diff --git a/.gitignore b/.gitignore
index 156247a90..738810b8e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -168,3 +168,4 @@ pip-log.txt
*.dso
console.log
*.cached.dts
+!Engine/bin
diff --git a/Engine/bin/bison/bison.exe b/Engine/bin/bison/bison.exe
new file mode 100644
index 000000000..4881bf604
Binary files /dev/null and b/Engine/bin/bison/bison.exe differ
diff --git a/Engine/bin/bison/bison.hairy b/Engine/bin/bison/bison.hairy
new file mode 100644
index 000000000..999b55591
--- /dev/null
+++ b/Engine/bin/bison/bison.hairy
@@ -0,0 +1,334 @@
+
+extern int timeclock;
+
+
+int yyerror; /* Yyerror and yycost are set by guards. */
+int yycost; /* If yyerror is set to a nonzero value by a */
+ /* guard, the reduction with which the guard */
+ /* is associated is not performed, and the */
+ /* error recovery mechanism is invoked. */
+ /* Yycost indicates the cost of performing */
+ /* the reduction given the attributes of the */
+ /* symbols. */
+
+
+/* YYMAXDEPTH indicates the size of the parser's state and value */
+/* stacks. */
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 500
+#endif
+
+/* YYMAXRULES must be at least as large as the number of rules that */
+/* could be placed in the rule queue. That number could be determined */
+/* from the grammar and the size of the stack, but, as yet, it is not. */
+
+#ifndef YYMAXRULES
+#define YYMAXRULES 100
+#endif
+
+#ifndef YYMAXBACKUP
+#define YYMAXBACKUP 100
+#endif
+
+
+short yyss[YYMAXDEPTH]; /* the state stack */
+YYSTYPE yyvs[YYMAXDEPTH]; /* the semantic value stack */
+YYLTYPE yyls[YYMAXDEPTH]; /* the location stack */
+short yyrq[YYMAXRULES]; /* the rule queue */
+int yychar; /* the lookahead symbol */
+
+YYSTYPE yylval; /* the semantic value of the */
+ /* lookahead symbol */
+
+YYSTYPE yytval; /* the semantic value for the state */
+ /* at the top of the state stack. */
+
+YYSTYPE yyval; /* the variable used to return */
+ /* semantic values from the action */
+ /* routines */
+
+YYLTYPE yylloc; /* location data for the lookahead */
+ /* symbol */
+
+YYLTYPE yytloc; /* location data for the state at the */
+ /* top of the state stack */
+
+
+int yynunlexed;
+short yyunchar[YYMAXBACKUP];
+YYSTYPE yyunval[YYMAXBACKUP];
+YYLTYPE yyunloc[YYMAXBACKUP];
+
+short *yygssp; /* a pointer to the top of the state */
+ /* stack; only set during error */
+ /* recovery. */
+
+YYSTYPE *yygvsp; /* a pointer to the top of the value */
+ /* stack; only set during error */
+ /* recovery. */
+
+YYLTYPE *yyglsp; /* a pointer to the top of the */
+ /* location stack; only set during */
+ /* error recovery. */
+
+
+/* Yyget is an interface between the parser and the lexical analyzer. */
+/* It is costly to provide such an interface, but it avoids requiring */
+/* the lexical analyzer to be able to back up the scan. */
+
+yyget()
+{
+ if (yynunlexed > 0)
+ {
+ yynunlexed--;
+ yychar = yyunchar[yynunlexed];
+ yylval = yyunval[yynunlexed];
+ yylloc = yyunloc[yynunlexed];
+ }
+ else if (yychar <= 0)
+ yychar = 0;
+ else
+ {
+ yychar = yylex();
+ if (yychar < 0)
+ yychar = 0;
+ else yychar = YYTRANSLATE(yychar);
+ }
+}
+
+
+
+yyunlex(chr, val, loc)
+int chr;
+YYSTYPE val;
+YYLTYPE loc;
+{
+ yyunchar[yynunlexed] = chr;
+ yyunval[yynunlexed] = val;
+ yyunloc[yynunlexed] = loc;
+ yynunlexed++;
+}
+
+
+
+yyrestore(first, last)
+register short *first;
+register short *last;
+{
+ register short *ssp;
+ register short *rp;
+ register int symbol;
+ register int state;
+ register int tvalsaved;
+
+ ssp = yygssp;
+ yyunlex(yychar, yylval, yylloc);
+
+ tvalsaved = 0;
+ while (first != last)
+ {
+ symbol = yystos[*ssp];
+ if (symbol < YYNTBASE)
+ {
+ yyunlex(symbol, yytval, yytloc);
+ tvalsaved = 1;
+ ssp--;
+ }
+
+ ssp--;
+
+ if (first == yyrq)
+ first = yyrq + YYMAXRULES;
+
+ first--;
+
+ for (rp = yyrhs + yyprhs[*first]; symbol = *rp; rp++)
+ {
+ if (symbol < YYNTBASE)
+ state = yytable[yypact[*ssp] + symbol];
+ else
+ {
+ state = yypgoto[symbol - YYNTBASE] + *ssp;
+
+ if (state >= 0 && state <= YYLAST && yycheck[state] == *ssp)
+ state = yytable[state];
+ else
+ state = yydefgoto[symbol - YYNTBASE];
+ }
+
+ *++ssp = state;
+ }
+ }
+
+ if ( ! tvalsaved && ssp > yyss)
+ {
+ yyunlex(yystos[*ssp], yytval, yytloc);
+ ssp--;
+ }
+
+ yygssp = ssp;
+}
+
+
+
+int
+yyparse()
+{
+ register int yystate;
+ register int yyn;
+ register short *yyssp;
+ register short *yyrq0;
+ register short *yyptr;
+ register YYSTYPE *yyvsp;
+
+ int yylen;
+ YYLTYPE *yylsp;
+ short *yyrq1;
+ short *yyrq2;
+
+ yystate = 0;
+ yyssp = yyss - 1;
+ yyvsp = yyvs - 1;
+ yylsp = yyls - 1;
+ yyrq0 = yyrq;
+ yyrq1 = yyrq0;
+ yyrq2 = yyrq0;
+
+ yychar = yylex();
+ if (yychar < 0)
+ yychar = 0;
+ else yychar = YYTRANSLATE(yychar);
+
+yynewstate:
+
+ if (yyssp >= yyss + YYMAXDEPTH - 1)
+ {
+ yyabort("Parser Stack Overflow");
+ YYABORT;
+ }
+
+ *++yyssp = yystate;
+
+yyresume:
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yydefault;
+
+ yyn += yychar;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar)
+ goto yydefault;
+
+ yyn = yytable[yyn];
+ if (yyn < 0)
+ {
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrlab;
+
+ yystate = yyn;
+
+ yyptr = yyrq2;
+ while (yyptr != yyrq1)
+ {
+ yyn = *yyptr++;
+ yylen = yyr2[yyn];
+ yyvsp -= yylen;
+ yylsp -= yylen;
+
+ yyguard(yyn, yyvsp, yylsp);
+ if (yyerror)
+ goto yysemerr;
+
+ yyaction(yyn, yyvsp, yylsp);
+ *++yyvsp = yyval;
+
+ yylsp++;
+ if (yylen == 0)
+ {
+ yylsp->timestamp = timeclock;
+ yylsp->first_line = yytloc.first_line;
+ yylsp->first_column = yytloc.first_column;
+ yylsp->last_line = (yylsp-1)->last_line;
+ yylsp->last_column = (yylsp-1)->last_column;
+ yylsp->text = 0;
+ }
+ else
+ {
+ yylsp->last_line = (yylsp+yylen-1)->last_line;
+ yylsp->last_column = (yylsp+yylen-1)->last_column;
+ }
+
+ if (yyptr == yyrq + YYMAXRULES)
+ yyptr = yyrq;
+ }
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ yyrq2 = yyptr;
+ yyrq1 = yyrq0;
+
+ *++yyvsp = yytval;
+ *++yylsp = yytloc;
+ yytval = yylval;
+ yytloc = yylloc;
+ yyget();
+
+ goto yynewstate;
+
+yydefault:
+
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+
+yyreduce:
+
+ *yyrq0++ = yyn;
+
+ if (yyrq0 == yyrq + YYMAXRULES)
+ yyrq0 = yyrq;
+
+ if (yyrq0 == yyrq2)
+ {
+ yyabort("Parser Rule Queue Overflow");
+ YYABORT;
+ }
+
+ yyssp -= yyr2[yyn];
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+ if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTBASE];
+
+ goto yynewstate;
+
+yysemerr:
+ *--yyptr = yyn;
+ yyrq2 = yyptr;
+ yyvsp += yyr2[yyn];
+
+yyerrlab:
+
+ yygssp = yyssp;
+ yygvsp = yyvsp;
+ yyglsp = yylsp;
+ yyrestore(yyrq0, yyrq2);
+ yyrecover();
+ yystate = *yygssp;
+ yyssp = yygssp;
+ yyvsp = yygvsp;
+ yyrq0 = yyrq;
+ yyrq1 = yyrq0;
+ yyrq2 = yyrq0;
+ goto yyresume;
+}
+
+$
diff --git a/Engine/bin/bison/bison.html b/Engine/bin/bison/bison.html
new file mode 100644
index 000000000..a89eaa329
--- /dev/null
+++ b/Engine/bin/bison/bison.html
@@ -0,0 +1,4501 @@
+
+
+
+Bison 1.24
+
+
+
+Bison
+
+The YACC-compatible Parser Generator
+
+May 1995, Bison Version 1.24
+
+by Charles Donnelly and Richard Stallman
+
+
+
+
Table of Contents
+
+
+
+
+
+
+Bison is a general-purpose parser generator that converts a
+grammar description for an LALR(1) context-free grammar into a C
+program to parse that grammar. Once you are proficient with Bison,
+you may use it to develop a wide range of language parsers, from those
+used in simple desk calculators to complex programming languages.
+
+Bison is upward compatible with Yacc: all properly-written Yacc grammars
+ought to work with Bison with no change. Anyone familiar with Yacc
+should be able to use Bison with little trouble. You need to be fluent in
+C programming in order to use Bison or to understand this manual.
+
+We begin with tutorial chapters that explain the basic concepts of using
+Bison and show three explained examples, each building on the last. If you
+don't know Bison or Yacc, start by reading these chapters. Reference
+chapters follow which describe specific aspects of Bison in detail.
+
+Bison was written primarily by Robert Corbett; Richard Stallman made
+it Yacc-compatible. This edition corresponds to version 1.24 of Bison.
+
+
+
+As of Bison version 1.24, we have changed the distribution terms for
+yyparse to permit using Bison's output in non-free programs.
+Formerly, Bison parsers could be used only in programs that were free
+software.
+
+The other GNU programming tools, such as the GNU C compiler, have never
+had such a requirement. They could always be used for non-free
+software. The reason Bison was different was not due to a special
+policy decision; it resulted from applying the usual General Public
+License to all of the Bison source code.
+
+The output of the Bison utility--the Bison parser file--contains a
+verbatim copy of a sizable piece of Bison, which is the code for the
+yyparse function. (The actions from your grammar are inserted
+into this function at one point, but the rest of the function is not
+changed.) When we applied the GPL terms to the code for yyparse,
+the effect was to restrict the use of Bison output to free software.
+
+We didn't change the terms because of sympathy for people who want to
+make software proprietary. Software should be free. But we
+concluded that limiting Bison's use to free software was doing little to
+encourage people to make other software free. So we decided to make the
+practical conditions for using Bison match the practical conditions for
+using the other GNU tools.
+
+
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+675 Mass Ave, Cambridge, MA 02139, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+
+
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+
+
+-
+This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+
-
+You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+
-
+You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+
+-
+You must cause the modified files to carry prominent notices
+stating that you changed the files and the date of any change.
+
+
-
+You must cause any work that you distribute or publish, that in
+whole or in part contains or is derived from the Program or any
+part thereof, to be licensed as a whole at no charge to all third
+parties under the terms of this License.
+
+
-
+If the modified program normally reads commands interactively
+when run, you must cause it, when started running for such
+interactive use in the most ordinary way, to print or display an
+announcement including an appropriate copyright notice and a
+notice that there is no warranty (or else, saying that you provide
+a warranty) and that users may redistribute the program under
+these conditions, and telling the user how to view a copy of this
+License. (Exception: if the Program itself is interactive but
+does not normally print such an announcement, your work based on
+the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+
-
+You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+
+-
+Accompany it with the complete corresponding machine-readable
+source code, which must be distributed under the terms of Sections
+1 and 2 above on a medium customarily used for software interchange; or,
+
+
-
+Accompany it with a written offer, valid for at least three
+years, to give any third party, for a charge no more than your
+cost of physically performing source distribution, a complete
+machine-readable copy of the corresponding source code, to be
+distributed under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+
-
+Accompany it with the information you received as to the offer
+to distribute corresponding source code. (This alternative is
+allowed only for noncommercial distribution and only if you
+received the program in object code or executable form with such
+an offer, in accord with Subsection b above.)
+
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
-
+You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
-
+You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+
-
+Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+
-
+If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
-
+If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+
-
+The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+
-
+If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+
NO WARRANTY
+ -
+BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+
-
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+
+
+
END OF TERMS AND CONDITIONS
+
+
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+one line to give the program's name and a brief idea of what it does.
+Copyright (C) 19yy name of author
+
+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 2 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, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+
+Also add information on how to contact you by electronic and paper mail.
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+Gnomovision version 69, Copyright (C) 19yy name of author
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type `show c' for details.
+
+
+
+The hypothetical commands `show w' and `show c' should show
+the appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than `show w' and
+`show c'; they could even be mouse-clicks or menu items--whatever
+suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+`Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+signature of Ty Coon, 1 April 1989
+Ty Coon, President of Vice
+
+
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+
+
+This chapter introduces many of the basic concepts without which the
+details of Bison will not make sense. If you do not already know how to
+use Bison or Yacc, we suggest you start by reading this chapter carefully.
+
+
+
+
+In order for Bison to parse a language, it must be described by a
+context-free grammar. This means that you specify one or more
+syntactic groupings and give rules for constructing them from their
+parts. For example, in the C language, one kind of grouping is called an
+`expression'. One rule for making an expression might be, "An expression
+can be made of a minus sign and another expression". Another would be,
+"An expression can be an integer". As you can see, rules are often
+recursive, but there must be at least one rule which leads out of the
+recursion.
+
+
+
+The most common formal system for presenting such rules for humans to read
+is Backus-Naur Form or "BNF", which was developed in order to
+specify the language Algol 60. Any grammar expressed in BNF is a
+context-free grammar. The input to Bison is essentially machine-readable
+BNF.
+
+Not all context-free languages can be handled by Bison, only those
+that are LALR(1). In brief, this means that it must be possible to
+tell how to parse any portion of an input string with just a single
+token of look-ahead. Strictly speaking, that is a description of an
+LR(1) grammar, and LALR(1) involves additional restrictions that are
+hard to explain simply; but it is rare in actual practice to find an
+LR(1) grammar that fails to be LALR(1). See section Mysterious Reduce/Reduce Conflicts, for more information on this.
+
+
+
+
+
+In the formal grammatical rules for a language, each kind of syntactic unit
+or grouping is named by a symbol. Those which are built by grouping
+smaller constructs according to grammatical rules are called
+nonterminal symbols; those which can't be subdivided are called
+terminal symbols or token types. We call a piece of input
+corresponding to a single terminal symbol a token, and a piece
+corresponding to a single nonterminal symbol a grouping.
+We can use the C language as an example of what symbols, terminal and
+nonterminal, mean. The tokens of C are identifiers, constants (numeric and
+string), and the various keywords, arithmetic operators and punctuation
+marks. So the terminal symbols of a grammar for C include `identifier',
+`number', `string', plus one symbol for each keyword, operator or
+punctuation mark: `if', `return', `const', `static', `int', `char',
+`plus-sign', `open-brace', `close-brace', `comma' and many more. (These
+tokens can be subdivided into characters, but that is a matter of
+lexicography, not grammar.)
+
+Here is a simple C function subdivided into tokens:
+
+
+
+int /* keyword `int' */
+square (x) /* identifier, open-paren, */
+ /* identifier, close-paren */
+ int x; /* keyword `int', identifier, semicolon */
+{ /* open-brace */
+ return x * x; /* keyword `return', identifier, */
+ /* asterisk, identifier, semicolon */
+} /* close-brace */
+
+
+
+The syntactic groupings of C include the expression, the statement, the
+declaration, and the function definition. These are represented in the
+grammar of C by nonterminal symbols `expression', `statement',
+`declaration' and `function definition'. The full grammar uses dozens of
+additional language constructs, each with its own nonterminal symbol, in
+order to express the meanings of these four. The example above is a
+function definition; it contains one declaration, and one statement. In
+the statement, each `x' is an expression and so is `x * x'.
+Each nonterminal symbol must have grammatical rules showing how it is made
+out of simpler constructs. For example, one kind of C statement is the
+return statement; this would be described with a grammar rule which
+reads informally as follows:
+
+
+A `statement' can be made of a `return' keyword, an `expression' and a
+`semicolon'.
+
+
+There would be many other rules for `statement', one for each kind of
+statement in C.
+
+
+One nonterminal symbol must be distinguished as the special one which
+defines a complete utterance in the language. It is called the start
+symbol. In a compiler, this means a complete input program. In the C
+language, the nonterminal symbol `sequence of definitions and declarations'
+plays this role.
+
+For example, `1 + 2' is a valid C expression--a valid part of a C
+program--but it is not valid as an entire C program. In the
+context-free grammar of C, this follows from the fact that `expression' is
+not the start symbol.
+
+The Bison parser reads a sequence of tokens as its input, and groups the
+tokens using the grammar rules. If the input is valid, the end result is
+that the entire token sequence reduces to a single grouping whose symbol is
+the grammar's start symbol. If we use a grammar for C, the entire input
+must be a `sequence of definitions and declarations'. If not, the parser
+reports a syntax error.
+
+
+
+
+
+
+A formal grammar is a mathematical construct. To define the language
+for Bison, you must write a file expressing the grammar in Bison syntax:
+a Bison grammar file. See section Bison Grammar Files.
+A nonterminal symbol in the formal grammar is represented in Bison input
+as an identifier, like an identifier in C. By convention, it should be
+in lower case, such as expr, stmt or declaration.
+The Bison representation for a terminal symbol is also called a token
+type. Token types as well can be represented as C-like identifiers. By
+convention, these identifiers should be upper case to distinguish them from
+nonterminals: for example, INTEGER, IDENTIFIER, IF or
+RETURN. A terminal symbol that stands for a particular keyword in
+the language should be named after that keyword converted to upper case.
+The terminal symbol error is reserved for error recovery.
+
+See section Symbols, Terminal and Nonterminal.
+A terminal symbol can also be represented as a character literal, just like
+a C character constant. You should do this whenever a token is just a
+single character (parenthesis, plus-sign, etc.): use that same character in
+a literal as the terminal symbol for that token.
+
+The grammar rules also have an expression in Bison syntax. For example,
+here is the Bison rule for a C return statement. The semicolon in
+quotes is a literal character token, representing part of the C syntax for
+the statement; the naked semicolon, and the colon, are Bison punctuation
+used in every rule.
+
+
+
+stmt: RETURN expr ';'
+ ;
+
+
+
+See section Syntax of Grammar Rules.
+
+
+
+
+
+A formal grammar selects tokens only by their classifications: for example,
+if a rule mentions the terminal symbol `integer constant', it means that
+any integer constant is grammatically valid in that position. The
+precise value of the constant is irrelevant to how to parse the input: if
+`x+4' is grammatical then `x+1' or `x+3989' is equally
+grammatical.
+
+But the precise value is very important for what the input means once it is
+parsed. A compiler is useless if it fails to distinguish between 4, 1 and
+3989 as constants in the program! Therefore, each token in a Bison grammar
+has both a token type and a semantic value. See section Defining Language Semantics,
+for details.
+
+The token type is a terminal symbol defined in the grammar, such as
+INTEGER, IDENTIFIER or ','. It tells everything
+you need to know to decide where the token may validly appear and how to
+group it with other tokens. The grammar rules know nothing about tokens
+except their types.
+
+The semantic value has all the rest of the information about the
+meaning of the token, such as the value of an integer, or the name of an
+identifier. (A token such as ',' which is just punctuation doesn't
+need to have any semantic value.)
+
+For example, an input token might be classified as token type
+INTEGER and have the semantic value 4. Another input token might
+have the same token type INTEGER but value 3989. When a grammar
+rule says that INTEGER is allowed, either of these tokens is
+acceptable because each is an INTEGER. When the parser accepts the
+token, it keeps track of the token's semantic value.
+
+Each grouping can also have a semantic value as well as its nonterminal
+symbol. For example, in a calculator, an expression typically has a
+semantic value that is a number. In a compiler for a programming
+language, an expression typically has a semantic value that is a tree
+structure describing the meaning of the expression.
+
+
+
+
+
+In order to be useful, a program must do more than parse input; it must
+also produce some output based on the input. In a Bison grammar, a grammar
+rule can have an action made up of C statements. Each time the
+parser recognizes a match for that rule, the action is executed.
+See section Actions.
+
+Most of the time, the purpose of an action is to compute the semantic value
+of the whole construct from the semantic values of its parts. For example,
+suppose we have a rule which says an expression can be the sum of two
+expressions. When the parser recognizes such a sum, each of the
+subexpressions has a semantic value which describes how it was built up.
+The action for this rule should create a similar sort of value for the
+newly recognized larger expression.
+For example, here is a rule that says an expression can be the sum of
+two subexpressions:
+
+
+
+expr: expr '+' expr { $$ = $1 + $3; }
+ ;
+
+
+
+The action says how to produce the semantic value of the sum expression
+from the values of the two subexpressions.
+
+
+
+
+
+
+When you run Bison, you give it a Bison grammar file as input. The output
+is a C source file that parses the language described by the grammar.
+This file is called a Bison parser. Keep in mind that the Bison
+utility and the Bison parser are two distinct programs: the Bison utility
+is a program whose output is the Bison parser that becomes part of your
+program.
+
+The job of the Bison parser is to group tokens into groupings according to
+the grammar rules--for example, to build identifiers and operators into
+expressions. As it does this, it runs the actions for the grammar rules it
+uses.
+
+The tokens come from a function called the lexical analyzer that you
+must supply in some fashion (such as by writing it in C). The Bison parser
+calls the lexical analyzer each time it wants a new token. It doesn't know
+what is "inside" the tokens (though their semantic values may reflect
+this). Typically the lexical analyzer makes the tokens by parsing
+characters of text, but Bison does not depend on this. See section The Lexical Analyzer Function yylex.
+The Bison parser file is C code which defines a function named
+yyparse which implements that grammar. This function does not make
+a complete C program: you must supply some additional functions. One is
+the lexical analyzer. Another is an error-reporting function which the
+parser calls to report an error. In addition, a complete C program must
+start with a function called main; you have to provide this, and
+arrange for it to call yyparse or the parser will never run.
+See section Parser C-Language Interface.
+Aside from the token type names and the symbols in the actions you
+write, all variable and function names used in the Bison parser file
+begin with `yy' or `YY'. This includes interface functions
+such as the lexical analyzer function yylex, the error reporting
+function yyerror and the parser function yyparse itself.
+This also includes numerous identifiers used for internal purposes.
+Therefore, you should avoid using C identifiers starting with `yy'
+or `YY' in the Bison grammar file except for the ones defined in
+this manual.
+
+
+
+
+The actual language-design process using Bison, from grammar specification
+to a working compiler or interpreter, has these parts:
+
+-
+Formally specify the grammar in a form recognized by Bison
+(see section Bison Grammar Files). For each grammatical rule in the language,
+describe the action that is to be taken when an instance of that rule
+is recognized. The action is described by a sequence of C statements.
+
-
+Write a lexical analyzer to process input and pass tokens to the
+parser. The lexical analyzer may be written by hand in C
+(see section The Lexical Analyzer Function
yylex). It could also be produced using Lex, but the use
+of Lex is not discussed in this manual.
+ -
+Write a controlling function that calls the Bison-produced parser.
+
-
+Write error-reporting routines.
+
+
+To turn this source code as written into a runnable program, you
+must follow these steps:
+
+-
+Run Bison on the grammar to produce the parser.
+
-
+Compile the code output by Bison, as well as any other source files.
+
-
+Link the object files to produce the finished product.
+
+
+
+
+
+
+
+
+The input file for the Bison utility is a Bison grammar file. The
+general form of a Bison grammar file is as follows:
+
+%{
+C declarations
+%}
+Bison declarations
+%%
+Grammar rules
+%%
+Additional C code
+
+
+The `%%', `%{' and `%}' are punctuation that appears
+in every Bison grammar file to separate the sections.
+The C declarations may define types and variables used in the actions.
+You can also use preprocessor commands to define macros used there, and use
+#include to include header files that do any of these things.
+The Bison declarations declare the names of the terminal and nonterminal
+symbols, and may also describe operator precedence and the data types of
+semantic values of various symbols.
+
+The grammar rules define how to construct each nonterminal symbol from its
+parts.
+
+The additional C code can contain any C code you want to use. Often the
+definition of the lexical analyzer yylex goes here, plus subroutines
+called by the actions in the grammar rules. In a simple program, all the
+rest of the program can go here.
+
+
+
+
+
+Now we show and explain three sample programs written using Bison: a
+reverse polish notation calculator, an algebraic (infix) notation
+calculator, and a multi-function calculator. All three have been tested
+under BSD Unix 4.3; each produces a usable, though limited, interactive
+desk-top calculator.
+
+These examples are simple, but Bison grammars for real programming
+languages are written the same way.
+
+
+
+
+
+
+
+The first example is that of a simple double-precision reverse polish
+notation calculator (a calculator using postfix operators). This example
+provides a good starting point, since operator precedence is not an issue.
+
+The second example will illustrate how operator precedence is handled.
+The source code for this calculator is named `rpcalc.y'. The
+`.y' extension is a convention used for Bison input files.
+
+
+Here are the C and Bison declarations for the reverse polish notation
+calculator. As in C, comments are placed between `/*...*/'.
+
+
+/* Reverse polish notation calculator. */
+%{
+#define YYSTYPE double
+#include <math.h>
+%}
+%token NUM
+%% /* Grammar rules and actions follow */
+
+
+The C declarations section (see section The C Declarations Section) contains two
+preprocessor directives.
+
+The #define directive defines the macro YYSTYPE, thus
+specifying the C data type for semantic values of both tokens and groupings
+(see section Data Types of Semantic Values). The Bison parser will use whatever type
+YYSTYPE is defined as; if you don't define it, int is the
+default. Because we specify double, each token and each expression
+has an associated value, which is a floating point number.
+
+The #include directive is used to declare the exponentiation
+function pow.
+
+The second section, Bison declarations, provides information to Bison about
+the token types (see section The Bison Declarations Section). Each terminal symbol that is
+not a single-character literal must be declared here. (Single-character
+literals normally don't need to be declared.) In this example, all the
+arithmetic operators are designated by single-character literals, so the
+only terminal symbol that needs to be declared is NUM, the token
+type for numeric constants.
+
+
+
+Here are the grammar rules for the reverse polish notation calculator.
+
+
+
+input: /* empty */
+ | input line
+;
+line: '\n'
+ | exp '\n' { printf ("\t%.10g\n", $1); }
+;
+exp: NUM { $$ = $1; }
+ | exp exp '+' { $$ = $1 + $2; }
+ | exp exp '-' { $$ = $1 - $2; }
+ | exp exp '*' { $$ = $1 * $2; }
+ | exp exp '/' { $$ = $1 / $2; }
+ /* Exponentiation */
+ | exp exp '^' { $$ = pow ($1, $2); }
+ /* Unary minus */
+ | exp 'n' { $$ = -$1; }
+;
+%%
+
+
+
+The groupings of the rpcalc "language" defined here are the expression
+(given the name exp), the line of input (line), and the
+complete input transcript (input). Each of these nonterminal
+symbols has several alternate rules, joined by the `|' punctuator
+which is read as "or". The following sections explain what these rules
+mean.
+
+The semantics of the language is determined by the actions taken when a
+grouping is recognized. The actions are the C code that appears inside
+braces. See section Actions.
+
+You must specify these actions in C, but Bison provides the means for
+passing semantic values between the rules. In each action, the
+pseudo-variable $$ stands for the semantic value for the grouping
+that the rule is going to construct. Assigning a value to $$ is the
+main job of most actions. The semantic values of the components of the
+rule are referred to as $1, $2, and so on.
+
+
+
+Consider the definition of input:
+
+
+
+input: /* empty */
+ | input line
+;
+
+
+
+This definition reads as follows: "A complete input is either an empty
+string, or a complete input followed by an input line". Notice that
+"complete input" is defined in terms of itself. This definition is said
+to be left recursive since input appears always as the
+leftmost symbol in the sequence. See section Recursive Rules.
+
+The first alternative is empty because there are no symbols between the
+colon and the first `|'; this means that input can match an
+empty string of input (no tokens). We write the rules this way because it
+is legitimate to type Ctrl-d right after you start the calculator.
+
+It's conventional to put an empty alternative first and write the comment
+`/* empty */' in it.
+
+The second alternate rule (input line) handles all nontrivial input.
+It means, "After reading any number of lines, read one more line if
+possible." The left recursion makes this rule into a loop. Since the
+first alternative matches empty input, the loop can be executed zero or
+more times.
+
+The parser function yyparse continues to process input until a
+grammatical error is seen or the lexical analyzer says there are no more
+input tokens; we will arrange for the latter to happen at end of file.
+
+
+Now consider the definition of line:
+
+
+line: '\n'
+ | exp '\n' { printf ("\t%.10g\n", $1); }
+;
+
+
+
+The first alternative is a token which is a newline character; this means
+that rpcalc accepts a blank line (and ignores it, since there is no
+action). The second alternative is an expression followed by a newline.
+This is the alternative that makes rpcalc useful. The semantic value of
+the exp grouping is the value of $1 because the exp in
+question is the first symbol in the alternative. The action prints this
+value, which is the result of the computation the user asked for.
+This action is unusual because it does not assign a value to $$. As
+a consequence, the semantic value associated with the line is
+uninitialized (its value will be unpredictable). This would be a bug if
+that value were ever used, but we don't use it: once rpcalc has printed the
+value of the user's input line, that value is no longer needed.
+
+
+The exp grouping has several rules, one for each kind of expression.
+The first rule handles the simplest expressions: those that are just numbers.
+The second handles an addition-expression, which looks like two expressions
+followed by a plus-sign. The third handles subtraction, and so on.
+
+
+exp: NUM
+ | exp exp '+' { $$ = $1 + $2; }
+ | exp exp '-' { $$ = $1 - $2; }
+ ...
+ ;
+
+
+
+We have used `|' to join all the rules for exp, but we could
+equally well have written them separately:
+
+
+exp: NUM ;
+exp: exp exp '+' { $$ = $1 + $2; } ;
+exp: exp exp '-' { $$ = $1 - $2; } ;
+ ...
+
+
+
+Most of the rules have actions that compute the value of the expression in
+terms of the value of its parts. For example, in the rule for addition,
+$1 refers to the first component exp and $2 refers to
+the second one. The third component, '+', has no meaningful
+associated semantic value, but if it had one you could refer to it as
+$3. When yyparse recognizes a sum expression using this
+rule, the sum of the two subexpressions' values is produced as the value of
+the entire expression. See section Actions.
+You don't have to give an action for every rule. When a rule has no
+action, Bison by default copies the value of $1 into $$.
+This is what happens in the first rule (the one that uses NUM).
+The formatting shown here is the recommended convention, but Bison does
+not require it. You can add or change whitespace as much as you wish.
+For example, this:
+
+exp : NUM | exp exp '+' {$$ = $1 + $2; } | ...
+
+
+means the same thing as this:
+
+exp: NUM
+ | exp exp '+' { $$ = $1 + $2; }
+ | ...
+
+
+The latter, however, is much more readable.
+
+
+
+
+The lexical analyzer's job is low-level parsing: converting characters or
+sequences of characters into tokens. The Bison parser gets its tokens by
+calling the lexical analyzer. See section The Lexical Analyzer Function yylex.
+Only a simple lexical analyzer is needed for the RPN calculator. This
+lexical analyzer skips blanks and tabs, then reads in numbers as
+double and returns them as NUM tokens. Any other character
+that isn't part of a number is a separate token. Note that the token-code
+for such a single-character token is the character itself.
+The return value of the lexical analyzer function is a numeric code which
+represents a token type. The same text used in Bison rules to stand for
+this token type is also a C expression for the numeric code for the type.
+This works in two ways. If the token type is a character literal, then its
+numeric code is the ASCII code for that character; you can use the same
+character literal in the lexical analyzer to express the number. If the
+token type is an identifier, that identifier is defined by Bison as a C
+macro whose definition is the appropriate number. In this example,
+therefore, NUM becomes a macro for yylex to use.
+The semantic value of the token (if it has one) is stored into the global
+variable yylval, which is where the Bison parser will look for it.
+(The C data type of yylval is YYSTYPE, which was defined
+at the beginning of the grammar; see section Declarations for rpcalc.)
+A token type code of zero is returned if the end-of-file is encountered.
+(Bison recognizes any nonpositive value as indicating the end of the
+input.)
+Here is the code for the lexical analyzer:
+
+/* Lexical analyzer returns a double floating point
+ number on the stack and the token NUM, or the ASCII
+ character read if not a number. Skips all blanks
+ and tabs, returns 0 for EOF. */
+#include <ctype.h>
+yylex ()
+{
+ int c;
+ /* skip white space */
+ while ((c = getchar ()) == ' ' || c == '\t')
+ ;
+ /* process numbers */
+ if (c == '.' || isdigit (c))
+ {
+ ungetc (c, stdin);
+ scanf ("%lf", &yylval);
+ return NUM;
+ }
+ /* return end-of-file */
+ if (c == EOF)
+ return 0;
+ /* return single chars */
+ return c;
+}
+
+
+
+
+
+
+In keeping with the spirit of this example, the controlling function is
+kept to the bare minimum. The only requirement is that it call
+yyparse to start the process of parsing.
+
+main ()
+{
+ yyparse ();
+}
+
+
+
+
+
+When yyparse detects a syntax error, it calls the error reporting
+function yyerror to print an error message (usually but not always
+"parse error"). It is up to the programmer to supply yyerror
+(see section Parser C-Language Interface), so here is the definition we will use:
+
+#include <stdio.h>
+yyerror (s) /* Called by yyparse on error */
+ char *s;
+{
+ printf ("%s\n", s);
+}
+
+
+After yyerror returns, the Bison parser may recover from the error
+and continue parsing if the grammar contains a suitable error rule
+(see section Error Recovery). Otherwise, yyparse returns nonzero. We
+have not written any error rules in this example, so any invalid input will
+cause the calculator program to exit. This is not clean behavior for a
+real calculator, but it is adequate in the first example.
+
+
+
+Before running Bison to produce a parser, we need to decide how to arrange
+all the source code in one or more source files. For such a simple example,
+the easiest thing is to put everything in one file. The definitions of
+yylex, yyerror and main go at the end, in the
+"additional C code" section of the file (see section The Overall Layout of a Bison Grammar).
+For a large project, you would probably have several source files, and use
+make to arrange to recompile them.
+With all the source in a single file, you use the following command to
+convert it into a parser file:
+
+bison file_name.y
+
+
+In this example the file was called `rpcalc.y' (for "Reverse Polish
+CALCulator"). Bison produces a file named `file_name.tab.c',
+removing the `.y' from the original file name. The file output by
+Bison contains the source code for yyparse. The additional
+functions in the input file (yylex, yyerror and main)
+are copied verbatim to the output.
+
+
+
+Here is how to compile and run the parser file:
+
+# List files in current directory.
+% ls
+rpcalc.tab.c rpcalc.y
+# Compile the Bison parser.
+# `-lm' tells compiler to search math library for pow.
+% cc rpcalc.tab.c -lm -o rpcalc
+# List files again.
+% ls
+rpcalc rpcalc.tab.c rpcalc.y
+
+
+The file `rpcalc' now contains the executable code. Here is an
+example session using rpcalc.
+
+% rpcalc
+4 9 +
+13
+3 7 + 3 4 5 *+-
+-13
+3 7 + 3 4 5 * + - n Note the unary minus, `n'
+13
+5 6 / 4 n +
+-3.166666667
+3 4 ^ Exponentiation
+81
+^D End-of-file indicator
+%
+
+
+
+
+
+
+
+We now modify rpcalc to handle infix operators instead of postfix. Infix
+notation involves the concept of operator precedence and the need for
+parentheses nested to arbitrary depth. Here is the Bison code for
+`calc.y', an infix desk-top calculator.
+
+/* Infix notation calculator--calc */
+%{
+#define YYSTYPE double
+#include <math.h>
+%}
+/* BISON Declarations */
+%token NUM
+%left '-' '+'
+%left '*' '/'
+%left NEG /* negation--unary minus */
+%right '^' /* exponentiation */
+/* Grammar follows */
+%%
+input: /* empty string */
+ | input line
+;
+line: '\n'
+ | exp '\n' { printf ("\t%.10g\n", $1); }
+;
+exp: NUM { $$ = $1; }
+ | exp '+' exp { $$ = $1 + $3; }
+ | exp '-' exp { $$ = $1 - $3; }
+ | exp '*' exp { $$ = $1 * $3; }
+ | exp '/' exp { $$ = $1 / $3; }
+ | '-' exp %prec NEG { $$ = -$2; }
+ | exp '^' exp { $$ = pow ($1, $3); }
+ | '(' exp ')' { $$ = $2; }
+;
+%%
+
+
+The functions yylex, yyerror and main can be the same
+as before.
+There are two important new features shown in this code.
+In the second section (Bison declarations), %left declares token
+types and says they are left-associative operators. The declarations
+%left and %right (right associativity) take the place of
+%token which is used to declare a token type name without
+associativity. (These tokens are single-character literals, which
+ordinarily don't need to be declared. We declare them here to specify
+the associativity.)
+Operator precedence is determined by the line ordering of the
+declarations; the higher the line number of the declaration (lower on
+the page or screen), the higher the precedence. Hence, exponentiation
+has the highest precedence, unary minus (NEG) is next, followed
+by `*' and `/', and so on. See section Operator Precedence.
+The other important new feature is the %prec in the grammar section
+for the unary minus operator. The %prec simply instructs Bison that
+the rule `| '-' exp' has the same precedence as NEG---in this
+case the next-to-highest. See section Context-Dependent Precedence.
+Here is a sample run of `calc.y':
+
+% calc
+4 + 4.5 - (34/(8*3+-3))
+6.880952381
+-56 + 2
+-54
+3 ^ 2
+9
+
+
+
+
+
+Up to this point, this manual has not addressed the issue of error
+recovery---how to continue parsing after the parser detects a syntax
+error. All we have handled is error reporting with yyerror. Recall
+that by default yyparse returns after calling yyerror. This
+means that an erroneous input line causes the calculator program to exit.
+Now we show how to rectify this deficiency.
+The Bison language itself includes the reserved word error, which
+may be included in the grammar rules. In the example below it has
+been added to one of the alternatives for line:
+
+line: '\n'
+ | exp '\n' { printf ("\t%.10g\n", $1); }
+ | error '\n' { yyerrok; }
+;
+
+
+This addition to the grammar allows for simple error recovery in the event
+of a parse error. If an expression that cannot be evaluated is read, the
+error will be recognized by the third rule for line, and parsing
+will continue. (The yyerror function is still called upon to print
+its message as well.) The action executes the statement yyerrok, a
+macro defined automatically by Bison; its meaning is that error recovery is
+complete (see section Error Recovery). Note the difference between
+yyerrok and yyerror; neither one is a misprint.
+This form of error recovery deals with syntax errors. There are other
+kinds of errors; for example, division by zero, which raises an exception
+signal that is normally fatal. A real calculator program must handle this
+signal and use longjmp to return to main and resume parsing
+input lines; it would also have to discard the rest of the current line of
+input. We won't discuss this issue further because it is not specific to
+Bison programs.
+
+
+
+
+
+Now that the basics of Bison have been discussed, it is time to move on to
+a more advanced problem. The above calculators provided only five
+functions, `+', `-', `*', `/' and `^'. It would
+be nice to have a calculator that provides other mathematical functions such
+as sin, cos, etc.
+It is easy to add new operators to the infix calculator as long as they are
+only single-character literals. The lexical analyzer yylex passes
+back all non-number characters as tokens, so new grammar rules suffice for
+adding a new operator. But we want something more flexible: built-in
+functions whose syntax has this form:
+
+function_name (argument)
+
+
+At the same time, we will add memory to the calculator, by allowing you
+to create named variables, store values in them, and use them later.
+Here is a sample session with the multi-function calculator:
+
+% mfcalc
+pi = 3.141592653589
+3.1415926536
+sin(pi)
+0.0000000000
+alpha = beta1 = 2.3
+2.3000000000
+alpha
+2.3000000000
+ln(alpha)
+0.8329091229
+exp(ln(beta1))
+2.3000000000
+%
+
+
+Note that multiple assignment and nested function calls are permitted.
+
+
+Here are the C and Bison declarations for the multi-function calculator.
+
+%{
+#include <math.h> /* For math functions, cos(), sin(), etc. */
+#include "calc.h" /* Contains definition of `symrec' */
+%}
+%union {
+double val; /* For returning numbers. */
+symrec *tptr; /* For returning symbol-table pointers */
+}
+%token <val> NUM /* Simple double precision number */
+%token <tptr> VAR FNCT /* Variable and Function */
+%type <val> exp
+%right '='
+%left '-' '+'
+%left '*' '/'
+%left NEG /* Negation--unary minus */
+%right '^' /* Exponentiation */
+/* Grammar follows */
+%%
+
+
+The above grammar introduces only two new features of the Bison language.
+These features allow semantic values to have various data types
+(see section More Than One Value Type).
+The %union declaration specifies the entire list of possible types;
+this is instead of defining YYSTYPE. The allowable types are now
+double-floats (for exp and NUM) and pointers to entries in
+the symbol table. See section The Collection of Value Types.
+Since values can now have various types, it is necessary to associate a
+type with each grammar symbol whose semantic value is used. These symbols
+are NUM, VAR, FNCT, and exp. Their
+declarations are augmented with information about their data type (placed
+between angle brackets).
+The Bison construct %type is used for declaring nonterminal symbols,
+just as %token is used for declaring token types. We have not used
+%type before because nonterminal symbols are normally declared
+implicitly by the rules that define them. But exp must be declared
+explicitly so we can specify its value type. See section Nonterminal Symbols.
+
+
+Here are the grammar rules for the multi-function calculator.
+Most of them are copied directly from calc; three rules,
+those which mention VAR or FNCT, are new.
+
+input: /* empty */
+ | input line
+;
+line:
+ '\n'
+ | exp '\n' { printf ("\t%.10g\n", $1); }
+ | error '\n' { yyerrok; }
+;
+exp: NUM { $$ = $1; }
+ | VAR { $$ = $1->value.var; }
+ | VAR '=' exp { $$ = $3; $1->value.var = $3; }
+ | FNCT '(' exp ')' { $$ = (*($1->value.fnctptr))($3); }
+ | exp '+' exp { $$ = $1 + $3; }
+ | exp '-' exp { $$ = $1 - $3; }
+ | exp '*' exp { $$ = $1 * $3; }
+ | exp '/' exp { $$ = $1 / $3; }
+ | '-' exp %prec NEG { $$ = -$2; }
+ | exp '^' exp { $$ = pow ($1, $3); }
+ | '(' exp ')' { $$ = $2; }
+;
+/* End of grammar */
+%%
+
+
+
+
+
+The multi-function calculator requires a symbol table to keep track of the
+names and meanings of variables and functions. This doesn't affect the
+grammar rules (except for the actions) or the Bison declarations, but it
+requires some additional C functions for support.
+The symbol table itself consists of a linked list of records. Its
+definition, which is kept in the header `calc.h', is as follows. It
+provides for either functions or variables to be placed in the table.
+
+/* Data type for links in the chain of symbols. */
+struct symrec
+{
+ char *name; /* name of symbol */
+ int type; /* type of symbol: either VAR or FNCT */
+ union {
+ double var; /* value of a VAR */
+ double (*fnctptr)(); /* value of a FNCT */
+ } value;
+ struct symrec *next; /* link field */
+};
+typedef struct symrec symrec;
+/* The symbol table: a chain of `struct symrec'. */
+extern symrec *sym_table;
+symrec *putsym ();
+symrec *getsym ();
+
+
+The new version of main includes a call to init_table, a
+function that initializes the symbol table. Here it is, and
+init_table as well:
+
+#include <stdio.h>
+main ()
+{
+ init_table ();
+ yyparse ();
+}
+yyerror (s) /* Called by yyparse on error */
+ char *s;
+{
+ printf ("%s\n", s);
+}
+struct init
+{
+ char *fname;
+ double (*fnct)();
+};
+struct init arith_fncts[]
+ = {
+ "sin", sin,
+ "cos", cos,
+ "atan", atan,
+ "ln", log,
+ "exp", exp,
+ "sqrt", sqrt,
+ 0, 0
+ };
+/* The symbol table: a chain of `struct symrec'. */
+symrec *sym_table = (symrec *)0;
+init_table () /* puts arithmetic functions in table. */
+{
+ int i;
+ symrec *ptr;
+ for (i = 0; arith_fncts[i].fname != 0; i++)
+ {
+ ptr = putsym (arith_fncts[i].fname, FNCT);
+ ptr->value.fnctptr = arith_fncts[i].fnct;
+ }
+}
+
+
+By simply editing the initialization list and adding the necessary include
+files, you can add additional functions to the calculator.
+Two important functions allow look-up and installation of symbols in the
+symbol table. The function putsym is passed a name and the type
+(VAR or FNCT) of the object to be installed. The object is
+linked to the front of the list, and a pointer to the object is returned.
+The function getsym is passed the name of the symbol to look up. If
+found, a pointer to that symbol is returned; otherwise zero is returned.
+
+symrec *
+putsym (sym_name,sym_type)
+ char *sym_name;
+ int sym_type;
+{
+ symrec *ptr;
+ ptr = (symrec *) malloc (sizeof (symrec));
+ ptr->name = (char *) malloc (strlen (sym_name) + 1);
+ strcpy (ptr->name,sym_name);
+ ptr->type = sym_type;
+ ptr->value.var = 0; /* set value to 0 even if fctn. */
+ ptr->next = (struct symrec *)sym_table;
+ sym_table = ptr;
+ return ptr;
+}
+symrec *
+getsym (sym_name)
+ char *sym_name;
+{
+ symrec *ptr;
+ for (ptr = sym_table; ptr != (symrec *) 0;
+ ptr = (symrec *)ptr->next)
+ if (strcmp (ptr->name,sym_name) == 0)
+ return ptr;
+ return 0;
+}
+
+
+The function yylex must now recognize variables, numeric values, and
+the single-character arithmetic operators. Strings of alphanumeric
+characters with a leading nondigit are recognized as either variables or
+functions depending on what the symbol table says about them.
+The string is passed to getsym for look up in the symbol table. If
+the name appears in the table, a pointer to its location and its type
+(VAR or FNCT) is returned to yyparse. If it is not
+already in the table, then it is installed as a VAR using
+putsym. Again, a pointer and its type (which must be VAR) is
+returned to yyparse.
+No change is needed in the handling of numeric values and arithmetic
+operators in yylex.
+
+#include <ctype.h>
+yylex ()
+{
+ int c;
+ /* Ignore whitespace, get first nonwhite character. */
+ while ((c = getchar ()) == ' ' || c == '\t');
+ if (c == EOF)
+ return 0;
+ /* Char starts a number => parse the number. */
+ if (c == '.' || isdigit (c))
+ {
+ ungetc (c, stdin);
+ scanf ("%lf", &yylval.val);
+ return NUM;
+ }
+ /* Char starts an identifier => read the name. */
+ if (isalpha (c))
+ {
+ symrec *s;
+ static char *symbuf = 0;
+ static int length = 0;
+ int i;
+ /* Initially make the buffer long enough
+ for a 40-character symbol name. */
+ if (length == 0)
+ length = 40, symbuf = (char *)malloc (length + 1);
+ i = 0;
+ do
+ {
+ /* If buffer is full, make it bigger. */
+ if (i == length)
+ {
+ length *= 2;
+ symbuf = (char *)realloc (symbuf, length + 1);
+ }
+ /* Add this character to the buffer. */
+ symbuf[i++] = c;
+ /* Get another character. */
+ c = getchar ();
+ }
+ while (c != EOF && isalnum (c));
+ ungetc (c, stdin);
+ symbuf[i] = '\0';
+ s = getsym (symbuf);
+ if (s == 0)
+ s = putsym (symbuf, VAR);
+ yylval.tptr = s;
+ return s->type;
+ }
+ /* Any other character is a token by itself. */
+ return c;
+}
+
+
+This program is both powerful and flexible. You may easily add new
+functions, and it is a simple job to modify this code to install predefined
+variables such as pi or e as well.
+
+
+
+
+-
+Add some new functions from `math.h' to the initialization list.
+
-
+Add another array that contains constants and their values. Then
+modify
init_table to add these constants to the symbol table.
+It will be easiest to give the constants type VAR.
+ -
+Make the program report an error if the user refers to an
+uninitialized variable in any way except to store a value in it.
+
+
+
+
+Bison takes as input a context-free grammar specification and produces a
+C-language function that recognizes correct instances of the grammar.
+The Bison grammar input file conventionally has a name ending in `.y'.
+
+
+A Bison grammar file has four main sections, shown here with the
+appropriate delimiters:
+
+%{
+C declarations
+%}
+Bison declarations
+%%
+Grammar rules
+%%
+Additional C code
+
+
+Comments enclosed in `/* ... */' may appear in any of the sections.
+
+
+
+
+The C declarations section contains macro definitions and
+declarations of functions and variables that are used in the actions in the
+grammar rules. These are copied to the beginning of the parser file so
+that they precede the definition of yyparse. You can use
+`#include' to get the declarations from a header file. If you don't
+need any C declarations, you may omit the `%{' and `%}'
+delimiters that bracket this section.
+
+
+
+
+The Bison declarations section contains declarations that define
+terminal and nonterminal symbols, specify precedence, and so on.
+In some simple grammars you may not need any declarations.
+See section Bison Declarations.
+
+
+
+
+The grammar rules section contains one or more Bison grammar
+rules, and nothing else. See section Syntax of Grammar Rules.
+There must always be at least one grammar rule, and the first
+`%%' (which precedes the grammar rules) may never be omitted even
+if it is the first thing in the file.
+
+
+
+
+The additional C code section is copied verbatim to the end of
+the parser file, just as the C declarations section is copied to
+the beginning. This is the most convenient place to put anything
+that you want to have in the parser file but which need not come before
+the definition of yyparse. For example, the definitions of
+yylex and yyerror often go here. See section Parser C-Language Interface.
+If the last section is empty, you may omit the `%%' that separates it
+from the grammar rules.
+The Bison parser itself contains many static variables whose names start
+with `yy' and many macros whose names start with `YY'. It is a
+good idea to avoid using any such names (except those documented in this
+manual) in the additional C code section of the grammar file.
+
+
+
+
+
+
+Symbols in Bison grammars represent the grammatical classifications
+of the language.
+A terminal symbol (also known as a token type) represents a
+class of syntactically equivalent tokens. You use the symbol in grammar
+rules to mean that a token in that class is allowed. The symbol is
+represented in the Bison parser by a numeric code, and the yylex
+function returns a token type code to indicate what kind of token has been
+read. You don't need to know what the code value is; you can use the
+symbol to stand for it.
+A nonterminal symbol stands for a class of syntactically equivalent
+groupings. The symbol name is used in writing grammar rules. By convention,
+it should be all lower case.
+Symbol names can contain letters, digits (not at the beginning),
+underscores and periods. Periods make sense only in nonterminals.
+There are two ways of writing terminal symbols in the grammar:
+
+-
+A named token type is written with an identifier, like an
+identifier in C. By convention, it should be all upper case. Each
+such name must be defined with a Bison declaration such as
+
%token. See section Token Type Names.
+ -
+
+
+
+A character token type (or literal token) is written in
+the grammar using the same syntax used in C for character constants;
+for example,
'+' is a character token type. A character token
+type doesn't need to be declared unless you need to specify its
+semantic value data type (see section Data Types of Semantic Values), associativity, or
+precedence (see section Operator Precedence).
+By convention, a character token type is used only to represent a
+token that consists of that particular character. Thus, the token
+type '+' is used to represent the character `+' as a
+token. Nothing enforces this convention, but if you depart from it,
+your program will confuse other readers.
+All the usual escape sequences used in character literals in C can be
+used in Bison as well, but you must not use the null character as a
+character literal because its ASCII code, zero, is the code
+yylex returns for end-of-input (see section Calling Convention for yylex).
+
+
+How you choose to write a terminal symbol has no effect on its
+grammatical meaning. That depends only on where it appears in rules and
+on when the parser function returns that symbol.
+The value returned by yylex is always one of the terminal symbols
+(or 0 for end-of-input). Whichever way you write the token type in the
+grammar rules, you write it the same way in the definition of yylex.
+The numeric code for a character token type is simply the ASCII code for
+the character, so yylex can use the identical character constant to
+generate the requisite code. Each named token type becomes a C macro in
+the parser file, so yylex can use the name to stand for the code.
+(This is why periods don't make sense in terminal symbols.)
+See section Calling Convention for yylex.
+If yylex is defined in a separate file, you need to arrange for the
+token-type macro definitions to be available there. Use the `-d'
+option when you run Bison, so that it will write these macro definitions
+into a separate header file `name.tab.h' which you can include
+in the other source files that need it. See section Invoking Bison.
+The symbol error is a terminal symbol reserved for error recovery
+(see section Error Recovery); you shouldn't use it for any other purpose.
+In particular, yylex should never return this value.
+
+
+
+
+
+A Bison grammar rule has the following general form:
+
+result: components...
+ ;
+
+
+where result is the nonterminal symbol that this rule describes
+and components are various terminal and nonterminal symbols that
+are put together by this rule (see section Symbols, Terminal and Nonterminal).
+For example,
+
+exp: exp '+' exp
+ ;
+
+
+says that two groupings of type exp, with a `+' token in between,
+can be combined into a larger grouping of type exp.
+Whitespace in rules is significant only to separate symbols. You can add
+extra whitespace as you wish.
+Scattered among the components can be actions that determine
+the semantics of the rule. An action looks like this:
+
+{C statements}
+
+
+Usually there is only one action and it follows the components.
+See section Actions.
+
+Multiple rules for the same result can be written separately or can
+be joined with the vertical-bar character `|' as follows:
+
+result: rule1-components...
+ | rule2-components...
+ ...
+ ;
+
+
+They are still considered distinct rules even when joined in this way.
+If components in a rule is empty, it means that result can
+match the empty string. For example, here is how to define a
+comma-separated sequence of zero or more exp groupings:
+
+expseq: /* empty */
+ | expseq1
+ ;
+expseq1: exp
+ | expseq1 ',' exp
+ ;
+
+
+It is customary to write a comment `/* empty */' in each rule
+with no components.
+
+
+
+A rule is called recursive when its result nonterminal appears
+also on its right hand side. Nearly all Bison grammars need to use
+recursion, because that is the only way to define a sequence of any number
+of somethings. Consider this recursive definition of a comma-separated
+sequence of one or more expressions:
+
+expseq1: exp
+ | expseq1 ',' exp
+ ;
+
+
+
+
+Since the recursive use of expseq1 is the leftmost symbol in the
+right hand side, we call this left recursion. By contrast, here
+the same construct is defined using right recursion:
+
+expseq1: exp
+ | exp ',' expseq1
+ ;
+
+
+Any kind of sequence can be defined using either left recursion or
+right recursion, but you should always use left recursion, because it
+can parse a sequence of any number of elements with bounded stack
+space. Right recursion uses up space on the Bison stack in proportion
+to the number of elements in the sequence, because all the elements
+must be shifted onto the stack before the rule can be applied even
+once. See section The Bison Parser Algorithm, for
+further explanation of this.
+
+Indirect or mutual recursion occurs when the result of the
+rule does not appear directly on its right hand side, but does appear
+in rules for other nonterminals which do appear on its right hand
+side.
+For example:
+
+expr: primary
+ | primary '+' primary
+ ;
+primary: constant
+ | '(' expr ')'
+ ;
+
+
+defines two mutually-recursive nonterminals, since each refers to the
+other.
+
+
+
+
+The grammar rules for a language determine only the syntax. The semantics
+are determined by the semantic values associated with various tokens and
+groupings, and by the actions taken when various groupings are recognized.
+For example, the calculator calculates properly because the value
+associated with each expression is the proper number; it adds properly
+because the action for the grouping `x + y' is to add
+the numbers associated with x and y.
+
+
+
+
+
+
+In a simple program it may be sufficient to use the same data type for
+the semantic values of all language constructs. This was true in the
+RPN and infix calculator examples (see section Reverse Polish Notation Calculator).
+Bison's default is to use type int for all semantic values. To
+specify some other type, define YYSTYPE as a macro, like this:
+
+#define YYSTYPE double
+
+
+This macro definition must go in the C declarations section of the grammar
+file (see section Outline of a Bison Grammar).
+
+
+In most programs, you will need different data types for different kinds
+of tokens and groupings. For example, a numeric constant may need type
+int or long, while a string constant needs type char *,
+and an identifier might need a pointer to an entry in the symbol table.
+To use more than one data type for semantic values in one parser, Bison
+requires you to do two things:
+
+-
+Specify the entire collection of possible data types, with the
+
%union Bison declaration (see section The Collection of Value Types).
+ -
+Choose one of those types for each symbol (terminal or nonterminal)
+for which semantic values are used. This is done for tokens with the
+
%token Bison declaration (see section Token Type Names) and for groupings
+with the %type Bison declaration (see section Nonterminal Symbols).
+
+
+
+
+
+
+
+An action accompanies a syntactic rule and contains C code to be executed
+each time an instance of that rule is recognized. The task of most actions
+is to compute a semantic value for the grouping built by the rule from the
+semantic values associated with tokens or smaller groupings.
+An action consists of C statements surrounded by braces, much like a
+compound statement in C. It can be placed at any position in the rule; it
+is executed at that position. Most rules have just one action at the end
+of the rule, following all the components. Actions in the middle of a rule
+are tricky and used only for special purposes (see section Actions in Mid-Rule).
+The C code in an action can refer to the semantic values of the components
+matched by the rule with the construct $n, which stands for
+the value of the nth component. The semantic value for the grouping
+being constructed is $$. (Bison translates both of these constructs
+into array element references when it copies the actions into the parser
+file.)
+Here is a typical example:
+
+exp: ...
+ | exp '+' exp
+ { $$ = $1 + $3; }
+
+
+This rule constructs an exp from two smaller exp groupings
+connected by a plus-sign token. In the action, $1 and $3
+refer to the semantic values of the two component exp groupings,
+which are the first and third symbols on the right hand side of the rule.
+The sum is stored into $$ so that it becomes the semantic value of
+the addition-expression just recognized by the rule. If there were a
+useful semantic value associated with the `+' token, it could be
+referred to as $2.
+
+If you don't specify an action for a rule, Bison supplies a default:
+$$ = $1. Thus, the value of the first symbol in the rule becomes
+the value of the whole rule. Of course, the default rule is valid only
+if the two data types match. There is no meaningful default action for
+an empty rule; every empty rule must have an explicit action unless the
+rule's value does not matter.
+$n with n zero or negative is allowed for reference
+to tokens and groupings on the stack before those that match the
+current rule. This is a very risky practice, and to use it reliably
+you must be certain of the context in which the rule is applied. Here
+is a case in which you can use this reliably:
+
+foo: expr bar '+' expr { ... }
+ | expr bar '-' expr { ... }
+ ;
+bar: /* empty */
+ { previous_expr = $0; }
+ ;
+
+
+As long as bar is used only in the fashion shown here, $0
+always refers to the expr which precedes bar in the
+definition of foo.
+
+
+
+
+If you have chosen a single data type for semantic values, the $$
+and $n constructs always have that data type.
+If you have used %union to specify a variety of data types, then you
+must declare a choice among these types for each terminal or nonterminal
+symbol that can have a semantic value. Then each time you use $$ or
+$n, its data type is determined by which symbol it refers to
+in the rule. In this example,
+
+exp: ...
+ | exp '+' exp
+ { $$ = $1 + $3; }
+
+
+$1 and $3 refer to instances of exp, so they all
+have the data type declared for the nonterminal symbol exp. If
+$2 were used, it would have the data type declared for the
+terminal symbol '+', whatever that might be.
+Alternatively, you can specify the data type when you refer to the value,
+by inserting `<type>' after the `$' at the beginning of the
+reference. For example, if you have defined types as shown here:
+
+%union {
+ int itype;
+ double dtype;
+}
+
+
+then you can write $<itype>1 to refer to the first subunit of the
+rule as an integer, or $<dtype>1 to refer to it as a double.
+
+
+
+
+Occasionally it is useful to put an action in the middle of a rule.
+These actions are written just like usual end-of-rule actions, but they
+are executed before the parser even recognizes the following components.
+A mid-rule action may refer to the components preceding it using
+$n, but it may not refer to subsequent components because
+it is run before they are parsed.
+The mid-rule action itself counts as one of the components of the rule.
+This makes a difference when there is another action later in the same rule
+(and usually there is another at the end): you have to count the actions
+along with the symbols when working out which number n to use in
+$n.
+The mid-rule action can also have a semantic value. The action can set
+its value with an assignment to $$, and actions later in the rule
+can refer to the value using $n. Since there is no symbol
+to name the action, there is no way to declare a data type for the value
+in advance, so you must use the `$<...>' construct to specify a
+data type each time you refer to this value.
+There is no way to set the value of the entire rule with a mid-rule
+action, because assignments to $$ do not have that effect. The
+only way to set the value for the entire rule is with an ordinary action
+at the end of the rule.
+Here is an example from a hypothetical compiler, handling a let
+statement that looks like `let (variable) statement' and
+serves to create a variable named variable temporarily for the
+duration of statement. To parse this construct, we must put
+variable into the symbol table while statement is parsed, then
+remove it afterward. Here is how it is done:
+
+stmt: LET '(' var ')'
+ { $<context>$ = push_context ();
+ declare_variable ($3); }
+ stmt { $$ = $6;
+ pop_context ($<context>5); }
+
+
+As soon as `let (variable)' has been recognized, the first
+action is run. It saves a copy of the current semantic context (the
+list of accessible variables) as its semantic value, using alternative
+context in the data-type union. Then it calls
+declare_variable to add the new variable to that list. Once the
+first action is finished, the embedded statement stmt can be
+parsed. Note that the mid-rule action is component number 5, so the
+`stmt' is component number 6.
+After the embedded statement is parsed, its semantic value becomes the
+value of the entire let-statement. Then the semantic value from the
+earlier action is used to restore the prior list of variables. This
+removes the temporary let-variable from the list so that it won't
+appear to exist while the rest of the program is parsed.
+Taking action before a rule is completely recognized often leads to
+conflicts since the parser must commit to a parse in order to execute the
+action. For example, the following two rules, without mid-rule actions,
+can coexist in a working parser because the parser can shift the open-brace
+token and look at what follows before deciding whether there is a
+declaration or not:
+
+compound: '{' declarations statements '}'
+ | '{' statements '}'
+ ;
+
+
+But when we add a mid-rule action as follows, the rules become nonfunctional:
+
+compound: { prepare_for_local_variables (); }
+ '{' declarations statements '}'
+ | '{' statements '}'
+ ;
+
+
+Now the parser is forced to decide whether to run the mid-rule action
+when it has read no farther than the open-brace. In other words, it
+must commit to using one rule or the other, without sufficient
+information to do it correctly. (The open-brace token is what is called
+the look-ahead token at this time, since the parser is still
+deciding what to do about it. See section Look-Ahead Tokens.)
+You might think that you could correct the problem by putting identical
+actions into the two rules, like this:
+
+compound: { prepare_for_local_variables (); }
+ '{' declarations statements '}'
+ | { prepare_for_local_variables (); }
+ '{' statements '}'
+ ;
+
+
+But this does not help, because Bison does not realize that the two actions
+are identical. (Bison never tries to understand the C code in an action.)
+If the grammar is such that a declaration can be distinguished from a
+statement by the first token (which is true in C), then one solution which
+does work is to put the action after the open-brace, like this:
+
+compound: '{' { prepare_for_local_variables (); }
+ declarations statements '}'
+ | '{' statements '}'
+ ;
+
+
+Now the first token of the following declaration or statement,
+which would in any case tell Bison which rule to use, can still do so.
+Another solution is to bury the action inside a nonterminal symbol which
+serves as a subroutine:
+
+subroutine: /* empty */
+ { prepare_for_local_variables (); }
+ ;
+compound: subroutine
+ '{' declarations statements '}'
+ | subroutine
+ '{' statements '}'
+ ;
+
+
+Now Bison can execute the action in the rule for subroutine without
+deciding which rule for compound it will eventually use. Note that
+the action is now at the end of its rule. Any mid-rule action can be
+converted to an end-of-rule action in this way, and this is what Bison
+actually does to implement mid-rule actions.
+
+
+
+
+The Bison declarations section of a Bison grammar defines the symbols
+used in formulating the grammar and the data types of semantic values.
+See section Symbols, Terminal and Nonterminal.
+All token type names (but not single-character literal tokens such as
+'+' and '*') must be declared. Nonterminal symbols must be
+declared if you need to specify which data type to use for the semantic
+value (see section More Than One Value Type).
+The first rule in the file also specifies the start symbol, by default.
+If you want some other symbol to be the start symbol, you must declare
+it explicitly (see section Languages and Context-Free Grammars).
+
+
+
+
+
+The basic way to declare a token type name (terminal symbol) is as follows:
+
+%token name
+
+
+Bison will convert this into a #define directive in
+the parser, so that the function yylex (if it is in this file)
+can use the name name to stand for this token type's code.
+Alternatively, you can use %left, %right, or %nonassoc
+instead of %token, if you wish to specify precedence.
+See section Operator Precedence.
+You can explicitly specify the numeric code for a token type by appending
+an integer value in the field immediately following the token name:
+
+%token NUM 300
+
+
+It is generally best, however, to let Bison choose the numeric codes for
+all token types. Bison will automatically select codes that don't conflict
+with each other or with ASCII characters.
+In the event that the stack type is a union, you must augment the
+%token or other token declaration to include the data type
+alternative delimited by angle-brackets (see section More Than One Value Type).
+For example:
+
+%union { /* define stack type */
+ double val;
+ symrec *tptr;
+}
+%token <val> NUM /* define token NUM and its type */
+
+
+
+
+
+
+
+Use the %left, %right or %nonassoc declaration to
+declare a token and specify its precedence and associativity, all at
+once. These are called precedence declarations.
+See section Operator Precedence, for general information on operator precedence.
+The syntax of a precedence declaration is the same as that of
+%token: either
+
+%left symbols...
+
+
+or
+
+%left <type> symbols...
+
+
+And indeed any of these declarations serves the purposes of %token.
+But in addition, they specify the associativity and relative precedence for
+all the symbols:
+
+-
+The associativity of an operator op determines how repeated uses
+of the operator nest: whether `x op y op
+z' is parsed by grouping x with y first or by
+grouping y with z first.
%left specifies
+left-associativity (grouping x with y first) and
+%right specifies right-associativity (grouping y with
+z first). %nonassoc specifies no associativity, which
+means that `x op y op z' is
+considered a syntax error.
+ -
+The precedence of an operator determines how it nests with other operators.
+All the tokens declared in a single precedence declaration have equal
+precedence and nest together according to their associativity.
+When two tokens declared in different precedence declarations associate,
+the one declared later has the higher precedence and is grouped first.
+
+
+
+
+
+
+
+The %union declaration specifies the entire collection of possible
+data types for semantic values. The keyword %union is followed by a
+pair of braces containing the same thing that goes inside a union in
+C.
+For example:
+
+%union {
+ double val;
+ symrec *tptr;
+}
+
+
+This says that the two alternative types are double and symrec
+*. They are given names val and tptr; these names are used
+in the %token and %type declarations to pick one of the types
+for a terminal or nonterminal symbol (see section Nonterminal Symbols).
+Note that, unlike making a union declaration in C, you do not write
+a semicolon after the closing brace.
+
+
+
+
+
+When you use %union to specify multiple value types, you must
+declare the value type of each nonterminal symbol for which values are
+used. This is done with a %type declaration, like this:
+
+%type <type> nonterminal...
+
+
+Here nonterminal is the name of a nonterminal symbol, and type
+is the name given in the %union to the alternative that you want
+(see section The Collection of Value Types). You can give any number of nonterminal symbols in
+the same %type declaration, if they have the same value type. Use
+spaces to separate the symbol names.
+
+
+
+
+
+
+
+Bison normally warns if there are any conflicts in the grammar
+(see section Shift/Reduce Conflicts), but most real grammars have harmless shift/reduce
+conflicts which are resolved in a predictable way and would be difficult to
+eliminate. It is desirable to suppress the warning about these conflicts
+unless the number of conflicts changes. You can do this with the
+%expect declaration.
+The declaration looks like this:
+
+%expect n
+
+
+Here n is a decimal integer. The declaration says there should be no
+warning if there are n shift/reduce conflicts and no reduce/reduce
+conflicts. The usual warning is given if there are either more or fewer
+conflicts, or if there are any reduce/reduce conflicts.
+In general, using %expect involves these steps:
+
+-
+Compile your grammar without
%expect. Use the `-v' option
+to get a verbose list of where the conflicts occur. Bison will also
+print the number of conflicts.
+ -
+Check each of the conflicts to make sure that Bison's default
+resolution is what you really want. If not, rewrite the grammar and
+go back to the beginning.
+
-
+Add an
%expect declaration, copying the number n from the
+number which Bison printed.
+
+
+Now Bison will stop annoying you about the conflicts you have checked, but
+it will warn you again if changes in the grammar result in additional
+conflicts.
+
+
+
+
+
+
+Bison assumes by default that the start symbol for the grammar is the first
+nonterminal specified in the grammar specification section. The programmer
+may override this restriction with the %start declaration as follows:
+
+%start symbol
+
+
+
+
+
+
+
+A reentrant program is one which does not alter in the course of
+execution; in other words, it consists entirely of pure (read-only)
+code. Reentrancy is important whenever asynchronous execution is possible;
+for example, a nonreentrant program may not be safe to call from a signal
+handler. In systems with multiple threads of control, a nonreentrant
+program must be called only within interlocks.
+The Bison parser is not normally a reentrant program, because it uses
+statically allocated variables for communication with yylex. These
+variables include yylval and yylloc.
+The Bison declaration %pure_parser says that you want the parser
+to be reentrant. It looks like this:
+
+%pure_parser
+
+
+The effect is that the two communication variables become local
+variables in yyparse, and a different calling convention is used
+for the lexical analyzer function yylex. See section Calling Conventions for Pure Parsers, for the details of this. The
+variable yynerrs also becomes local in yyparse
+(see section The Error Reporting Function yyerror).
+The convention for calling yyparse itself is unchanged.
+
+
+
+
+
+Here is a summary of all Bison declarations:
+
+%union
+-
+Declare the collection of data types that semantic values may have
+(see section The Collection of Value Types).
+
%token
+-
+Declare a terminal symbol (token type name) with no precedence
+or associativity specified (see section Token Type Names).
+
%right
+-
+Declare a terminal symbol (token type name) that is right-associative
+(see section Operator Precedence).
+
%left
+-
+Declare a terminal symbol (token type name) that is left-associative
+(see section Operator Precedence).
+
%nonassoc
+-
+Declare a terminal symbol (token type name) that is nonassociative
+(using it in a way that would be associative is a syntax error)
+(see section Operator Precedence).
+
%type
+-
+Declare the type of semantic values for a nonterminal symbol
+(see section Nonterminal Symbols).
+
%start
+-
+Specify the grammar's start symbol (see section The Start-Symbol).
+
%expect
+-
+Declare the expected number of shift-reduce conflicts
+(see section Suppressing Conflict Warnings).
+
%pure_parser
+-
+Request a pure (reentrant) parser program (see section A Pure (Reentrant) Parser).
+
+
+
+
+Most programs that use Bison parse only one language and therefore contain
+only one Bison parser. But what if you want to parse more than one
+language with the same program? Then you need to avoid a name conflict
+between different definitions of yyparse, yylval, and so on.
+The easy way to do this is to use the option `-p prefix'
+(see section Invoking Bison). This renames the interface functions and
+variables of the Bison parser to start with prefix instead of
+`yy'. You can use this to give each parser distinct names that do
+not conflict.
+The precise list of symbols renamed is yyparse, yylex,
+yyerror, yynerrs, yylval, yychar and
+yydebug. For example, if you use `-p c', the names become
+cparse, clex, and so on.
+All the other variables and macros associated with Bison are not
+renamed. These others are not global; there is no conflict if the same
+name is used in different parsers. For example, YYSTYPE is not
+renamed, but defining this in different ways in different parsers causes
+no trouble (see section Data Types of Semantic Values).
+The `-p' option works by adding macro definitions to the beginning
+of the parser source file, defining yyparse as
+prefixparse, and so on. This effectively substitutes one
+name for the other in the entire parser file.
+
+
+
+
+The Bison parser is actually a C function named yyparse. Here we
+describe the interface conventions of yyparse and the other
+functions that it needs to use.
+Keep in mind that the parser uses many C identifiers starting with
+`yy' and `YY' for internal purposes. If you use such an
+identifier (aside from those in this manual) in an action or in additional
+C code in the grammar file, you are likely to run into trouble.
+
+
+
+You call the function yyparse to cause parsing to occur. This
+function reads tokens, executes actions, and ultimately returns when it
+encounters end-of-input or an unrecoverable syntax error. You can also
+write an action which directs yyparse to return immediately without
+reading further.
+The value returned by yyparse is 0 if parsing was successful (return
+is due to end-of-input).
+The value is 1 if parsing failed (return is due to a syntax error).
+In an action, you can cause immediate return from yyparse by using
+these macros:
+
+YYACCEPT
+-
+
+Return immediately with value 0 (to report success).
+
YYABORT
+-
+
+Return immediately with value 1 (to report failure).
+
+
+
+
+
+
+The lexical analyzer function, yylex, recognizes tokens from
+the input stream and returns them to the parser. Bison does not create
+this function automatically; you must write it so that yyparse can
+call it. The function is sometimes referred to as a lexical scanner.
+In simple programs, yylex is often defined at the end of the Bison
+grammar file. If yylex is defined in a separate source file, you
+need to arrange for the token-type macro definitions to be available there.
+To do this, use the `-d' option when you run Bison, so that it will
+write these macro definitions into a separate header file
+`name.tab.h' which you can include in the other source files
+that need it. See section Invoking Bison.
+
+
+The value that yylex returns must be the numeric code for the type
+of token it has just found, or 0 for end-of-input.
+When a token is referred to in the grammar rules by a name, that name
+in the parser file becomes a C macro whose definition is the proper
+numeric code for that token type. So yylex can use the name
+to indicate that type. See section Symbols, Terminal and Nonterminal.
+When a token is referred to in the grammar rules by a character literal,
+the numeric code for that character is also the code for the token type.
+So yylex can simply return that character code. The null character
+must not be used this way, because its code is zero and that is what
+signifies end-of-input.
+Here is an example showing these things:
+
+yylex ()
+{
+ ...
+ if (c == EOF) /* Detect end of file. */
+ return 0;
+ ...
+ if (c == '+' || c == '-')
+ return c; /* Assume token type for `+' is '+'. */
+ ...
+ return INT; /* Return the type of the token. */
+ ...
+}
+
+
+This interface has been designed so that the output from the lex
+utility can be used without change as the definition of yylex.
+
+
+
+In an ordinary (nonreentrant) parser, the semantic value of the token must
+be stored into the global variable yylval. When you are using
+just one data type for semantic values, yylval has that type.
+Thus, if the type is int (the default), you might write this in
+yylex:
+
+ ...
+ yylval = value; /* Put value onto Bison stack. */
+ return INT; /* Return the type of the token. */
+ ...
+
+
+When you are using multiple data types, yylval's type is a union
+made from the %union declaration (see section The Collection of Value Types). So when
+you store a token's value, you must use the proper member of the union.
+If the %union declaration looks like this:
+
+%union {
+ int intval;
+ double val;
+ symrec *tptr;
+}
+
+
+then the code in yylex might look like this:
+
+ ...
+ yylval.intval = value; /* Put value onto Bison stack. */
+ return INT; /* Return the type of the token. */
+ ...
+
+
+
+
+
+If you are using the `@n'-feature (see section Special Features for Use in Actions) in
+actions to keep track of the textual locations of tokens and groupings,
+then you must provide this information in yylex. The function
+yyparse expects to find the textual location of a token just parsed
+in the global variable yylloc. So yylex must store the
+proper data in that variable. The value of yylloc is a structure
+and you need only initialize the members that are going to be used by the
+actions. The four members are called first_line,
+first_column, last_line and last_column. Note that
+the use of this feature makes the parser noticeably slower.
+
+The data type of yylloc has the name YYLTYPE.
+
+
+When you use the Bison declaration %pure_parser to request a
+pure, reentrant parser, the global communication variables yylval
+and yylloc cannot be used. (See section A Pure (Reentrant) Parser.) In such parsers the two global variables are replaced by
+pointers passed as arguments to yylex. You must declare them as
+shown here, and pass the information back by storing it through those
+pointers.
+
+yylex (lvalp, llocp)
+ YYSTYPE *lvalp;
+ YYLTYPE *llocp;
+{
+ ...
+ *lvalp = value; /* Put value onto Bison stack. */
+ return INT; /* Return the type of the token. */
+ ...
+}
+
+
+If the grammar file does not use the `@' constructs to refer to
+textual positions, then the type YYLTYPE will not be defined. In
+this case, omit the second argument; yylex will be called with
+only one argument.
+
+You can pass parameter information to a reentrant parser in a reentrant
+way. Define the macro YYPARSE_PARAM as a variable name. The
+resulting yyparse function then accepts one argument, of type
+void *, with that name.
+When you call yyparse, pass the address of an object, casting the
+address to void *. The grammar actions can refer to the contents
+of the object by casting the pointer value back to its proper type and
+then dereferencing it. Here's an example. Write this in the parser:
+
+%{
+struct parser_control
+{
+ int nastiness;
+ int randomness;
+};
+#define YYPARSE_PARAM parm
+%}
+
+
+Then call the parser like this:
+
+struct parser_control
+{
+ int nastiness;
+ int randomness;
+};
+...
+{
+ struct parser_control foo;
+ ... /* Store proper data in foo. */
+ value = yyparse ((void *) &foo);
+ ...
+}
+
+
+In the grammar actions, use expressions like this to refer to the data:
+
+((struct parser_control *) parm)->randomness
+
+
+
+If you wish to pass the additional parameter data to yylex,
+define the macro YYLEX_PARAM just like YYPARSE_PARAM, as
+shown here:
+
+%{
+struct parser_control
+{
+ int nastiness;
+ int randomness;
+};
+#define YYPARSE_PARAM parm
+#define YYLEX_PARAM parm
+%}
+
+
+You should then define yylex to accept one additional
+argument--the value of parm. (This makes either two or three
+arguments in total, depending on whether an argument of type
+YYLTYPE is passed.) You can declare the argument as a pointer to
+the proper object type, or you can declare it as void * and
+access the contents as shown above.
+
+
+
+
+
+
+The Bison parser detects a parse error or syntax error
+whenever it reads a token which cannot satisfy any syntax rule. A
+action in the grammar can also explicitly proclaim an error, using the
+macro YYERROR (see section Special Features for Use in Actions).
+The Bison parser expects to report the error by calling an error
+reporting function named yyerror, which you must supply. It is
+called by yyparse whenever a syntax error is found, and it
+receives one argument. For a parse error, the string is normally
+"parse error".
+
+If you define the macro YYERROR_VERBOSE in the Bison declarations
+section (see section The Bison Declarations Section), then Bison provides a more verbose
+and specific error message string instead of just plain "parse
+error". It doesn't matter what definition you use for
+YYERROR_VERBOSE, just whether you define it.
+The parser can detect one other kind of error: stack overflow. This
+happens when the input contains constructions that are very deeply
+nested. It isn't likely you will encounter this, since the Bison
+parser extends its stack automatically up to a very large limit. But
+if overflow happens, yyparse calls yyerror in the usual
+fashion, except that the argument string is "parser stack
+overflow".
+The following definition suffices in simple programs:
+
+yyerror (s)
+ char *s;
+{
+ fprintf (stderr, "%s\n", s);
+}
+
+
+After yyerror returns to yyparse, the latter will attempt
+error recovery if you have written suitable error recovery grammar rules
+(see section Error Recovery). If recovery is impossible, yyparse will
+immediately return 1.
+
+The variable yynerrs contains the number of syntax errors
+encountered so far. Normally this variable is global; but if you
+request a pure parser (see section A Pure (Reentrant) Parser) then it is a local variable
+which only the actions can access.
+
+
+
+
+Here is a table of Bison constructs, variables and macros that
+are useful in actions.
+
+- `$$'
+
-
+Acts like a variable that contains the semantic value for the
+grouping made by the current rule. See section Actions.
+
- `$n'
+
-
+Acts like a variable that contains the semantic value for the
+nth component of the current rule. See section Actions.
+
- `$<typealt>$'
+
-
+Like
$$ but specifies alternative typealt in the union
+specified by the %union declaration. See section Data Types of Values in Actions.
+ - `$<typealt>n'
+
-
+Like
$n but specifies alternative typealt in the
+union specified by the %union declaration.
+See section Data Types of Values in Actions.
+ - `YYABORT;'
+
-
+Return immediately from
yyparse, indicating failure.
+See section The Parser Function yyparse.
+ - `YYACCEPT;'
+
-
+Return immediately from
yyparse, indicating success.
+See section The Parser Function yyparse.
+ - `YYBACKUP (token, value);'
+
-
+
+Unshift a token. This macro is allowed only for rules that reduce
+a single value, and only when there is no look-ahead token.
+It installs a look-ahead token with token type token and
+semantic value value; then it discards the value that was
+going to be reduced by this rule.
+If the macro is used when it is not valid, such as when there is
+a look-ahead token already, then it reports a syntax error with
+a message `cannot back up' and performs ordinary error
+recovery.
+In either case, the rest of the action is not executed.
+
- `YYEMPTY'
+
-
+
+Value stored in
yychar when there is no look-ahead token.
+ - `YYERROR;'
+
-
+
+Cause an immediate syntax error. This statement initiates error
+recovery just as if the parser itself had detected an error; however, it
+does not call
yyerror, and does not print any message. If you
+want to print an error message, call yyerror explicitly before
+the `YYERROR;' statement. See section Error Recovery.
+ - `YYRECOVERING'
+
-
+This macro stands for an expression that has the value 1 when the parser
+is recovering from a syntax error, and 0 the rest of the time.
+See section Error Recovery.
+
- `yychar'
+
-
+Variable containing the current look-ahead token. (In a pure parser,
+this is actually a local variable within
yyparse.) When there is
+no look-ahead token, the value YYEMPTY is stored in the variable.
+See section Look-Ahead Tokens.
+ - `yyclearin;'
+
-
+Discard the current look-ahead token. This is useful primarily in
+error rules. See section Error Recovery.
+
- `yyerrok;'
+
-
+Resume generating error messages immediately for subsequent syntax
+errors. This is useful primarily in error rules.
+See section Error Recovery.
+
- `@n'
+
-
+
+Acts like a structure variable containing information on the line
+numbers and column numbers of the nth component of the current
+rule. The structure has four members, like this:
+
+struct {
+ int first_line, last_line;
+ int first_column, last_column;
+};
+
+Thus, to get the starting line number of the third component, use
+`@3.first_line'.
+In order for the members of this structure to contain valid information,
+you must make yylex supply this information about each token.
+If you need only certain members, then yylex need only fill in
+those members.
+The use of this feature makes the parser noticeably slower.
+
+
+
+
+
+
+
+
+
+
+As Bison reads tokens, it pushes them onto a stack along with their
+semantic values. The stack is called the parser stack. Pushing a
+token is traditionally called shifting.
+For example, suppose the infix calculator has read `1 + 5 *', with a
+`3' to come. The stack will have four elements, one for each token
+that was shifted.
+But the stack does not always have an element for each token read. When
+the last n tokens and groupings shifted match the components of a
+grammar rule, they can be combined according to that rule. This is called
+reduction. Those tokens and groupings are replaced on the stack by a
+single grouping whose symbol is the result (left hand side) of that rule.
+Running the rule's action is part of the process of reduction, because this
+is what computes the semantic value of the resulting grouping.
+For example, if the infix calculator's parser stack contains this:
+
+1 + 5 * 3
+
+
+and the next input token is a newline character, then the last three
+elements can be reduced to 15 via the rule:
+
+expr: expr '*' expr;
+
+
+Then the stack contains just these three elements:
+
+1 + 15
+
+
+At this point, another reduction can be made, resulting in the single value
+16. Then the newline token can be shifted.
+The parser tries, by shifts and reductions, to reduce the entire input down
+to a single grouping whose symbol is the grammar's start-symbol
+(see section Languages and Context-Free Grammars).
+This kind of parser is known in the literature as a bottom-up parser.
+
+
+
+The Bison parser does not always reduce immediately as soon as the
+last n tokens and groupings match a rule. This is because such a
+simple strategy is inadequate to handle most languages. Instead, when a
+reduction is possible, the parser sometimes "looks ahead" at the next
+token in order to decide what to do.
+When a token is read, it is not immediately shifted; first it becomes the
+look-ahead token, which is not on the stack. Now the parser can
+perform one or more reductions of tokens and groupings on the stack, while
+the look-ahead token remains off to the side. When no more reductions
+should take place, the look-ahead token is shifted onto the stack. This
+does not mean that all possible reductions have been done; depending on the
+token type of the look-ahead token, some rules may choose to delay their
+application.
+Here is a simple case where look-ahead is needed. These three rules define
+expressions which contain binary addition operators and postfix unary
+factorial operators (`!'), and allow parentheses for grouping.
+
+expr: term '+' expr
+ | term
+ ;
+term: '(' expr ')'
+ | term '!'
+ | NUMBER
+ ;
+
+
+Suppose that the tokens `1 + 2' have been read and shifted; what
+should be done? If the following token is `)', then the first three
+tokens must be reduced to form an expr. This is the only valid
+course, because shifting the `)' would produce a sequence of symbols
+term ')', and no rule allows this.
+If the following token is `!', then it must be shifted immediately so
+that `2 !' can be reduced to make a term. If instead the
+parser were to reduce before shifting, `1 + 2' would become an
+expr. It would then be impossible to shift the `!' because
+doing so would produce on the stack the sequence of symbols expr
+'!'. No rule allows that sequence.
+
+The current look-ahead token is stored in the variable yychar.
+See section Special Features for Use in Actions.
+
+
+
+
+
+
+Suppose we are parsing a language which has if-then and if-then-else
+statements, with a pair of rules like this:
+
+if_stmt:
+ IF expr THEN stmt
+ | IF expr THEN stmt ELSE stmt
+ ;
+
+
+Here we assume that IF, THEN and ELSE are
+terminal symbols for specific keyword tokens.
+When the ELSE token is read and becomes the look-ahead token, the
+contents of the stack (assuming the input is valid) are just right for
+reduction by the first rule. But it is also legitimate to shift the
+ELSE, because that would lead to eventual reduction by the second
+rule.
+This situation, where either a shift or a reduction would be valid, is
+called a shift/reduce conflict. Bison is designed to resolve
+these conflicts by choosing to shift, unless otherwise directed by
+operator precedence declarations. To see the reason for this, let's
+contrast it with the other alternative.
+Since the parser prefers to shift the ELSE, the result is to attach
+the else-clause to the innermost if-statement, making these two inputs
+equivalent:
+
+if x then if y then win (); else lose;
+if x then do; if y then win (); else lose; end;
+
+
+But if the parser chose to reduce when possible rather than shift, the
+result would be to attach the else-clause to the outermost if-statement,
+making these two inputs equivalent:
+
+if x then if y then win (); else lose;
+if x then do; if y then win (); end; else lose;
+
+
+The conflict exists because the grammar as written is ambiguous: either
+parsing of the simple nested if-statement is legitimate. The established
+convention is that these ambiguities are resolved by attaching the
+else-clause to the innermost if-statement; this is what Bison accomplishes
+by choosing to shift rather than reduce. (It would ideally be cleaner to
+write an unambiguous grammar, but that is very hard to do in this case.)
+This particular ambiguity was first encountered in the specifications of
+Algol 60 and is called the "dangling else" ambiguity.
+To avoid warnings from Bison about predictable, legitimate shift/reduce
+conflicts, use the %expect n declaration. There will be no
+warning as long as the number of shift/reduce conflicts is exactly n.
+See section Suppressing Conflict Warnings.
+The definition of if_stmt above is solely to blame for the
+conflict, but the conflict does not actually appear without additional
+rules. Here is a complete Bison input file that actually manifests the
+conflict:
+
+%token IF THEN ELSE variable
+%%
+stmt: expr
+ | if_stmt
+ ;
+if_stmt:
+ IF expr THEN stmt
+ | IF expr THEN stmt ELSE stmt
+ ;
+expr: variable
+ ;
+
+
+
+
+
+
+Another situation where shift/reduce conflicts appear is in arithmetic
+expressions. Here shifting is not always the preferred resolution; the
+Bison declarations for operator precedence allow you to specify when to
+shift and when to reduce.
+
+
+Consider the following ambiguous grammar fragment (ambiguous because the
+input `1 - 2 * 3' can be parsed in two different ways):
+
+expr: expr '-' expr
+ | expr '*' expr
+ | expr '<' expr
+ | '(' expr ')'
+ ...
+ ;
+
+
+Suppose the parser has seen the tokens `1', `-' and `2';
+should it reduce them via the rule for the addition operator? It depends
+on the next token. Of course, if the next token is `)', we must
+reduce; shifting is invalid because no single rule can reduce the token
+sequence `- 2 )' or anything starting with that. But if the next
+token is `*' or `<', we have a choice: either shifting or
+reduction would allow the parse to complete, but with different
+results.
+To decide which one Bison should do, we must consider the
+results. If the next operator token op is shifted, then it
+must be reduced first in order to permit another opportunity to
+reduce the sum. The result is (in effect) `1 - (2
+op 3)'. On the other hand, if the subtraction is reduced
+before shifting op, the result is `(1 - 2) op
+3'. Clearly, then, the choice of shift or reduce should depend
+on the relative precedence of the operators `-' and
+op: `*' should be shifted first, but not `<'.
+
+What about input such as `1 - 2 - 5'; should this be
+`(1 - 2) - 5' or should it be `1 - (2 - 5)'? For
+most operators we prefer the former, which is called left
+association. The latter alternative, right association, is
+desirable for assignment operators. The choice of left or right
+association is a matter of whether the parser chooses to shift or
+reduce when the stack contains `1 - 2' and the look-ahead
+token is `-': shifting makes right-associativity.
+
+
+
+
+
+Bison allows you to specify these choices with the operator precedence
+declarations %left and %right. Each such declaration
+contains a list of tokens, which are operators whose precedence and
+associativity is being declared. The %left declaration makes all
+those operators left-associative and the %right declaration makes
+them right-associative. A third alternative is %nonassoc, which
+declares that it is a syntax error to find the same operator twice "in a
+row".
+The relative precedence of different operators is controlled by the
+order in which they are declared. The first %left or
+%right declaration in the file declares the operators whose
+precedence is lowest, the next such declaration declares the operators
+whose precedence is a little higher, and so on.
+
+
+In our example, we would want the following declarations:
+
+%left '<'
+%left '-'
+%left '*'
+
+
+In a more complete example, which supports other operators as well, we
+would declare them in groups of equal precedence. For example, '+' is
+declared with '-':
+
+%left '<' '>' '=' NE LE GE
+%left '+' '-'
+%left '*' '/'
+
+
+(Here NE and so on stand for the operators for "not equal"
+and so on. We assume that these tokens are more than one character long
+and therefore are represented by names, not character literals.)
+
+
+The first effect of the precedence declarations is to assign precedence
+levels to the terminal symbols declared. The second effect is to assign
+precedence levels to certain rules: each rule gets its precedence from the
+last terminal symbol mentioned in the components. (You can also specify
+explicitly the precedence of a rule. See section Context-Dependent Precedence.)
+Finally, the resolution of conflicts works by comparing the
+precedence of the rule being considered with that of the
+look-ahead token. If the token's precedence is higher, the
+choice is to shift. If the rule's precedence is higher, the
+choice is to reduce. If they have equal precedence, the choice
+is made based on the associativity of that precedence level. The
+verbose output file made by `-v' (see section Invoking Bison) says
+how each conflict was resolved.
+Not all rules and not all tokens have precedence. If either the rule or
+the look-ahead token has no precedence, then the default is to shift.
+
+
+
+
+
+
+
+Often the precedence of an operator depends on the context. This sounds
+outlandish at first, but it is really very common. For example, a minus
+sign typically has a very high precedence as a unary operator, and a
+somewhat lower precedence (lower than multiplication) as a binary operator.
+The Bison precedence declarations, %left, %right and
+%nonassoc, can only be used once for a given token; so a token has
+only one precedence declared in this way. For context-dependent
+precedence, you need to use an additional mechanism: the %prec
+modifier for rules.
+The %prec modifier declares the precedence of a particular rule by
+specifying a terminal symbol whose precedence should be used for that rule.
+It's not necessary for that symbol to appear otherwise in the rule. The
+modifier's syntax is:
+
+%prec terminal-symbol
+
+
+and it is written after the components of the rule. Its effect is to
+assign the rule the precedence of terminal-symbol, overriding
+the precedence that would be deduced for it in the ordinary way. The
+altered rule precedence then affects how conflicts involving that rule
+are resolved (see section Operator Precedence).
+Here is how %prec solves the problem of unary minus. First, declare
+a precedence for a fictitious terminal symbol named UMINUS. There
+are no tokens of this type, but the symbol serves to stand for its
+precedence:
+
+...
+%left '+' '-'
+%left '*'
+%left UMINUS
+
+
+Now the precedence of UMINUS can be used in specific rules:
+
+exp: ...
+ | exp '-' exp
+ ...
+ | '-' exp %prec UMINUS
+
+
+
+
+
+
+
+The function yyparse is implemented using a finite-state machine.
+The values pushed on the parser stack are not simply token type codes; they
+represent the entire sequence of terminal and nonterminal symbols at or
+near the top of the stack. The current state collects all the information
+about previous input which is relevant to deciding what to do next.
+Each time a look-ahead token is read, the current parser state together
+with the type of look-ahead token are looked up in a table. This table
+entry can say, "Shift the look-ahead token." In this case, it also
+specifies the new parser state, which is pushed onto the top of the
+parser stack. Or it can say, "Reduce using rule number n."
+This means that a certain number of tokens or groupings are taken off
+the top of the stack, and replaced by one grouping. In other words,
+that number of states are popped from the stack, and one new state is
+pushed.
+There is one other alternative: the table can say that the look-ahead token
+is erroneous in the current state. This causes error processing to begin
+(see section Error Recovery).
+
+
+
+
+A reduce/reduce conflict occurs if there are two or more rules that apply
+to the same sequence of input. This usually indicates a serious error
+in the grammar.
+For example, here is an erroneous attempt to define a sequence
+of zero or more word groupings.
+
+sequence: /* empty */
+ { printf ("empty sequence\n"); }
+ | maybeword
+ | sequence word
+ { printf ("added word %s\n", $2); }
+ ;
+maybeword: /* empty */
+ { printf ("empty maybeword\n"); }
+ | word
+ { printf ("single word %s\n", $1); }
+ ;
+
+
+The error is an ambiguity: there is more than one way to parse a single
+word into a sequence. It could be reduced to a
+maybeword and then into a sequence via the second rule.
+Alternatively, nothing-at-all could be reduced into a sequence
+via the first rule, and this could be combined with the word
+using the third rule for sequence.
+There is also more than one way to reduce nothing-at-all into a
+sequence. This can be done directly via the first rule,
+or indirectly via maybeword and then the second rule.
+You might think that this is a distinction without a difference, because it
+does not change whether any particular input is valid or not. But it does
+affect which actions are run. One parsing order runs the second rule's
+action; the other runs the first rule's action and the third rule's action.
+In this example, the output of the program changes.
+Bison resolves a reduce/reduce conflict by choosing to use the rule that
+appears first in the grammar, but it is very risky to rely on this. Every
+reduce/reduce conflict must be studied and usually eliminated. Here is the
+proper way to define sequence:
+
+sequence: /* empty */
+ { printf ("empty sequence\n"); }
+ | sequence word
+ { printf ("added word %s\n", $2); }
+ ;
+
+
+Here is another common error that yields a reduce/reduce conflict:
+
+sequence: /* empty */
+ | sequence words
+ | sequence redirects
+ ;
+words: /* empty */
+ | words word
+ ;
+redirects:/* empty */
+ | redirects redirect
+ ;
+
+
+The intention here is to define a sequence which can contain either
+word or redirect groupings. The individual definitions of
+sequence, words and redirects are error-free, but the
+three together make a subtle ambiguity: even an empty input can be parsed
+in infinitely many ways!
+Consider: nothing-at-all could be a words. Or it could be two
+words in a row, or three, or any number. It could equally well be a
+redirects, or two, or any number. Or it could be a words
+followed by three redirects and another words. And so on.
+Here are two ways to correct these rules. First, to make it a single level
+of sequence:
+
+sequence: /* empty */
+ | sequence word
+ | sequence redirect
+ ;
+
+
+Second, to prevent either a words or a redirects
+from being empty:
+
+sequence: /* empty */
+ | sequence words
+ | sequence redirects
+ ;
+words: word
+ | words word
+ ;
+redirects:redirect
+ | redirects redirect
+ ;
+
+
+
+
+Sometimes reduce/reduce conflicts can occur that don't look warranted.
+Here is an example:
+
+%token ID
+%%
+def: param_spec return_spec ','
+ ;
+param_spec:
+ type
+ | name_list ':' type
+ ;
+return_spec:
+ type
+ | name ':' type
+ ;
+type: ID
+ ;
+name: ID
+ ;
+name_list:
+ name
+ | name ',' name_list
+ ;
+
+
+It would seem that this grammar can be parsed with only a single token
+of look-ahead: when a param_spec is being read, an ID is
+a name if a comma or colon follows, or a type if another
+ID follows. In other words, this grammar is LR(1).
+
+
+However, Bison, like most parser generators, cannot actually handle all
+LR(1) grammars. In this grammar, two contexts, that after an ID
+at the beginning of a param_spec and likewise at the beginning of
+a return_spec, are similar enough that Bison assumes they are the
+same. They appear similar because the same set of rules would be
+active--the rule for reducing to a name and that for reducing to
+a type. Bison is unable to determine at that stage of processing
+that the rules would require different look-ahead tokens in the two
+contexts, so it makes a single parser state for them both. Combining
+the two contexts causes a conflict later. In parser terminology, this
+occurrence means that the grammar is not LALR(1).
+In general, it is better to fix deficiencies than to document them. But
+this particular deficiency is intrinsically hard to fix; parser
+generators that can handle LR(1) grammars are hard to write and tend to
+produce parsers that are very large. In practice, Bison is more useful
+as it is now.
+When the problem arises, you can often fix it by identifying the two
+parser states that are being confused, and adding something to make them
+look distinct. In the above example, adding one rule to
+return_spec as follows makes the problem go away:
+
+%token BOGUS
+...
+%%
+...
+return_spec:
+ type
+ | name ':' type
+ /* This rule is never used. */
+ | ID BOGUS
+ ;
+
+
+This corrects the problem because it introduces the possibility of an
+additional active rule in the context after the ID at the beginning of
+return_spec. This rule is not active in the corresponding context
+in a param_spec, so the two contexts receive distinct parser states.
+As long as the token BOGUS is never generated by yylex,
+the added rule cannot alter the way actual input is parsed.
+In this particular example, there is another way to solve the problem:
+rewrite the rule for return_spec to use ID directly
+instead of via name. This also causes the two confusing
+contexts to have different sets of active rules, because the one for
+return_spec activates the altered rule for return_spec
+rather than the one for name.
+
+param_spec:
+ type
+ | name_list ':' type
+ ;
+return_spec:
+ type
+ | ID ':' type
+ ;
+
+
+
+
+
+
+
+The Bison parser stack can overflow if too many tokens are shifted and
+not reduced. When this happens, the parser function yyparse
+returns a nonzero value, pausing only to call yyerror to report
+the overflow.
+
+By defining the macro YYMAXDEPTH, you can control how deep the
+parser stack can become before a stack overflow occurs. Define the
+macro with a value that is an integer. This value is the maximum number
+of tokens that can be shifted (and not reduced) before overflow.
+It must be a constant expression whose value is known at compile time.
+The stack space allowed is not necessarily allocated. If you specify a
+large value for YYMAXDEPTH, the parser actually allocates a small
+stack at first, and then makes it bigger by stages as needed. This
+increasing allocation happens automatically and silently. Therefore,
+you do not need to make YYMAXDEPTH painfully small merely to save
+space for ordinary inputs that do not need much stack.
+
+The default value of YYMAXDEPTH, if you do not define it, is
+10000.
+
+You can control how much stack is allocated initially by defining the
+macro YYINITDEPTH. This value too must be a compile-time
+constant integer. The default is 200.
+
+
+
+
+It is not usually acceptable to have a program terminate on a parse
+error. For example, a compiler should recover sufficiently to parse the
+rest of the input file and check it for errors; a calculator should accept
+another expression.
+In a simple interactive command parser where each input is one line, it may
+be sufficient to allow yyparse to return 1 on error and have the
+caller ignore the rest of the input line when that happens (and then call
+yyparse again). But this is inadequate for a compiler, because it
+forgets all the syntactic context leading up to the error. A syntax error
+deep within a function in the compiler input should not cause the compiler
+to treat the following line like the beginning of a source file.
+
+You can define how to recover from a syntax error by writing rules to
+recognize the special token error. This is a terminal symbol that
+is always defined (you need not declare it) and reserved for error
+handling. The Bison parser generates an error token whenever a
+syntax error happens; if you have provided a rule to recognize this token
+in the current context, the parse can continue.
+For example:
+
+stmnts: /* empty string */
+ | stmnts '\n'
+ | stmnts exp '\n'
+ | stmnts error '\n'
+
+
+The fourth rule in this example says that an error followed by a newline
+makes a valid addition to any stmnts.
+What happens if a syntax error occurs in the middle of an exp? The
+error recovery rule, interpreted strictly, applies to the precise sequence
+of a stmnts, an error and a newline. If an error occurs in
+the middle of an exp, there will probably be some additional tokens
+and subexpressions on the stack after the last stmnts, and there
+will be tokens to read before the next newline. So the rule is not
+applicable in the ordinary way.
+But Bison can force the situation to fit the rule, by discarding part of
+the semantic context and part of the input. First it discards states and
+objects from the stack until it gets back to a state in which the
+error token is acceptable. (This means that the subexpressions
+already parsed are discarded, back to the last complete stmnts.) At
+this point the error token can be shifted. Then, if the old
+look-ahead token is not acceptable to be shifted next, the parser reads
+tokens and discards them until it finds a token which is acceptable. In
+this example, Bison reads and discards input until the next newline
+so that the fourth rule can apply.
+The choice of error rules in the grammar is a choice of strategies for
+error recovery. A simple and useful strategy is simply to skip the rest of
+the current input line or current statement if an error is detected:
+
+stmnt: error ';' /* on error, skip until ';' is read */
+
+
+It is also useful to recover to the matching close-delimiter of an
+opening-delimiter that has already been parsed. Otherwise the
+close-delimiter will probably appear to be unmatched, and generate another,
+spurious error message:
+
+primary: '(' expr ')'
+ | '(' error ')'
+ ...
+ ;
+
+
+Error recovery strategies are necessarily guesses. When they guess wrong,
+one syntax error often leads to another. In the above example, the error
+recovery rule guesses that an error is due to bad input within one
+stmnt. Suppose that instead a spurious semicolon is inserted in the
+middle of a valid stmnt. After the error recovery rule recovers
+from the first error, another syntax error will be found straightaway,
+since the text following the spurious semicolon is also an invalid
+stmnt.
+To prevent an outpouring of error messages, the parser will output no error
+message for another syntax error that happens shortly after the first; only
+after three consecutive input tokens have been successfully shifted will
+error messages resume.
+Note that rules which accept the error token may have actions, just
+as any other rules can.
+
+You can make error messages resume immediately by using the macro
+yyerrok in an action. If you do this in the error rule's action, no
+error messages will be suppressed. This macro requires no arguments;
+`yyerrok;' is a valid C statement.
+
+The previous look-ahead token is reanalyzed immediately after an error. If
+this is unacceptable, then the macro yyclearin may be used to clear
+this token. Write the statement `yyclearin;' in the error rule's
+action.
+For example, suppose that on a parse error, an error handling routine is
+called that advances the input stream to some point where parsing should
+once again commence. The next symbol returned by the lexical scanner is
+probably correct. The previous look-ahead token ought to be discarded
+with `yyclearin;'.
+
+The macro YYRECOVERING stands for an expression that has the
+value 1 when the parser is recovering from a syntax error, and 0 the
+rest of the time. A value of 1 indicates that error messages are
+currently suppressed for new syntax errors.
+
+
+The Bison paradigm is to parse tokens first, then group them into larger
+syntactic units. In many languages, the meaning of a token is affected by
+its context. Although this violates the Bison paradigm, certain techniques
+(known as kludges) may enable you to write Bison parsers for such
+languages.
+(Actually, "kludge" means any technique that gets its job done but is
+neither clean nor robust.)
+
+
+The C language has a context dependency: the way an identifier is used
+depends on what its current meaning is. For example, consider this:
+
+foo (x);
+
+
+This looks like a function call statement, but if foo is a typedef
+name, then this is actually a declaration of x. How can a Bison
+parser for C decide how to parse this input?
+The method used in GNU C is to have two different token types,
+IDENTIFIER and TYPENAME. When yylex finds an
+identifier, it looks up the current declaration of the identifier in order
+to decide which token type to return: TYPENAME if the identifier is
+declared as a typedef, IDENTIFIER otherwise.
+The grammar rules can then express the context dependency by the choice of
+token type to recognize. IDENTIFIER is accepted as an expression,
+but TYPENAME is not. TYPENAME can start a declaration, but
+IDENTIFIER cannot. In contexts where the meaning of the identifier
+is not significant, such as in declarations that can shadow a
+typedef name, either TYPENAME or IDENTIFIER is
+accepted--there is one rule for each of the two token types.
+This technique is simple to use if the decision of which kinds of
+identifiers to allow is made at a place close to where the identifier is
+parsed. But in C this is not always so: C allows a declaration to
+redeclare a typedef name provided an explicit type has been specified
+earlier:
+
+typedef int foo, bar, lose;
+static foo (bar); /* redeclare bar as static variable */
+static int foo (lose); /* redeclare foo as function */
+
+
+Unfortunately, the name being declared is separated from the declaration
+construct itself by a complicated syntactic structure--the "declarator".
+As a result, the part of Bison parser for C needs to be duplicated, with
+all the nonterminal names changed: once for parsing a declaration in which
+a typedef name can be redefined, and once for parsing a declaration in
+which that can't be done. Here is a part of the duplication, with actions
+omitted for brevity:
+
+initdcl:
+ declarator maybeasm '='
+ init
+ | declarator maybeasm
+ ;
+notype_initdcl:
+ notype_declarator maybeasm '='
+ init
+ | notype_declarator maybeasm
+ ;
+
+
+Here initdcl can redeclare a typedef name, but notype_initdcl
+cannot. The distinction between declarator and
+notype_declarator is the same sort of thing.
+There is some similarity between this technique and a lexical tie-in
+(described next), in that information which alters the lexical analysis is
+changed during parsing by other parts of the program. The difference is
+here the information is global, and is used for other purposes in the
+program. A true lexical tie-in has a special-purpose flag controlled by
+the syntactic context.
+
+
+
+One way to handle context-dependency is the lexical tie-in: a flag
+which is set by Bison actions, whose purpose is to alter the way tokens are
+parsed.
+For example, suppose we have a language vaguely like C, but with a special
+construct `hex (hex-expr)'. After the keyword hex comes
+an expression in parentheses in which all integers are hexadecimal. In
+particular, the token `a1b' must be treated as an integer rather than
+as an identifier if it appears in that context. Here is how you can do it:
+
+%{
+int hexflag;
+%}
+%%
+...
+expr: IDENTIFIER
+ | constant
+ | HEX '('
+ { hexflag = 1; }
+ expr ')'
+ { hexflag = 0;
+ $$ = $4; }
+ | expr '+' expr
+ { $$ = make_sum ($1, $3); }
+ ...
+ ;
+constant:
+ INTEGER
+ | STRING
+ ;
+
+
+Here we assume that yylex looks at the value of hexflag; when
+it is nonzero, all integers are parsed in hexadecimal, and tokens starting
+with letters are parsed as integers if possible.
+The declaration of hexflag shown in the C declarations section of
+the parser file is needed to make it accessible to the actions
+(see section The C Declarations Section). You must also write the code in yylex
+to obey the flag.
+
+
+Lexical tie-ins make strict demands on any error recovery rules you have.
+See section Error Recovery.
+The reason for this is that the purpose of an error recovery rule is to
+abort the parsing of one construct and resume in some larger construct.
+For example, in C-like languages, a typical error recovery rule is to skip
+tokens until the next semicolon, and then start a new statement, like this:
+
+stmt: expr ';'
+ | IF '(' expr ')' stmt { ... }
+ ...
+ error ';'
+ { hexflag = 0; }
+ ;
+
+
+If there is a syntax error in the middle of a `hex (expr)'
+construct, this error rule will apply, and then the action for the
+completed `hex (expr)' will never run. So hexflag would
+remain set for the entire rest of the input, or until the next hex
+keyword, causing identifiers to be misinterpreted as integers.
+To avoid this problem the error recovery rule itself clears hexflag.
+There may also be an error recovery rule that works within expressions.
+For example, there could be a rule which applies within parentheses
+and skips to the close-parenthesis:
+
+expr: ...
+ | '(' expr ')'
+ { $$ = $2; }
+ | '(' error ')'
+ ...
+
+
+If this rule acts within the hex construct, it is not going to abort
+that construct (since it applies to an inner level of parentheses within
+the construct). Therefore, it should not clear the flag: the rest of
+the hex construct should be parsed with the flag still in effect.
+What if there is an error recovery rule which might abort out of the
+hex construct or might not, depending on circumstances? There is no
+way you can write the action to determine whether a hex construct is
+being aborted or not. So if you are using a lexical tie-in, you had better
+make sure your error recovery rules are not of this kind. Each rule must
+be such that you can be sure that it always will, or always won't, have to
+clear the flag.
+
+
+
+
+
+
+If a Bison grammar compiles properly but doesn't do what you want when it
+runs, the yydebug parser-trace feature can help you figure out why.
+To enable compilation of trace facilities, you must define the macro
+YYDEBUG when you compile the parser. You could use
+`-DYYDEBUG=1' as a compiler option or you could put `#define
+YYDEBUG 1' in the C declarations section of the grammar file
+(see section The C Declarations Section). Alternatively, use the `-t' option when
+you run Bison (see section Invoking Bison). We always define YYDEBUG so that
+debugging is always possible.
+The trace facility uses stderr, so you must add #include
+<stdio.h> to the C declarations section unless it is already there.
+Once you have compiled the program with trace facilities, the way to
+request a trace is to store a nonzero value in the variable yydebug.
+You can do this by making the C code do it (in main, perhaps), or
+you can alter the value with a C debugger.
+Each step taken by the parser when yydebug is nonzero produces a
+line or two of trace information, written on stderr. The trace
+messages tell you these things:
+
+-
+Each time the parser calls
yylex, what kind of token was read.
+ -
+Each time a token is shifted, the depth and complete contents of the
+state stack (see section Parser States).
+
-
+Each time a rule is reduced, which rule it is, and the complete contents
+of the state stack afterward.
+
+
+To make sense of this information, it helps to refer to the listing file
+produced by the Bison `-v' option (see section Invoking Bison). This file
+shows the meaning of each state in terms of positions in various rules, and
+also what each state will do with each possible input token. As you read
+the successive trace messages, you can see that the parser is functioning
+according to its specification in the listing file. Eventually you will
+arrive at the place where something undesirable happens, and you will see
+which parts of the grammar are to blame.
+The parser file is a C program and you can use C debuggers on it, but it's
+not easy to interpret what it is doing. The parser function is a
+finite-state machine interpreter, and aside from the actions it executes
+the same code over and over. Only the values of variables show where in
+the grammar it is working.
+
+The debugging information normally gives the token type of each token
+read, but not its semantic value. You can optionally define a macro
+named YYPRINT to provide a way to print the value. If you define
+YYPRINT, it should take three arguments. The parser will pass a
+standard I/O stream, the numeric code for the token type, and the token
+value (from yylval).
+Here is an example of YYPRINT suitable for the multi-function
+calculator (see section Declarations for mfcalc):
+
+#define YYPRINT(file, type, value) yyprint (file, type, value)
+static void
+yyprint (file, type, value)
+ FILE *file;
+ int type;
+ YYSTYPE value;
+{
+ if (type == VAR)
+ fprintf (file, " %s", value.tptr->name);
+ else if (type == NUM)
+ fprintf (file, " %d", value.val);
+}
+
+
+
+
+
+
+
+The usual way to invoke Bison is as follows:
+
+bison infile
+
+
+Here infile is the grammar file name, which usually ends in
+`.y'. The parser file's name is made by replacing the `.y'
+with `.tab.c'. Thus, the `bison foo.y' filename yields
+`foo.tab.c', and the `bison hack/foo.y' filename yields
+`hack/foo.tab.c'.
+
+
+Bison supports both traditional single-letter options and mnemonic long
+option names. Long option names are indicated with `--' instead of
+`-'. Abbreviations for option names are allowed as long as they
+are unique. When a long option takes an argument, like
+`--file-prefix', connect the option name and the argument with
+`='.
+Here is a list of options that can be used with Bison, alphabetized by
+short option. It is followed by a cross key alphabetized by long
+option.
+
+- `-b file-prefix'
+
-
+
- `--file-prefix=prefix'
+
-
+Specify a prefix to use for all Bison output file names. The names are
+chosen as if the input file were named `prefix.c'.
+
- `-d'
+
-
+
- `--defines'
+
-
+Write an extra output file containing macro definitions for the token
+type names defined in the grammar and the semantic value type
+
YYSTYPE, as well as a few extern variable declarations.
+If the parser output file is named `name.c' then this file
+is named `name.h'.
+This output file is essential if you wish to put the definition of
+yylex in a separate source file, because yylex needs to
+be able to refer to token type codes and the variable
+yylval. See section Semantic Values of Tokens.
+ - `-l'
+
-
+
- `--no-lines'
+
-
+Don't put any
#line preprocessor commands in the parser file.
+Ordinarily Bison puts them in the parser file so that the C compiler
+and debuggers will associate errors with your source file, the
+grammar file. This option causes them to associate errors with the
+parser file, treating it an independent source file in its own right.
+ - `-o outfile'
+
-
+
- `--output-file=outfile'
+
-
+Specify the name outfile for the parser file.
+The other output files' names are constructed from outfile
+as described under the `-v' and `-d' switches.
+
- `-p prefix'
+
-
+
- `--name-prefix=prefix'
+
-
+Rename the external symbols used in the parser so that they start with
+prefix instead of `yy'. The precise list of symbols renamed
+is
yyparse, yylex, yyerror, yynerrs,
+yylval, yychar and yydebug.
+For example, if you use `-p c', the names become cparse,
+clex, and so on.
+See section Multiple Parsers in the Same Program.
+ - `-t'
+
-
+
- `--debug'
+
-
+Output a definition of the macro
YYDEBUG into the parser file,
+so that the debugging facilities are compiled. See section Debugging Your Parser.
+ - `-v'
+
-
+
- `--verbose'
+
-
+Write an extra output file containing verbose descriptions of the
+parser states and what is done for each type of look-ahead token in
+that state.
+This file also describes all the conflicts, both those resolved by
+operator precedence and the unresolved ones.
+The file's name is made by removing `.tab.c' or `.c' from
+the parser output file name, and adding `.output' instead.
+Therefore, if the input file is `foo.y', then the parser file is
+called `foo.tab.c' by default. As a consequence, the verbose
+output file is called `foo.output'.
+
- `-V'
+
-
+
- `--version'
+
-
+Print the version number of Bison and exit.
+
- `-h'
+
-
+
- `--help'
+
-
+Print a summary of the command-line options to Bison and exit.
+
- `-y'
+
-
+
- `--yacc'
+
-
+
- `--fixed-output-files'
+
-
+Equivalent to `-o y.tab.c'; the parser output file is called
+`y.tab.c', and the other outputs are called `y.output' and
+`y.tab.h'. The purpose of this switch is to imitate Yacc's output
+file name conventions. Thus, the following shell script can substitute
+for Yacc:
+
+bison -y $*
+
+
+
+
+
+Here is a list of options, alphabetized by long option, to help you find
+the corresponding short option.
+
+
+
+
+The command line syntax for Bison on VMS is a variant of the usual
+Bison command syntax--adapted to fit VMS conventions.
+To find the VMS equivalent for any Bison option, start with the long
+option, and substitute a `/' for the leading `--', and
+substitute a `_' for each `-' in the name of the long option.
+For example, the following invocation under VMS:
+
+bison /debug/name_prefix=bar foo.y
+
+
+is equivalent to the following command under POSIX.
+
+bison --debug --name-prefix=bar foo.y
+
+
+The VMS file system does not permit filenames such as
+`foo.tab.c'. In the above example, the output file
+would instead be named `foo_tab.c'.
+
+
+
+
+
+error
+-
+A token name reserved for error recovery. This token may be used in
+grammar rules so as to allow the Bison parser to recognize an error in
+the grammar without halting the process. In effect, a sentence
+containing an error may be recognized as valid. On a parse error, the
+token
error becomes the current look-ahead token. Actions
+corresponding to error are then executed, and the look-ahead
+token is reset to the token that originally caused the violation.
+See section Error Recovery.
+ YYABORT
+-
+Macro to pretend that an unrecoverable syntax error has occurred, by
+making
yyparse return 1 immediately. The error reporting
+function yyerror is not called. See section The Parser Function yyparse.
+ YYACCEPT
+-
+Macro to pretend that a complete utterance of the language has been
+read, by making
yyparse return 0 immediately.
+See section The Parser Function yyparse.
+ YYBACKUP
+-
+Macro to discard a value from the parser stack and fake a look-ahead
+token. See section Special Features for Use in Actions.
+
YYERROR
+-
+Macro to pretend that a syntax error has just been detected: call
+
yyerror and then perform normal error recovery if possible
+(see section Error Recovery), or (if recovery is impossible) make
+yyparse return 1. See section Error Recovery.
+ YYERROR_VERBOSE
+-
+Macro that you define with
#define in the Bison declarations
+section to request verbose, specific error message strings when
+yyerror is called.
+ YYINITDEPTH
+-
+Macro for specifying the initial size of the parser stack.
+See section Stack Overflow, and How to Avoid It.
+
YYLEX_PARAM
+-
+Macro for specifying an extra argument (or list of extra arguments) for
+
yyparse to pass to yylex. See section Calling Conventions for Pure Parsers.
+ YYLTYPE
+-
+Macro for the data type of
yylloc; a structure with four
+members. See section Textual Positions of Tokens.
+ YYMAXDEPTH
+-
+Macro for specifying the maximum size of the parser stack.
+See section Stack Overflow, and How to Avoid It.
+
YYPARSE_PARAM
+-
+Macro for specifying the name of a parameter that
yyparse should
+accept. See section Calling Conventions for Pure Parsers.
+ YYRECOVERING
+-
+Macro whose value indicates whether the parser is recovering from a
+syntax error. See section Special Features for Use in Actions.
+
YYSTYPE
+-
+Macro for the data type of semantic values;
int by default.
+See section Data Types of Semantic Values.
+ yychar
+-
+External integer variable that contains the integer value of the
+current look-ahead token. (In a pure parser, it is a local variable
+within
yyparse.) Error-recovery rule actions may examine this
+variable. See section Special Features for Use in Actions.
+ yyclearin
+-
+Macro used in error-recovery rule actions. It clears the previous
+look-ahead token. See section Error Recovery.
+
yydebug
+-
+External integer variable set to zero by default. If
yydebug
+is given a nonzero value, the parser will output information on input
+symbols and parser action. See section Debugging Your Parser.
+ yyerrok
+-
+Macro to cause parser to recover immediately to its normal mode
+after a parse error. See section Error Recovery.
+
yyerror
+-
+User-supplied function to be called by
yyparse on error. The
+function receives one argument, a pointer to a character string
+containing an error message. See section The Error Reporting Function yyerror.
+ yylex
+-
+User-supplied lexical analyzer function, called with no arguments
+to get the next token. See section The Lexical Analyzer Function
yylex.
+ yylval
+-
+External variable in which
yylex should place the semantic
+value associated with a token. (In a pure parser, it is a local
+variable within yyparse, and its address is passed to
+yylex.) See section Semantic Values of Tokens.
+ yylloc
+-
+External variable in which
yylex should place the line and
+column numbers associated with a token. (In a pure parser, it is a
+local variable within yyparse, and its address is passed to
+yylex.) You can ignore this variable if you don't use the
+`@' feature in the grammar actions. See section Textual Positions of Tokens.
+ yynerrs
+-
+Global variable which Bison increments each time there is a parse
+error. (In a pure parser, it is a local variable within
+
yyparse.) See section The Error Reporting Function yyerror.
+ yyparse
+-
+The parser function produced by Bison; call this function to start
+parsing. See section The Parser Function
yyparse.
+ %left
+-
+Bison declaration to assign left associativity to token(s).
+See section Operator Precedence.
+
%nonassoc
+-
+Bison declaration to assign nonassociativity to token(s).
+See section Operator Precedence.
+
%prec
+-
+Bison declaration to assign a precedence to a specific rule.
+See section Context-Dependent Precedence.
+
%pure_parser
+-
+Bison declaration to request a pure (reentrant) parser.
+See section A Pure (Reentrant) Parser.
+
%right
+-
+Bison declaration to assign right associativity to token(s).
+See section Operator Precedence.
+
%start
+-
+Bison declaration to specify the start symbol. See section The Start-Symbol.
+
%token
+-
+Bison declaration to declare token(s) without specifying precedence.
+See section Token Type Names.
+
%type
+-
+Bison declaration to declare nonterminals. See section Nonterminal Symbols.
+
%union
+-
+Bison declaration to specify several possible data types for semantic
+values. See section The Collection of Value Types.
+
+
+These are the punctuation and delimiters used in Bison input:
+
+- `%%'
+
-
+Delimiter used to separate the grammar rule section from the
+Bison declarations section or the additional C code section.
+See section The Overall Layout of a Bison Grammar.
+
- `%{ %}'
+
-
+All code listed between `%{' and `%}' is copied directly
+to the output file uninterpreted. Such code forms the "C
+declarations" section of the input file. See section Outline of a Bison Grammar.
+
- `/*...*/'
+
-
+Comment delimiters, as in C.
+
- `:'
+
-
+Separates a rule's result from its components. See section Syntax of Grammar Rules.
+
- `;'
+
-
+Terminates a rule. See section Syntax of Grammar Rules.
+
- `|'
+
-
+Separates alternate rules for the same result nonterminal.
+See section Syntax of Grammar Rules.
+
+
+
+
+
+
+- Backus-Naur Form (BNF)
+
-
+Formal method of specifying context-free grammars. BNF was first used
+in the ALGOL-60 report, 1963. See section Languages and Context-Free Grammars.
+
- Context-free grammars
+
-
+Grammars specified as rules that can be applied regardless of context.
+Thus, if there is a rule which says that an integer can be used as an
+expression, integers are allowed anywhere an expression is
+permitted. See section Languages and Context-Free Grammars.
+
- Dynamic allocation
+
-
+Allocation of memory that occurs during execution, rather than at
+compile time or on entry to a function.
+
- Empty string
+
-
+Analogous to the empty set in set theory, the empty string is a
+character string of length zero.
+
- Finite-state stack machine
+
-
+A "machine" that has discrete states in which it is said to exist at
+each instant in time. As input to the machine is processed, the
+machine moves from state to state as specified by the logic of the
+machine. In the case of the parser, the input is the language being
+parsed, and the states correspond to various stages in the grammar
+rules. See section The Bison Parser Algorithm.
+
- Grouping
+
-
+A language construct that is (in general) grammatically divisible;
+for example, `expression' or `declaration' in C.
+See section Languages and Context-Free Grammars.
+
- Infix operator
+
-
+An arithmetic operator that is placed between the operands on which it
+performs some operation.
+
- Input stream
+
-
+A continuous flow of data between devices or programs.
+
- Language construct
+
-
+One of the typical usage schemas of the language. For example, one of
+the constructs of the C language is the
if statement.
+See section Languages and Context-Free Grammars.
+ - Left associativity
+
-
+Operators having left associativity are analyzed from left to right:
+`a+b+c' first computes `a+b' and then combines with
+`c'. See section Operator Precedence.
+
- Left recursion
+
-
+A rule whose result symbol is also its first component symbol;
+for example, `expseq1 : expseq1 ',' exp;'. See section Recursive Rules.
+
- Left-to-right parsing
+
-
+Parsing a sentence of a language by analyzing it token by token from
+left to right. See section The Bison Parser Algorithm.
+
- Lexical analyzer (scanner)
+
-
+A function that reads an input stream and returns tokens one by one.
+See section The Lexical Analyzer Function
yylex.
+ - Lexical tie-in
+
-
+A flag, set by actions in the grammar rules, which alters the way
+tokens are parsed. See section Lexical Tie-ins.
+
- Look-ahead token
+
-
+A token already read but not yet shifted. See section Look-Ahead Tokens.
+
- LALR(1)
+
-
+The class of context-free grammars that Bison (like most other parser
+generators) can handle; a subset of LR(1). See section Mysterious Reduce/Reduce Conflicts.
+
- LR(1)
+
-
+The class of context-free grammars in which at most one token of
+look-ahead is needed to disambiguate the parsing of any piece of input.
+
- Nonterminal symbol
+
-
+A grammar symbol standing for a grammatical construct that can
+be expressed through rules in terms of smaller constructs; in other
+words, a construct that is not a token. See section Symbols, Terminal and Nonterminal.
+
- Parse error
+
-
+An error encountered during parsing of an input stream due to invalid
+syntax. See section Error Recovery.
+
- Parser
+
-
+A function that recognizes valid sentences of a language by analyzing
+the syntax structure of a set of tokens passed to it from a lexical
+analyzer.
+
- Postfix operator
+
-
+An arithmetic operator that is placed after the operands upon which it
+performs some operation.
+
- Reduction
+
-
+Replacing a string of nonterminals and/or terminals with a single
+nonterminal, according to a grammar rule. See section The Bison Parser Algorithm.
+
- Reentrant
+
-
+A reentrant subprogram is a subprogram which can be in invoked any
+number of times in parallel, without interference between the various
+invocations. See section A Pure (Reentrant) Parser.
+
- Reverse polish notation
+
-
+A language in which all operators are postfix operators.
+
- Right recursion
+
-
+A rule whose result symbol is also its last component symbol;
+for example, `expseq1: exp ',' expseq1;'. See section Recursive Rules.
+
- Semantics
+
-
+In computer languages, the semantics are specified by the actions
+taken for each instance of the language, i.e., the meaning of
+each statement. See section Defining Language Semantics.
+
- Shift
+
-
+A parser is said to shift when it makes the choice of analyzing
+further input from the stream rather than reducing immediately some
+already-recognized rule. See section The Bison Parser Algorithm.
+
- Single-character literal
+
-
+A single character that is recognized and interpreted as is.
+See section From Formal Rules to Bison Input.
+
- Start symbol
+
-
+The nonterminal symbol that stands for a complete valid utterance in
+the language being parsed. The start symbol is usually listed as the
+first nonterminal symbol in a language specification.
+See section The Start-Symbol.
+
- Symbol table
+
-
+A data structure where symbol names and associated data are stored
+during parsing to allow for recognition and use of existing
+information in repeated uses of a symbol. See section Multi-Function Calculator:
mfcalc.
+ - Token
+
-
+A basic, grammatically indivisible unit of a language. The symbol
+that describes a token in the grammar is a terminal symbol.
+The input of the Bison parser is a stream of tokens which comes from
+the lexical analyzer. See section Symbols, Terminal and Nonterminal.
+
- Terminal symbol
+
-
+A grammar symbol that has no rules in the grammar and therefore
+is grammatically indivisible. The piece of text it represents
+is a token. See section Languages and Context-Free Grammars.
+
+
+
+
+Jump to:
+$
+-
+%
+-
+@
+-
+a
+-
+b
+-
+c
+-
+d
+-
+e
+-
+f
+-
+g
+-
+i
+-
+l
+-
+m
+-
+n
+-
+o
+-
+p
+-
+r
+-
+s
+-
+t
+-
+u
+-
+v
+-
+w
+-
+y
+-
+|
+
+
+
+$$
+$n
+
+
+
+%expect
+%left
+%nonassoc
+%prec
+%pure_parser
+%right
+%start
+%token
+%type
+%union
+
+
+
+@n
+
+
+
+action
+action data types
+action features summary
+actions in mid-rule
+actions, semantic
+additional C code section
+algorithm of parser
+associativity
+
+
+
+Backus-Naur form
+Bison declaration summary
+Bison declarations
+Bison declarations (introduction)
+Bison grammar
+Bison invocation
+Bison parser
+Bison parser algorithm
+Bison symbols, table of
+Bison utility
+BNF
+
+
+
+C code, section for additional
+C declarations section
+C-language interface
+calc
+calculator, infix notation
+calculator, multi-function
+calculator, simple
+character token
+compiling the parser
+conflicts
+conflicts, reduce/reduce
+conflicts, suppressing warnings of
+context-dependent precedence
+context-free grammar
+controlling function
+
+
+
+dangling else
+data types in actions
+data types of semantic values
+debugging
+declaration summary
+declarations, Bison
+declarations, Bison (introduction)
+declarations, C
+declaring operator precedence
+declaring the start symbol
+declaring token type names
+declaring value types
+declaring value types, nonterminals
+default action
+default data type
+default stack limit
+default start symbol
+defining language semantics
+
+
+
+else, dangling
+error
+error recovery
+error recovery, simple
+error reporting function
+error reporting routine
+examples, simple
+exercises
+
+
+
+file format
+finite-state machine
+formal grammar
+format of grammar file
+
+
+
+glossary
+grammar file
+grammar rule syntax
+grammar rules section
+grammar, Bison
+grammar, context-free
+grouping, syntactic
+
+
+
+infix notation calculator
+interface
+introduction
+invoking Bison
+invoking Bison under VMS
+
+
+
+LALR(1)
+language semantics, defining
+layout of Bison grammar
+left recursion
+lexical analyzer
+lexical analyzer, purpose
+lexical analyzer, writing
+lexical tie-in
+literal token
+look-ahead token
+LR(1)
+
+
+
+main function in simple example
+mfcalc
+mid-rule actions
+multi-function calculator
+mutual recursion
+
+
+
+nonterminal symbol
+
+
+
+operator precedence
+operator precedence, declaring
+options for invoking Bison
+overflow of parser stack
+
+
+
+parse error
+parser
+parser stack
+parser stack overflow
+parser state
+polish notation calculator
+precedence declarations
+precedence of operators
+precedence, context-dependent
+precedence, unary operator
+preventing warnings about conflicts
+pure parser
+
+
+
+recovery from errors
+recursive rule
+reduce/reduce conflict
+reduction
+reentrant parser
+reverse polish notation
+right recursion
+rpcalc
+rule syntax
+rules section for grammar
+running Bison (introduction)
+
+
+
+semantic actions
+semantic value
+semantic value type
+shift/reduce conflicts
+shifting
+simple examples
+single-character literal
+stack overflow
+stack, parser
+stages in using Bison
+start symbol
+start symbol, declaring
+state (of parser)
+summary, action features
+summary, Bison declaration
+suppressing conflict warnings
+symbol
+symbol table example
+symbols (abstract)
+symbols in Bison, table of
+syntactic grouping
+syntax error
+syntax of grammar rules
+
+
+
+terminal symbol
+token
+token type
+token type names, declaring
+tracing the parser
+
+
+
+unary operator precedence
+using Bison
+
+
+
+value type, semantic
+value types, declaring
+value types, nonterminals, declaring
+value, semantic
+VMS
+
+
+
+warnings, preventing
+writing a lexical analyzer
+
+
+
+YYABORT
+YYACCEPT
+YYBACKUP
+yychar
+yyclearin
+YYDEBUG
+yydebug
+YYEMPTY
+yyerrok
+yyerror
+YYERROR
+YYERROR_VERBOSE
+YYINITDEPTH
+yylex
+YYLEX_PARAM
+yylloc
+YYLTYPE
+yylval
+YYMAXDEPTH
+yynerrs
+yyparse
+YYPARSE_PARAM
+YYPRINT
+YYRECOVERING
+
+
+
+|
+
+
+This document was generated on 2 October 1998 using the
+texi2html
+translator version 1.52.
+
+
diff --git a/Engine/bin/bison/bison.simple b/Engine/bin/bison/bison.simple
new file mode 100644
index 000000000..0fb74ce71
--- /dev/null
+++ b/Engine/bin/bison/bison.simple
@@ -0,0 +1,686 @@
+/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+#line 3 "bison.simple"
+
+/* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+ 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 2, 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, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+#ifndef alloca
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not GNU C. */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
+#include
+#else /* not sparc */
+#if defined (MSDOS) && !defined (__TURBOC__)
+#include
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+#include
+ #pragma alloca
+#else /* not MSDOS, __TURBOC__, or _AIX */
+#ifdef __hpux
+#ifdef __cplusplus
+extern "C" {
+void *alloca (unsigned int);
+};
+#else /* not __cplusplus */
+void *alloca ();
+#endif /* not __cplusplus */
+#endif /* __hpux */
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc. */
+#endif /* not GNU C. */
+#endif /* alloca not defined. */
+
+/* This is the parser code that is written into each bison parser
+ when the %semantic_parser declaration is not specified in the grammar.
+ It was written by Richard Stallman by simplifying the hairy parser
+ used when %semantic_parser is specified. */
+
+/* Note: there must be only one dollar sign in this file.
+ It is replaced by the list of actions, each action
+ as one case of the switch. */
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYACCEPT return(0)
+#define YYABORT return(1)
+#define YYERROR goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+ This remains here temporarily to ease the
+ transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+#define YYFAIL goto yyerrlab
+#define YYRECOVERING() (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { yychar = (token), yylval = (value); \
+ yychar1 = YYTRANSLATE (yychar); \
+ YYPOPSTACK; \
+ goto yybackup; \
+ } \
+ else \
+ { yyerror ("syntax error: cannot back up"); YYERROR; } \
+while (0)
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+#ifndef YYPURE
+#define YYLEX yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int yychar; /* the lookahead symbol */
+YYSTYPE yylval; /* the semantic value of the */
+ /* lookahead symbol */
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc; /* location data for the lookahead */
+ /* symbol */
+#endif
+
+int yynerrs; /* number of parse errors so far */
+#endif /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug; /* nonzero means print parse trace */
+/* Since this is uninitialized, it does not stop multiple parsers
+ from coexisting. */
+#endif
+
+/* YYINITDEPTH indicates the initial size of the parser's stacks */
+
+#ifndef YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH is the maximum size the stacks can grow to
+ (effective only if the built-in stack extension method is used). */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Prevent warning if -Wstrict-prototypes. */
+#ifdef __GNUC__
+int yyparse (void);
+#endif
+
+#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
+#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT)
+#else /* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+static void
+__yy_memcpy (from, to, count)
+ char *from;
+ char *to;
+ int count;
+{
+ register char *f = from;
+ register char *t = to;
+ register int i = count;
+
+ while (i-- > 0)
+ *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+static void
+__yy_memcpy (char *from, char *to, int count)
+{
+ register char *f = from;
+ register char *t = to;
+ register int i = count;
+
+ while (i-- > 0)
+ *t++ = *f++;
+}
+
+#endif
+#endif
+
+#line 192 "bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ into yyparse. The argument should have type void *.
+ It should actually point to an object.
+ Grammar actions can access the variable by casting it
+ to the proper pointer type. */
+
+#ifdef YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#else
+#define YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#endif
+
+int
+yyparse(YYPARSE_PARAM)
+ YYPARSE_PARAM_DECL
+{
+ register int yystate;
+ register int yyn;
+ register short *yyssp;
+ register YYSTYPE *yyvsp;
+ int yyerrstatus; /* number of tokens to shift before error messages enabled */
+ int yychar1 = 0; /* lookahead token as an internal (translated) token number */
+
+ short yyssa[YYINITDEPTH]; /* the state stack */
+ YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
+
+ short *yyss = yyssa; /* refer to the stacks thru separate pointers */
+ YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+ YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
+ YYLTYPE *yyls = yylsa;
+ YYLTYPE *yylsp;
+
+#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK (yyvsp--, yyssp--)
+#endif
+
+ int yystacksize = YYINITDEPTH;
+
+#ifdef YYPURE
+ int yychar;
+ YYSTYPE yylval;
+ int yynerrs;
+#ifdef YYLSP_NEEDED
+ YYLTYPE yylloc;
+#endif
+#endif
+
+ YYSTYPE yyval; /* the variable used to return */
+ /* semantic values from the action */
+ /* routines */
+
+ int yylen;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Starting parse\n");
+#endif
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss - 1;
+ yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+ yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in yystate . */
+/* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks. */
+yynewstate:
+
+ *++yyssp = yystate;
+
+ if (yyssp >= yyss + yystacksize - 1)
+ {
+ /* Give user a chance to reallocate the stack */
+ /* Use copies of these so that the &'s don't force the real ones into memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+ YYLTYPE *yyls1 = yyls;
+#endif
+
+ /* Get the current used size of the three stacks, in elements. */
+ int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ /* Each stack pointer address is followed by the size of
+ the data in use in that stack, in bytes. */
+#ifdef YYLSP_NEEDED
+ /* This used to be a conditional around just the two extra args,
+ but that might be undefined if yyoverflow is a macro. */
+ yyoverflow("parser stack overflow",
+ &yyss1, size * sizeof (*yyssp),
+ &yyvs1, size * sizeof (*yyvsp),
+ &yyls1, size * sizeof (*yylsp),
+ &yystacksize);
+#else
+ yyoverflow("parser stack overflow",
+ &yyss1, size * sizeof (*yyssp),
+ &yyvs1, size * sizeof (*yyvsp),
+ &yystacksize);
+#endif
+
+ yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+ yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+ /* Extend the stack our own way. */
+ if (yystacksize >= YYMAXDEPTH)
+ {
+ yyerror("parser stack overflow");
+ return 2;
+ }
+ yystacksize *= 2;
+ if (yystacksize > YYMAXDEPTH)
+ yystacksize = YYMAXDEPTH;
+ yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+ __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
+ yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+ __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+ yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+ __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + size - 1;
+ yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+ yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+ if (yyssp >= yyss + yystacksize - 1)
+ YYABORT;
+ }
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+ goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state. */
+/* Read a lookahead token if we need one and don't already have one. */
+/* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* yychar is either YYEMPTY or YYEOF
+ or a valid token in external form. */
+
+ if (yychar == YYEMPTY)
+ {
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Reading a token: ");
+#endif
+ yychar = YYLEX;
+ }
+
+ /* Convert token to internal form (in yychar1) for indexing tables with */
+
+ if (yychar <= 0) /* This means end of input. */
+ {
+ yychar1 = 0;
+ yychar = YYEOF; /* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Now at end of input.\n");
+#endif
+ }
+ else
+ {
+ yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+ /* Give the individual parser a way to print the precise meaning
+ of a token, for further debugging info. */
+#ifdef YYPRINT
+ YYPRINT (stderr, yychar, yylval);
+#endif
+ fprintf (stderr, ")\n");
+ }
+#endif
+ }
+
+ yyn += yychar1;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+ goto yydefault;
+
+ yyn = yytable[yyn];
+
+ /* yyn is what to do for this token type in this state.
+ Negative => reduce, -yyn is rule number.
+ Positive => shift, yyn is new state.
+ New state is final state => don't bother to shift,
+ just return success.
+ 0, or most negative number => error. */
+
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrlab;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Shift the lookahead token. */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+ /* Discard the token being shifted unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ /* count tokens shifted since error; after three, turn off error status. */
+ if (yyerrstatus) yyerrstatus--;
+
+ yystate = yyn;
+ goto yynewstate;
+
+/* Do the default action for the current state. */
+yydefault:
+
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+
+/* Do a reduction. yyn is the number of a rule to reduce with. */
+yyreduce:
+ yylen = yyr2[yyn];
+ if (yylen > 0)
+ yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ int i;
+
+ fprintf (stderr, "Reducing via rule %d (line %d), ",
+ yyn, yyrline[yyn]);
+
+ /* Print the symbols being reduced, and their result. */
+ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+ fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+ fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+ }
+#endif
+
+$ /* the action file gets copied in in place of this dollarsign */
+#line 487 "bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+ yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ short *ssp1 = yyss - 1;
+ fprintf (stderr, "state stack now");
+ while (ssp1 != yyssp)
+ fprintf (stderr, " %d", *++ssp1);
+ fprintf (stderr, "\n");
+ }
+#endif
+
+ *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+ yylsp++;
+ if (yylen == 0)
+ {
+ yylsp->first_line = yylloc.first_line;
+ yylsp->first_column = yylloc.first_column;
+ yylsp->last_line = (yylsp-1)->last_line;
+ yylsp->last_column = (yylsp-1)->last_column;
+ yylsp->text = 0;
+ }
+ else
+ {
+ yylsp->last_line = (yylsp+yylen-1)->last_line;
+ yylsp->last_column = (yylsp+yylen-1)->last_column;
+ }
+#endif
+
+ /* Now "shift" the result of the reduction.
+ Determine what state that goes to,
+ based on the state we popped back to
+ and the rule number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+ if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTBASE];
+
+ goto yynewstate;
+
+yyerrlab: /* here on detecting error */
+
+ if (! yyerrstatus)
+ /* If not already recovering from an error, report this error. */
+ {
+ ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+ yyn = yypact[yystate];
+
+ if (yyn > YYFLAG && yyn < YYLAST)
+ {
+ int size = 0;
+ char *msg;
+ int x, count;
+
+ count = 0;
+ /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
+ for (x = (yyn < 0 ? -yyn : 0);
+ x < (sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ size += strlen(yytname[x]) + 15, count++;
+ msg = (char *) malloc(size + 15);
+ if (msg != 0)
+ {
+ strcpy(msg, "parse error");
+
+ if (count < 5)
+ {
+ count = 0;
+ for (x = (yyn < 0 ? -yyn : 0);
+ x < (sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ {
+ strcat(msg, count == 0 ? ", expecting `" : " or `");
+ strcat(msg, yytname[x]);
+ strcat(msg, "'");
+ count++;
+ }
+ }
+ yyerror(msg);
+ free(msg);
+ }
+ else
+ yyerror ("parse error; also virtual memory exceeded");
+ }
+ else
+#endif /* YYERROR_VERBOSE */
+ yyerror("parse error");
+ }
+
+ goto yyerrlab1;
+yyerrlab1: /* here on error raised explicitly by an action */
+
+ if (yyerrstatus == 3)
+ {
+ /* if just tried and failed to reuse lookahead token after an error, discard it. */
+
+ /* return failure if at end of input */
+ if (yychar == YYEOF)
+ YYABORT;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+ yychar = YYEMPTY;
+ }
+
+ /* Else will try to reuse lookahead token
+ after shifting the error token. */
+
+ yyerrstatus = 3; /* Each real token shifted decrements this */
+
+ goto yyerrhandle;
+
+yyerrdefault: /* current state does not do anything special for the error token. */
+
+#if 0
+ /* This is wrong; only states that explicitly want error tokens
+ should shift them. */
+ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
+ if (yyn) goto yydefault;
+#endif
+
+yyerrpop: /* pop the current state because it cannot handle the error token */
+
+ if (yyssp == yyss) YYABORT;
+ yyvsp--;
+ yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+ yylsp--;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ short *ssp1 = yyss - 1;
+ fprintf (stderr, "Error: state stack now");
+ while (ssp1 != yyssp)
+ fprintf (stderr, " %d", *++ssp1);
+ fprintf (stderr, "\n");
+ }
+#endif
+
+yyerrhandle:
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yyerrdefault;
+
+ yyn += YYTERROR;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+ goto yyerrdefault;
+
+ yyn = yytable[yyn];
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrpop;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrpop;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Shifting error token, ");
+#endif
+
+ *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ yystate = yyn;
+ goto yynewstate;
+}
diff --git a/Engine/bin/flex/flex.exe b/Engine/bin/flex/flex.exe
new file mode 100644
index 000000000..30bfa2916
Binary files /dev/null and b/Engine/bin/flex/flex.exe differ
diff --git a/Engine/bin/flex/flex_1.html b/Engine/bin/flex/flex_1.html
new file mode 100644
index 000000000..2f0080a89
--- /dev/null
+++ b/Engine/bin/flex/flex_1.html
@@ -0,0 +1,4079 @@
+flex
+NAME
+
+flex - fast lexical analyzer generator
+
+
SYNOPSIS
+
+flex
+[-bcdfhilnpstvwBFILTV78+? -C[aefFmr] -ooutput -Pprefix -Sskeleton]
+[--help --version]
+[filename ...]
+
+
OVERVIEW
+
+This manual describes
+flex,
+a tool for generating programs that perform pattern-matching on text. The
+manual includes both tutorial and reference sections:
+
+
+
Description
+
a brief overview of the tool
+
+
Some Simple Examples
+
+
Format Of The Input File
+
+
Patterns
+
the extended regular expressions used by flex
+
+
How The Input Is Matched
+
the rules for determining what has been matched
+
+
Actions
+
how to specify what to do when a pattern is matched
+
+
The Generated Scanner
+
details regarding the scanner that flex produces;
+
how to control the input source
+
+
Start Conditions
+
introducing context into your scanners, and
+
managing "mini-scanners"
+
+
Multiple Input Buffers
+
how to manipulate multiple input sources; how to
+
scan from strings instead of files
+
+
End-of-file Rules
+
special rules for matching the end of the input
+
+
Miscellaneous Macros
+
a summary of macros available to the actions
+
+
Values Available To The User
+
a summary of values available to the actions
+
+
Interfacing With Yacc
+
connecting flex scanners together with yacc parsers
+
+
Options
+
flex command-line options, and the "%option"
+
directive
+
+
Performance Considerations
+
how to make your scanner go as fast as possible
+
+
Generating C++ Scanners
+
the (experimental) facility for generating C++
+
scanner classes
+
+
Incompatibilities With Lex And POSIX
+
how flex differs from AT&T lex and the POSIX lex
+
standard
+
+
Diagnostics
+
those error messages produced by flex (or scanners
+
it generates) whose meanings might not be apparent
+
+
Files
+
files used by flex
+
+
Deficiencies / Bugs
+
known problems with flex
+
+
See Also
+
other documentation, related tools
+
+
Author
+
includes contact information
+
+
+
+DESCRIPTION
+
+flex
+is a tool for generating
+scanners:
+programs which recognized lexical patterns in text.
+flex
+reads
+the given input files, or its standard input if no file names are given,
+for a description of a scanner to generate. The description is in
+the form of pairs
+of regular expressions and C code, called
+rules. flex
+generates as output a C source file,
+lex.yy.c,
+which defines a routine
+yylex().
+This file is compiled and linked with the
+-lfl
+library to produce an executable. When the executable is run,
+it analyzes its input for occurrences
+of the regular expressions. Whenever it finds one, it executes
+the corresponding C code.
+
+
SOME SIMPLE EXAMPLES
+
+
+
+First some simple examples to get the flavor of how one uses
+flex.
+The following
+flex
+input specifies a scanner which whenever it encounters the string
+"username" will replace it with the user's login name:
+
+
+
%%
+
username printf( "%s", getlogin() );
+
+
+By default, any text not matched by a
+flex
+scanner
+is copied to the output, so the net effect of this scanner is
+to copy its input file to its output with each occurrence
+of "username" expanded.
+In this input, there is just one rule. "username" is the
+pattern
+and the "printf" is the
+action.
+The "%%" marks the beginning of the rules.
+
+
+Here's another simple example:
+
+
+
int num_lines = 0, num_chars = 0;
+
+
%%
+
\n ++num_lines; ++num_chars;
+
. ++num_chars;
+
+
%%
+
main()
+
{
+
yylex();
+
printf( "# of lines = %d, # of chars = %d\n",
+
num_lines, num_chars );
+
}
+
+
+This scanner counts the number of characters and the number
+of lines in its input (it produces no output other than the
+final report on the counts). The first line
+declares two globals, "num_lines" and "num_chars", which are accessible
+both inside
+yylex()
+and in the
+main()
+routine declared after the second "%%". There are two rules, one
+which matches a newline ("\n") and increments both the line count and
+the character count, and one which matches any character other than
+a newline (indicated by the "." regular expression).
+
+
+A somewhat more complicated example:
+
+
+
/* scanner for a toy Pascal-like language */
+
+
%{
+
/* need this for the call to atof() below */
+
#include <math.h>
+
%}
+
+
DIGIT [0-9]
+
ID [a-z][a-z0-9]*
+
+
%%
+
+
{DIGIT}+ {
+
printf( "An integer: %s (%d)\n", yytext,
+
atoi( yytext ) );
+
}
+
+
{DIGIT}+"."{DIGIT}* {
+
printf( "A float: %s (%g)\n", yytext,
+
atof( yytext ) );
+
}
+
+
if|then|begin|end|procedure|function {
+
printf( "A keyword: %s\n", yytext );
+
}
+
+
{ID} printf( "An identifier: %s\n", yytext );
+
+
"+"|"-"|"*"|"/" printf( "An operator: %s\n", yytext );
+
+
"{"[^}\n]*"}" /* eat up one-line comments */
+
+
[ \t\n]+ /* eat up whitespace */
+
+
. printf( "Unrecognized character: %s\n", yytext );
+
+
%%
+
+
main( argc, argv )
+
int argc;
+
char **argv;
+
{
+
++argv, --argc; /* skip over program name */
+
if ( argc > 0 )
+
yyin = fopen( argv[0], "r" );
+
else
+
yyin = stdin;
+
+
yylex();
+
}
+
+
+This is the beginnings of a simple scanner for a language like
+Pascal. It identifies different types of
+tokens
+and reports on what it has seen.
+
+
+The details of this example will be explained in the following
+sections.
+
+
FORMAT OF THE INPUT FILE
+
+The
+flex
+input file consists of three sections, separated by a line with just
+%%
+in it:
+
+
+
definitions
+
%%
+
rules
+
%%
+
user code
+
+
+The
+definitions
+section contains declarations of simple
+name
+definitions to simplify the scanner specification, and declarations of
+start conditions,
+which are explained in a later section.
+
+
+Name definitions have the form:
+
+
+
name definition
+
+
+The "name" is a word beginning with a letter or an underscore ('_')
+followed by zero or more letters, digits, '_', or '-' (dash).
+The definition is taken to begin at the first non-white-space character
+following the name and continuing to the end of the line.
+The definition can subsequently be referred to using "{name}", which
+will expand to "(definition)". For example,
+
+
+
DIGIT [0-9]
+
ID [a-z][a-z0-9]*
+
+
+defines "DIGIT" to be a regular expression which matches a
+single digit, and
+"ID" to be a regular expression which matches a letter
+followed by zero-or-more letters-or-digits.
+A subsequent reference to
+
+
+
{DIGIT}+"."{DIGIT}*
+
+
+is identical to
+
+
+
([0-9])+"."([0-9])*
+
+
+and matches one-or-more digits followed by a '.' followed
+by zero-or-more digits.
+
+
+The
+rules
+section of the
+flex
+input contains a series of rules of the form:
+
+
+
pattern action
+
+
+where the pattern must be unindented and the action must begin
+on the same line.
+
+
+See below for a further description of patterns and actions.
+
+
+Finally, the user code section is simply copied to
+lex.yy.c
+verbatim.
+It is used for companion routines which call or are called
+by the scanner. The presence of this section is optional;
+if it is missing, the second
+%%
+in the input file may be skipped, too.
+
+
+In the definitions and rules sections, any
+indented
+text or text enclosed in
+%{
+and
+%}
+is copied verbatim to the output (with the %{}'s removed).
+The %{}'s must appear unindented on lines by themselves.
+
+
+In the rules section,
+any indented or %{} text appearing before the
+first rule may be used to declare variables
+which are local to the scanning routine and (after the declarations)
+code which is to be executed whenever the scanning routine is entered.
+Other indented or %{} text in the rule section is still copied to the output,
+but its meaning is not well-defined and it may well cause compile-time
+errors (this feature is present for
+POSIX
+compliance; see below for other such features).
+
+
+In the definitions section (but not in the rules section),
+an unindented comment (i.e., a line
+beginning with "/*") is also copied verbatim to the output up
+to the next "*/".
+
+
PATTERNS
+
+The patterns in the input are written using an extended set of regular
+expressions. These are:
+
+
+
x match the character 'x'
+
. any character (byte) except newline
+
[xyz] a "character class"; in this case, the pattern
+
matches either an 'x', a 'y', or a 'z'
+
[abj-oZ] a "character class" with a range in it; matches
+
an 'a', a 'b', any letter from 'j' through 'o',
+
or a 'Z'
+
[^A-Z] a "negated character class", i.e., any character
+
but those in the class. In this case, any
+
character EXCEPT an uppercase letter.
+
[^A-Z\n] any character EXCEPT an uppercase letter or
+
a newline
+
r* zero or more r's, where r is any regular expression
+
r+ one or more r's
+
r? zero or one r's (that is, "an optional r")
+
r{2,5} anywhere from two to five r's
+
r{2,} two or more r's
+
r{4} exactly 4 r's
+
{name} the expansion of the "name" definition
+
(see above)
+
"[xyz]\"foo"
+
the literal string: [xyz]"foo
+
\X if X is an 'a', 'b', 'f', 'n', 'r', 't', or 'v',
+
then the ANSI-C interpretation of \x.
+
Otherwise, a literal 'X' (used to escape
+
operators such as '*')
+
\0 a NUL character (ASCII code 0)
+
\123 the character with octal value 123
+
\x2a the character with hexadecimal value 2a
+
(r) match an r; parentheses are used to override
+
precedence (see below)
+
+
+
rs the regular expression r followed by the
+
regular expression s; called "concatenation"
+
+
+
r|s either an r or an s
+
+
+
r/s an r but only if it is followed by an s. The
+
text matched by s is included when determining
+
whether this rule is the "longest match",
+
but is then returned to the input before
+
the action is executed. So the action only
+
sees the text matched by r. This type
+
of pattern is called trailing context".
+
(There are some combinations of r/s that flex
+
cannot match correctly; see notes in the
+
Deficiencies / Bugs section below regarding
+
"dangerous trailing context".)
+
^r an r, but only at the beginning of a line (i.e.,
+
which just starting to scan, or right after a
+
newline has been scanned).
+
r$ an r, but only at the end of a line (i.e., just
+
before a newline). Equivalent to "r/\n".
+
+
Note that flex's notion of "newline" is exactly
+
whatever the C compiler used to compile flex
+
interprets '\n' as; in particular, on some DOS
+
systems you must either filter out \r's in the
+
input yourself, or explicitly use r/\r\n for "r$".
+
+
+
<s>r an r, but only in start condition s (see
+
below for discussion of start conditions)
+
<s1,s2,s3>r
+
same, but in any of start conditions s1,
+
s2, or s3
+
<*>r an r in any start condition, even an exclusive one.
+
+
+
<<EOF>> an end-of-file
+
<s1,s2><<EOF>>
+
an end-of-file when in start condition s1 or s2
+
+
+Note that inside of a character class, all regular expression operators
+lose their special meaning except escape ('\') and the character class
+operators, '-', ']', and, at the beginning of the class, '^'.
+
+
+The regular expressions listed above are grouped according to
+precedence, from highest precedence at the top to lowest at the bottom.
+Those grouped together have equal precedence. For example,
+
+
+
foo|bar*
+
+
+is the same as
+
+
+
(foo)|(ba(r*))
+
+
+since the '*' operator has higher precedence than concatenation,
+and concatenation higher than alternation ('|'). This pattern
+therefore matches
+either
+the string "foo"
+or
+the string "ba" followed by zero-or-more r's.
+To match "foo" or zero-or-more "bar"'s, use:
+
+
+
foo|(bar)*
+
+
+and to match zero-or-more "foo"'s-or-"bar"'s:
+
+
+
(foo|bar)*
+
+
+
+
+In addition to characters and ranges of characters, character classes
+can also contain character class
+expressions.
+These are expressions enclosed inside
+[:
+and
+:]
+delimiters (which themselves must appear between the '[' and ']' of the
+character class; other elements may occur inside the character class, too).
+The valid expressions are:
+
+
+
[:alnum:] [:alpha:] [:blank:]
+
[:cntrl:] [:digit:] [:graph:]
+
[:lower:] [:print:] [:punct:]
+
[:space:] [:upper:] [:xdigit:]
+
+
+These expressions all designate a set of characters equivalent to
+the corresponding standard C
+isXXX
+function. For example,
+[:alnum:]
+designates those characters for which
+isalnum()
+returns true - i.e., any alphabetic or numeric.
+Some systems don't provide
+isblank(),
+so flex defines
+[:blank:]
+as a blank or a tab.
+
+
+For example, the following character classes are all equivalent:
+
+
+
[[:alnum:]]
+
[[:alpha:][:digit:]
+
[[:alpha:]0-9]
+
[a-zA-Z0-9]
+
+
+If your scanner is case-insensitive (the
+-i
+flag), then
+[:upper:]
+and
+[:lower:]
+are equivalent to
+[:alpha:].
+
+
+Some notes on patterns:
+
- -
- A negated character class such as the example "[^A-Z]"
+above
+will match a newline
+unless "\n" (or an equivalent escape sequence) is one of the
+characters explicitly present in the negated character class
+(e.g., "[^A-Z\n]"). This is unlike how many other regular
+expression tools treat negated character classes, but unfortunately
+the inconsistency is historically entrenched.
+Matching newlines means that a pattern like [^"]* can match the entire
+input unless there's another quote in the input.
+
- -
- A rule can have at most one instance of trailing context (the '/' operator
+or the '$' operator). The start condition, '^', and "<<EOF>>" patterns
+can only occur at the beginning of a pattern, and, as well as with '/' and '$',
+cannot be grouped inside parentheses. A '^' which does not occur at
+the beginning of a rule or a '$' which does not occur at the end of
+a rule loses its special properties and is treated as a normal character.
+
- The following are illegal:
+
+
+
foo/bar$
+
<sc1>foo<sc2>bar
+
+
+Note that the first of these, can be written "foo/bar\n".
+ - The following will result in '$' or '^' being treated as a normal character:
+
+
+
foo|(bar$)
+
foo|^bar
+
+
+If what's wanted is a "foo" or a bar-followed-by-a-newline, the following
+could be used (the special '|' action is explained below):
+
+
+
foo |
+
bar$ /* action goes here */
+
+
+A similar trick will work for matching a foo or a
+bar-at-the-beginning-of-a-line.
+
+HOW THE INPUT IS MATCHED
+
+When the generated scanner is run, it analyzes its input looking
+for strings which match any of its patterns. If it finds more than
+one match, it takes the one matching the most text (for trailing
+context rules, this includes the length of the trailing part, even
+though it will then be returned to the input). If it finds two
+or more matches of the same length, the
+rule listed first in the
+flex
+input file is chosen.
+
+
+Once the match is determined, the text corresponding to the match
+(called the
+token)
+is made available in the global character pointer
+yytext,
+and its length in the global integer
+yyleng.
+The
+action
+corresponding to the matched pattern is then executed (a more
+detailed description of actions follows), and then the remaining
+input is scanned for another match.
+
+
+If no match is found, then the
+default rule
+is executed: the next character in the input is considered matched and
+copied to the standard output. Thus, the simplest legal
+flex
+input is:
+
+
+
%%
+
+
+which generates a scanner that simply copies its input (one character
+at a time) to its output.
+
+
+Note that
+yytext
+can be defined in two different ways: either as a character
+pointer
+or as a character
+array.
+You can control which definition
+flex
+uses by including one of the special directives
+%pointer
+or
+%array
+in the first (definitions) section of your flex input. The default is
+%pointer,
+unless you use the
+-l
+lex compatibility option, in which case
+yytext
+will be an array.
+The advantage of using
+%pointer
+is substantially faster scanning and no buffer overflow when matching
+very large tokens (unless you run out of dynamic memory). The disadvantage
+is that you are restricted in how your actions can modify
+yytext
+(see the next section), and calls to the
+unput()
+function destroys the present contents of
+yytext,
+which can be a considerable porting headache when moving between different
+lex
+versions.
+
+
+The advantage of
+%array
+is that you can then modify
+yytext
+to your heart's content, and calls to
+unput()
+do not destroy
+yytext
+(see below). Furthermore, existing
+lex
+programs sometimes access
+yytext
+externally using declarations of the form:
+
+ extern char yytext[];
+
+This definition is erroneous when used with
+%pointer,
+but correct for
+%array.
+
+
+%array
+defines
+yytext
+to be an array of
+YYLMAX
+characters, which defaults to a fairly large value. You can change
+the size by simply #define'ing
+YYLMAX
+to a different value in the first section of your
+flex
+input. As mentioned above, with
+%pointer
+yytext grows dynamically to accommodate large tokens. While this means your
+%pointer
+scanner can accommodate very large tokens (such as matching entire blocks
+of comments), bear in mind that each time the scanner must resize
+yytext
+it also must rescan the entire token from the beginning, so matching such
+tokens can prove slow.
+yytext
+presently does
+not
+dynamically grow if a call to
+unput()
+results in too much text being pushed back; instead, a run-time error results.
+
+
+Also note that you cannot use
+%array
+with C++ scanner classes
+(the
+c++
+option; see below).
+
+
ACTIONS
+
+Each pattern in a rule has a corresponding action, which can be any
+arbitrary C statement. The pattern ends at the first non-escaped
+whitespace character; the remainder of the line is its action. If the
+action is empty, then when the pattern is matched the input token
+is simply discarded. For example, here is the specification for a program
+which deletes all occurrences of "zap me" from its input:
+
+
+
%%
+
"zap me"
+
+
+(It will copy all other characters in the input to the output since
+they will be matched by the default rule.)
+
+
+Here is a program which compresses multiple blanks and tabs down to
+a single blank, and throws away whitespace found at the end of a line:
+
+
+
%%
+
[ \t]+ putchar( ' ' );
+
[ \t]+$ /* ignore this token */
+
+
+
+
+If the action contains a '{', then the action spans till the balancing '}'
+is found, and the action may cross multiple lines.
+flex
+knows about C strings and comments and won't be fooled by braces found
+within them, but also allows actions to begin with
+%{
+and will consider the action to be all the text up to the next
+%}
+(regardless of ordinary braces inside the action).
+
+
+An action consisting solely of a vertical bar ('|') means "same as
+the action for the next rule." See below for an illustration.
+
+
+Actions can include arbitrary C code, including
+return
+statements to return a value to whatever routine called
+yylex().
+Each time
+yylex()
+is called it continues processing tokens from where it last left
+off until it either reaches
+the end of the file or executes a return.
+
+
+Actions are free to modify
+yytext
+except for lengthening it (adding
+characters to its end--these will overwrite later characters in the
+input stream). This however does not apply when using
+%array
+(see above); in that case,
+yytext
+may be freely modified in any way.
+
+
+Actions are free to modify
+yyleng
+except they should not do so if the action also includes use of
+yymore()
+(see below).
+
+
+There are a number of special directives which can be included within
+an action:
+
- -
- ECHO
+copies yytext to the scanner's output.
+
- -
- BEGIN
+followed by the name of a start condition places the scanner in the
+corresponding start condition (see below).
+
- -
- REJECT
+directs the scanner to proceed on to the "second best" rule which matched the
+input (or a prefix of the input). The rule is chosen as described
+above in "How the Input is Matched", and
+yytext
+and
+yyleng
+set up appropriately.
+It may either be one which matched as much text
+as the originally chosen rule but came later in the
+flex
+input file, or one which matched less text.
+For example, the following will both count the
+words in the input and call the routine special() whenever "frob" is seen:
+
+
+
int word_count = 0;
+
%%
+
+
frob special(); REJECT;
+
[^ \t\n]+ ++word_count;
+
+
+Without the
+REJECT,
+any "frob"'s in the input would not be counted as words, since the
+scanner normally executes only one action per token.
+Multiple
+REJECT's
+are allowed, each one finding the next best choice to the currently
+active rule. For example, when the following scanner scans the token
+"abcd", it will write "abcdabcaba" to the output:
+
+
+
%%
+
a |
+
ab |
+
abc |
+
abcd ECHO; REJECT;
+
.|\n /* eat up any unmatched character */
+
+
+(The first three rules share the fourth's action since they use
+the special '|' action.)
+REJECT
+is a particularly expensive feature in terms of scanner performance;
+if it is used in
+any
+of the scanner's actions it will slow down
+all
+of the scanner's matching. Furthermore,
+REJECT
+cannot be used with the
+-Cf
+or
+-CF
+options (see below).
+ - Note also that unlike the other special actions,
+REJECT
+is a
+branch;
+code immediately following it in the action will
+not
+be executed.
+
- -
- yymore()
+tells the scanner that the next time it matches a rule, the corresponding
+token should be
+appended
+onto the current value of
+yytext
+rather than replacing it. For example, given the input "mega-kludge"
+the following will write "mega-mega-kludge" to the output:
+
+
+
%%
+
mega- ECHO; yymore();
+
kludge ECHO;
+
+
+First "mega-" is matched and echoed to the output. Then "kludge"
+is matched, but the previous "mega-" is still hanging around at the
+beginning of
+yytext
+so the
+ECHO
+for the "kludge" rule will actually write "mega-kludge".
+
+
+Two notes regarding use of
+yymore().
+First,
+yymore()
+depends on the value of
+yyleng
+correctly reflecting the size of the current token, so you must not
+modify
+yyleng
+if you are using
+yymore().
+Second, the presence of
+yymore()
+in the scanner's action entails a minor performance penalty in the
+scanner's matching speed.
+
- -
- yyless(n)
+returns all but the first
+n
+characters of the current token back to the input stream, where they
+will be rescanned when the scanner looks for the next match.
+yytext
+and
+yyleng
+are adjusted appropriately (e.g.,
+yyleng
+will now be equal to
+n
+). For example, on the input "foobar" the following will write out
+"foobarbar":
+
+
+
%%
+
foobar ECHO; yyless(3);
+
[a-z]+ ECHO;
+
+
+An argument of 0 to
+yyless
+will cause the entire current input string to be scanned again. Unless you've
+changed how the scanner will subsequently process its input (using
+BEGIN,
+for example), this will result in an endless loop.
+
+
+Note that
+yyless
+is a macro and can only be used in the flex input file, not from
+other source files.
+
- -
- unput(c)
+puts the character
+c
+back onto the input stream. It will be the next character scanned.
+The following action will take the current token and cause it
+to be rescanned enclosed in parentheses.
+
+
+
{
+
int i;
+
/* Copy yytext because unput() trashes yytext */
+
char *yycopy = strdup( yytext );
+
unput( ')' );
+
for ( i = yyleng - 1; i >= 0; --i )
+
unput( yycopy[i] );
+
unput( '(' );
+
free( yycopy );
+
}
+
+
+Note that since each
+unput()
+puts the given character back at the
+beginning
+of the input stream, pushing back strings must be done back-to-front.
+
+
+An important potential problem when using
+unput()
+is that if you are using
+%pointer
+(the default), a call to
+unput()
+destroys
+the contents of
+yytext,
+starting with its rightmost character and devouring one character to
+the left with each call. If you need the value of yytext preserved
+after a call to
+unput()
+(as in the above example),
+you must either first copy it elsewhere, or build your scanner using
+%array
+instead (see How The Input Is Matched).
+
+
+Finally, note that you cannot put back
+EOF
+to attempt to mark the input stream with an end-of-file.
+
- -
- input()
+reads the next character from the input stream. For example,
+the following is one way to eat up C comments:
+
+
+
%%
+
"/*" {
+
register int c;
+
+
for ( ; ; )
+
{
+
while ( (c = input()) != '*' &&
+
c != EOF )
+
; /* eat up text of comment */
+
+
if ( c == '*' )
+
{
+
while ( (c = input()) == '*' )
+
;
+
if ( c == '/' )
+
break; /* found the end */
+
}
+
+
if ( c == EOF )
+
{
+
error( "EOF in comment" );
+
break;
+
}
+
}
+
}
+
+
+(Note that if the scanner is compiled using
+C++,
+then
+input()
+is instead referred to as
+yyinput(),
+in order to avoid a name clash with the
+C++
+stream by the name of
+input.)
+ - -
- YY_FLUSH_BUFFER
+flushes the scanner's internal buffer
+so that the next time the scanner attempts to match a token, it will
+first refill the buffer using
+YY_INPUT
+(see The Generated Scanner, below). This action is a special case
+of the more general
+yy_flush_buffer()
+function, described below in the section Multiple Input Buffers.
+
- -
- yyterminate()
+can be used in lieu of a return statement in an action. It terminates
+the scanner and returns a 0 to the scanner's caller, indicating "all done".
+By default,
+yyterminate()
+is also called when an end-of-file is encountered. It is a macro and
+may be redefined.
+
+THE GENERATED SCANNER
+
+The output of
+flex
+is the file
+lex.yy.c,
+which contains the scanning routine
+yylex(),
+a number of tables used by it for matching tokens, and a number
+of auxiliary routines and macros. By default,
+yylex()
+is declared as follows:
+
+
+
int yylex()
+
{
+
... various definitions and the actions in here ...
+
}
+
+
+(If your environment supports function prototypes, then it will
+be "int yylex( void )".) This definition may be changed by defining
+the "YY_DECL" macro. For example, you could use:
+
+
+
#define YY_DECL float lexscan( a, b ) float a, b;
+
+
+to give the scanning routine the name
+lexscan,
+returning a float, and taking two floats as arguments. Note that
+if you give arguments to the scanning routine using a
+K&R-style/non-prototyped function declaration, you must terminate
+the definition with a semi-colon (;).
+
+
+Whenever
+yylex()
+is called, it scans tokens from the global input file
+yyin
+(which defaults to stdin). It continues until it either reaches
+an end-of-file (at which point it returns the value 0) or
+one of its actions executes a
+return
+statement.
+
+
+If the scanner reaches an end-of-file, subsequent calls are undefined
+unless either
+yyin
+is pointed at a new input file (in which case scanning continues from
+that file), or
+yyrestart()
+is called.
+yyrestart()
+takes one argument, a
+FILE *
+pointer (which can be nil, if you've set up
+YY_INPUT
+to scan from a source other than
+yyin),
+and initializes
+yyin
+for scanning from that file. Essentially there is no difference between
+just assigning
+yyin
+to a new input file or using
+yyrestart()
+to do so; the latter is available for compatibility with previous versions
+of
+flex,
+and because it can be used to switch input files in the middle of scanning.
+It can also be used to throw away the current input buffer, by calling
+it with an argument of
+yyin;
+but better is to use
+YY_FLUSH_BUFFER
+(see above).
+Note that
+yyrestart()
+does
+not
+reset the start condition to
+INITIAL
+(see Start Conditions, below).
+
+
+If
+yylex()
+stops scanning due to executing a
+return
+statement in one of the actions, the scanner may then be called again and it
+will resume scanning where it left off.
+
+
+By default (and for purposes of efficiency), the scanner uses
+block-reads rather than simple
+getc()
+calls to read characters from
+yyin.
+The nature of how it gets its input can be controlled by defining the
+YY_INPUT
+macro.
+YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)". Its
+action is to place up to
+max_size
+characters in the character array
+buf
+and return in the integer variable
+result
+either the
+number of characters read or the constant YY_NULL (0 on Unix systems)
+to indicate EOF. The default YY_INPUT reads from the
+global file-pointer "yyin".
+
+
+A sample definition of YY_INPUT (in the definitions
+section of the input file):
+
+
+
%{
+
#define YY_INPUT(buf,result,max_size) \
+
{ \
+
int c = getchar(); \
+
result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \
+
}
+
%}
+
+
+This definition will change the input processing to occur
+one character at a time.
+
+
+When the scanner receives an end-of-file indication from YY_INPUT,
+it then checks the
+yywrap()
+function. If
+yywrap()
+returns false (zero), then it is assumed that the
+function has gone ahead and set up
+yyin
+to point to another input file, and scanning continues. If it returns
+true (non-zero), then the scanner terminates, returning 0 to its
+caller. Note that in either case, the start condition remains unchanged;
+it does
+not
+revert to
+INITIAL.
+
+
+If you do not supply your own version of
+yywrap(),
+then you must either use
+%option noyywrap
+(in which case the scanner behaves as though
+yywrap()
+returned 1), or you must link with
+-lfl
+to obtain the default version of the routine, which always returns 1.
+
+
+Three routines are available for scanning from in-memory buffers rather
+than files:
+yy_scan_string(), yy_scan_bytes(),
+and
+yy_scan_buffer().
+See the discussion of them below in the section Multiple Input Buffers.
+
+
+The scanner writes its
+ECHO
+output to the
+yyout
+global (default, stdout), which may be redefined by the user simply
+by assigning it to some other
+FILE
+pointer.
+
+
START CONDITIONS
+
+flex
+provides a mechanism for conditionally activating rules. Any rule
+whose pattern is prefixed with "<sc>" will only be active when
+the scanner is in the start condition named "sc". For example,
+
+
+
<STRING>[^"]* { /* eat up the string body ... */
+
...
+
}
+
+
+will be active only when the scanner is in the "STRING" start
+condition, and
+
+
+
<INITIAL,STRING,QUOTE>\. { /* handle an escape ... */
+
...
+
}
+
+
+will be active only when the current start condition is
+either "INITIAL", "STRING", or "QUOTE".
+
+
+Start conditions
+are declared in the definitions (first) section of the input
+using unindented lines beginning with either
+%s
+or
+%x
+followed by a list of names.
+The former declares
+inclusive
+start conditions, the latter
+exclusive
+start conditions. A start condition is activated using the
+BEGIN
+action. Until the next
+BEGIN
+action is executed, rules with the given start
+condition will be active and
+rules with other start conditions will be inactive.
+If the start condition is
+inclusive,
+then rules with no start conditions at all will also be active.
+If it is
+exclusive,
+then
+only
+rules qualified with the start condition will be active.
+A set of rules contingent on the same exclusive start condition
+describe a scanner which is independent of any of the other rules in the
+flex
+input. Because of this,
+exclusive start conditions make it easy to specify "mini-scanners"
+which scan portions of the input that are syntactically different
+from the rest (e.g., comments).
+
+
+If the distinction between inclusive and exclusive start conditions
+is still a little vague, here's a simple example illustrating the
+connection between the two. The set of rules:
+
+
+
%s example
+
%%
+
+
<example>foo do_something();
+
+
bar something_else();
+
+
+is equivalent to
+
+
+
%x example
+
%%
+
+
<example>foo do_something();
+
+
<INITIAL,example>bar something_else();
+
+
+Without the
+<INITIAL,example>
+qualifier, the
+bar
+pattern in the second example wouldn't be active (i.e., couldn't match)
+when in start condition
+example.
+If we just used
+<example>
+to qualify
+bar,
+though, then it would only be active in
+example
+and not in
+INITIAL,
+while in the first example it's active in both, because in the first
+example the
+example
+startion condition is an
+inclusive
+(%s)
+start condition.
+
+
+Also note that the special start-condition specifier
+<*>
+matches every start condition. Thus, the above example could also
+have been written;
+
+
+
%x example
+
%%
+
+
<example>foo do_something();
+
+
<*>bar something_else();
+
+
+
+
+The default rule (to
+ECHO
+any unmatched character) remains active in start conditions. It
+is equivalent to:
+
+
+
<*>.|\n ECHO;
+
+
+
+
+BEGIN(0)
+returns to the original state where only the rules with
+no start conditions are active. This state can also be
+referred to as the start-condition "INITIAL", so
+BEGIN(INITIAL)
+is equivalent to
+BEGIN(0).
+(The parentheses around the start condition name are not required but
+are considered good style.)
+
+
+BEGIN
+actions can also be given as indented code at the beginning
+of the rules section. For example, the following will cause
+the scanner to enter the "SPECIAL" start condition whenever
+yylex()
+is called and the global variable
+enter_special
+is true:
+
+
+
int enter_special;
+
+
%x SPECIAL
+
%%
+
if ( enter_special )
+
BEGIN(SPECIAL);
+
+
<SPECIAL>blahblahblah
+
...more rules follow...
+
+
+
+
+To illustrate the uses of start conditions,
+here is a scanner which provides two different interpretations
+of a string like "123.456". By default it will treat it as
+as three tokens, the integer "123", a dot ('.'), and the integer "456".
+But if the string is preceded earlier in the line by the string
+"expect-floats"
+it will treat it as a single token, the floating-point number
+123.456:
+
+
+
%{
+
#include <math.h>
+
%}
+
%s expect
+
+
%%
+
expect-floats BEGIN(expect);
+
+
<expect>[0-9]+"."[0-9]+ {
+
printf( "found a float, = %f\n",
+
atof( yytext ) );
+
}
+
<expect>\n {
+
/* that's the end of the line, so
+
* we need another "expect-number"
+
* before we'll recognize any more
+
* numbers
+
*/
+
BEGIN(INITIAL);
+
}
+
+
[0-9]+ {
+
printf( "found an integer, = %d\n",
+
atoi( yytext ) );
+
}
+
+
"." printf( "found a dot\n" );
+
+
+Here is a scanner which recognizes (and discards) C comments while
+maintaining a count of the current input line.
+
+
+
%x comment
+
%%
+
int line_num = 1;
+
+
"/*" BEGIN(comment);
+
+
<comment>[^*\n]* /* eat anything that's not a '*' */
+
<comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */
+
<comment>\n ++line_num;
+
<comment>"*"+"/" BEGIN(INITIAL);
+
+
+This scanner goes to a bit of trouble to match as much
+text as possible with each rule. In general, when attempting to write
+a high-speed scanner try to match as much possible in each rule, as
+it's a big win.
+
+
+Note that start-conditions names are really integer values and
+can be stored as such. Thus, the above could be extended in the
+following fashion:
+
+
+
%x comment foo
+
%%
+
int line_num = 1;
+
int comment_caller;
+
+
"/*" {
+
comment_caller = INITIAL;
+
BEGIN(comment);
+
}
+
+
...
+
+
<foo>"/*" {
+
comment_caller = foo;
+
BEGIN(comment);
+
}
+
+
<comment>[^*\n]* /* eat anything that's not a '*' */
+
<comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */
+
<comment>\n ++line_num;
+
<comment>"*"+"/" BEGIN(comment_caller);
+
+
+Furthermore, you can access the current start condition using
+the integer-valued
+YY_START
+macro. For example, the above assignments to
+comment_caller
+could instead be written
+
+
+
comment_caller = YY_START;
+
+
+Flex provides
+YYSTATE
+as an alias for
+YY_START
+(since that is what's used by AT&T
+lex).
+
+
+Note that start conditions do not have their own name-space; %s's and %x's
+declare names in the same fashion as #define's.
+
+
+Finally, here's an example of how to match C-style quoted strings using
+exclusive start conditions, including expanded escape sequences (but
+not including checking for a string that's too long):
+
+
+
%x str
+
+
%%
+
char string_buf[MAX_STR_CONST];
+
char *string_buf_ptr;
+
+
+
\" string_buf_ptr = string_buf; BEGIN(str);
+
+
<str>\" { /* saw closing quote - all done */
+
BEGIN(INITIAL);
+
*string_buf_ptr = '\0';
+
/* return string constant token type and
+
* value to parser
+
*/
+
}
+
+
<str>\n {
+
/* error - unterminated string constant */
+
/* generate error message */
+
}
+
+
<str>\\[0-7]{1,3} {
+
/* octal escape sequence */
+
int result;
+
+
(void) sscanf( yytext + 1, "%o", &result );
+
+
if ( result > 0xff )
+
/* error, constant is out-of-bounds */
+
+
*string_buf_ptr++ = result;
+
}
+
+
<str>\\[0-9]+ {
+
/* generate error - bad escape sequence; something
+
* like '\48' or '\0777777'
+
*/
+
}
+
+
<str>\\n *string_buf_ptr++ = '\n';
+
<str>\\t *string_buf_ptr++ = '\t';
+
<str>\\r *string_buf_ptr++ = '\r';
+
<str>\\b *string_buf_ptr++ = '\b';
+
<str>\\f *string_buf_ptr++ = '\f';
+
+
<str>\\(.|\n) *string_buf_ptr++ = yytext[1];
+
+
<str>[^\\\n\"]+ {
+
char *yptr = yytext;
+
+
while ( *yptr )
+
*string_buf_ptr++ = *yptr++;
+
}
+
+
+
+
+Often, such as in some of the examples above, you wind up writing a
+whole bunch of rules all preceded by the same start condition(s). Flex
+makes this a little easier and cleaner by introducing a notion of
+start condition
+scope.
+A start condition scope is begun with:
+
+
+
<SCs>{
+
+
+where
+SCs
+is a list of one or more start conditions. Inside the start condition
+scope, every rule automatically has the prefix
+<SCs>
+applied to it, until a
+'}'
+which matches the initial
+'{'.
+So, for example,
+
+
+
<ESC>{
+
"\\n" return '\n';
+
"\\r" return '\r';
+
"\\f" return '\f';
+
"\\0" return '\0';
+
}
+
+
+is equivalent to:
+
+
+
<ESC>"\\n" return '\n';
+
<ESC>"\\r" return '\r';
+
<ESC>"\\f" return '\f';
+
<ESC>"\\0" return '\0';
+
+
+Start condition scopes may be nested.
+
+
+Three routines are available for manipulating stacks of start conditions:
+
- void yy_push_state(int new_state)
+
- pushes the current start condition onto the top of the start condition
+stack and switches to
+new_state
+as though you had used
+BEGIN new_state
+(recall that start condition names are also integers).
+
- void yy_pop_state()
+
- pops the top of the stack and switches to it via
+BEGIN.
+
- int yy_top_state()
+
- returns the top of the stack without altering the stack's contents.
+
+
+The start condition stack grows dynamically and so has no built-in
+size limitation. If memory is exhausted, program execution aborts.
+
+
+To use start condition stacks, your scanner must include a
+%option stack
+directive (see Options below).
+
+
MULTIPLE INPUT BUFFERS
+
+Some scanners (such as those which support "include" files)
+require reading from several input streams. As
+flex
+scanners do a large amount of buffering, one cannot control
+where the next input will be read from by simply writing a
+YY_INPUT
+which is sensitive to the scanning context.
+YY_INPUT
+is only called when the scanner reaches the end of its buffer, which
+may be a long time after scanning a statement such as an "include"
+which requires switching the input source.
+
+
+To negotiate these sorts of problems,
+flex
+provides a mechanism for creating and switching between multiple
+input buffers. An input buffer is created by using:
+
+
+
YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+
+
+which takes a
+FILE
+pointer and a size and creates a buffer associated with the given
+file and large enough to hold
+size
+characters (when in doubt, use
+YY_BUF_SIZE
+for the size). It returns a
+YY_BUFFER_STATE
+handle, which may then be passed to other routines (see below). The
+YY_BUFFER_STATE
+type is a pointer to an opaque
+struct yy_buffer_state
+structure, so you may safely initialize YY_BUFFER_STATE variables to
+((YY_BUFFER_STATE) 0)
+if you wish, and also refer to the opaque structure in order to
+correctly declare input buffers in source files other than that
+of your scanner. Note that the
+FILE
+pointer in the call to
+yy_create_buffer
+is only used as the value of
+yyin
+seen by
+YY_INPUT;
+if you redefine
+YY_INPUT
+so it no longer uses
+yyin,
+then you can safely pass a nil
+FILE
+pointer to
+yy_create_buffer.
+You select a particular buffer to scan from using:
+
+
+
void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+
+
+switches the scanner's input buffer so subsequent tokens will
+come from
+new_buffer.
+Note that
+yy_switch_to_buffer()
+may be used by yywrap() to set things up for continued scanning, instead
+of opening a new file and pointing
+yyin
+at it. Note also that switching input sources via either
+yy_switch_to_buffer()
+or
+yywrap()
+does
+not
+change the start condition.
+
+
+
void yy_delete_buffer( YY_BUFFER_STATE buffer )
+
+
+is used to reclaim the storage associated with a buffer.
+You can also clear the current contents of a buffer using:
+
+
+
void yy_flush_buffer( YY_BUFFER_STATE buffer )
+
+
+This function discards the buffer's contents,
+so the next time the scanner attempts to match a token from the
+buffer, it will first fill the buffer anew using
+YY_INPUT.
+
+
+yy_new_buffer()
+is an alias for
+yy_create_buffer(),
+provided for compatibility with the C++ use of
+new
+and
+delete
+for creating and destroying dynamic objects.
+
+
+Finally, the
+YY_CURRENT_BUFFER
+macro returns a
+YY_BUFFER_STATE
+handle to the current buffer.
+
+
+Here is an example of using these features for writing a scanner
+which expands include files (the
+<<EOF>>
+feature is discussed below):
+
+
+
/* the "incl" state is used for picking up the name
+
* of an include file
+
*/
+
%x incl
+
+
%{
+
#define MAX_INCLUDE_DEPTH 10
+
YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
+
int include_stack_ptr = 0;
+
%}
+
+
%%
+
include BEGIN(incl);
+
+
[a-z]+ ECHO;
+
[^a-z\n]*\n? ECHO;
+
+
<incl>[ \t]* /* eat the whitespace */
+
<incl>[^ \t\n]+ { /* got the include file name */
+
if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
+
{
+
fprintf( stderr, "Includes nested too deeply" );
+
exit( 1 );
+
}
+
+
include_stack[include_stack_ptr++] =
+
YY_CURRENT_BUFFER;
+
+
yyin = fopen( yytext, "r" );
+
+
if ( ! yyin )
+
error( ... );
+
+
yy_switch_to_buffer(
+
yy_create_buffer( yyin, YY_BUF_SIZE ) );
+
+
BEGIN(INITIAL);
+
}
+
+
<<EOF>> {
+
if ( --include_stack_ptr < 0 )
+
{
+
yyterminate();
+
}
+
+
else
+
{
+
yy_delete_buffer( YY_CURRENT_BUFFER );
+
yy_switch_to_buffer(
+
include_stack[include_stack_ptr] );
+
}
+
}
+
+
+Three routines are available for setting up input buffers for
+scanning in-memory strings instead of files. All of them create
+a new input buffer for scanning the string, and return a corresponding
+YY_BUFFER_STATE
+handle (which you should delete with
+yy_delete_buffer()
+when done with it). They also switch to the new buffer using
+yy_switch_to_buffer(),
+so the next call to
+yylex()
+will start scanning the string.
+- yy_scan_string(const char *str)
+
- scans a NUL-terminated string.
+
- yy_scan_bytes(const char *bytes, int len)
+
- scans
+len
+bytes (including possibly NUL's)
+starting at location
+bytes.
+
+
+Note that both of these functions create and scan a
+copy
+of the string or bytes. (This may be desirable, since
+yylex()
+modifies the contents of the buffer it is scanning.) You can avoid the
+copy by using:
+
- yy_scan_buffer(char *base, yy_size_t size)
+
- which scans in place the buffer starting at
+base,
+consisting of
+size
+bytes, the last two bytes of which
+must
+be
+YY_END_OF_BUFFER_CHAR
+(ASCII NUL).
+These last two bytes are not scanned; thus, scanning
+consists of
+base[0]
+through
+base[size-2],
+inclusive.
+
- If you fail to set up
+base
+in this manner (i.e., forget the final two
+YY_END_OF_BUFFER_CHAR
+bytes), then
+yy_scan_buffer()
+returns a nil pointer instead of creating a new input buffer.
+
- The type
+yy_size_t
+is an integral type to which you can cast an integer expression
+reflecting the size of the buffer.
+
+END-OF-FILE RULES
+
+The special rule "<<EOF>>" indicates
+actions which are to be taken when an end-of-file is
+encountered and yywrap() returns non-zero (i.e., indicates
+no further files to process). The action must finish
+by doing one of four things:
+- -
- assigning
+yyin
+to a new input file (in previous versions of flex, after doing the
+assignment you had to call the special action
+YY_NEW_FILE;
+this is no longer necessary);
+
- -
- executing a
+return
+statement;
+
- -
- executing the special
+yyterminate()
+action;
+
- -
- or, switching to a new buffer using
+yy_switch_to_buffer()
+as shown in the example above.
+
+
+<<EOF>> rules may not be used with other
+patterns; they may only be qualified with a list of start
+conditions. If an unqualified <<EOF>> rule is given, it
+applies to
+all
+start conditions which do not already have <<EOF>> actions. To
+specify an <<EOF>> rule for only the initial start condition, use
+
+
+
<INITIAL><<EOF>>
+
+
+
+
+These rules are useful for catching things like unclosed comments.
+An example:
+
+
+
%x quote
+
%%
+
+
...other rules for dealing with quotes...
+
+
<quote><<EOF>> {
+
error( "unterminated quote" );
+
yyterminate();
+
}
+
<<EOF>> {
+
if ( *++filelist )
+
yyin = fopen( *filelist, "r" );
+
else
+
yyterminate();
+
}
+
+
+
+MISCELLANEOUS MACROS
+
+The macro
+YY_USER_ACTION
+can be defined to provide an action
+which is always executed prior to the matched rule's action. For example,
+it could be #define'd to call a routine to convert yytext to lower-case.
+When
+YY_USER_ACTION
+is invoked, the variable
+yy_act
+gives the number of the matched rule (rules are numbered starting with 1).
+Suppose you want to profile how often each of your rules is matched. The
+following would do the trick:
+
+
+
#define YY_USER_ACTION ++ctr[yy_act]
+
+
+where
+ctr
+is an array to hold the counts for the different rules. Note that
+the macro
+YY_NUM_RULES
+gives the total number of rules (including the default rule, even if
+you use
+-s),
+so a correct declaration for
+ctr
+is:
+
+
+
int ctr[YY_NUM_RULES];
+
+
+
+
+The macro
+YY_USER_INIT
+may be defined to provide an action which is always executed before
+the first scan (and before the scanner's internal initializations are done).
+For example, it could be used to call a routine to read
+in a data table or open a logging file.
+
+
+The macro
+yy_set_interactive(is_interactive)
+can be used to control whether the current buffer is considered
+interactive.
+An interactive buffer is processed more slowly,
+but must be used when the scanner's input source is indeed
+interactive to avoid problems due to waiting to fill buffers
+(see the discussion of the
+-I
+flag below). A non-zero value
+in the macro invocation marks the buffer as interactive, a zero
+value as non-interactive. Note that use of this macro overrides
+%option always-interactive
+or
+%option never-interactive
+(see Options below).
+yy_set_interactive()
+must be invoked prior to beginning to scan the buffer that is
+(or is not) to be considered interactive.
+
+
+The macro
+yy_set_bol(at_bol)
+can be used to control whether the current buffer's scanning
+context for the next token match is done as though at the
+beginning of a line. A non-zero macro argument makes rules anchored with
+'^' active, while a zero argument makes '^' rules inactive.
+
+
+The macro
+YY_AT_BOL()
+returns true if the next token scanned from the current buffer
+will have '^' rules active, false otherwise.
+
+
+In the generated scanner, the actions are all gathered in one large
+switch statement and separated using
+YY_BREAK,
+which may be redefined. By default, it is simply a "break", to separate
+each rule's action from the following rule's.
+Redefining
+YY_BREAK
+allows, for example, C++ users to
+#define YY_BREAK to do nothing (while being very careful that every
+rule ends with a "break" or a "return"!) to avoid suffering from
+unreachable statement warnings where because a rule's action ends with
+"return", the
+YY_BREAK
+is inaccessible.
+
+
VALUES AVAILABLE TO THE USER
+
+This section summarizes the various values available to the user
+in the rule actions.
+- -
- char *yytext
+holds the text of the current token. It may be modified but not lengthened
+(you cannot append characters to the end).
+
- If the special directive
+%array
+appears in the first section of the scanner description, then
+yytext
+is instead declared
+char yytext[YYLMAX],
+where
+YYLMAX
+is a macro definition that you can redefine in the first section
+if you don't like the default value (generally 8KB). Using
+%array
+results in somewhat slower scanners, but the value of
+yytext
+becomes immune to calls to
+input()
+and
+unput(),
+which potentially destroy its value when
+yytext
+is a character pointer. The opposite of
+%array
+is
+%pointer,
+which is the default.
+
- You cannot use
+%array
+when generating C++ scanner classes
+(the
+-+
+flag).
+
- -
- int yyleng
+holds the length of the current token.
+
- -
- FILE *yyin
+is the file which by default
+flex
+reads from. It may be redefined but doing so only makes sense before
+scanning begins or after an EOF has been encountered. Changing it in
+the midst of scanning will have unexpected results since
+flex
+buffers its input; use
+yyrestart()
+instead.
+Once scanning terminates because an end-of-file
+has been seen, you can assign
+yyin
+at the new input file and then call the scanner again to continue scanning.
+
- -
- void yyrestart( FILE *new_file )
+may be called to point
+yyin
+at the new input file. The switch-over to the new file is immediate
+(any previously buffered-up input is lost). Note that calling
+yyrestart()
+with
+yyin
+as an argument thus throws away the current input buffer and continues
+scanning the same input file.
+
- -
- FILE *yyout
+is the file to which
+ECHO
+actions are done. It can be reassigned by the user.
+
- -
- YY_CURRENT_BUFFER
+returns a
+YY_BUFFER_STATE
+handle to the current buffer.
+
- -
- YY_START
+returns an integer value corresponding to the current start
+condition. You can subsequently use this value with
+BEGIN
+to return to that start condition.
+
+
INTERFACING WITH YACC
+
+One of the main uses of
+flex
+is as a companion to the
+yacc
+parser-generator.
+yacc
+parsers expect to call a routine named
+yylex()
+to find the next input token. The routine is supposed to
+return the type of the next token as well as putting any associated
+value in the global
+yylval.
+To use
+flex
+with
+yacc,
+one specifies the
+-d
+option to
+yacc
+to instruct it to generate the file
+y.tab.h
+containing definitions of all the
+%tokens
+appearing in the
+yacc
+input. This file is then included in the
+flex
+scanner. For example, if one of the tokens is "TOK_NUMBER",
+part of the scanner might look like:
+
+
+
%{
+
#include "y.tab.h"
+
%}
+
+
%%
+
+
[0-9]+ yylval = atoi( yytext ); return TOK_NUMBER;
+
+
+
+OPTIONS
+
+flex
+has the following options:
+- -b
+
- Generate backing-up information to
+lex.backup.
+This is a list of scanner states which require backing up
+and the input characters on which they do so. By adding rules one
+can remove backing-up states. If
+all
+backing-up states are eliminated and
+-Cf
+or
+-CF
+is used, the generated scanner will run faster (see the
+-p
+flag). Only users who wish to squeeze every last cycle out of their
+scanners need worry about this option. (See the section on Performance
+Considerations below.)
+
- -c
+
- is a do-nothing, deprecated option included for POSIX compliance.
+
- -d
+
- makes the generated scanner run in
+debug
+mode. Whenever a pattern is recognized and the global
+yy_flex_debug
+is non-zero (which is the default),
+the scanner will write to
+stderr
+a line of the form:
+
+
+
--accepting rule at line 53 ("the matched text")
+
+
+The line number refers to the location of the rule in the file
+defining the scanner (i.e., the file that was fed to flex). Messages
+are also generated when the scanner backs up, accepts the
+default rule, reaches the end of its input buffer (or encounters
+a NUL; at this point, the two look the same as far as the scanner's concerned),
+or reaches an end-of-file.
+ - -f
+
- specifies
+fast scanner.
+No table compression is done and stdio is bypassed.
+The result is large but fast. This option is equivalent to
+-Cfr
+(see below).
+
- -h
+
- generates a "help" summary of
+flex's
+options to
+stdout
+and then exits.
+-?
+and
+--help
+are synonyms for
+-h.
+
- -i
+
- instructs
+flex
+to generate a
+case-insensitive
+scanner. The case of letters given in the
+flex
+input patterns will
+be ignored, and tokens in the input will be matched regardless of case. The
+matched text given in
+yytext
+will have the preserved case (i.e., it will not be folded).
+
- -l
+
- turns on maximum compatibility with the original AT&T
+lex
+implementation. Note that this does not mean
+full
+compatibility. Use of this option costs a considerable amount of
+performance, and it cannot be used with the
+-+, -f, -F, -Cf,
+or
+-CF
+options. For details on the compatibilities it provides, see the section
+"Incompatibilities With Lex And POSIX" below. This option also results
+in the name
+YY_FLEX_LEX_COMPAT
+being #define'd in the generated scanner.
+
- -n
+
- is another do-nothing, deprecated option included only for
+POSIX compliance.
+
- -p
+
- generates a performance report to stderr. The report
+consists of comments regarding features of the
+flex
+input file which will cause a serious loss of performance in the resulting
+scanner. If you give the flag twice, you will also get comments regarding
+features that lead to minor performance losses.
+
- Note that the use of
+REJECT,
+%option yylineno,
+and variable trailing context (see the Deficiencies / Bugs section below)
+entails a substantial performance penalty; use of
+yymore(),
+the
+^
+operator,
+and the
+-I
+flag entail minor performance penalties.
+
- -s
+
- causes the
+default rule
+(that unmatched scanner input is echoed to
+stdout)
+to be suppressed. If the scanner encounters input that does not
+match any of its rules, it aborts with an error. This option is
+useful for finding holes in a scanner's rule set.
+
- -t
+
- instructs
+flex
+to write the scanner it generates to standard output instead
+of
+lex.yy.c.
+
- -v
+
- specifies that
+flex
+should write to
+stderr
+a summary of statistics regarding the scanner it generates.
+Most of the statistics are meaningless to the casual
+flex
+user, but the first line identifies the version of
+flex
+(same as reported by
+-V),
+and the next line the flags used when generating the scanner, including
+those that are on by default.
+
- -w
+
- suppresses warning messages.
+
- -B
+
- instructs
+flex
+to generate a
+batch
+scanner, the opposite of
+interactive
+scanners generated by
+-I
+(see below). In general, you use
+-B
+when you are
+certain
+that your scanner will never be used interactively, and you want to
+squeeze a
+little
+more performance out of it. If your goal is instead to squeeze out a
+lot
+more performance, you should be using the
+-Cf
+or
+-CF
+options (discussed below), which turn on
+-B
+automatically anyway.
+
- -F
+
- specifies that the
+fast
+scanner table representation should be used (and stdio
+bypassed). This representation is
+about as fast as the full table representation
+(-f),
+and for some sets of patterns will be considerably smaller (and for
+others, larger). In general, if the pattern set contains both "keywords"
+and a catch-all, "identifier" rule, such as in the set:
+
+
+
"case" return TOK_CASE;
+
"switch" return TOK_SWITCH;
+
...
+
"default" return TOK_DEFAULT;
+
[a-z]+ return TOK_ID;
+
+
+then you're better off using the full table representation. If only
+the "identifier" rule is present and you then use a hash table or some such
+to detect the keywords, you're better off using
+-F.
+ - This option is equivalent to
+-CFr
+(see below). It cannot be used with
+-+.
+
- -I
+
- instructs
+flex
+to generate an
+interactive
+scanner. An interactive scanner is one that only looks ahead to decide
+what token has been matched if it absolutely must. It turns out that
+always looking one extra character ahead, even if the scanner has already
+seen enough text to disambiguate the current token, is a bit faster than
+only looking ahead when necessary. But scanners that always look ahead
+give dreadful interactive performance; for example, when a user types
+a newline, it is not recognized as a newline token until they enter
+another
+token, which often means typing in another whole line.
+
- Flex
+scanners default to
+interactive
+unless you use the
+-Cf
+or
+-CF
+table-compression options (see below). That's because if you're looking
+for high-performance you should be using one of these options, so if you
+didn't,
+flex
+assumes you'd rather trade off a bit of run-time performance for intuitive
+interactive behavior. Note also that you
+cannot
+use
+-I
+in conjunction with
+-Cf
+or
+-CF.
+Thus, this option is not really needed; it is on by default for all those
+cases in which it is allowed.
+
- You can force a scanner to
+not
+be interactive by using
+-B
+(see above).
+
- -L
+
- instructs
+flex
+not to generate
+#line
+directives. Without this option,
+flex
+peppers the generated scanner
+with #line directives so error messages in the actions will be correctly
+located with respect to either the original
+flex
+input file (if the errors are due to code in the input file), or
+lex.yy.c
+(if the errors are
+flex's
+fault -- you should report these sorts of errors to the email address
+given below).
+
- -T
+
- makes
+flex
+run in
+trace
+mode. It will generate a lot of messages to
+stderr
+concerning
+the form of the input and the resultant non-deterministic and deterministic
+finite automata. This option is mostly for use in maintaining
+flex.
+
- -V
+
- prints the version number to
+stdout
+and exits.
+--version
+is a synonym for
+-V.
+
- -7
+
- instructs
+flex
+to generate a 7-bit scanner, i.e., one which can only recognized 7-bit
+characters in its input. The advantage of using
+-7
+is that the scanner's tables can be up to half the size of those generated
+using the
+-8
+option (see below). The disadvantage is that such scanners often hang
+or crash if their input contains an 8-bit character.
+
- Note, however, that unless you generate your scanner using the
+-Cf
+or
+-CF
+table compression options, use of
+-7
+will save only a small amount of table space, and make your scanner
+considerably less portable.
+Flex's
+default behavior is to generate an 8-bit scanner unless you use the
+-Cf
+or
+-CF,
+in which case
+flex
+defaults to generating 7-bit scanners unless your site was always
+configured to generate 8-bit scanners (as will often be the case
+with non-USA sites). You can tell whether flex generated a 7-bit
+or an 8-bit scanner by inspecting the flag summary in the
+-v
+output as described above.
+
- Note that if you use
+-Cfe
+or
+-CFe
+(those table compression options, but also using equivalence classes as
+discussed see below), flex still defaults to generating an 8-bit
+scanner, since usually with these compression options full 8-bit tables
+are not much more expensive than 7-bit tables.
+
- -8
+
- instructs
+flex
+to generate an 8-bit scanner, i.e., one which can recognize 8-bit
+characters. This flag is only needed for scanners generated using
+-Cf
+or
+-CF,
+as otherwise flex defaults to generating an 8-bit scanner anyway.
+
- See the discussion of
+-7
+above for flex's default behavior and the tradeoffs between 7-bit
+and 8-bit scanners.
+
- -+
+
- specifies that you want flex to generate a C++
+scanner class. See the section on Generating C++ Scanners below for
+details.
+
- -C[aefFmr]
+
- controls the degree of table compression and, more generally, trade-offs
+between small scanners and fast scanners.
+
- -Ca
+("align") instructs flex to trade off larger tables in the
+generated scanner for faster performance because the elements of
+the tables are better aligned for memory access and computation. On some
+RISC architectures, fetching and manipulating longwords is more efficient
+than with smaller-sized units such as shortwords. This option can
+double the size of the tables used by your scanner.
+
- -Ce
+directs
+flex
+to construct
+equivalence classes,
+i.e., sets of characters
+which have identical lexical properties (for example, if the only
+appearance of digits in the
+flex
+input is in the character class
+"[0-9]" then the digits '0', '1', ..., '9' will all be put
+in the same equivalence class). Equivalence classes usually give
+dramatic reductions in the final table/object file sizes (typically
+a factor of 2-5) and are pretty cheap performance-wise (one array
+look-up per character scanned).
+
- -Cf
+specifies that the
+full
+scanner tables should be generated -
+flex
+should not compress the
+tables by taking advantages of similar transition functions for
+different states.
+
- -CF
+specifies that the alternate fast scanner representation (described
+above under the
+-F
+flag)
+should be used. This option cannot be used with
+-+.
+
- -Cm
+directs
+flex
+to construct
+meta-equivalence classes,
+which are sets of equivalence classes (or characters, if equivalence
+classes are not being used) that are commonly used together. Meta-equivalence
+classes are often a big win when using compressed tables, but they
+have a moderate performance impact (one or two "if" tests and one
+array look-up per character scanned).
+
- -Cr
+causes the generated scanner to
+bypass
+use of the standard I/O library (stdio) for input. Instead of calling
+fread()
+or
+getc(),
+the scanner will use the
+read()
+system call, resulting in a performance gain which varies from system
+to system, but in general is probably negligible unless you are also using
+-Cf
+or
+-CF.
+Using
+-Cr
+can cause strange behavior if, for example, you read from
+yyin
+using stdio prior to calling the scanner (because the scanner will miss
+whatever text your previous reads left in the stdio input buffer).
+
- -Cr
+has no effect if you define
+YY_INPUT
+(see The Generated Scanner above).
+
- A lone
+-C
+specifies that the scanner tables should be compressed but neither
+equivalence classes nor meta-equivalence classes should be used.
+
- The options
+-Cf
+or
+-CF
+and
+-Cm
+do not make sense together - there is no opportunity for meta-equivalence
+classes if the table is not being compressed. Otherwise the options
+may be freely mixed, and are cumulative.
+
- The default setting is
+-Cem,
+which specifies that
+flex
+should generate equivalence classes
+and meta-equivalence classes. This setting provides the highest
+degree of table compression. You can trade off
+faster-executing scanners at the cost of larger tables with
+the following generally being true:
+
+
+
slowest & smallest
+
-Cem
+
-Cm
+
-Ce
+
-C
+
-C{f,F}e
+
-C{f,F}
+
-C{f,F}a
+
fastest & largest
+
+
+Note that scanners with the smallest tables are usually generated and
+compiled the quickest, so
+during development you will usually want to use the default, maximal
+compression.
+ - -Cfe
+is often a good compromise between speed and size for production
+scanners.
+
- -ooutput
+
- directs flex to write the scanner to the file
+output
+instead of
+lex.yy.c.
+If you combine
+-o
+with the
+-t
+option, then the scanner is written to
+stdout
+but its
+#line
+directives (see the
+\-L
+option above) refer to the file
+output.
+
- -Pprefix
+
- changes the default
+yy
+prefix used by
+flex
+for all globally-visible variable and function names to instead be
+prefix.
+For example,
+-Pfoo
+changes the name of
+yytext
+to
+footext.
+It also changes the name of the default output file from
+lex.yy.c
+to
+lex.foo.c.
+Here are all of the names affected:
+
+
+
yy_create_buffer
+
yy_delete_buffer
+
yy_flex_debug
+
yy_init_buffer
+
yy_flush_buffer
+
yy_load_buffer_state
+
yy_switch_to_buffer
+
yyin
+
yyleng
+
yylex
+
yylineno
+
yyout
+
yyrestart
+
yytext
+
yywrap
+
+
+(If you are using a C++ scanner, then only
+yywrap
+and
+yyFlexLexer
+are affected.)
+Within your scanner itself, you can still refer to the global variables
+and functions using either version of their name; but externally, they
+have the modified name.
+ - This option lets you easily link together multiple
+flex
+programs into the same executable. Note, though, that using this
+option also renames
+yywrap(),
+so you now
+must
+either
+provide your own (appropriately-named) version of the routine for your
+scanner, or use
+%option noyywrap,
+as linking with
+-lfl
+no longer provides one for you by default.
+
- -Sskeleton_file
+
- overrides the default skeleton file from which
+flex
+constructs its scanners. You'll never need this option unless you are doing
+flex
+maintenance or development.
+
+
+flex
+also provides a mechanism for controlling options within the
+scanner specification itself, rather than from the flex command-line.
+This is done by including
+%option
+directives in the first section of the scanner specification.
+You can specify multiple options with a single
+%option
+directive, and multiple directives in the first section of your flex input
+file. Most
+options are given simply as names, optionally preceded by the
+word "no" (with no intervening whitespace) to negate their meaning.
+A number are equivalent to flex flags or their negation:
+
+
+
7bit -7 option
+
8bit -8 option
+
align -Ca option
+
backup -b option
+
batch -B option
+
c++ -+ option
+
+
caseful or
+
case-sensitive opposite of -i (default)
+
+
case-insensitive or
+
caseless -i option
+
+
debug -d option
+
default opposite of -s option
+
ecs -Ce option
+
fast -F option
+
full -f option
+
interactive -I option
+
lex-compat -l option
+
meta-ecs -Cm option
+
perf-report -p option
+
read -Cr option
+
stdout -t option
+
verbose -v option
+
warn opposite of -w option
+
(use "%option nowarn" for -w)
+
+
array equivalent to "%array"
+
pointer equivalent to "%pointer" (default)
+
+
+Some
+%option's
+provide features otherwise not available:
+- always-interactive
+
- instructs flex to generate a scanner which always considers its input
+"interactive". Normally, on each new input file the scanner calls
+isatty()
+in an attempt to determine whether
+the scanner's input source is interactive and thus should be read a
+character at a time. When this option is used, however, then no
+such call is made.
+
- main
+
- directs flex to provide a default
+main()
+program for the scanner, which simply calls
+yylex().
+This option implies
+noyywrap
+(see below).
+
- never-interactive
+
- instructs flex to generate a scanner which never considers its input
+"interactive" (again, no call made to
+isatty()).
+This is the opposite of
+always-interactive.
+
- stack
+
- enables the use of start condition stacks (see Start Conditions above).
+
- stdinit
+
- if unset (i.e.,
+%option nostdinit)
+initializes
+yyin
+and
+yyout
+to nil
+FILE
+pointers, instead of
+stdin
+and
+stdout.
+
- yylineno
+
- directs
+flex
+to generate a scanner that maintains the number of the current line
+read from its input in the global variable
+yylineno.
+This option is implied by
+%option lex-compat.
+
- yywrap
+
- if unset (i.e.,
+%option noyywrap),
+makes the scanner not call
+yywrap()
+upon an end-of-file, but simply assume that there are no more
+files to scan (until the user points
+yyin
+at a new file and calls
+yylex()
+again).
+
+
+flex
+scans your rule actions to determine whether you use the
+REJECT
+or
+yymore()
+features. The
+reject
+and
+yymore
+options are available to override its decision as to whether you use the
+options, either by setting them (e.g.,
+%option reject)
+to indicate the feature is indeed used, or
+unsetting them to indicate it actually is not used
+(e.g.,
+%option noyymore).
+
+
+Three options take string-delimited values, offset with '=':
+
+
+
%option outfile="ABC"
+
+
+is equivalent to
+-oABC,
+and
+
+
+
%option prefix="XYZ"
+
+
+is equivalent to
+-PXYZ.
+Finally,
+
+
+
%option yyclass="foo"
+
+
+only applies when generating a C++ scanner (
+-+
+option). It informs
+flex
+that you have derived
+foo
+as a subclass of
+yyFlexLexer,
+so
+flex
+will place your actions in the member function
+foo::yylex()
+instead of
+yyFlexLexer::yylex().
+It also generates a
+yyFlexLexer::yylex()
+member function that emits a run-time error (by invoking
+yyFlexLexer::LexerError())
+if called.
+See Generating C++ Scanners, below, for additional information.
+
+
+A number of options are available for lint purists who want to suppress
+the appearance of unneeded routines in the generated scanner. Each of the
+following, if unset, results in the corresponding routine not appearing in
+the generated scanner:
+
+
+
input, unput
+
yy_push_state, yy_pop_state, yy_top_state
+
yy_scan_buffer, yy_scan_bytes, yy_scan_string
+
+
+(though
+yy_push_state()
+and friends won't appear anyway unless you use
+%option stack).
+
+PERFORMANCE CONSIDERATIONS
+
+The main design goal of
+flex
+is that it generate high-performance scanners. It has been optimized
+for dealing well with large sets of rules. Aside from the effects on
+scanner speed of the table compression
+-C
+options outlined above,
+there are a number of options/actions which degrade performance. These
+are, from most expensive to least:
+
+
+
REJECT
+
%option yylineno
+
arbitrary trailing context
+
+
pattern sets that require backing up
+
%array
+
%option interactive
+
%option always-interactive
+
+
'^' beginning-of-line operator
+
yymore()
+
+
+with the first three all being quite expensive and the last two
+being quite cheap. Note also that
+unput()
+is implemented as a routine call that potentially does quite a bit of
+work, while
+yyless()
+is a quite-cheap macro; so if just putting back some excess text you
+scanned, use
+yyless().
+
+
+REJECT
+should be avoided at all costs when performance is important.
+It is a particularly expensive option.
+
+
+Getting rid of backing up is messy and often may be an enormous
+amount of work for a complicated scanner. In principal, one begins
+by using the
+-b
+flag to generate a
+lex.backup
+file. For example, on the input
+
+
+
%%
+
foo return TOK_KEYWORD;
+
foobar return TOK_KEYWORD;
+
+
+the file looks like:
+
+
+
State #6 is non-accepting -
+
associated rule line numbers:
+
2 3
+
out-transitions: [ o ]
+
jam-transitions: EOF [ \001-n p-\177 ]
+
+
State #8 is non-accepting -
+
associated rule line numbers:
+
3
+
out-transitions: [ a ]
+
jam-transitions: EOF [ \001-` b-\177 ]
+
+
State #9 is non-accepting -
+
associated rule line numbers:
+
3
+
out-transitions: [ r ]
+
jam-transitions: EOF [ \001-q s-\177 ]
+
+
Compressed tables always back up.
+
+
+The first few lines tell us that there's a scanner state in
+which it can make a transition on an 'o' but not on any other
+character, and that in that state the currently scanned text does not match
+any rule. The state occurs when trying to match the rules found
+at lines 2 and 3 in the input file.
+If the scanner is in that state and then reads
+something other than an 'o', it will have to back up to find
+a rule which is matched. With
+a bit of headscratching one can see that this must be the
+state it's in when it has seen "fo". When this has happened,
+if anything other than another 'o' is seen, the scanner will
+have to back up to simply match the 'f' (by the default rule).
+
+
+The comment regarding State #8 indicates there's a problem
+when "foob" has been scanned. Indeed, on any character other
+than an 'a', the scanner will have to back up to accept "foo".
+Similarly, the comment for State #9 concerns when "fooba" has
+been scanned and an 'r' does not follow.
+
+
+The final comment reminds us that there's no point going to
+all the trouble of removing backing up from the rules unless
+we're using
+-Cf
+or
+-CF,
+since there's no performance gain doing so with compressed scanners.
+
+
+The way to remove the backing up is to add "error" rules:
+
+
+
%%
+
foo return TOK_KEYWORD;
+
foobar return TOK_KEYWORD;
+
+
fooba |
+
foob |
+
fo {
+
/* false alarm, not really a keyword */
+
return TOK_ID;
+
}
+
+
+
+
+Eliminating backing up among a list of keywords can also be
+done using a "catch-all" rule:
+
+
+
%%
+
foo return TOK_KEYWORD;
+
foobar return TOK_KEYWORD;
+
+
[a-z]+ return TOK_ID;
+
+
+This is usually the best solution when appropriate.
+
+
+Backing up messages tend to cascade.
+With a complicated set of rules it's not uncommon to get hundreds
+of messages. If one can decipher them, though, it often
+only takes a dozen or so rules to eliminate the backing up (though
+it's easy to make a mistake and have an error rule accidentally match
+a valid token. A possible future
+flex
+feature will be to automatically add rules to eliminate backing up).
+
+
+It's important to keep in mind that you gain the benefits of eliminating
+backing up only if you eliminate
+every
+instance of backing up. Leaving just one means you gain nothing.
+
+
+Variable
+trailing context (where both the leading and trailing parts do not have
+a fixed length) entails almost the same performance loss as
+REJECT
+(i.e., substantial). So when possible a rule like:
+
+
+
%%
+
mouse|rat/(cat|dog) run();
+
+
+is better written:
+
+
+
%%
+
mouse/cat|dog run();
+
rat/cat|dog run();
+
+
+or as
+
+
+
%%
+
mouse|rat/cat run();
+
mouse|rat/dog run();
+
+
+Note that here the special '|' action does
+not
+provide any savings, and can even make things worse (see
+Deficiencies / Bugs below).
+
+
+Another area where the user can increase a scanner's performance
+(and one that's easier to implement) arises from the fact that
+the longer the tokens matched, the faster the scanner will run.
+This is because with long tokens the processing of most input
+characters takes place in the (short) inner scanning loop, and
+does not often have to go through the additional work of setting up
+the scanning environment (e.g.,
+yytext)
+for the action. Recall the scanner for C comments:
+
+
+
%x comment
+
%%
+
int line_num = 1;
+
+
"/*" BEGIN(comment);
+
+
<comment>[^*\n]*
+
<comment>"*"+[^*/\n]*
+
<comment>\n ++line_num;
+
<comment>"*"+"/" BEGIN(INITIAL);
+
+
+This could be sped up by writing it as:
+
+
+
%x comment
+
%%
+
int line_num = 1;
+
+
"/*" BEGIN(comment);
+
+
<comment>[^*\n]*
+
<comment>[^*\n]*\n ++line_num;
+
<comment>"*"+[^*/\n]*
+
<comment>"*"+[^*/\n]*\n ++line_num;
+
<comment>"*"+"/" BEGIN(INITIAL);
+
+
+Now instead of each newline requiring the processing of another
+action, recognizing the newlines is "distributed" over the other rules
+to keep the matched text as long as possible. Note that
+adding
+rules does
+not
+slow down the scanner! The speed of the scanner is independent
+of the number of rules or (modulo the considerations given at the
+beginning of this section) how complicated the rules are with
+regard to operators such as '*' and '|'.
+
+
+A final example in speeding up a scanner: suppose you want to scan
+through a file containing identifiers and keywords, one per line
+and with no other extraneous characters, and recognize all the
+keywords. A natural first approach is:
+
+
+
%%
+
asm |
+
auto |
+
break |
+
... etc ...
+
volatile |
+
while /* it's a keyword */
+
+
.|\n /* it's not a keyword */
+
+
+To eliminate the back-tracking, introduce a catch-all rule:
+
+
+
%%
+
asm |
+
auto |
+
break |
+
... etc ...
+
volatile |
+
while /* it's a keyword */
+
+
[a-z]+ |
+
.|\n /* it's not a keyword */
+
+
+Now, if it's guaranteed that there's exactly one word per line,
+then we can reduce the total number of matches by a half by
+merging in the recognition of newlines with that of the other
+tokens:
+
+
+
%%
+
asm\n |
+
auto\n |
+
break\n |
+
... etc ...
+
volatile\n |
+
while\n /* it's a keyword */
+
+
[a-z]+\n |
+
.|\n /* it's not a keyword */
+
+
+One has to be careful here, as we have now reintroduced backing up
+into the scanner. In particular, while
+we
+know that there will never be any characters in the input stream
+other than letters or newlines,
+flex
+can't figure this out, and it will plan for possibly needing to back up
+when it has scanned a token like "auto" and then the next character
+is something other than a newline or a letter. Previously it would
+then just match the "auto" rule and be done, but now it has no "auto"
+rule, only a "auto\n" rule. To eliminate the possibility of backing up,
+we could either duplicate all rules but without final newlines, or,
+since we never expect to encounter such an input and therefore don't
+how it's classified, we can introduce one more catch-all rule, this
+one which doesn't include a newline:
+
+
+
%%
+
asm\n |
+
auto\n |
+
break\n |
+
... etc ...
+
volatile\n |
+
while\n /* it's a keyword */
+
+
[a-z]+\n |
+
[a-z]+ |
+
.|\n /* it's not a keyword */
+
+
+Compiled with
+-Cf,
+this is about as fast as one can get a
+flex
+scanner to go for this particular problem.
+
+
+A final note:
+flex
+is slow when matching NUL's, particularly when a token contains
+multiple NUL's.
+It's best to write rules which match
+short
+amounts of text if it's anticipated that the text will often include NUL's.
+
+
+Another final note regarding performance: as mentioned above in the section
+How the Input is Matched, dynamically resizing
+yytext
+to accommodate huge tokens is a slow process because it presently requires that
+the (huge) token be rescanned from the beginning. Thus if performance is
+vital, you should attempt to match "large" quantities of text but not
+"huge" quantities, where the cutoff between the two is at about 8K
+characters/token.
+
+
GENERATING C++ SCANNERS
+
+flex
+provides two different ways to generate scanners for use with C++. The
+first way is to simply compile a scanner generated by
+flex
+using a C++ compiler instead of a C compiler. You should not encounter
+any compilations errors (please report any you find to the email address
+given in the Author section below). You can then use C++ code in your
+rule actions instead of C code. Note that the default input source for
+your scanner remains
+yyin,
+and default echoing is still done to
+yyout.
+Both of these remain
+FILE *
+variables and not C++
+streams.
+
+
+You can also use
+flex
+to generate a C++ scanner class, using the
+-+
+option (or, equivalently,
+%option c++),
+which is automatically specified if the name of the flex
+executable ends in a '+', such as
+flex++.
+When using this option, flex defaults to generating the scanner to the file
+lex.yy.cc
+instead of
+lex.yy.c.
+The generated scanner includes the header file
+FlexLexer.h,
+which defines the interface to two C++ classes.
+
+
+The first class,
+FlexLexer,
+provides an abstract base class defining the general scanner class
+interface. It provides the following member functions:
+
- const char* YYText()
+
- returns the text of the most recently matched token, the equivalent of
+yytext.
+
- int YYLeng()
+
- returns the length of the most recently matched token, the equivalent of
+yyleng.
+
- int lineno() const
+
- returns the current input line number
+(see
+%option yylineno),
+or
+1
+if
+%option yylineno
+was not used.
+
- void set_debug( int flag )
+
- sets the debugging flag for the scanner, equivalent to assigning to
+yy_flex_debug
+(see the Options section above). Note that you must build the scanner
+using
+%option debug
+to include debugging information in it.
+
- int debug() const
+
- returns the current setting of the debugging flag.
+
+
+Also provided are member functions equivalent to
+yy_switch_to_buffer(),
+yy_create_buffer()
+(though the first argument is an
+istream*
+object pointer and not a
+FILE*),
+yy_flush_buffer(),
+yy_delete_buffer(),
+and
+yyrestart()
+(again, the first argument is a
+istream*
+object pointer).
+
+
+The second class defined in
+FlexLexer.h
+is
+yyFlexLexer,
+which is derived from
+FlexLexer.
+It defines the following additional member functions:
+
- yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 )
+
- constructs a
+yyFlexLexer
+object using the given streams for input and output. If not specified,
+the streams default to
+cin
+and
+cout,
+respectively.
+
- virtual int yylex()
+
- performs the same role is
+yylex()
+does for ordinary flex scanners: it scans the input stream, consuming
+tokens, until a rule's action returns a value. If you derive a subclass
+S
+from
+yyFlexLexer
+and want to access the member functions and variables of
+S
+inside
+yylex(),
+then you need to use
+%option yyclass=S
+to inform
+flex
+that you will be using that subclass instead of
+yyFlexLexer.
+In this case, rather than generating
+yyFlexLexer::yylex(),
+flex
+generates
+S::yylex()
+(and also generates a dummy
+yyFlexLexer::yylex()
+that calls
+yyFlexLexer::LexerError()
+if called).
+
- virtual void switch_streams(istream* new_in = 0,
+
- ostream* new_out = 0)
+
reassigns
+yyin
+to
+new_in
+(if non-nil)
+and
+yyout
+to
+new_out
+(ditto), deleting the previous input buffer if
+yyin
+is reassigned.
+- int yylex( istream* new_in = 0, ostream* new_out = 0 )
+
- first switches the input streams via
+switch_streams( new_in, new_out )
+and then returns the value of
+yylex().
+
+
+In addition,
+yyFlexLexer
+defines the following protected virtual functions which you can redefine
+in derived classes to tailor the scanner:
+
- virtual int LexerInput( char* buf, int max_size )
+
- reads up to
+max_size
+characters into
+buf
+and returns the number of characters read. To indicate end-of-input,
+return 0 characters. Note that "interactive" scanners (see the
+-B
+and
+-I
+flags) define the macro
+YY_INTERACTIVE.
+If you redefine
+LexerInput()
+and need to take different actions depending on whether or not
+the scanner might be scanning an interactive input source, you can
+test for the presence of this name via
+#ifdef.
+
- virtual void LexerOutput( const char* buf, int size )
+
- writes out
+size
+characters from the buffer
+buf,
+which, while NUL-terminated, may also contain "internal" NUL's if
+the scanner's rules can match text with NUL's in them.
+
- virtual void LexerError( const char* msg )
+
- reports a fatal error message. The default version of this function
+writes the message to the stream
+cerr
+and exits.
+
+
+Note that a
+yyFlexLexer
+object contains its
+entire
+scanning state. Thus you can use such objects to create reentrant
+scanners. You can instantiate multiple instances of the same
+yyFlexLexer
+class, and you can also combine multiple C++ scanner classes together
+in the same program using the
+-P
+option discussed above.
+
+
+Finally, note that the
+%array
+feature is not available to C++ scanner classes; you must use
+%pointer
+(the default).
+
+
+Here is an example of a simple C++ scanner:
+
+
+
// An example of using the flex C++ scanner class.
+
+
%{
+
int mylineno = 0;
+
%}
+
+
string \"[^\n"]+\"
+
+
ws [ \t]+
+
+
alpha [A-Za-z]
+
dig [0-9]
+
name ({alpha}|{dig}|\$)({alpha}|{dig}|[_.\-/$])*
+
num1 [-+]?{dig}+\.?([eE][-+]?{dig}+)?
+
num2 [-+]?{dig}*\.{dig}+([eE][-+]?{dig}+)?
+
number {num1}|{num2}
+
+
%%
+
+
{ws} /* skip blanks and tabs */
+
+
"/*" {
+
int c;
+
+
while((c = yyinput()) != 0)
+
{
+
if(c == '\n')
+
++mylineno;
+
+
else if(c == '*')
+
{
+
if((c = yyinput()) == '/')
+
break;
+
else
+
unput(c);
+
}
+
}
+
}
+
+
{number} cout << "number " << YYText() << '\n';
+
+
\n mylineno++;
+
+
{name} cout << "name " << YYText() << '\n';
+
+
{string} cout << "string " << YYText() << '\n';
+
+
%%
+
+
int main( int /* argc */, char** /* argv */ )
+
{
+
FlexLexer* lexer = new yyFlexLexer;
+
while(lexer->yylex() != 0)
+
;
+
return 0;
+
}
+
+If you want to create multiple (different) lexer classes, you use the
+-P
+flag (or the
+prefix=
+option) to rename each
+yyFlexLexer
+to some other
+xxFlexLexer.
+You then can include
+<FlexLexer.h>
+in your other sources once per lexer class, first renaming
+yyFlexLexer
+as follows:
+
+
+
#undef yyFlexLexer
+
#define yyFlexLexer xxFlexLexer
+
#include <FlexLexer.h>
+
+
#undef yyFlexLexer
+
#define yyFlexLexer zzFlexLexer
+
#include <FlexLexer.h>
+
+
+if, for example, you used
+%option prefix=xx
+for one of your scanners and
+%option prefix=zz
+for the other.
+
+
+IMPORTANT: the present form of the scanning class is
+experimental
+and may change considerably between major releases.
+
+
INCOMPATIBILITIES WITH LEX AND POSIX
+
+flex
+is a rewrite of the AT&T Unix
+lex
+tool (the two implementations do not share any code, though),
+with some extensions and incompatibilities, both of which
+are of concern to those who wish to write scanners acceptable
+to either implementation. Flex is fully compliant with the POSIX
+lex
+specification, except that when using
+%pointer
+(the default), a call to
+unput()
+destroys the contents of
+yytext,
+which is counter to the POSIX specification.
+
+
+In this section we discuss all of the known areas of incompatibility
+between flex, AT&T lex, and the POSIX specification.
+
+
+flex's
+-l
+option turns on maximum compatibility with the original AT&T
+lex
+implementation, at the cost of a major loss in the generated scanner's
+performance. We note below which incompatibilities can be overcome
+using the
+-l
+option.
+
+
+flex
+is fully compatible with
+lex
+with the following exceptions:
+
- -
- The undocumented
+lex
+scanner internal variable
+yylineno
+is not supported unless
+-l
+or
+%option yylineno
+is used.
+
- yylineno
+should be maintained on a per-buffer basis, rather than a per-scanner
+(single global variable) basis.
+
- yylineno
+is not part of the POSIX specification.
+
- -
- The
+input()
+routine is not redefinable, though it may be called to read characters
+following whatever has been matched by a rule. If
+input()
+encounters an end-of-file the normal
+yywrap()
+processing is done. A ``real'' end-of-file is returned by
+input()
+as
+EOF.
+
- Input is instead controlled by defining the
+YY_INPUT
+macro.
+
- The
+flex
+restriction that
+input()
+cannot be redefined is in accordance with the POSIX specification,
+which simply does not specify any way of controlling the
+scanner's input other than by making an initial assignment to
+yyin.
+
- -
- The
+unput()
+routine is not redefinable. This restriction is in accordance with POSIX.
+
- -
- flex
+scanners are not as reentrant as
+lex
+scanners. In particular, if you have an interactive scanner and
+an interrupt handler which long-jumps out of the scanner, and
+the scanner is subsequently called again, you may get the following
+message:
+
+
+
fatal flex scanner internal error--end of buffer missed
+
+
+To reenter the scanner, first use
+
+
+
yyrestart( yyin );
+
+
+Note that this call will throw away any buffered input; usually this
+isn't a problem with an interactive scanner.
+ - Also note that flex C++ scanner classes
+are
+reentrant, so if using C++ is an option for you, you should use
+them instead. See "Generating C++ Scanners" above for details.
+
- -
- output()
+is not supported.
+Output from the
+ECHO
+macro is done to the file-pointer
+yyout
+(default
+stdout).
+
- output()
+is not part of the POSIX specification.
+
- -
- lex
+does not support exclusive start conditions (%x), though they
+are in the POSIX specification.
+
- -
- When definitions are expanded,
+flex
+encloses them in parentheses.
+With lex, the following:
+
+
+
NAME [A-Z][A-Z0-9]*
+
%%
+
foo{NAME}? printf( "Found it\n" );
+
%%
+
+
+will not match the string "foo" because when the macro
+is expanded the rule is equivalent to "foo[A-Z][A-Z0-9]*?"
+and the precedence is such that the '?' is associated with
+"[A-Z0-9]*". With
+flex,
+the rule will be expanded to
+"foo([A-Z][A-Z0-9]*)?" and so the string "foo" will match.
+ - Note that if the definition begins with
+^
+or ends with
+$
+then it is
+not
+expanded with parentheses, to allow these operators to appear in
+definitions without losing their special meanings. But the
+<s>, /,
+and
+<<EOF>>
+operators cannot be used in a
+flex
+definition.
+
- Using
+-l
+results in the
+lex
+behavior of no parentheses around the definition.
+
- The POSIX specification is that the definition be enclosed in parentheses.
+
- -
- Some implementations of
+lex
+allow a rule's action to begin on a separate line, if the rule's pattern
+has trailing whitespace:
+
+
+
%%
+
foo|bar<space here>
+
{ foobar_action(); }
+
+
+flex
+does not support this feature.
+ - -
- The
+lex
+%r
+(generate a Ratfor scanner) option is not supported. It is not part
+of the POSIX specification.
+
- -
- After a call to
+unput(),
+yytext
+is undefined until the next token is matched, unless the scanner
+was built using
+%array.
+This is not the case with
+lex
+or the POSIX specification. The
+-l
+option does away with this incompatibility.
+
- -
- The precedence of the
+{}
+(numeric range) operator is different.
+lex
+interprets "abc{1,3}" as "match one, two, or
+three occurrences of 'abc'", whereas
+flex
+interprets it as "match 'ab'
+followed by one, two, or three occurrences of 'c'". The latter is
+in agreement with the POSIX specification.
+
- -
- The precedence of the
+^
+operator is different.
+lex
+interprets "^foo|bar" as "match either 'foo' at the beginning of a line,
+or 'bar' anywhere", whereas
+flex
+interprets it as "match either 'foo' or 'bar' if they come at the beginning
+of a line". The latter is in agreement with the POSIX specification.
+
- -
- The special table-size declarations such as
+%a
+supported by
+lex
+are not required by
+flex
+scanners;
+flex
+ignores them.
+
- -
- The name
+FLEX_SCANNER
+is #define'd so scanners may be written for use with either
+flex
+or
+lex.
+Scanners also include
+YY_FLEX_MAJOR_VERSION
+and
+YY_FLEX_MINOR_VERSION
+indicating which version of
+flex
+generated the scanner
+(for example, for the 2.5 release, these defines would be 2 and 5
+respectively).
+
+
+The following
+flex
+features are not included in
+lex
+or the POSIX specification:
+
+
+
C++ scanners
+
%option
+
start condition scopes
+
start condition stacks
+
interactive/non-interactive scanners
+
yy_scan_string() and friends
+
yyterminate()
+
yy_set_interactive()
+
yy_set_bol()
+
YY_AT_BOL()
+
<<EOF>>
+
<*>
+
YY_DECL
+
YY_START
+
YY_USER_ACTION
+
YY_USER_INIT
+
#line directives
+
%{}'s around actions
+
multiple actions on a line
+
+
+plus almost all of the flex flags.
+The last feature in the list refers to the fact that with
+flex
+you can put multiple actions on the same line, separated with
+semi-colons, while with
+lex,
+the following
+
+
+
foo handle_foo(); ++num_foos_seen;
+
+
+is (rather surprisingly) truncated to
+
+
+
foo handle_foo();
+
+
+flex
+does not truncate the action. Actions that are not enclosed in
+braces are simply terminated at the end of the line.
+
+DIAGNOSTICS
+
+
+
+warning, rule cannot be matched
+indicates that the given rule
+cannot be matched because it follows other rules that will
+always match the same text as it. For
+example, in the following "foo" cannot be matched because it comes after
+an identifier "catch-all" rule:
+
+
+
[a-z]+ got_identifier();
+
foo got_foo();
+
+
+Using
+REJECT
+in a scanner suppresses this warning.
+
+
+warning,
+-s
+option given but default rule can be matched
+means that it is possible (perhaps only in a particular start condition)
+that the default rule (match any single character) is the only one
+that will match a particular input. Since
+-s
+was given, presumably this is not intended.
+
+
+reject_used_but_not_detected undefined
+or
+yymore_used_but_not_detected undefined -
+These errors can occur at compile time. They indicate that the
+scanner uses
+REJECT
+or
+yymore()
+but that
+flex
+failed to notice the fact, meaning that
+flex
+scanned the first two sections looking for occurrences of these actions
+and failed to find any, but somehow you snuck some in (via a #include
+file, for example). Use
+%option reject
+or
+%option yymore
+to indicate to flex that you really do use these features.
+
+
+flex scanner jammed -
+a scanner compiled with
+-s
+has encountered an input string which wasn't matched by
+any of its rules. This error can also occur due to internal problems.
+
+
+token too large, exceeds YYLMAX -
+your scanner uses
+%array
+and one of its rules matched a string longer than the
+YYLMAX
+constant (8K bytes by default). You can increase the value by
+#define'ing
+YYLMAX
+in the definitions section of your
+flex
+input.
+
+
+scanner requires -8 flag to
+use the character 'x' -
+Your scanner specification includes recognizing the 8-bit character
+'x'
+and you did not specify the -8 flag, and your scanner defaulted to 7-bit
+because you used the
+-Cf
+or
+-CF
+table compression options. See the discussion of the
+-7
+flag for details.
+
+
+flex scanner push-back overflow -
+you used
+unput()
+to push back so much text that the scanner's buffer could not hold
+both the pushed-back text and the current token in
+yytext.
+Ideally the scanner should dynamically resize the buffer in this case, but at
+present it does not.
+
+
+input buffer overflow, can't enlarge buffer because scanner uses REJECT -
+the scanner was working on matching an extremely large token and needed
+to expand the input buffer. This doesn't work with scanners that use
+REJECT.
+
+
+fatal flex scanner internal error--end of buffer missed -
+This can occur in an scanner which is reentered after a long-jump
+has jumped out (or over) the scanner's activation frame. Before
+reentering the scanner, use:
+
+
+
yyrestart( yyin );
+
+
+or, as noted above, switch to using the C++ scanner class.
+
+
+too many start conditions in <> construct! -
+you listed more start conditions in a <> construct than exist (so
+you must have listed at least one of them twice).
+
+
FILES
+
+- -lfl
+
- library with which scanners must be linked.
+
- lex.yy.c
+
- generated scanner (called
+lexyy.c
+on some systems).
+
- lex.yy.cc
+
- generated C++ scanner class, when using
+-+.
+
- <FlexLexer.h>
+
- header file defining the C++ scanner base class,
+FlexLexer,
+and its derived class,
+yyFlexLexer.
+
- flex.skl
+
- skeleton scanner. This file is only used when building flex, not when
+flex executes.
+
- lex.backup
+
- backing-up information for
+-b
+flag (called
+lex.bck
+on some systems).
+
+
DEFICIENCIES / BUGS
+
+
+
+Some trailing context
+patterns cannot be properly matched and generate
+warning messages ("dangerous trailing context"). These are
+patterns where the ending of the
+first part of the rule matches the beginning of the second
+part, such as "zx*/xy*", where the 'x*' matches the 'x' at
+the beginning of the trailing context. (Note that the POSIX draft
+states that the text matched by such patterns is undefined.)
+
+
+For some trailing context rules, parts which are actually fixed-length are
+not recognized as such, leading to the abovementioned performance loss.
+In particular, parts using '|' or {n} (such as "foo{3}") are always
+considered variable-length.
+
+
+Combining trailing context with the special '|' action can result in
+fixed
+trailing context being turned into the more expensive
+variable
+trailing context. For example, in the following:
+
+
+
%%
+
abc |
+
xyz/def
+
+
+
+
+Use of
+unput()
+invalidates yytext and yyleng, unless the
+%array
+directive
+or the
+-l
+option has been used.
+
+
+Pattern-matching of NUL's is substantially slower than matching other
+characters.
+
+
+Dynamic resizing of the input buffer is slow, as it entails rescanning
+all the text matched so far by the current (generally huge) token.
+
+
+Due to both buffering of input and read-ahead, you cannot intermix
+calls to <stdio.h> routines, such as, for example,
+getchar(),
+with
+flex
+rules and expect it to work. Call
+input()
+instead.
+
+
+The total table entries listed by the
+-v
+flag excludes the number of table entries needed to determine
+what rule has been matched. The number of entries is equal
+to the number of DFA states if the scanner does not use
+REJECT,
+and somewhat greater than the number of states if it does.
+
+
+REJECT
+cannot be used with the
+-f
+or
+-F
+options.
+
+
+The
+flex
+internal algorithms need documentation.
+
+
SEE ALSO
+
+
+
+lex(1), yacc(1), sed(1), awk(1).
+
+
+John Levine, Tony Mason, and Doug Brown,
+Lex & Yacc,
+O'Reilly and Associates. Be sure to get the 2nd edition.
+
+
+M. E. Lesk and E. Schmidt,
+LEX - Lexical Analyzer Generator
+
+
+Alfred Aho, Ravi Sethi and Jeffrey Ullman,
+Compilers: Principles, Techniques and Tools,
+Addison-Wesley (1986). Describes the pattern-matching techniques used by
+flex
+(deterministic finite automata).
+
+
AUTHOR
+
+Vern Paxson, with the help of many ideas and much inspiration from
+Van Jacobson. Original version by Jef Poskanzer. The fast table
+representation is a partial implementation of a design done by Van
+Jacobson. The implementation was done by Kevin Gong and Vern Paxson.
+
+
+Thanks to the many
+flex
+beta-testers, feedbackers, and contributors, especially Francois Pinard,
+Casey Leedom,
+Stan Adermann, Terry Allen, David Barker-Plummer, John Basrai,
+Nelson H.F. Beebe, benson@odi.com,
+Karl Berry, Peter A. Bigot, Simon Blanchard,
+Keith Bostic, Frederic Brehm, Ian Brockbank, Kin Cho, Nick Christopher,
+Brian Clapper, J.T. Conklin,
+Jason Coughlin, Bill Cox, Nick Cropper, Dave Curtis, Scott David
+Daniels, Chris G. Demetriou, Theo Deraadt,
+Mike Donahue, Chuck Doucette, Tom Epperly, Leo Eskin,
+Chris Faylor, Chris Flatters, Jon Forrest, Joe Gayda, Kaveh R. Ghazi,
+Eric Goldman, Christopher M. Gould, Ulrich Grepel, Peer Griebel,
+Jan Hajic, Charles Hemphill, NORO Hideo,
+Jarkko Hietaniemi, Scott Hofmann,
+Jeff Honig, Dana Hudes, Eric Hughes, John Interrante,
+Ceriel Jacobs, Michal Jaegermann, Sakari Jalovaara, Jeffrey R. Jones,
+Henry Juengst, Klaus Kaempf, Jonathan I. Kamens, Terrence O Kane,
+Amir Katz, ken@ken.hilco.com, Kevin B. Kenny,
+Steve Kirsch, Winfried Koenig, Marq Kole, Ronald Lamprecht,
+Greg Lee, Rohan Lenard, Craig Leres, John Levine, Steve Liddle, Mike Long,
+Mohamed el Lozy, Brian Madsen, Malte, Joe Marshall,
+Bengt Martensson, Chris Metcalf,
+Luke Mewburn, Jim Meyering, R. Alexander Milowski, Erik Naggum,
+G.T. Nicol, Landon Noll, James Nordby, Marc Nozell,
+Richard Ohnemus, Karsten Pahnke,
+Sven Panne, Roland Pesch, Walter Pelissero, Gaumond
+Pierre, Esmond Pitt, Jef Poskanzer, Joe Rahmeh, Jarmo Raiha,
+Frederic Raimbault, Pat Rankin, Rick Richardson,
+Kevin Rodgers, Kai Uwe Rommel, Jim Roskind, Alberto Santini,
+Andreas Scherer, Darrell Schiebel, Raf Schietekat,
+Doug Schmidt, Philippe Schnoebelen, Andreas Schwab,
+Alex Siegel, Eckehard Stolz, Jan-Erik Strvmquist,
+Mike Stump, Paul Stuart, Dave Tallman, Ian Lance Taylor,
+Chris Thewalt, Richard M. Timoney, Jodi Tsai,
+Paul Tuinenga, Gary Weik, Frank Whaley, Gerhard Wilhelms, Kent Williams, Ken
+Yap, Ron Zellar, Nathan Zelle, David Zuhn,
+and those whose names have slipped my marginal
+mail-archiving skills but whose contributions are appreciated all the
+same.
+
+
+Thanks to Keith Bostic, Jon Forrest, Noah Friedman,
+John Gilmore, Craig Leres, John Levine, Bob Mulcahy, G.T.
+Nicol, Francois Pinard, Rich Salz, and Richard Stallman for help with various
+distribution headaches.
+
+
+Thanks to Esmond Pitt and Earle Horton for 8-bit character support; to
+Benson Margulies and Fred Burke for C++ support; to Kent Williams and Tom
+Epperly for C++ class support; to Ove Ewerlid for support of NUL's; and to
+Eric Hughes for support of multiple buffers.
+
+
+This work was primarily done when I was with the Real Time Systems Group
+at the Lawrence Berkeley Laboratory in Berkeley, CA. Many thanks to all there
+for the support I received.
+
+
+Send comments to vern@ee.lbl.gov.
+
\ No newline at end of file
diff --git a/Engine/bin/nasm/Licence b/Engine/bin/nasm/Licence
new file mode 100644
index 000000000..3202f29a2
--- /dev/null
+++ b/Engine/bin/nasm/Licence
@@ -0,0 +1,357 @@
+
+
+
+Terms and Conditions for the use of the Netwide Assembler
+
+
+=========================================================
+
+
+
+
+
+Can I have the gist without reading the legalese?
+
+
+-------------------------------------------------
+
+
+
+
+
+Basically, NASM is free. You can't charge for it. You can copy it as
+
+
+much as you like. You can incorporate it, or bits of it, into other
+
+
+free programs if you want. (But we want to know about it if you do,
+
+
+and we want to be mentioned in the credits.) We may well allow you
+
+
+to incorporate it into commercial software too, but we'll probably
+
+
+demand some money for it, and we'll certainly demand to be given
+
+
+credit. And in extreme cases (although I can't immediately think of
+
+
+a reason we might actually want to do this) we may refuse to let you
+
+
+do it at all.
+
+
+
+
+
+NASM LICENCE AGREEMENT
+
+
+======================
+
+
+
+
+
+By "the Software" this licence refers to the complete contents of
+
+
+the NASM archive, excluding this licence document itself, and
+
+
+excluding the contents of the `test' directory. The Netwide
+
+
+Disassembler, NDISASM, is specifically included under this licence.
+
+
+
+
+
+I. The Software is freely redistributable; anyone may copy the
+
+
+Software, or parts of the Software, and give away as many copies as
+
+
+they like to anyone, as long as this licence document is kept with
+
+
+the Software. Charging a fee for the Software is prohibited,
+
+
+although a fee may be charged for the act of transferring a copy,
+
+
+and you can offer warranty protection and charge a fee for that.
+
+
+
+
+
+II. The Software, or parts thereof, may be incorporated into other
+
+
+freely redistributable software (by which we mean software that may
+
+
+be obtained free of charge) without requiring permission from the
+
+
+authors, as long as due credit is given to the authors of the
+
+
+Software in the resulting work, as long as the authors are informed
+
+
+of this action if possible, and as long as those parts of the
+
+
+Software that are used remain under this licence.
+
+
+
+
+
+III. Modified forms of the Software may be created and distributed
+
+
+as long as the authors are informed of this action if possible, as
+
+
+long as the resulting work remains under this licence, as long as
+
+
+the modified form of the Software is distributed with documentation
+
+
+which still gives credit to the original authors of the Software,
+
+
+and as long as the modified form of the Software is distributed with
+
+
+a clear statement that it is not the original form of the Software
+
+
+in the form that it was distributed by the authors.
+
+
+
+
+
+IV. The Software, or parts thereof, may be incorporated into other
+
+
+software which is not freely redistributable (i.e. software for
+
+
+which a fee is charged), as long as permission is granted from the
+
+
+authors of the Software. The authors reserve the right to grant this
+
+
+permission only for a fee, which may at our option take the form of
+
+
+royalty payments. The authors also reserve the right to refuse to
+
+
+grant permission if they deem it necessary. For further information
+
+
+about who exactly the authors are, see clause XI below.
+
+
+
+
+
+V. The Software may be incorporated, in its original archive form,
+
+
+into software collections or archives which are not freely
+
+
+redistributable, as long as it is clearly stated that the Software
+
+
+itself remains freely redistributable and remains under this licence
+
+
+and no other. Such collections are deemed not to fall under article
+
+
+IV of this licence.
+
+
+
+
+
+VI. Object files or programs generated by the Software as output do
+
+
+not fall under this licence at all, and may be placed under any
+
+
+licence the author wishes. The authors explicitly lay no claim to,
+
+
+and assert no rights over, any programs written by other people and
+
+
+assembled into object form by the Software.
+
+
+
+
+
+VII. You may not copy, modify or distribute the Software except
+
+
+under the terms given in this licence document. You may not
+
+
+sublicense the Software or in any way place it under any other
+
+
+licence than this one. Since you have not signed this licence, you
+
+
+are not of course required to accept it; however, no other licence
+
+
+applies to the Software, and nothing else grants you any permission
+
+
+to copy, modify, sublicense or distribute the Software in any way.
+
+
+These actions are therefore prohibited if you do not accept this
+
+
+licence.
+
+
+
+
+
+VIII. There is no warranty for the Software, to the extent permitted
+
+
+by applicable law. The authors provide the Software "as is" without
+
+
+warranty of any kind, either expressed or implied, including but not
+
+
+limited to the implied warranties of merchantability and fitness for
+
+
+a particular purpose. The entire risk as to the quality and
+
+
+performance of the Software is with you. Should the Software prove
+
+
+defective, you assume the cost of all necessary servicing, repair or
+
+
+correction.
+
+
+
+
+
+IX. In no event, unless required by applicable law or agreed to in
+
+
+writing, will any of the authors be liable to you for damages,
+
+
+including any general, special, incidental or consequential damages,
+
+
+arising out of the use or the inability to use the Software,
+
+
+including but not limited to loss of data or data being rendered
+
+
+inaccurate or a failure of the Software to operate with any other
+
+
+programs, even if you have been advised of the possibility of such
+
+
+damages.
+
+
+
+
+
+X. In addition to what this Licence otherwise provides, the Software
+
+
+may be distributed in such a way as to be compliant with the GNU
+
+
+General Public Licence, as published by the Free Software Foundation,
+
+
+Cambridge, MA, USA; version 2, or, at your option, any later version;
+
+
+incorporated herein by reference. You must include a copy of this
+
+
+Licence with such distribution. Furthermore, patches sent to the
+
+
+authors for the purpose of inclusion in the official release version
+
+
+are considered cleared for release under the full terms of this
+
+
+Licence.
+
+
+
+
+
+XI. The authors of NASM are the original authors (Simon Tatham and
+
+
+Julian Hall) and all those who the original authors feel have
+
+
+contributed significantly to the overall project. If you wish to
+
+
+contact the authors, Julian Hall (jules@earthcorp.com) should be your
+
+
+first port of call.
+
+
+
+
+
+XII. Should any part of this agreement be deemed unenforcable, it is
+
+
+intended that the remainder of the agreement be held in force.
+
+
+
+
+
+END OF LICENCE AGREEMENT
+
+
diff --git a/Engine/bin/nasm/Readme b/Engine/bin/nasm/Readme
new file mode 100644
index 000000000..20db36b58
--- /dev/null
+++ b/Engine/bin/nasm/Readme
@@ -0,0 +1,179 @@
+This is a distribution of NASM, the Netwide Assembler. NASM is a
+prototype general-purpose x86 assembler. It will currently output
+flat-form binary files, a.out, COFF and ELF Unix object files,
+Microsoft Win32 and 16-bit DOS object files, OS/2 object files, the
+as86 object format, and a home-grown format called RDOFF.
+
+Also included is NDISASM, a prototype x86 binary-file disassembler
+which uses the same instruction table as NASM.
+
+To install NASM on UNIX or Linux, type `./configure', then `make', and
+then either `make install', or copy the file `nasm' (and maybe
+`ndisasm') to a directory on your search path (maybe /usr/local/bin,
+or ~/bin if you don't have root access). You may also want to copy the
+man page `nasm.1' (and maybe `ndisasm.1') to somewhere sensible. Note
+that source and binaries are also available in RPM format; to install
+an RPM on a system which uses this packaging format (mostly Linux
+distributions) simply do "rpm -Uivh filename.rpm".
+
+To install under DOS, if you don't need to rebuild from the sources,
+you can just copy either nasm.exe and ndisasm.exe (32-bit DOS-extended
+versions), nasmr.exe and ndisasmr.exe (16-bit classical DOS
+executables), or nasmw.exe and ndisasmw.exe (Win32 console
+applications - less likely to run out of memory), to somewhere on your
+PATH.
+
+The 32-bit applications require a DPMI server. If you're running
+under plain DOS and don't have a DPMI server already, you can get
+CSDPMI from ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2misc/.
+
+To rebuild the DOS sources, various makefiles are provided:
+
+- Makefile.dos, the one I build the standard 16-bit releases from,
+ designed for a hybrid system using Microsoft C and Borland Make
+ (don't ask why :-)
+- Makefile.vc, for Microsoft Visual C++ compiling to a Win32
+ command-line application. This is the one I build the standard
+ Win32 release binaries from.
+
+- Makefile.bor, for Borland C.
+- Makefile.bc2, also for Borland C, contributed by Fox Cutter.
+ Reported to work better than Makefile.bor on some systems.
+
+- Makefile.sc, for Symantec C++, compiling to a 32-bit extended DOS
+ executable.. Contributed by Mark Junker.
+- Makefile.scw, also for Symantec C++, compiling to a Win32 command-
+ line application. Also contributed by Mark Junker.
+
+- Makefile.wc, for Watcom C, compiling to a 32-bit extended DOS
+ executable. Contributed by Dominik Behr.
+- Makefile.wcw, also for Watcom C, compiling to a Win32 command-
+ line application. Also contributed by Dominik Behr.
+
+- Makefile.dj, for DJGPP, compiling to a 32-bit extended DOS
+ executable. Contributed by Dominik Behr.
+
+- Makefile.lcc, for lcc-win32, compiling to a Win32 command line
+ application. (The lcc-win32 compiler and tools are available from
+ http://www.remcomp.com/lcc-win32/)
+
+I can't guarantee that all of those makefiles work, because I don't
+have all of those compilers. However, Makefile.dos and Makefile.vc
+work on my system, and so do Makefile.bor and Makefile.bc2.
+
+Be careful with Borland C: there have been various conflicting
+reports about how reliable the Huge memory model is. If you try to
+compile NASM in Large model, you may get DGROUP overflows due to the
+vast quantity of data in the instruction tables. I've had reports
+from some people that Huge model doesn't work at all (and also
+reports from others that it works fine), so if you don't want to try
+moving to Huge, you could try adding the option `-dc' to the
+compiler command line instead, which causes string literals to be
+moved from DGROUP to the code segments and might make Large model
+start working. (Either solution works for me.)
+
+To rebuild truly from scratch, or to make any changes to insns.dat or
+standard.mac, you need a Perl interpreter installed. Perl
+interpreters are available for a number of platforms, from:
+
+ http://www.cpan.org/ports/
+
+For DOS you can also get one from:
+
+ ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/
+
+Dominik Behr has also contributed the file misc/pmw.bat, which is a
+batch file to turn the output from Makefile.wc (NASM.EXE and
+NDISASM.EXE) into standalone executables incorporating Tran's
+PMODE/W DOS extender, rather than depending on an external extender
+program.
+
+Some of the Windows makefiles produce executables called nasmw.exe
+and ndisasmw.exe, and some don't. Be prepared for either...
+
+If you want to build a restricted version of NASM containing only
+some of the object file formats, you can achieve this by adding
+#defines to `outform.h' (see the file itself for documentation), or
+equivalently by adding compiler command line options in the
+Makefile.
+
+There is a machine description file for the `LCC' retargetable C
+compiler (version 4.0), in the directory `lcc', along with
+instructions for its use. This means that NASM can now be used as
+the code-generator back end for a useful C compiler.
+
+Michael `Wuschel' Tippach has ported his DOS extender `WDOSX' to
+enable it to work with the 32-bit binary files NASM can output: the
+original extender and his port `WDOSX/N' are available from his web
+page, http://www.geocities.com/SiliconValley/Park/4493.
+
+Matt Mastracci has written a document explaining how to write
+assembly language modules in DJGPP programs using NASM: it's on his
+web site at http://www.ucalgary.ca/~mmastrac/djgppasm.doc.
+
+The `misc' directory contains `nasm.sl', a NASM editing mode for the
+JED programmers' editor (see http://space.mit.edu/~davis/jed.html
+for details about JED). The comment at the start of the file gives
+instructions on how to install the mode. This directory also
+contains a file (`magic') containing lines to add to /etc/magic on
+Unix systems to allow the `file' command to recognise RDF files, and
+a zip file (`exasm.zip') containing the necessary files for syntax
+highlighting in the Aurora DOS editor. (The Aurora files were
+contributed by ; I haven't tested them as I
+don't have Aurora.)
+
+The `rdoff' directory contains sources for a linker and loader for
+the RDF object file format, to run under Linux, and also
+documentation on the internal structure of RDF files.
+
+For information about how you can distribute and use NASM, see the
+file Licence. We were tempted to put NASM under the GPL, but decided
+that in many ways it was too restrictive for developers.
+
+For release 0.98 and later, the NASM source distribution contains the
+following components:
+
+ Unix Windows, OS/2 DOS
+
+ nasm-X.XX.tar.gz nasm-X.XX.zip nasmXXXs.zip
+
+ Main archive: Contain all sources you need to build NASM,
+ plus the documentation source code. If you have a Perl
+ interpreter and (possibly) Winhelp compiler installed, you
+ don't need any additional files.
+
+ nasm-X.XX-xdoc.tar.gz nasm-X.XX-xdoc.zip nasmXXXd.zip
+
+ Documentation in HTML, INFO, text, and PostScript format.
+ You can compile these files yourself from the main archive
+ if you have a Perl interpreter installed.
+
+ N/A nasm-X.XX-whlp.zip N/A
+
+ Documentation in Windows help format. You can compile this
+ file yourself from the main archive if you have a Perl
+ interpreter and a Winhelp compiler installed.
+
+The Unix, Windows-OS/2, and DOS versions differ in the following ways:
+
+The Unix version uses the Unix line ending convention (LF), and long file
+names with upper and lower case.
+
+The Windows-OS/2 version uses the Microsoft line ending convention
+(CR+LF), and long file names with upper and lower case.
+
+The DOS version uses the Microsoft line ending convention (CR+LF),
+with all filenames in 8.3 monocase.
+
+For information about how to use NASM, see the various forms of
+documentation in the `doc' directory: documentation is provided in
+HTML, PostScript, plain text, Texinfo, and Windows Help formats. For
+information about how to use NDISASM, see `ndisasm.doc'. For
+information about the internal structure of NASM, see
+`internal.doc'. (In particular, _please_ read `internal.doc' before
+writing any code for us...)
+
+The NASM web page is at http://www.cryogen.com/Nasm/
+
+Bug reports (and patches if you can) should be sent to
+.
diff --git a/Engine/bin/nasm/nasmw.exe b/Engine/bin/nasm/nasmw.exe
new file mode 100644
index 000000000..dc6b0cc52
Binary files /dev/null and b/Engine/bin/nasm/nasmw.exe differ
diff --git a/Engine/bin/nasm/ndisasmw.exe b/Engine/bin/nasm/ndisasmw.exe
new file mode 100644
index 000000000..b38bdf440
Binary files /dev/null and b/Engine/bin/nasm/ndisasmw.exe differ
diff --git a/Engine/bin/php/php.exe b/Engine/bin/php/php.exe
new file mode 100644
index 000000000..302ff8a21
Binary files /dev/null and b/Engine/bin/php/php.exe differ
diff --git a/Engine/bin/php/php5ts.dll b/Engine/bin/php/php5ts.dll
new file mode 100644
index 000000000..11123d29e
Binary files /dev/null and b/Engine/bin/php/php5ts.dll differ
diff --git a/Engine/bin/tools/comments/CB7C7F15-A958-4A75-9AED-29A41AEFF30C.xml b/Engine/bin/tools/comments/CB7C7F15-A958-4A75-9AED-29A41AEFF30C.xml
new file mode 100644
index 000000000..604b4845c
--- /dev/null
+++ b/Engine/bin/tools/comments/CB7C7F15-A958-4A75-9AED-29A41AEFF30C.xml
@@ -0,0 +1,9 @@
+
+
+
+ A singleplayer demo of the integrated PhysX support in Torque 3D
+
+
+ An example of a multiplayer first person shooter built with the stock Torque 3D functionality
+
+
diff --git a/Engine/bin/tools/documentation/Tutorials.png b/Engine/bin/tools/documentation/Tutorials.png
new file mode 100644
index 000000000..2f97ef4d3
Binary files /dev/null and b/Engine/bin/tools/documentation/Tutorials.png differ
diff --git a/Engine/bin/tools/documentation/docs-artist.png b/Engine/bin/tools/documentation/docs-artist.png
new file mode 100644
index 000000000..e5904f830
Binary files /dev/null and b/Engine/bin/tools/documentation/docs-artist.png differ
diff --git a/Engine/bin/tools/documentation/docs-newuser.png b/Engine/bin/tools/documentation/docs-newuser.png
new file mode 100644
index 000000000..48d76bb92
Binary files /dev/null and b/Engine/bin/tools/documentation/docs-newuser.png differ
diff --git a/Engine/bin/tools/documentation/docs-scripter.png b/Engine/bin/tools/documentation/docs-scripter.png
new file mode 100644
index 000000000..fac0433bf
Binary files /dev/null and b/Engine/bin/tools/documentation/docs-scripter.png differ
diff --git a/Engine/bin/tools/documentation/index.html b/Engine/bin/tools/documentation/index.html
new file mode 100644
index 000000000..b3f1cb412
--- /dev/null
+++ b/Engine/bin/tools/documentation/index.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ - Getting Started
+
+
+
+
+ - Editors
+
+
+
+ |
+
+
+ |
+
+
+
+
diff --git a/Engine/bin/tools/dxwebsetup/dxwebsetup.exe b/Engine/bin/tools/dxwebsetup/dxwebsetup.exe
new file mode 100644
index 000000000..53d2415e8
Binary files /dev/null and b/Engine/bin/tools/dxwebsetup/dxwebsetup.exe differ
diff --git a/Engine/bin/tools/getD3DXVer/app/ReadMe.txt b/Engine/bin/tools/getD3DXVer/app/ReadMe.txt
new file mode 100644
index 000000000..dff85a9eb
--- /dev/null
+++ b/Engine/bin/tools/getD3DXVer/app/ReadMe.txt
@@ -0,0 +1,5 @@
+getD3DXVer Notes:
+
+- Current compiled version checks for d3dx9_41.dll. This is based on March 2009 DirectX SDK.
+
+- Be sure to recompile the executable if the required DirectX SDK changes. The D3DX DLL version is automatically taken from d3dx9core.h so only a recompile is required.
diff --git a/Engine/bin/tools/getD3DXVer/app/getD3DXVer.exe b/Engine/bin/tools/getD3DXVer/app/getD3DXVer.exe
new file mode 100644
index 000000000..160c1ba60
Binary files /dev/null and b/Engine/bin/tools/getD3DXVer/app/getD3DXVer.exe differ
diff --git a/Engine/bin/tools/getD3DXVer/source/getD3DXVer.cpp b/Engine/bin/tools/getD3DXVer/source/getD3DXVer.cpp
new file mode 100644
index 000000000..adaedf3ed
--- /dev/null
+++ b/Engine/bin/tools/getD3DXVer/source/getD3DXVer.cpp
@@ -0,0 +1,60 @@
+//-----------------------------------------------------------------------------
+// Copyright (c) 2012 GarageGames, LLC
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// getD3DXVer.exe
+//
+// Checks for the existance of the correct D3DX library. Automatically
+// uses the D3DX library version this executable was compiled against.
+// (As contained in D3dx9core.h)
+//-----------------------------------------------------------------------------
+
+#include "stdafx.h"
+#include
+#include
+
+int _tmain(int argc, _TCHAR* argv[])
+{
+ // Method documented at http://msdn.microsoft.com/en-us/library/bb172717(VS.85).aspx
+ // NOTE: Went with a different check below as this one requires linking with
+ // the correct D3DX library to begin with.
+ //if ( !D3DXCheckVersion(D3D_SDK_VERSION, D3DX_SDK_VERSION) )
+ //{
+ // return 1;
+ //}
+
+ // Perform a simple LoadLibrary to check for the correct D3DX
+ _TCHAR name[64];
+ _stprintf(name, _T("d3dx9_%d.dll"), D3DX_SDK_VERSION);
+ HINSTANCE hinstLib = LoadLibrary(name);
+ if( !hinstLib )
+ {
+ //_tprintf(_T("'%s' lib NOT found"), name);
+ return 1;
+ }
+
+ FreeLibrary(hinstLib);
+
+ //_tprintf(_T("'%s' lib was found"), name);
+ return 0;
+}
+
diff --git a/Engine/bin/tools/getD3DXVer/source/getD3DXVer.sln b/Engine/bin/tools/getD3DXVer/source/getD3DXVer.sln
new file mode 100644
index 000000000..8e5dc7c76
--- /dev/null
+++ b/Engine/bin/tools/getD3DXVer/source/getD3DXVer.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "getD3DXVer", "getD3DXVer.vcproj", "{38452831-9FDC-4961-ACE8-DF4A0EC06471}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {38452831-9FDC-4961-ACE8-DF4A0EC06471}.Debug|Win32.ActiveCfg = Debug|Win32
+ {38452831-9FDC-4961-ACE8-DF4A0EC06471}.Debug|Win32.Build.0 = Debug|Win32
+ {38452831-9FDC-4961-ACE8-DF4A0EC06471}.Release|Win32.ActiveCfg = Release|Win32
+ {38452831-9FDC-4961-ACE8-DF4A0EC06471}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Engine/bin/tools/getD3DXVer/source/getD3DXVer.vcproj b/Engine/bin/tools/getD3DXVer/source/getD3DXVer.vcproj
new file mode 100644
index 000000000..41be3e0a5
--- /dev/null
+++ b/Engine/bin/tools/getD3DXVer/source/getD3DXVer.vcproj
@@ -0,0 +1,211 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Engine/bin/tools/getD3DXVer/source/stdafx.cpp b/Engine/bin/tools/getD3DXVer/source/stdafx.cpp
new file mode 100644
index 000000000..19f5e2a6e
--- /dev/null
+++ b/Engine/bin/tools/getD3DXVer/source/stdafx.cpp
@@ -0,0 +1,30 @@
+//-----------------------------------------------------------------------------
+// Copyright (c) 2012 GarageGames, LLC
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//-----------------------------------------------------------------------------
+
+// stdafx.cpp : source file that includes just the standard includes
+// getD3DXVer.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/Engine/bin/tools/getD3DXVer/source/stdafx.h b/Engine/bin/tools/getD3DXVer/source/stdafx.h
new file mode 100644
index 000000000..1cbb55c07
--- /dev/null
+++ b/Engine/bin/tools/getD3DXVer/source/stdafx.h
@@ -0,0 +1,39 @@
+//-----------------------------------------------------------------------------
+// Copyright (c) 2012 GarageGames, LLC
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//-----------------------------------------------------------------------------
+
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
+#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
+#endif
+
+#include
+#include
+
+
+
+// TODO: reference additional headers your program requires here
diff --git a/Engine/bin/tools/nsis/app/COPYING b/Engine/bin/tools/nsis/app/COPYING
new file mode 100644
index 000000000..4cb7626ad
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/COPYING
@@ -0,0 +1,144 @@
+COPYRIGHT
+---------
+
+Copyright (C) 1995-2009 Contributors
+
+More detailed copyright information can be found in the individual source code files.
+
+APPLICABLE LICENSES
+-------------------
+
+* All NSIS source code, plug-ins, documentation, examples, header files and graphics, with the exception of the compression modules and where otherwise noted, are licensed under the zlib/libpng license.
+
+* The zlib compression module for NSIS is licensed under the zlib/libpng license.
+
+* The bzip2 compression module for NSIS is licensed under the bzip2 license.
+
+* The LZMA compression module for NSIS is licensed under the Common Public License version 1.0.
+
+ZLIB/LIBPNG LICENSE
+-------------------
+
+This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source distribution.
+
+BZIP2 LICENSE
+-------------
+
+This program, "bzip2" and associated library "libbzip2", are copyright (C) 1996-2000 Julian R Seward. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Julian Seward, Cambridge, UK.
+
+jseward@acm.org
+
+COMMON PUBLIC LICENSE VERSION 1.0
+---------------------------------
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+ a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+ b) in the case of each subsequent Contributor:
+
+ i) changes to the Program, and
+
+ ii) additions to the Program;
+
+ where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+2. GRANT OF RIGHTS
+
+ a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+
+ b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+
+ c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+
+ d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+ a) it complies with the terms and conditions of this Agreement; and
+
+ b) its license agreement:
+
+ i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
+
+ ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
+
+ iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+
+ iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+ a) it must be made available under this Agreement; and
+
+ b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
+
+SPECIAL EXCEPTION FOR LZMA COMPRESSION MODULE
+---------------------------------------------
+
+Igor Pavlov and Amir Szekely, the authors of the LZMA compression module for NSIS, expressly permit you to statically or dynamically link your code (or bind by name) to the files from the LZMA compression module for NSIS without subjecting your linked code to the terms of the Common Public license version 1.0. Any modifications or additions to files from the LZMA compression module for NSIS, however, are subject to the terms of the Common Public License version 1.0.
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/big.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/big.bmp
new file mode 100644
index 000000000..d6db07793
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/big.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/classic-cross.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/classic-cross.bmp
new file mode 100644
index 000000000..a4d37a14a
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/classic-cross.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/classic.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/classic.bmp
new file mode 100644
index 000000000..83e3cf565
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/classic.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/colorful.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/colorful.bmp
new file mode 100644
index 000000000..7713942e0
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/colorful.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/grey-cross.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/grey-cross.bmp
new file mode 100644
index 000000000..b28b59bbc
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/grey-cross.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/grey.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/grey.bmp
new file mode 100644
index 000000000..b374432b7
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/grey.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/modern.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/modern.bmp
new file mode 100644
index 000000000..62468dedc
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/modern.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/red-round.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/red-round.bmp
new file mode 100644
index 000000000..31d3c0252
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/red-round.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/red.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/red.bmp
new file mode 100644
index 000000000..e14e6b4a0
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/red.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/simple-round.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/simple-round.bmp
new file mode 100644
index 000000000..695023224
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/simple-round.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/simple-round2.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/simple-round2.bmp
new file mode 100644
index 000000000..ee1ec8427
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/simple-round2.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/simple.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/simple.bmp
new file mode 100644
index 000000000..c687a1d92
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Checks/simple.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/nsis-r.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/nsis-r.bmp
new file mode 100644
index 000000000..eb3650f7d
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/nsis-r.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/nsis.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/nsis.bmp
new file mode 100644
index 000000000..cbb52312f
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/nsis.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-nsis.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-nsis.bmp
new file mode 100644
index 000000000..b4a0cf94b
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-nsis.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-r-nsis.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-r-nsis.bmp
new file mode 100644
index 000000000..2da34f174
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-r-nsis.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-r.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-r.bmp
new file mode 100644
index 000000000..c74fbdd51
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-r.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-uninstall-nsis.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-uninstall-nsis.bmp
new file mode 100644
index 000000000..635596b20
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-uninstall-nsis.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-uninstall-r-nsis.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-uninstall-r-nsis.bmp
new file mode 100644
index 000000000..5f215d774
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-uninstall-r-nsis.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-uninstall-r.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-uninstall-r.bmp
new file mode 100644
index 000000000..1672afa6d
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-uninstall-r.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-uninstall.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-uninstall.bmp
new file mode 100644
index 000000000..97be6746e
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange-uninstall.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange.bmp
new file mode 100644
index 000000000..4ac1413b3
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/orange.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/win.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/win.bmp
new file mode 100644
index 000000000..6612357a3
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Header/win.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/arrow-install.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/arrow-install.ico
new file mode 100644
index 000000000..0441d5cef
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/arrow-install.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/arrow-uninstall.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/arrow-uninstall.ico
new file mode 100644
index 000000000..f3e7bfed3
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/arrow-uninstall.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/arrow2-install.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/arrow2-install.ico
new file mode 100644
index 000000000..e047f7db4
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/arrow2-install.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/arrow2-uninstall.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/arrow2-uninstall.ico
new file mode 100644
index 000000000..fa6064fab
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/arrow2-uninstall.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/box-install.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/box-install.ico
new file mode 100644
index 000000000..fd6c7c1f3
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/box-install.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/box-uninstall.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/box-uninstall.ico
new file mode 100644
index 000000000..bc275415f
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/box-uninstall.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/classic-install.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/classic-install.ico
new file mode 100644
index 000000000..5afcc62e8
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/classic-install.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/classic-uninstall.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/classic-uninstall.ico
new file mode 100644
index 000000000..09532909e
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/classic-uninstall.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/llama-blue.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/llama-blue.ico
new file mode 100644
index 000000000..08288b6dd
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/llama-blue.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/llama-grey.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/llama-grey.ico
new file mode 100644
index 000000000..4749479fa
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/llama-grey.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install-blue-full.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install-blue-full.ico
new file mode 100644
index 000000000..8f1c51222
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install-blue-full.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install-blue.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install-blue.ico
new file mode 100644
index 000000000..fecdc2739
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install-blue.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install-colorful.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install-colorful.ico
new file mode 100644
index 000000000..2908f58be
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install-colorful.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install-full.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install-full.ico
new file mode 100644
index 000000000..3aa83e9f4
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install-full.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install.ico
new file mode 100644
index 000000000..f8fbd5ffa
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-install.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall-blue-full.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall-blue-full.ico
new file mode 100644
index 000000000..cd9227971
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall-blue-full.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall-blue.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall-blue.ico
new file mode 100644
index 000000000..77031b58e
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall-blue.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall-colorful.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall-colorful.ico
new file mode 100644
index 000000000..461035cc2
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall-colorful.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall-full.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall-full.ico
new file mode 100644
index 000000000..a134f586c
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall-full.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall.ico
new file mode 100644
index 000000000..6c7410c2f
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/modern-uninstall.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/nsis1-install.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/nsis1-install.ico
new file mode 100644
index 000000000..e18044928
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/nsis1-install.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/nsis1-uninstall.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/nsis1-uninstall.ico
new file mode 100644
index 000000000..a37774cf3
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/nsis1-uninstall.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/orange-install-nsis.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/orange-install-nsis.ico
new file mode 100644
index 000000000..ef3975f56
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/orange-install-nsis.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/orange-install.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/orange-install.ico
new file mode 100644
index 000000000..1db75f8e4
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/orange-install.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/orange-uninstall-nsis.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/orange-uninstall-nsis.ico
new file mode 100644
index 000000000..431eb2e0f
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/orange-uninstall-nsis.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/orange-uninstall.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/orange-uninstall.ico
new file mode 100644
index 000000000..59c79f32b
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/orange-uninstall.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/pixel-install.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/pixel-install.ico
new file mode 100644
index 000000000..f2106d611
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/pixel-install.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/pixel-uninstall.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/pixel-uninstall.ico
new file mode 100644
index 000000000..2003b2df8
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/pixel-uninstall.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/win-install.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/win-install.ico
new file mode 100644
index 000000000..a5eb774b3
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/win-install.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/win-uninstall.ico b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/win-uninstall.ico
new file mode 100644
index 000000000..932917696
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Icons/win-uninstall.ico differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/arrow.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/arrow.bmp
new file mode 100644
index 000000000..9f7426bc8
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/arrow.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/llama.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/llama.bmp
new file mode 100644
index 000000000..1e1d94251
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/llama.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/nsis.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/nsis.bmp
new file mode 100644
index 000000000..dcc38094c
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/nsis.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/nullsoft.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/nullsoft.bmp
new file mode 100644
index 000000000..d4145d4ff
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/nullsoft.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/orange-nsis.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/orange-nsis.bmp
new file mode 100644
index 000000000..ec46bd852
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/orange-nsis.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/orange-uninstall-nsis.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/orange-uninstall-nsis.bmp
new file mode 100644
index 000000000..661e70232
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/orange-uninstall-nsis.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/orange-uninstall.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/orange-uninstall.bmp
new file mode 100644
index 000000000..097d09429
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/orange-uninstall.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/orange.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/orange.bmp
new file mode 100644
index 000000000..196a5b7a7
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/orange.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/win.bmp b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/win.bmp
new file mode 100644
index 000000000..5524eef94
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/Graphics/Wizard/win.bmp differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Afrikaans.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Afrikaans.nlf
new file mode 100644
index 000000000..3c4543102
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Afrikaans.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1078
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Friedel Wolff
+# ^Branding
+Nullsoft Installeerstelsel %s
+# ^SetupCaption
+$(^Name) Installasie
+# ^UninstallCaption
+$(^Name) Verwydering
+# ^LicenseSubCaption
+: Lisensie-ooreenkoms
+# ^ComponentsSubCaption
+: Installasiekeuses
+# ^DirSubCaption
+: Installasiegids
+# ^InstallingSubCaption
+: Installeer tans
+# ^CompletedSubCaption
+: Voltooid
+# ^UnComponentsSubCaption
+: Verwyderingkeuses
+# ^UnDirSubCaption
+: Verwyderinggids
+# ^ConfirmSubCaption
+: Bevestiging
+# ^UninstallingSubCaption
+: Verwyder tans
+# ^UnCompletedSubCaption
+: Voltooid
+# ^BackBtn
+< V&orige
+# ^NextBtn
+&Volgende >
+# ^AgreeBtn
+&Regso
+# ^AcceptBtn
+Ek &aanvaar die ooreenkoms
+# ^DontAcceptBtn
+Ek aan vaar &nie die ooreenkoms nie
+# ^InstallBtn
+&Installeer
+# ^UninstallBtn
+&Verwyder
+# ^CancelBtn
+Kanselleer
+# ^CloseBtn
+&Sluit af
+# ^BrowseBtn
+&Blaai...
+# ^ShowDetailsBtn
+&Wys detail
+# ^ClickNext
+Klik op Volgende om verder te gaan.
+# ^ClickInstall
+Klik op Installeer om die installasie te begin.
+# ^ClickUninstall
+Klik op Verwyder om die verwydering te begin.
+# ^Name
+Naam
+# ^Completed
+Voltooid
+# ^LicenseText
+Lees die lisensieooreenkoms voordat u $(^NameDA) installeer. Klik op Regso as u die ooreenkoms aanvaar.
+# ^LicenseTextCB
+Lees die lisensieooreenkoms voordat u $(^NameDA) installeer. Merk die blokkie hieronder as u die ooreenkoms aanvaar. $_CLICK
+# ^LicenseTextRB
+Lees die lisensieooreenkoms voordat u $(^NameDA) installeer. Kies die eerste keuse hieronder as u die ooreenkoms aanvaar. $_CLICK
+# ^UnLicenseText
+Lees die lisensieooreenkoms voordat u $(^NameDA) verwyder. Klik op Regso als u die ooreenkoms aanvaar.
+# ^UnLicenseTextCB
+Lees die lisensieooreenkoms voordat u $(^NameDA) verwyder. Merk die blokkie hieronder as u die ooreenkoms aanvaar. $_CLICK
+# ^UnLicenseTextRB
+Lees die lisensieooreenkoms voordat u $(^NameDA) verwyder. KIes die eerste keuse hieronder as u die ooreenkoms aanvaar. $_CLICK
+# ^Custom
+Aangepast
+# ^ComponentsText
+Kies die komponente wat u wil installeer en deselekteer dié wat u nie wil installeer nie. $_CLICK
+# ^ComponentsSubText1
+Kies die installasietipe:
+# ^ComponentsSubText2_NoInstTypes
+Kies die komponente wat geïnstalleer moet word:
+# ^ComponentsSubText2
+Of kies die komponente wat geïnstalleer moet word:
+# ^UnComponentsText
+Kies die komponente wat u wil verwyder en deselekteer dié wat u nie wil verwyder nie. $_CLICK
+# ^UnComponentsSubText1
+Kies die verwyderingstipe:
+# ^UnComponentsSubText2_NoInstTypes
+Kies die komponente wat verwyder moet word:
+# ^UnComponentsSubText2
+Of kies die komponente wat verwyder moet word:
+# ^DirText
+$(^NameDA) sal in die volgende gids geïnstalleer word. Om elders te installeer, klik op Blaai en kies 'n ander een. $_CLICK
+# ^DirSubText
+Installasiegids
+# ^DirBrowseText
+Kies die gids om $(^NameDA) in te installeer:
+# ^UnDirText
+$(^NameDA) gaan uit die volgende gids verwyder word. Om van elders af te verwyder, klik op Blaai en kies 'n ander gids. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Kies die gids om $(^NameDA) uit te verwyder:
+# ^SpaceAvailable
+"Beskikbare spasie: "
+# ^SpaceRequired
+"Vereiste spasie: "
+# ^UninstallingText
+$(^NameDA) sal uit die volgende gids verwyder word. $_CLICK
+# ^UninstallingSubText
+Verwydering uit:
+# ^FileError
+Fout met skryf na lêer: \r\n\r\n$0\r\n\r\nKlik Staak om de installasie te stop,\r\nProbeer weer om weer te probeer of\r\nIgnoreer om dié lêer oor te slaan.
+# ^FileError_NoIgnore
+Fout met skryf na lêer: \r\n\r\n$0\r\n\r\nKlik Probeer weer om op nuut te probeer, of \r\nKanselleer om die installasie te stop.
+# ^CantWrite
+"Kon nie skyf nie: "
+# ^CopyFailed
+Kopiëring het misluk
+# ^CopyTo
+"Kopieer na "
+# ^Registering
+"Registreer tans: "
+# ^Unregistering
+"Deregistreer tans: "
+# ^SymbolNotFound
+"Kon nie simbool vind nie: "
+# ^CouldNotLoad
+"Kon nie laai nie: "
+# ^CreateFolder
+"Skep gids: "
+# ^CreateShortcut
+"Maak kortpad: "
+# ^CreatedUninstaller
+"Verwyderingsprogram gemaak: "
+# ^Delete
+"Verwyder lêer: "
+# ^DeleteOnReboot
+"Verwyder na herbegin van rekenaar: "
+# ^ErrorCreatingShortcut
+"Fout met maak van kortpad: "
+# ^ErrorCreating
+"Fout met skep: "
+# ^ErrorDecompressing
+Fout met uitpak van data! Korrupte installasielêer?
+# ^ErrorRegistering
+Fout met registrasie van DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Voer uit: "
+# ^Extract
+"Pak uit: "
+# ^ErrorWriting
+"Uitpak: fout met skryf na lêer "
+# ^InvalidOpcode
+Installasieprogram korrup: ongeldige opcode
+# ^NoOLE
+"Geen OLE vir: "
+# ^OutputFolder
+"Afvoergids: "
+# ^RemoveFolder
+"Verwyder gids: "
+# ^RenameOnReboot
+"Hernoem na herbegin van rekenaar: "
+# ^Rename
+"Hernoem: "
+# ^Skipped
+"Oorgeslaan: "
+# ^CopyDetails
+Kopieer detail na knipbord
+# ^LogInstall
+Boekstaaf die installasieproses
+# ^Byte
+G
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Afrikaans.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Afrikaans.nsh
new file mode 100644
index 000000000..275a4f1e3
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Afrikaans.nsh
@@ -0,0 +1,121 @@
+;Language: Afrikaans (1078)
+;By Friedel Wolff
+
+!insertmacro LANGFILE "Afrikaans" "Afrikaans"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Welkom by die $(^NameDA) Installasieslimmerd"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Hierdie slimmerd lei mens deur die installasie van $(^NameDA).$\r$\n$\r$\nDit word aanbeveel dat u alle ander programme afsluit voor die begin van die installasie. Dit maak dit moontlik om die relevante stelsellêers op te dateer sonder om die rekenaar te herlaai.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Welkom by die $(^NameDA) Verwyderingslimmerd"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Hierdie slimmerd lei mens deur die verwydering van $(^NameDA).$\r$\n$\r$\nVoor die verwydering begin word, maak seker dat $(^NameDA) nie loop nie.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisensie-ooreenkoms"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lees die lisensie-ooreenkoms voordat u $(^NameDA) installeer."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Klik op Regso om verder te gaan as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te installeer."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Merk die blokkie hier onder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te installeer. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kies die eerste keuse hieronder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te installeer. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisensie-ooreenkoms"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lees die lisensie-ooreenkoms voordat u $(^NameDA) verwyder."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Klik op Regso om verder te gaan as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te verwyder."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Merk die kiesblokkie hieronder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te verwyder."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kies die eerste keuse hieronder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te verwyder."
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Druk op Page Down om die res van die ooreenkoms te sien."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Kies komponente"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Kies watter komponente van $(^NameDA) geïnstalleer moet word."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskrywing"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Kies komponente"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Kies watter komponente van $(^NameDA) verwyder moet word."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beweeg die muis oor 'n komponent om sy beskrywing te sien."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beweeg die muis oor 'n komponent om sy beskrywing te sien."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Kies installasieplek"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Kies die gids waarin u $(^NameDA) wil installeer."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Kies verwyderinggids"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Kies die gids waaruit u $(^NameDA) wil verwyder."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installeer tans"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Wag asb. terwyl $(^NameDA) geïnstalleer word."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Installasie voltooid"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Die installasie is suksesvol voltooi."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Installasie gestaak"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Die installasie is nie suksesvol voltooi nie."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Verwyder tans"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Wag asb. terwyl $(^NameDA) van u rekenaar verwyder word."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Verwydering voltooi"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Verwydering is suksesvol voltooi."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Verwydering gestaak"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Verwydering is nie suksesvol voltooi nie."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Voltooi van die $(^NameDA) Installasieslimmerd"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) is geïnstalleer op uw rekenaar.$\r$\n$\r$\nKlik op Voltooi om hierdie slimmerd af te sluit."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Die rekenaar moet oorbegin word om die installasie van $(^NameDA) te voltooi. Wil u nou oorbegin?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Voltooi van die $(^NameDA) Verwyderingslimmerd"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) is van u rekenaar verwyder.$\r$\n$\r$\nKlik op Voltooi om hierdie slimmerd af te sluit."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Die rekenaar moet oorbegin word om die verwydering van $(^NameDA) te voltooi. Wil u nou oorbegin?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Begin nou oor"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ek wil later self oorbegin"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Laat loop $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Wys Leesmy-lêer"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Voltooi"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Kies gids in Begin-kieslys"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Kies 'n gids in die Begin-kieslys vir $(^NameDA) se kortpaaie."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Kies die gids in die Begin-kieslys waarin die program se kortpaaie geskep moet word. U kan ook 'n nuwe naam gee om 'n nuwe gids te skep."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Moenie kortpaaie maak nie"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Verwyder $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Verwyder $(^NameDA) van u rekenaar."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Wil u definitief die installasie van $(^Name) afsluit?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Wil u definitief die verwydering van $(^Name) afsluit?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Albanian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Albanian.nlf
new file mode 100644
index 000000000..79028f690
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Albanian.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1052
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1250
+# RTL - anything else than RTL means LTR
+-
+# Përkthimi nga Besnik Bleta, besnik@programeshqip.org
+# ^Branding
+Sistemi Nullsoft për Instalime %s
+# ^SetupCaption
+Rregullimi i $(^Name)
+# ^UninstallCaption
+Çinstalimi i $(^Name)
+# ^LicenseSubCaption
+: Marrëveshje Licence
+# ^ComponentsSubCaption
+: Mundësi Instalimi
+# ^DirSubCaption
+: Dosje Instalimi
+# ^InstallingSubCaption
+: Po instalohet
+# ^CompletedSubCaption
+: U plotësua
+# ^UnComponentsSubCaption
+: Mundësi Çinstalimi
+# ^UnDirSubCaption
+: Dosje Çinstalimi
+# ^ConfirmSubCaption
+: Ripohim
+# ^UninstallingSubCaption
+: Po çinstalohet
+# ^UnCompletedSubCaption
+: U plotësua
+# ^BackBtn
+< &Mbrapsht
+# ^NextBtn
+&Tjetri >
+# ^AgreeBtn
+&Pajtohem
+# ^AcceptBtn
+&I pranoj kushtet e Marrëveshjes së Licensës
+# ^DontAcceptBtn
+&Nuk i pranoj kushtet e Marrëveshjes së Licensës
+# ^InstallBtn
+&Instaloje
+# ^UninstallBtn
+&Çinstaloje
+# ^CancelBtn
+Anuloje
+# ^CloseBtn
+&Mbylle
+# ^BrowseBtn
+Sh&fletoni...
+# ^ShowDetailsBtn
+Shfaq &hollësi
+# ^ClickNext
+Klikoni Tjetri për të vazhduar.
+# ^ClickInstall
+Për të filluar instalimin klikoni Instaloje.
+# ^ClickUninstall
+Për të filluar çinstalimin klikoni Çinstaloje.
+# ^Name
+Emër
+# ^Completed
+U plotësua
+# ^LicenseText
+Ju lutem, para instalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, klikoni Pajtohem.
+# ^LicenseTextCB
+Ju lutem, para instalimit të $(^NameDA), shqyrtoni marrëveshjen e licensës. Nëse i pranoni tërë kushtet e marrëveshjes, klikoni kutizën më poshtë. $_CLICK
+# ^LicenseTextRB
+Ju lutem, para instalimit të $(^NameDA), shqyrtoni marrëveshjen e licensës. Nëse i pranoni tërë kushtet e marrëveshjes, përzgjidhni mundësinë e parë më poshtë. $_CLICK
+# ^UnLicenseText
+Ju lutem, para çinstalimit të $(^NameDA), shqyrtoni marrëveshjen e licensës. Nëse i pranoni tërë kushtet e marrëveshjes, klikoni Pajtohem.
+# ^UnLicenseTextCB
+Ju lutem, para çinstalimit të $(^NameDA), shqyrtoni marrëveshjen e licensës. Nëse i pranoni tërë kushtet e marrëveshjes, klikoni kutizën më poshtë. $_CLICK
+# ^UnLicenseTextRB
+Ju lutem, para çinstalimit të $(^NameDA), shqyrtoni marrëveshjen e licensës. Nëse i pranoni tërë kushtet e marrëveshjes, përzgjidhni mundësinë e parë më poshtë. $_CLICK
+# ^Custom
+Vetjake
+# ^ComponentsText
+U vini shenjë përbërësve që doni të instalohen dhe hiquani shenjën përbërësvet që nuk doni të instalohen. $_CLICK
+# ^ComponentsSubText1
+Përzgjidhni llojin e instalimit:
+# ^ComponentsSubText2_NoInstTypes
+Përzgjidhni përbërësit për instalim:
+# ^ComponentsSubText2
+Ose, përzgjidhni përbërësit e mundshëm që doni të instalohen:
+# ^UnComponentsText
+U vini shenjë përbërësve që doni të çinstalohen dhe hiquni shenjën përbërësve që nuk doni të çinstalohen. $_CLICK
+# ^UnComponentsSubText1
+Përzgjidhni llojin e çinstalimit:
+# ^UnComponentsSubText2_NoInstTypes
+Përzgjidhni përbërësit për çinstalim:
+# ^UnComponentsSubText2
+Ose, përzgjidhni përbërësit e mundshëm që doni të çinstalohen:
+# ^DirText
+Rregullimi do ta instalojë $(^NameDA) në dosjen vijuese. Për instalim në një dosje tjetër, klikoni Shfletoni dhe përzgjidhni një tjetër dosje. $_CLICK
+# ^DirSubText
+Dosje Vendmbërritje
+# ^DirBrowseText
+Përzgjidhni dosjen ku të instalohet $(^NameDA):
+# ^UnDirText
+Rregullimi do të çinstalojë $(^NameDA) prej dosjes vijuese. Për çinstalim prej një dosjeje tjetër, klikoni Shfletoni dhe përzgjidhni një tjetër dosje. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Përzgjidhni dosjen prej nga ku të çinstalohet $(^NameDA):
+# ^SpaceAvailable
+"Hapësirë e mundshme: "
+# ^SpaceRequired
+"Hapësirë e nevojshme: "
+# ^UninstallingText
+$(^NameDA) do të çinstalohet prej dosjes vijuese. $_CLICK
+# ^UninstallingSubText
+Po çinstalohet prej:
+# ^FileError
+Gabim në hapje kartele për shkrim: \r\n\r\n$0\r\n\r\nKlikoni Ndërprite për të ndalur instalimin,\r\nRiprovo për të provuar sërish, ose\r\nShpërfille për të sanashkaluar këtë kartelë.
+# ^FileError_NoIgnore
+Gabim në hapje kartele për shkrim: \r\n\r\n$0\r\n\r\nKlikoni Riprovo për të provuar sërish, ose\r\nAnulo për të ndalur instalimin.
+# ^CantWrite
+"S'shkruaj dot: "
+# ^CopyFailed
+Kopjimi dështoi
+# ^CopyTo
+"Kopjo tek "
+# ^Registering
+"Regjistrim: "
+# ^Unregistering
+"Çregjistrim: "
+# ^SymbolNotFound
+"S'u gjet dot simbol: "
+# ^CouldNotLoad
+"S'u ngarkua dot: "
+# ^CreateFolder
+"Krijo dosje: "
+# ^CreateShortcut
+"Krijo shkurtore: "
+# ^CreatedUninstaller
+"Krijo çinstalues: "
+# ^Delete
+"Fshi kartelë: "
+# ^DeleteOnReboot
+"Fshi gjatë rinisjes: "
+# ^ErrorCreatingShortcut
+"Gabim në krijim shkurtoresh: "
+# ^ErrorCreating
+"Gabim në krijimin e: "
+# ^ErrorDecompressing
+Gabim në çngjeshje të dhënash! Instalues i dëmtuar?
+# ^ErrorRegistering
+Gabim në regjistrim DLL-je
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Ekzekuto: "
+# ^Extract
+"Përfto: "
+# ^ErrorWriting
+"Përftim: gabim në shkrim te kartela "
+# ^InvalidOpcode
+Instalues i dëmtuar: opcode i pavlefshëm
+# ^NoOLE
+"Pa OLE për: "
+# ^OutputFolder
+"Dosje përfundimesh: "
+# ^RemoveFolder
+"Hiq dosjen: "
+# ^RenameOnReboot
+"Riemërtoje gjatë rinisjes: "
+# ^Rename
+"Riemërtoje: "
+# ^Skipped
+"U anashkalua: "
+# ^CopyDetails
+Kopjo Hollësira Te Clipboard
+# ^LogInstall
+Regjistro procesin e instalimit
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Albanian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Albanian.nsh
new file mode 100644
index 000000000..ecd9ae10a
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Albanian.nsh
@@ -0,0 +1,129 @@
+;Language: Albanian (1052)
+;Translation Besnik Bleta, besnik@programeshqip.org
+
+!insertmacro LANGFILE "Albanian" "Albanian"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Mirësevini te Rregullimi i $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ky do t'ju udhëheqë gjatë instalimit të $(^NameDA).$\r$\n$\r$\nKëshillohet që të mbyllni tërë zbatimet e tjera para se të nisni Rregullimin. Kjo bën të mundur përditësimin e kartelave të rëndësishme të sistemit pa u dashur të riniset kompjuteri juaj.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Mirësevini te Çinstalimi i $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ky do t'ju udhëheqë gjatë çinstalimit të $(^NameDA).$\r$\n$\r$\nPara nisjes së çinstalimit, sigurohuni që $(^NameDA) nuk është duke xhiruar.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Marrëveshje Licence"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ju lutem shqyrtoni kushtet e licencës përpara se të instaloni $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Nëse i pranoni kushtet e marrëveshjes, klikoni Pajtohem për të vazhduar. Duhet ta pranoni marrëveshjen për të instaluar $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Nëse pranoni kushtet e marrëveshjes, klikoni kutizën më poshtë. Duhet të pranoni marrëveshjen për të instaluar $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Nëse pranoni kushtet e marrëveshjes, përzgjidhni më poshtë mundësinë e parë. Duhet të pranoni marrëveshjen për të instaluar $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Marrëveshje Licence"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ju lutem shqyrtoni kushtet e licencës përpara çinstalimit të $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Nëse i pranoni kushtet e marrëveshjes, klikoni Pajtohem për të vazhduar. Duhet të pranoni marrëveshjen për të çinstaluar $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Nëse pranoni kushtet e marrëveshjes, klikoni kutizën më poshtë. Duhet të pranoni marrëveshjen për të çinstaluar $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Nëse pranoni kushtet e marrëveshjes, përzgjidhni mundësinë e parë më poshtë. Duhet të pranoni marrëveshjen për të çinstaluar $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Shtypni Page Down për të parë pjesën e mbetur të marrëveshjes."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Përzgjidhni Përbërës"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Zgjidhni cilat anë të $(^NameDA) doni të instalohen."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Përshkrim"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Zgjidhni Përbërësa"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Zgjidhni cilat anë të $(^NameDA) doni të çinstalohen."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Për të parë përshkrimin e një përbërësi, vendosni miun përsipër tij."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Për të parë përshkrimin e një përbërësi, vendosni miun përsipër tij."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Zgjidhni Vend Instalimi"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Zgjidhni dosjen tek e cila të instalohet $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Zgjidhni Vend Çinstalimi"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Zgjidhni dosjen prej së cilës të çinstalohet $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Po instalohet"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ju lutem prisni ndërkohë që $(^NameDA) instalohet."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalim i Plotësuar"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Rregullimi u plotësua me sukses."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalimi u Ndërpre"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Rregullimi nuk u plotësua me sukses."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Çinstalim"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Ju lutem prisni ndërsa $(^NameDA) çinstalohet."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Çinstalim i Plotë"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Çinstalimi u plotësua me sukses."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Çinstalimi u Ndërpre"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Çinstalimi nuk plotësua me sukses."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Po plotësoj Rregullimin e $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) u instalua në kompjuterin tuaj.$\r$\n$\r$\nPër mbylljen e procesit, klikoni Përfundoje."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Që të mund të plotësohet instalimi i $(^NameDA) kompjuteri juaj duhet të riniset. Doni ta rinisni tani?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Po plotësoj Çinstalimin e $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) u çinstalua prej kompjuterit tuaj.$\r$\n$\r$\nPër mbylljen e procesit, klikoni Përfundoje."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Kompjuteri juaj duhet të riniset që të mund të plotësohet çinstalimi i $(^NameDA). Doni ta rinisni tani?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Rinise tani"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Dua ta rinis dorazi më vonë"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Nis $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Shfaq Readme"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Përfundoje"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Zgjidhni Dosje Menuje Start"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Zgjidhni një dosje Menuje Start për shkurtore $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Përzgjidhni dosjen e Menusë Start në të cilën do të donit të krijonit shkurtoret për programin. Mundeni edhe të jepni një emër për të krijuar një dosje të re."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Mos krijo shkurtore"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Çinstalo $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Hiqeni $(^NameDA) prej kompjuterit tuaj."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Jeni i sigurt që doni të dilni nga Rregullimi i $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Jeni i sigurt që doni të dilni nga Çinstalimi i $(^Name)?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Zgjidhni Përdoruesa"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Zgjidhni për cilët përdoruesa doni të instalohet $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Përzgjidhni në doni të instalohet $(^NameDA) vetëm për veten tuaj apo për tërë përdoruesit e këtij kompjuteri. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instaloje për këdo në këtë kompjuter"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instaloje vetëm për mua"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Arabic.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Arabic.nlf
new file mode 100644
index 000000000..ebb0e2864
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Arabic.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1025
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1256
+# RTL - anything else than RTL means LTR
+RTL
+# Translation by asdfuae@msn.com, updated by Rami Kattan
+# ^Branding
+äÙÇã ÇáÊäÕíÈ äáÓæÝÊ %s
+# ^SetupCaption
+ÊäÕíÈ $(^Name)
+# ^UninstallCaption
+ÅÒÇáÉ $(^Name)
+# ^LicenseSubCaption
+ÅÊÝÇÞíÉþ ÇáÊÑÎíÕ :
+# ^ComponentsSubCaption
+ÎíÇÑÇÊ ÇáÊäÕíÈ :
+# ^DirSubCaption
+ãÌáÏ ÇáÊäÕíÈ :
+# ^InstallingSubCaption
+ÊäÕíÈ :
+# ^CompletedSubCaption
+ÅäÊåì :
+# ^UnComponentsSubCaption
+ÎíÇÑÇÊ ÇáÅÒÇáÉ :
+# ^UnDirSubCaption
+ãÌáÏ ÇáÅÒÇáÉ :
+# ^ConfirmSubCaption
+ÊÃßíÏ :
+# ^UninstallingSubCaption
+ÅÒÇáÉ :
+# ^UnCompletedSubCaption
+ÅäÊåì :
+# ^BackBtn
+< Çá&ÓÇÈÞ
+# ^NextBtn
+Çá&ÊÇáí >
+# ^AgreeBtn
+ãæÇÝÞ&
+# ^AcceptBtn
+&ÃæÇÝÞ Úáì ÔÑæØ ÇÊÝÇÞíÉ ÇáÊÑÎíÕ
+# ^DontAcceptBtn
+&áÇ ÃæÇÝÞ Úáì ÔÑæØ ÇÊÝÇÞíÉ ÇáÊÑÎíÕ
+# ^InstallBtn
+&ÊäÕíÈ
+# ^UninstallBtn
+&ÅÒÇáÉ
+# ^CancelBtn
+ÅáÛÇÁ
+# ^CloseBtn
+Å&ÛáÇÞ
+# ^BrowseBtn
+&ÚÑÖ...
+# ^ShowDetailsBtn
+Å&ÙåÇÑ ÇáÊÝÇÕíá
+# ^ClickNext
+ÅÖÛØ Úáì ÇáÊÇáí ááãÊÇÈÚÉ.
+# ^ClickInstall
+ÅÖÛØ Úáì ÊäÕíÈ áÊÔÛíá ÇáÊäÕíÈ.
+# ^ClickUninstall
+ÅÖÛØ Úáì ÅÒÇáÉ áÊÔÛíá ÇáÅÒÇáÉ.
+# ^Name
+ÇáÅÓã
+# ^Completed
+ÅäÊåì
+# ^LicenseText
+ÇáÑÌÇÁ ãÑÇÌÚÉ ÅÊÝÇÞíÉ ÇáÊÑÎíÕ ÞÈá ÊäÕíÈ $(^NameDA). ÚäÏ ÇáãæÇÝÞÉ Úáì ÌãíÚ ÔÑæØ ÇáÅÊÝÇÞíÉ¡ ÅÖÛØ ãæÇÝÞ.
+# ^LicenseTextCB
+ÇáÑÌÇÁ ãÑÇÌÚÉ ÅÊÝÇÞíÉ ÇáÊÑÎíÕ ÞÈá ÊäÕíÈ $(^NameDA). ÚäÏ ÇáãæÇÝÞÉ Úáì ÌãíÚ ÔÑæØ ÇáÅÊÝÇÞíÉ¡ ÅÖÛØ Úáì ãÑÈÚ ÇáãÄÔÑ ÇáÊÇáí. $_CLICK.
+# ^LicenseTextRB
+ÇáÑÌÇÁ ãÑÇÌÚÉ ÅÊÝÇÞíÉ ÇáÊÑÎíÕ ÞÈá ÊäÕíÈ $(^NameDA). ÚäÏ ÇáãæÇÝÞÉ Úáì ÌãíÚ ÔÑæØ ÇáÅÊÝÇÞíÉ¡ ÅÎÊÑ ÇáÎíÇÑ ÇáÃæá ÇáÊÇáí. $_CLICK
+# ^UnLicenseText
+ÇáÑÌÇÁ ãÑÇÌÚÉ ÅÊÝÇÞíÉ ÇáÊÑÎíÕ ÞÈá ÅÒÇáÉ $(^NameDA). ÚäÏ ÇáãæÇÝÞÉ Úáì ÌãíÚ ÔÑæØ ÇáÅÊÝÇÞíÉ¡ ÅÖÛØ ãæÇÝÞ.
+# ^UnLicenseTextCB
+ÇáÑÌÇÁ ãÑÇÌÚÉ ÅÊÝÇÞíÉ ÇáÊÑÎíÕ ÞÈá ÅÒÇáÉ $(^NameDA). ÚäÏ ÇáãæÇÝÞÉ Úáì ÌãíÚ ÔÑæØ ÇáÅÊÝÇÞíÉ¡ ÇÖÛØ Úáì ãÑÈÚ ÇáãÄÔÑ ÇáÊÇáí. $_CLICK
+# ^UnLicenseTextRB
+ÇáÑÌÇÁ ãÑÇÌÚÉ ÅÊÝÇÞíÉ ÇáÊÑÎíÕ ÞÈá ÅÒÇáÉ $(^NameDA). ÚäÏ ÇáãæÇÝÞÉ Úáì ÌãíÚ ÔÑæØ ÇáÅÊÝÇÞíÉ¡ ÅÎÊÑ ÇáÎíÇÑ ÇáÃæá ÇáÊÇáí. $_CLICK
+# ^Custom
+ÅÎÊíÇÑí
+# ^ComponentsText
+Úáøã ÇáãßæäÇÊ ÇáãÑÇÏ ÊäÕíÈåÇ æÅÒá ÇáÚáÇãÉ Úä ÇáãßæäÇÊ ÇáÛíÑ ãÑÇÏ ÊäÕíÈåÇ. $_CLICK
+# ^ComponentsSubText1
+ÅÎÊÑ äæÚ ÇáÊäÕíÈ:
+# ^ComponentsSubText2_NoInstTypes
+ÅÎÊÑ ÇáãßæäÇÊ ááÊäÕíÈ:
+# ^ComponentsSubText2
+Ãæ¡ Þã ÈÅÎÊíÇÑ ÇáãßæäÇÊ ÇáÅÎÊíÇÑíÉ ÇáãÑÇÏ ÊäÕíÈåÇ:
+# ^UnComponentsText
+Úáøã ÇáãßæäÇÊ ÇáãÑÇÏ ÅÒÇáÊåÇ æÃÒá ÇáÚáÇãÉ Úä ÇáãßæäÇÊ ÇáÛíÑ ãÑÇÏ ÅÒÇáÊåÇ. $_CLICK
+# ^UnComponentsSubText1
+ÅÎÊÑ äæÚ ÇáÅÒÇáÉ:
+# ^UnComponentsSubText2_NoInstTypes
+ÅÎÊÑ ÇáãßæäÇÊ ááÅÒÇáÉ:
+# ^UnComponentsSubText2
+Ãæ¡ ÅÎÊÑ ÇáãßæäÇÊ ÇáÅÎÊíÇÑíÉ ÇáãÑÇÏ ÅÒÇáÊåÇ:
+# ^DirText
+ÓíÊã ÊäÕíÈ $(^NameDA) Ýí ÇáãÌáÏ ÇáÊÇáí. ááÊäÕíÈ Ýí ãÌáÏ ÂÎÑ¡ ÅÖÛØ ÚÑÖ æÅÎÊÑ ãÌáÏ ÂÎÑ. $_CLICK
+# ^DirSubText
+ãÌáÏ ÇáåÏÝ
+# ^DirBrowseText
+ÅÎÊÑ ÇáãÌáÏ áÊäÕíÈ $(^NameDA) Ýíå:
+# ^UnDirText
+ÓíÊã ÅÒÇáÉ $(^NameDA) ãä ÇáãÌáÏ ÇáÊÇáí. ááÅÒÇáÉ ãä ãÌáÏ ÂÎÑ¡ ÅÖÛØ ÚÑÖ æÃÎÊÑ ãÌáÏ ÂÎÑ. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+ÅÎÊÑ ÇáãÌáÏ áÅÒÇáÉ $(^NameDA) ãäå:
+# ^SpaceAvailable
+"ÇáãÓÇÍÉ ÇáãÊæÝÑÉ: "
+# ^SpaceRequired
+"ÇáãÓÇÍÉ ÇáãØáæÈÉ: "
+# ^UninstallingText
+ÓíÊã ÅÒÇáÉ $(^NameDA) ãä ÇáãÌáÏ ÇáÊÇáí. $_CLICK
+# ^UninstallingSubText
+ÅÒÇáÉ ãä:
+# ^FileError
+ÍÏË Îáá ÃËäÇÁ ÝÊÍ ãáÝ ááßÊÇÈÉ: \r\n\t\"$0\"\r\nÅÖÛØ ÅáÛÇÁ áÅáÛÇÁ ÇáÊäÕíÈ¡\r\nãÍÇæáÉ áÅÚÇÏÉ ãÍÇæáÉ ßÊÇÈÉ ÇáãáÝ¡\r\n ÊÌÇåá áÊÎØí ÇáãáÝ
+# ^FileError_NoIgnore
+ÍÏË Îáá ÃËäÇÁ ÝÊÍ ãáÝ ááßÊÇÈÉ: \r\n\t\"$0\"\r\nÅÖÛØ ãÍÇæáÉ áÅÚÇÏÉ ãÍÇæáÉ ßÊÇÈÉ ÇáãáÝ¡ Ãæ\r\nÅáÛÇÁ áÅáÛÇÁ ÇáÊäÕíÈ
+# ^CantWrite
+"áÇ íÓÊØíÚ ÇáßÊÇÈÉ: "
+# ^CopyFailed
+ÝÔá ÇáäÓÎ
+# ^CopyTo
+"äÓÎ Åáì"
+# ^Registering
+"ÊÓÌíá: "
+# ^Unregistering
+"ÅáÛÇÁ ÊÓÌíá: "
+# ^SymbolNotFound
+"áã íÊãßä ãä ÅíÌÇÏ ÇáÑãÒ :"
+# ^CouldNotLoad
+"áã íÊãßä ãä ÊÍãíá :"
+# ^CreateFolder
+"ÅäÔÇÁ ãÌáÏ"
+# ^CreateShortcut
+"ÅäÔÇÁ ÅÎÊÕÇÑ: "
+# ^CreatedUninstaller
+"ÅäÔÇÁ ãÒíá: "
+# ^Delete
+"ÍÐÝ ãáÝ: "
+# ^DeleteOnReboot
+"ÍÐÝ ÈÚÏ ÅÚÇÏÉ ÇáÊÔÛíá: "
+# ^ErrorCreatingShortcut
+"Îáá ÃËäÇÁ ÅäÔÇÁ ÅÎÊÕÇÑ: "
+# ^ErrorCreating
+"Îáá ÃËäÇÁ ÅäÔÇÁ :"
+# ^ErrorDecompressing
+Îáá ÃËäÇÁ ÝÊÍ ÇáÈíÇäÇÊ ÇáãÖÛæØÉ! ãäÕÈ ÊÇáÝ¿
+# ^ErrorRegistering
+Îáá ÃËäÇÁ ÊÓÌíá DLL
+# ^ExecShell
+"ÊäÝíÐ ExecShell:"
+# ^Exec
+"ÊäÝíÐ: "
+# ^Extract
+"ÅÓÊÎÑÇÌ: "
+# ^ErrorWriting
+"ÅÓÊÎÑÇÌ: Îáá ÃËäÇÁ ÇáßÊÇÈÉ Åáì ãáÝ "
+# ^InvalidOpcode
+ÇáãäÕøÈ ÊÇáÝ: ÔÝÑÉ ÛíÑ ÕÇáÍÉ
+# ^NoOLE
+"áÇ ÊæÌÏ OLE áÜö: "
+# ^OutputFolder
+"ãÌáÏ ÇáÅÎÑÇÌ: "
+# ^RemoveFolder
+"ÅÒÇáÉ ãÌáÏ: "
+# ^RenameOnReboot
+"ÅÚÇÏÉ ÊÓãíÉ ÈÚÏ ÅÚÇÏÉ ÇáÊÔÛíá: "
+# ^Rename
+"ÅÚÇÏÉ ÊÓãíÉ: "
+# ^Skipped
+"ÊÎØì: "
+# ^CopyDetails
+äÓÎ ÇáÊÝÇÕíá Åáì ÇáÐÇßÑÉ
+# ^LogInstall
+ÓÌøá ÚãáíÉ ÇáÊäÕíÈ
+# ^Byte
+ÈÇíÊ
+# ^Kilo
+ßíáæ
+# ^Mega
+ãíÛÇ
+# ^Giga
+ÌíÛÇ
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Arabic.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Arabic.nsh
new file mode 100644
index 000000000..afef641f1
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Arabic.nsh
@@ -0,0 +1,122 @@
+;Language: Arabic (1025)
+;Translation by asdfuae@msn.com
+;updated by Rami Kattan
+
+!insertmacro LANGFILE "Arabic" "Arabic"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "ãÑÍÈÇ Èß Ýí ãÑÔÏ ÅÚÏÇÏ $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "ÓíÓÇÚÏß åÐÇ ÇáãÑÔÏ Ýí ÊäÕíÈ $(^NameDA).$\r$\n$\r$\nãä ÇáãÝÖá ÅÛáÇÞ ÌãíÚ ÇáÈÑÇãÌ ÞÈá ÇáÊäÕíÈ. ÓíÓÇÚÏ åÐÇ Ýí ÊÌÏíÏ ãáÝÇÊ ÇáäÙÇã Ïæä ÇáÍÇÌÉ áÅÚÇÏÉ ÊÔÛíá ÇáÌåÇÒ.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "ãÑÍÈÇ Èß Ýí ãÑÔÏ ÅÒÇáÉ $(^NameDA) "
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "åÐÇ ÇáãÑÔÏ ÓíÏáøß ÃËäÇÁ ÅÒÇáÉ $(^NameDA).$\r$\n$\r$\n ÞÈá ÇáÈÏÁ ÈÇáÅÒÇáÉ¡ íÑÌì ÇáÊÃßÏ ãä Ãä $(^NameDA) ÛíÑ ÔÛøÇá.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "ÅÊÝÇÞíÉþ ÇáÊÑÎíÕ"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "ÇáÑÌÇÁ ãÑÇÌÚÉ ÅÊÝÇÞíÉþ ÇáÊÑÎíÕ ÞÈá ÊäÕíÈ $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "ÚäÏ ÇáãæÇÝÞÉ Úáì ÔÑæØ ÇáÅÊÝÇÞíÉþ¡ ÅÖÛØ ÃæÇÝÞ ááãÊÇÈÚÉ. íÌÈ ÇáãæÇÝÞÉ Úáì ÇáÅÊÝÇÞíÉþ áÊäÕíÈ $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "ÚäÏ ÇáãæÇÝÞÉ Úáì ÔÑæØ ÇáÅÊÝÇÞíÉþ¡ Úáøã ãÑÈÚ ÇáÚáÇãÉ ÇáÊÇáí. íÌÈ ÇáãæÇÝÞÉ Úáì ÇáÅÊÝÇÞíÉþ áÊäÕíÈ $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ÚäÏ ÇáãæÇÝÞÉ Úáì ÔÑæØ ÇáÅÊÝÇÞíÉ¡ ÅÎÊÑ ÇáÎíÇÑ ÇáÃæá ãä ÇáÊÇáí. íÌÈ ÇáãæÇÝÞÉ Úáì ÇáÅÊÝÇÞíÉ áÊäÕíÈ $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "ÅÊÝÇÞíÉ ÇáÊÑÎíÕ"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "ÇáÑÌÇÁ ãÑÇÌÚÉ ÔÑæØ ÇáÊÑÎíÕ ÞÈá ÅÒÇáÉ $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "ÚäÏ ÇáãæÇÝÞÉ Úáì ÔÑæØ ÇáÅÊÝÇÞíÉ¡ ÅÖÛØ Úáì ãæÇÝÞ. íÌÈ ÇáãæÇÝÞÉ Úáì ÇáÅÊÝÇÞíÉ áÅÒÇáÉ $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "ÚäÏ ÇáãæÇÝÞÉ Úáì ÔÑæØ ÇáÅÊÝÇÞíÉ¡ Úáøã ÇáãÑÈÚ ÇáÚáÇãÉ ÇáÊÇáí. íÌÈ ÇáãæÇÝÞÉ Úáì ÇáÅÊÝÇÞíÉ áÅÒÇáÉ $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ÚäÏ ÇáãæÇÝÞÉ Úáì ÔÑæØ ÇáÅÊÝÇÞíÉ¡ ÅÎÊÑ ÇáÎíÇÑ ÇáÃæá ãä ÇáÊÇáí. íÌÈ ÇáãæÇÝÞÉ Úáì ÇáÅÊÝÇÞíÉ áÅÒÇáÉ $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ÅÖÚØ ãÝÊÇÍ ÕÝÍÉ ááÃÓÝá áÑÄíÉ ÈÇÞí ÇáÅÊÝÇÞíÉ"
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "ÅÎÊÑ ÇáãßæäÇÊ"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "ÅÎÊÑ ãíÒÇÊ $(^NameDA) ÇáãÑÇÏ ÊäÕíÈåÇ."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ÇáæÕÝ"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "ÅÎÊÑ ÇáãßæäÇÊ"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "ÅÎÊÑ ãíÒÇÊ $(^NameDA) ÇáãÑÇÏ ÅÒÇáÊåÇ."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ÃÔÑ ÈÇáÝÃÑÉ ÝæÞ ÃÍÏ ÇáãßæäÇÊ áÑÄíÉ ÇáæÕÝ"
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ÃÔÑ ÈÇáÝÃÑÉ ÝæÞ ÃÍÏ ÇáãßæäÇÊ áÑÄíÉ ÇáæÕÝ"
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "ÅÎÊÑ ãæÞÚ ÇáÊäÕíÈ"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "ÅÎÊÑ ÇáãÌáÏ ÇáãÑÇÏ ÊäÕíÈ $(^NameDA) Ýíå."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "ÅÎÊÑ ãæÞÚ ÇáãÒíá"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "ÅÎÊÑ ÇáãÌáÏ ÇáÐí ÓíÒÇá ãäå $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "ÊäÕíÈ"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "ÇáÑÌÇÁ ÇáÅäÊÙÇÑ ÃËäÇÁ ÊäÕíÈ $(^NameDA)."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "ÅäÊåì ÇáÊäÕíÈ"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "ÅäÊåÊ ÚãáíÉ ÇáÊäÕíÈ ÈäÌÇÍ."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "ÅáÛÇÁ ÇáÊäÕíÈ"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "áã íäÊåí ÇáÊäÕíÈ ÈäÌÇÍ."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "ÅÒÇáÉ"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "ÇáÑÌÇÁ ÇáÅäÊÙÇÑ ÃËäÇÁ ÅÒÇáÉ $(^NameDA)."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "ÅäÊåì"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "ÅäÊåÊ ÚãáíÉ ÇáÅÒÇáÉ ÈäÌÇÍ."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "ÅáÛÇÁ ÇáÅÒÇáÉ"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "áã ÊäÊåí ÇáÅÒÇáÉ ÈäÌÇÍ."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "ÅäåÇÁ ãÑÔÏ ÅÚÏÇÏ $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "áÞÏ Êã ÊäÕíÈ $(^NameDA) Úáì ÇáÌåÇÒ$\r$\n$\r$\nÅÖÛØ ÅäåÇÁ áÅÛáÇÞ ãÑÔÏ ÇáÅÚÏÇÏ."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "íÌÈ ÅÚÇÏÉ ÊÔÛíá ÇáÌåÇÒ áÅäåÇÁ ÊäÕíÈ $(^NameDA). åá ÊÑíÏ ÅÚÇÏÉ ÇáÊÔÛíá ÇáÂä¿"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "ÅäåÇÁ ãÑÔÏ ÅÒÇáÉ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "áÞÏ Êã ÅÒÇáÉ $(^NameDA) ãä ÇáÌåÇÒ.$\r$\n$\r$\n ÅÖÛØ ÅäåÇÁ áÅÛáÇÞ ÇáãÑÔÏ."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "íÌÈ ÅÚÇÏÉ ÊÔÛíá ÇáÌåÇÒ áÅäåÇÁ ÅÒÇáÉ $(^NameDA). åá ÊÑíÏ ÅÚÇÏÉ ÇáÊÔÛíá ÇáÂä¿"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "ÃÚÏ ÇáÊÔÛíá ÇáÂä"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "ÃÑÛÈ Ýí ÅÚÇÏÉ ÊÔÛíá ÇáÌåÇÒ Ýí æÞÊ áÇÍÞ"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&ÔÛá $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "ÇÚÑÖ& ÃÞÑÃäí"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&ÅäåÇÁ"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "ÅÎÊÑ ãÌáÏ ÞÇÆãÉ ÇÈÏÃ"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "ÅÎÊÑ ãÌáÏ ÞÇÆãÉ ÇÈÏà áÅÎÊÕÇÑÇÊ $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "ÅÎÊÑ ÇáãÌáÏ Ýí ÞÇÆãÉ ÇÈÏà ÇáÐí ÓÊäÔà Ýíå ÅÎÊÕÇÑÇÊ ÇáÈÑäÇãÌ. íãßä ÃíÖÇ ßÊÇÈÉ ÅÓã áÅäÔÇÁ ãÌáÏ ÌÏíÏ."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "áÇ ÊäÔÆ ÅÎÊÕÇÑÇÊ"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "ÅÒÇáÉ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "ÅÒÇáÉ $(^NameDA) ãä ÇáÌåÇÒ."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "åá ÃäÊ ãÊÃßÏ ãä ÅÛáÇÞ ãäÕøÈ $(^Name)¿"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "åá ÃäÊ ãÊÃßÏ ãä Ãäß ÇáÎÑæÌ ãä ãÒíá $(^Name)¿"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Basque.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Basque.nlf
new file mode 100644
index 000000000..d4230c55e
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Basque.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1069
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Iñaki San Vicente
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) -ren Instalazioa
+# ^UninstallCaption
+$(^Name) -ren Ezabaketa
+# ^LicenseSubCaption
+: Lizentzia hitzarmen agiria
+# ^ComponentsSubCaption
+: Instalazio aukerak
+# ^DirSubCaption
+: Instalazio karpeta
+# ^InstallingSubCaption
+: Instalatzen
+# ^CompletedSubCaption
+: Instalazioa burututa
+# ^UnComponentsSubCaption
+: Ezabaketa aukerak
+# ^UnDirSubCaption
+: Ezabaketa direktorioa
+# ^ConfirmSubCaption
+: Berretsi ezabaketa
+# ^UninstallingSubCaption
+: Ezabatzen
+# ^UnCompletedSubCaption
+: Ezabaketa burututa
+# ^BackBtn
+< &Atzera
+# ^NextBtn
+&Aurrera >
+# ^AgreeBtn
+Onartu
+# ^AcceptBtn
+Lizentzia hitzarmenaren baldintzak onartzen ditut.
+# ^DontAcceptBtn
+Ez ditut lizentzia hitzarmenaren baldintzak onartzen.
+# ^InstallBtn
+&Instalatu
+# ^UninstallBtn
+&Ezabatu
+# ^CancelBtn
+Ezeztatu
+# ^CloseBtn
+&Itxi
+# ^BrowseBtn
+&Arakatu...
+# ^ShowDetailsBtn
+Ikusi &zehaztasunak
+# ^ClickNext
+Sakatu Aurrera jarraitzeko.
+# ^ClickInstall
+Sakatu Instalatu instalazioarekin hasteko.
+# ^ClickUninstall
+Sakatu Ezabatu ezabaketarekin hasteko.
+# ^Name
+Izena
+# ^Completed
+Osatuta
+# ^LicenseText
+Mesedez, aztertu lizentzia hitzarmena $(^NameDA) instalatu aurretik. Baldintza guztiak onartzen badituzu, sakatu Onartu.
+# ^LicenseTextCB
+Mesedez, aztertu lizentzia hitzarmena $(^NameDA) instalatu aurretik. Baldintza guztiak onartzen badituzu, nabarmendu azpiko laukitxoa. $_CLICK
+# ^LicenseTextRB
+Mesedez, aztertu lizentzia hitzarmena $(^NameDA) instalatu aurretik. Baldintza guztiak onartzen badituzu, hautatu azpian lehen aukera. $_CLICK
+# ^UnLicenseText
+Mesedez, aztertu lizentzia hitzarmena $(^NameDA) ezabatu aurretik. Baldintza guztiak onartzen badituzu, sakatu Onartu.
+# ^UnLicenseTextCB
+Mesedez, aztertu lizentzia hitzarmena $(^NameDA) ezabatu aurretik. Baldintza guztiak onartzen badituzu, nabarmendu azpiko laukitxoa. $_CLICK.
+# ^UnLicenseTextRB
+Mesedez, aztertu lizentzia hitzarmena $(^NameDA) ezabatu aurretik. Baldintza guztiak onartzen badituzu, hautatu azpian lehen aukera. $_CLICK
+# ^Custom
+Norberaren nahien arabera
+# ^ComponentsText
+Nabarmendu instalatu nahi diren osagaiak, eta utzi zuri instalatu nahi ez direnak. $_CLICK
+# ^ComponentsSubText1
+Hautatu instalazio mota:
+# ^ComponentsSubText2_NoInstTypes
+Hautatu instalatu beharreko osagaiak:
+# ^ComponentsSubText2
+Edo hautatu instalatu beharreko aukerazko osagaiak:
+# ^UnComponentsText
+Nabarmendu ezabatu nahi diren osagaiak, eta utzi zuri ezabatu nahi ez direnak. $_CLICK
+# ^UnComponentsSubText1
+Hautatu ezabaketa mota:
+# ^UnComponentsSubText2_NoInstTypes
+Hautatu ezabatu beharreko osagaiak:
+# ^UnComponentsSubText2
+Edo hautatu ezabatu beharreko aukerazko osagaiak:
+# ^DirText
+Instalazio programak $(^NameDA) honako karpetan instalatuko du. Beste karpeta batean instalatzeko, sakatu Arakatu eta aukeratu beste bat. $_CLICK
+# ^DirSubText
+Helburu karpeta
+# ^DirBrowseText
+Aukeratu $(^NameDA) instalatuko den karpeta:
+# ^UnDirText
+Instalazio programak $(^NameDA) honako karpetatik ezabatuko du. Beste karpeta batetik ezabatzeko, sakatu Arakatu eta aukeratu beste bat. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Aukeratu $(^NameDA) zein karpetatik ezabatuko den:
+# ^SpaceAvailable
+Leku erabilgarria:
+# ^SpaceRequired
+Behar den lekua:
+# ^UninstallingText
+$(^NameDA) ondorengo karpetan instalatuko da. $_CLICK
+# ^UninstallingSubTex
+Ezabatzen honako karpetatik:
+# ^FileError
+Hutsegitea idazteko fitxategia irekitzean: \r\n\t"$0"\r\nSakatu Irten instalazioa ,\r\nsaiatu berriz fitxategi hau berriz idazten saiatzeko, u\r\njarraitu fitxategi hau alde batera utzita aurrera egiteko
+# ^FileError_NoIgnore
+Hutsegitea idazteko fitxategia irekitzean: \r\n\t"$0"\r\nsaiatu berriz fitxategi hau berriz idazten saiatzeko ,\r\nSakatu Irten instalazioa
+# ^CantWrite
+"Ezin izan da idatzi: "
+# ^CopyFailed
+Kopiatzeak hutsegin du
+# ^CopyTo
+"Kopiatu hona "
+# ^Registering
+"Erregistratzen: "
+# ^Unregistering
+"Erregistroa ezabatzen: "
+# ^SymbolNotFound
+"Ikurra ezin izan da aurkitu: "
+# ^CouldNotLoad
+"Ezin izan da kargatu: "
+# ^CreateFolder
+"Sortu karpeta: "
+# ^CreateShortcut
+"Sortu lasterbidea: "
+# ^CreatedUninstaller
+"Sortu ezabatzailea: "
+# ^Delete
+"Ezabatu fitxategia: "
+# ^DeleteOnReboot
+"Ezabatu berrabiarazitakoan: "
+# ^ErrorCreatingShortcut
+"Hutsegitea lasterbidea sortzerakoan: "
+# ^ErrorCreating
+"Hutsegitea sortzerakoan: "
+# ^ErrorDecompressing
+¡Hutsegitea datuak deskomprimatzean! Instalatzailea okerra?
+# ^ErrorRegistering
+Hutsegitea DLL erregistratzerakoan
+# ^ExecShell
+"Exekutatu agindua: "
+# ^Exec
+"Exekutatu: "
+# ^Extract
+"Kanporatu: "
+# ^ErrorWriting
+"Kanporaketa: hutsegitea fitxategira idazterakoan "
+# ^InvalidOpcode
+Instalatzailea okerra: ekintza kodea ez da baliozkoa
+# ^NoOLE
+"OLE-rik ez honentzako: "
+# ^OutputFolder
+"Irteera karpeta: "
+# ^RemoveFolder
+"Ezabatu karpeta: "
+# ^RenameOnReboot
+"Berrizendatu berrabiarazitakoan: "
+# ^Rename
+"Berrizendatu: "
+# ^Skipped
+"Alde batera utzitakoa: "
+# ^CopyDetails
+Kopiatu xehetasunak arbelera
+# ^LogInstall
+Instalazio prozesuaren erregistroa gorde
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Basque.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Basque.nsh
new file mode 100644
index 000000000..ebc9ef4e0
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Basque.nsh
@@ -0,0 +1,121 @@
+;Language: Basque (1069)
+;By Iñaki San Vicente
+
+!insertmacro LANGFILE "Basque" "Euskera"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Ongi etorri $(^NameDA) -ren instalazio programara"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Programa honek $(^NameDA) zure ordenagailuan instalatuko du.$\r$\n$\r$\nAholkatzen da instalazioarekin hasi aurretik beste aplikazio guztiak ixtea. Honek sistemarekin erlazionatuta dauden fitxategien eguneratzea ahalbidetuko du, ordenagailua berrabiarazi beharrik izan gabe.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Ongi etorri $(^NameDA) -ren ezabaketa programara"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Laguntzaile honek $(^NameDA)-ren ezabaketa prozesuan zehar gidatuko zaitu.$\r$\n$\r$\nEzabaketa hasi aurretik, ziurtatu $(^NameDA) martxan ez dagoela .$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lizentzia hitzarmena"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Mesedez aztertu lizentziaren baldintzak $(^NameDA) instalatu aurretik."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Baldintzak onartzen badituzu, sakatu Onartu aurrera egiteko. Hitzarmena onartzea ezinbestekoa da $(^NameDA) instalatzeko."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Baldintzak onartzen badituzu, nabarmendu azpiko laukitxoa. Hitzarmena onartzea ezinbestekoa da $(^NameDA) instalatzeko. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Baldintzak onartzen badituzu, hautatu azpian lehen aukera. Hitzarmena onartzea ezinbestekoa da $(^NameDA) instalatzeko. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lizentzia hitzarmena"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Mesedez aztertu lizentziaren baldintzak $(^NameDA) ezabatu aurretik."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Baldintzak onartzen badituzu, sakatu Onartu aurrera egiteko. Hitzarmena onartzea ezinbestekoa da $(^NameDA) ezabatzeko."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Baldintzak onartzen badituzu, nabarmendu azpiko laukitxoa. Hitzarmena onartzea ezinbestekoa da $(^NameDA) ezabatzeko. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Baldintzak onartzen badituzu, hautatu azpian lehen aukera. Hitzarmena onartzea ezinbestekoa da $(^NameDA) ezabatzeko. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Sakatu Av Pág hitzarmenaren gainontzeko atalak ikusteko."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Osagaien hautatzea"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Hautatu $(^NameDA)-ren zein ezaugarri instalatu nahi duzun."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Azalpena"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Osagaien hautatzea"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Hautatu $(^NameDA)-ren zein ezaugarri ezabatu nahi duzun."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Jarri sagua osagai baten gainean dagokion azalpena ikusteko."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Jarri sagua osagai baten gainean dagokion azalpena ikusteko."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Hautatu instalazioaren lekua"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Aukeratu $(^NameDA) instalatzeko karpeta."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Aukeratu ezabatuko den karpeta"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Aukeratu $(^NameDA) zein karpetatik ezabatuko den."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalatzen"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Mesedez itxoin $(^NameDA) instalatzen den bitartean."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalazioa burututa"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalazioa zuzen burutu da."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalazioa ezeztatua"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalazioa ez da zuzen burutu."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Ezabatzen"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Mesedez itxoin $(^NameDA) ezabatzen den bitartean."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Ezabatzea burututa"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Ezabatzea zuzen burutu da."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ezabatzea ezeztatuta"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Ezabatzea ez da zuzen burutu."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA)-ren instalazio laguntzailea osatzen"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) zure sisteman instalatu da.$\r$\n$\r$\nSakatu Amaitu laguntzaile hau ixteko."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Zure sistema berrabiarazi behar duzu $(^NameDA)-ren instalazioa osatzeko. Orain Berrabiarazi nahi duzu?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA)-ren ezabaketa laguntzailea osatzen"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) zure sistematik ezabatu da.$\r$\n$\r$\nSakatu Amaitu laguntzaile hau ixteko."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Zure ordenagailuak berrabiarazia izan behar du $(^NameDA)-ren ezabaketa osatzeko. Orain Berrabiarazi nahi duzu?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Berrabiarazi orain"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Neuk berrabiarazi geroago"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Exekutatu $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Ikusi Readme.txt"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Amaitu"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Aukeratu Hasiera Menuko karpeta"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Aukeratu Hasiera Menuko karpeta bat $(^NameDA)-ren lasterbideentzako."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Aukeratu Hasiera Menuko karpeta bat, non programaren lasterbideak instalatu nahi dituzun. Karpeta berri bat sortzeko izen bat ere adierazi dezakezu."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ez sortu lasterbiderik"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Ezabatu $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) zure sistematik ezabatzen du."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Ziur zaude $(^Name)-ren instalaziotik irten nahi duzula?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ziur zaude $(^Name)-ren ezabaketa laguntzailetik irten nahi duzula?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Belarusian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Belarusian.nlf
new file mode 100644
index 000000000..8babe2ca1
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Belarusian.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1059
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1251
+# RTL - anything else than RTL means LTR
+-
+# Translation by Sitnikov Vjacheslav [ glory_man@tut.by ]
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Óñòàíî¢êà $(^Name)
+# ^UninstallCaption
+Âûäàëåííå $(^Name)
+# ^LicenseSubCaption
+: ˳öýíç³éíàå ïàãàäíåííå
+# ^ComponentsSubCaption
+: Ïàðàìåòðû ¢ñòàíî¢ê³
+# ^DirSubCaption
+: Ïàïêà óñòàíî¢ê³
+# ^InstallingSubCaption
+: Êàï³ðàâàííå ôàéëà¢
+# ^CompletedSubCaption
+: Ïðàöýäóðà çàâåðøåíà
+# ^UnComponentsSubCaption
+: Ïàðàìåòðû âûäàëåííÿ
+# ^UnDirSubCaption
+: Ïàïêà âûäàëåííÿ
+# ^ConfirmSubCaption
+: Ïàöâÿðäæýííå
+# ^UninstallingSubCaption
+: Âûäàëåííå ôàéëà¢
+# ^UnCompletedSubCaption
+: Ïðàöýäóðà çàâåðøàíà
+# ^BackBtn
+< &Íàçàä
+# ^NextBtn
+&Äàëåé >
+# ^AgreeBtn
+&Çãîäçåí
+# ^AcceptBtn
+ß &ïðûìàþ ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ
+# ^DontAcceptBtn
+ß í&å ïðûìàþ ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ
+# ^InstallBtn
+&Óñòàëÿâàöü
+# ^UninstallBtn
+Âûä&àë³öü
+# ^CancelBtn
+Àäìÿí³öü
+# ^CloseBtn
+Çà&÷ûí³öü
+# ^BrowseBtn
+À&ãëÿä ...
+# ^ShowDetailsBtn
+Ïàäðà&áÿçíà...
+# ^ClickNext
+Íàö³ñí³öå êíîïêó "Äàëåé", êàá ïðàöÿãíóöü óñòàíî¢êó ïðàãðàìû.
+# ^ClickInstall
+Íàö³ñí³öå êíîïêó "Óñòàëÿâàöü" äëÿ ïà÷àòêó ïðàöýñà ¢ñòàíî¢ê³ ïðàãðàìû.
+# ^ClickUninstall
+Íàö³ñí³öå êíîïêó "Âûäàë³öü" äëÿ ïà÷àòêó ïðàöýñà âûäàëåííÿ ïðàãðàìû.
+# ^Name
+²ìÿ
+# ^Completed
+Çàâåðøàíà
+# ^LicenseText
+Êàë³ ëàñêà, ïðà÷ûòàéöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ ïåðàä ïà÷àòêàì óñòàíî¢ê³ $(^NameDA). Êàë³ Âû ïðûìàåöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ, íàö³ñí³öå êíîïêó "Çãîäçåí".
+# ^LicenseTextCB
+Êàë³ ëàñêà, ïðà÷ûòàéöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ ïåðàä ïà÷àòêàì óñòàíî¢ê³ $(^NameDA). Êàë³ Âû ïðûìàåöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ, óñòàëþéöå ñöÿæîê í³æýé. $_CLICK
+# ^LicenseTextRB
+Êàë³ ëàñêà, ïðà÷ûòàéöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ ïåðàä ïà÷àòêàì óñòàíî¢ê³ $(^NameDA). Êàë³ Âû ïðûìàåöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ, âûëó÷ûöå ïåðøû âàðûÿíò ç ïðàïàíàâàíûõ íiæýé. $_CLICK
+# ^UnLicenseText
+Êàë³ ëàñêà, ïðà÷ûòàéöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ ïåðàä ïà÷àòêàì âûäàëåííÿ $(^NameDA). Êàë³ Âû ïðûìàåöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ, íàöiñíiöå êíîïêó "Çãîäçåí".
+# ^UnLicenseTextCB
+Êàë³ ëàñêà, ïðà÷ûòàéöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ ïåðàä ïà÷àòêàì âûäàëåííÿ $(^NameDA). Êàë³ Âû ïðûìàåöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ, óñòàëþéöå ñöÿæîê í³æýé. $_CLICK
+# ^UnLicenseTextRB
+Êàë³ ëàñêà, ïðà÷ûòàéöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ ïåðàä ïà÷àòêàì âûäàëåííÿ $(^NameDA). Êàë³ Âû ïðûìàåöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ, âûëó÷ûöå ïåðøû âàðûÿíò ç ïðàïàíàâàíûõ íiæýé. $_CLICK
+# ^Custom
+Âûáàðêîâà
+# ^ComponentsText
+Âûçíà÷öå êàìïàíåíòû ïðàãðàìû, ÿêiÿ Âû æàäàåöå ¢ñòàíàâiöü. $_CLICK
+# ^ComponentsSubText1
+Âûçíà÷öå òûï óñòàíî¢êi:
+# ^ComponentsSubText2_NoInstTypes
+Âûçíà÷öå êàìïàíåíòû ïðàãðàìû, êàá óñòàíàâiöü iõ:
+# ^ComponentsSubText2
+àëüáî âûçíà÷öå êàìïàíåíòû ïðàãðàìû, êàá óñòàíàâiöü iõ ïà ñâàéìó æàäàííþ:
+# ^UnComponentsText
+Âûçíà÷öå êàìïàíåíòû, ÿêiÿ Âû æàäàåöå âûäàëiöü, i çíiìiöå ñöÿæê³, âûáðàíûÿ äëÿ òûõ êàìïàíåíòà¢, ÿêiÿ íå òðýáà âûäàëÿöü. $_CLICK
+# ^UnComponentsSubText1
+Âûçíà÷öå òûï âûäàëåííÿ:
+# ^UnComponentsSubText2_NoInstTypes
+Âûçíà÷öå êàìïàíåíòû äëÿ âûäàëåííÿ:
+# ^UnComponentsSubText2
+àëüáî âûçíà÷öå êàìïàíåíòû ïðàãðàìû äëÿ âûäàëåííÿ:
+# ^DirText
+Ïðàãðàìà ¢ñòàëþå $(^NameDA) ó âûçíà÷àíóþ ïàïêó. Êàá óñòàíàâiöü ïðàãðàìó ¢ iíøàé ïàïê³, íàöiñíiöå êíîïêó "Àãëÿä" i âûçíà÷öå ïàòðýáíóþ ïàïêó. $_CLICK
+# ^DirSubText
+Ïàïêà óñòàíî¢êi
+# ^DirBrowseText
+Âûçíà÷öå ïàïêó äëÿ ¢ñòàíî¢êi $(^NameDA):
+# ^UnDirText
+Ïðàãðàìà âûäàëiöü $(^NameDA) ç àäçíà÷àíàé ïàïê³. Êàá âûðàá³öü âûäàëåííå ç iíøàé ïàïê³, íàöiñíiöå êíîïêó "Àãëÿä" i âûçíà÷öå ïàòðýáíóþ ïàïêó. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Âûçíà÷öå ïàïêó, ç ÿêîé Âû æàäàåöå âûäàëiöü $(^NameDA):
+# ^SpaceAvailable
+"Äàñÿæíà íà äûñêó: "
+# ^SpaceRequired
+"Ïàòðýáíàå ìåñöà íà äûñêó: "
+# ^UninstallingText
+Ïðàãðàìà âûäàëiöü $(^NameDA) ç Âàøàãà êàìïóòàðà. $_CLICK
+# ^UninstallingSubText
+Âûäàëåííå ç:
+# ^FileError
+Íåìàã÷ûìà àä÷ûí³öü ôàéë äëÿ çàïiñó: \r\n\r\n$0\r\n\r\nÍàöiñíiöå êíîïêó "Ïåðàïûíiöü", êàá ïåðàïûíiöü óñòàíî¢êó;\r\n"Ïà¢òàðûöü", êàá ïà¢òàðûöü ñïðîáó çàïiñó ¢ ôàéë;\r\n"²ãíàðàâàöü", êàá ïðàïóñöiöü ãýòà äçåÿííå.
+# ^FileError_NoIgnore
+Íåìàã÷ûìà àä÷ûí³öü ôàéë äëÿ çàïiñó: \r\n\r\n$0\r\n\r\nÍàöiñíiöå êíîïêó "Ïà¢òàðûöü", êàá ïà¢òàðûöü ñïðîáó çàïiñó ¢ ôàéë;\r\n"Àäìÿí³öü", êàá ïåðàïûíiöü óñòàíî¢êó.
+# ^CantWrite
+"Íåìàã÷ûìà çàïiñàöü: "
+# ^CopyFailed
+Êàïiðàâàííå íÿ¢äàëà
+# ^CopyTo
+"Êàïiðàâàííå ¢ "
+# ^Registering
+"Ðýãiñòðàöûÿ: "
+# ^Unregistering
+"Âûäàëåííå ðýãiñòðàöûi: "
+# ^SymbolNotFound
+"Íåìàã÷ûìà àäøóêàöü ñiìâàë: "
+# ^CouldNotLoad
+"Íåìàã÷ûìà çàãðóçiöü: "
+# ^CreateFolder
+"Ñòâàðýííå ïàïê³: "
+# ^CreateShortcut
+"Ñòâàðýííå ÿðëûêó: "
+# ^CreatedUninstaller
+"Ñòâàðýííå ïðàãðàìû âûäàëåííÿ: "
+# ^Delete
+"Âûäàëåííå ôàéëà: "
+# ^DeleteOnReboot
+"Âûäàëåííå ïàñëÿ ïåðåçàãðóçêi êàìïóòàðà: "
+# ^ErrorCreatingShortcut
+"Ïàìûëêà ñòâàðýííÿ ÿðëûêó: "
+# ^ErrorCreating
+"Ïàìûëêà ñòâàðýííÿ: "
+# ^ErrorDecompressing
+Íåìàã÷ûìà âûöÿãíóöü äàäçåíûÿ. Ìàã÷ûìà ïàøêîäæàíû äûñòðûáóòû¢.
+# ^ErrorRegistering
+Íåìàã÷ûìà çàðýã³ñòðàâàöü á³áë³ÿòýêó (DLL)
+# ^ExecShell
+"Âûêàíàííå êàìàíäû àáàëîíê³: "
+# ^Exec
+"Âûêàíàííå: "
+# ^Extract
+"Âûìàííå: "
+# ^ErrorWriting
+"Âûìàííå: ïàìûëêà çàïiñó ôàéëà"
+# ^InvalidOpcode
+äûñòðûáóòû¢ ïàøêîäæàíû: êîä ïàìûëêi
+# ^NoOLE
+"Íÿìà OLE äëÿ: "
+# ^OutputFolder
+"Êàòàëîã óñòàíî¢êi: "
+# ^RemoveFolder
+"Âûäàëåííå ïàïê³: "
+# ^RenameOnReboot
+"Ïåðàíàçâà ïàñëÿ ïåðåçàãðóçêi êàìïóòàðà: "
+# ^Rename
+"Ïåðàíàçâà: "
+# ^Skipped
+"Ïðàïóø÷àíà: "
+# ^CopyDetails
+Êàïiðàâàöü çâåñòêi ¢ áóôåð àáìåíà
+# ^LogInstall
+Çàïiñâàöü ó ëîã ïðàöýñ óñòàíî¢êi
+# byte
+Á
+# kilo
+Ê
+# mega
+Ì
+# giga
+Ã
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Belarusian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Belarusian.nsh
new file mode 100644
index 000000000..68664b4c8
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Belarusian.nsh
@@ -0,0 +1,121 @@
+;Language: Belarusian (1059)
+;Translated by Sitnikov Vjacheslav [ glory_man@tut.by ]
+
+!insertmacro LANGFILE "Belarusian" "Byelorussian"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Âàñ âiòàå ìàéñòàð ¢ñòàíî¢ê³ $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ãýòàÿ ïðàãðàìà ¢ñòàëþå $(^NameDA) íà Âàø êàìïóòàð.$\r$\n$\r$\nÏåðàä ïà÷àòêàì óñòàíî¢êi ïðàïàíóåì çà÷ûí³öü óñå ïðàãðàìû, ÿê³ÿ âûêîíâàþööà ¢ ñàïðà¢äíû ìîìàíò. Ãýòà äàïàìîæà ïðàãðàìå ¢ñòàíî¢ê³ àáíàâ³öü ñ³ñòýìíûÿ ôàéëû áåç ïåðàçàãðóçê³ êàìïóòàðà.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Âàñ âiòàå ìàéñòàð âûäàëåííÿ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ãýòàÿ ïðàãðàìà âûäàë³öü $(^NameDA) ç Âàøàãà êàìïóòàðà.$\r$\n$\r$\nÏåðàä ïà÷àòêàì âûäàëåííÿ ïåðàêàíàéöåñÿ ¢ òûì, øòî ïðàãðàìà $(^NameDA) íå âûêîíâàåööà.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ëiöåíçiéíàå ïàãàäíåííå"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Êàë³ ëàñêà, ïðà÷ûòàéöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ ïåðàä ïà÷àòêàì óñòàíî¢êi $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Êàëi Âû ïðûìàåöå ¢ìîâû Ëiöåíçiéíàãà ïàãàäíåííÿ, íàö³ñí³öå êíîïêó $\"Çãîäçåí$\". Ãýòà íåàáõîäíà äëÿ ¢ñòàíî¢ê³ ïðàãðàìû."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Êàëi Âû ïðûìàåöå ¢ìîâû Ëiöåíçiéíàãà ïàãàäíåííÿ, óñòàëþéöå ñöÿæîê í³æýé. Ãýòà íåàáõîäíà äëÿ ¢ñòàíî¢ê³ ïðàãðàìû. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Êàëi Âû ïðûìàåöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ, âûëó÷ûöå ïåðøû âàðûÿíò ç ïðàïàíîâàíûõ í³æýé. Ãýòà íåàáõîäíà äëÿ ¢ñòàíî¢ê³ ïðàãðàìû. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "˳öýíç³éíàå ïàãàäíåííå"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Êàë³ ëàñêà, ïðà÷ûòàéöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ ïåðàä ïà÷àòêàì âûäàëåííÿ $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Êàë³ Âû ïðûìàåöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ, íàö³ñí³öå êíîïêó $\"Çãîäçåí$\". Ãýòà íåàáõîäíà äëÿ âûäàëåííÿ ïðàãðàìû. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Êàë³ Âû ïðûìàåöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ, óñòàëþéöå ñöÿæîê í³æýé. Ãýòà íåàáõîäíà äëÿ âûäàëåííÿ ïðàãðàìû. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Êàë³ Âû ïðûìàåöå ¢ìîâû ˳öýíç³éíàãà ïàãàäíåííÿ, âûëó÷ûöå ïåðøû âàðûÿíò ç ïðàïàíàâàíûõ í³æýé. Ãýòà íåàáõîäíà äëÿ âûäàëåííÿ ïðàãðàìû. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Âûêàðûñòî¢âàéöå êíîïêi $\"PageUp$\" i $\"PageDown$\" äëÿ ïåðàìÿø÷ýííÿ ïà òýêñöå."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Êàìïàíåíòû ïðàãðàìû, ÿêàÿ ¢ñòà븢âàåööà"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Âûçíà÷öå êàìïàíåíòû $(^NameDA), ÿê³ÿ Âû æàäàåöå ¢ñòàëÿâàöü."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Àï³ñàííå"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Êàìïàíåíòû ïðàãðàìû"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Âûçíà÷öå êàìïàíåíòû $(^NameDA), ÿê³ÿ Âû æàäàåöå âûäàë³öü."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Óñòàëþéöå êóðñîð ìûøû íà íàçâó êàìïàíåíòà, êàá ïðà÷ûòàöü ÿãî àï³ñàííå."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Óñòàëþéöå êóðñîð ìûøû íà íàçâó êàìïàíåíòà, êàá ïðà÷ûòàöü ÿãî àï³ñàííå."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Âûáàð ïàïê³ ¢ñòàíî¢ê³"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Âûçíà÷öå ïàïêó äëÿ ¢ñòàíî¢ê³ $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Âûáàð ïàïê³ äëÿ âûäàëåííÿ"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Âûçíà÷öå ïàïêó, ç ÿêîé ïàòðýáíà âûäàë³öü $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Êàï³ðàâàííå ôàéëà¢"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ïà÷àêàéöå, êàë³ ëàñêà, âûêîíâàåööà êàï³ðàâàííå ôàéëࢠ$(^NameDA) íà Âàø êàìïóòàð..."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Óñòàíî¢êà çàâåðøàíà"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Óñòàíî¢êà ïàñïÿõîâà çàâåðøàíà."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Óñòàíî¢êà ïåðàðâàíà"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Óñòàíî¢êà íå çàâåðøàíà."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Âûäàëåííå"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Ïà÷àêàéöå, êàë³ ëàñêà, âûêîíâàåööà âûäàëåííå ôàéëࢠ$(^NameDA) ç Âàøàãà êàìïóòàðà..."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Âûäàëåííå çàâåðøàíà"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Âûäàëåííå ïðàãðàìû ïàñïÿõîâà çàâåðøàíà."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Âûäàëåííå ïåðàðâàíà"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Âûäàëåííå âûêàíàíà íå ïî¢íàñöþ."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Çàêàí÷ýííå ìàéñòðà ¢ñòàíî¢ê³ $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Óñòàíî¢êà $(^NameDA) âûêàíàíà.$\r$\n$\r$\nÍàö³ñí³öå êíîïêó $\"Ãàòîâà$\" äëÿ âûéñöÿ ç ïðàãðàìû ¢ñòàíî¢ê³."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Êàá çàêîí÷ûöü óñòàíî¢êó $(^NameDA), íåàáõîäíà ïåðàçàãðóç³öü êàìïóòàð. Ö³ æàäàåöå Âû çðàá³öü ãýòà çàðàç?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Çàêàí÷ýííå ðàáîòû ìàéñòàðà âûäàëåííÿ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Ïðàãðàìà $(^NameDA) âûäàëåíà ç Âàøàãà êàìïóòàðà.$\r$\n$\r$\nÍàö³ñí³öå êíîïêó $\"Ãàòîâà$\"êàá âûéñö³ ç ïðàãðàìû âûäàëåííÿ."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Êàá ñêîí÷ûöü âûäàëåííå $(^NameDA), íåàáõîäíà ïåðàçàãðóç³öü êàìïóòàð. Ö³ æàäàåöå Âû çðàá³öü ãýòà çàðàç?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Òàê, ïåðàçàãðóç³öü êàìïóòàð çàðàç"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Íå, ïåðàçàãðóç³öü êàìïóòàð ïàçíåé"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Çàïóñö³öü $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Ïàêàçàöü ³íôàðìàöûþ àá ïðàãðàìå"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Ãàòîâà"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Ïàïêà ¢ ìåíþ $\"Ïóñê$\""
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Âûëó÷ûöå ïàïêó ¢ ìåíþ $\"Ïóñê$\" äëÿ ðàçìÿø÷ýííÿ ÿðëûêî¢ ïðàãðàìû."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Âûëó÷ûöå ïàïêó ¢ ìåíþ $\"Ïóñê$\", êóäû áóäóöü çìåø÷àíû ÿðëûê³ ïðàãðàìû. Âû òàêñàìà ìîæàöå àçíà÷ûöü ³íøàå ³ìÿ ïàïê³."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Íå ñòâàðàöü ÿðëûê³"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Âûäàëåííå $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Âûäàëåííå $(^NameDA) ç Âàøàãà êàìïóòàðà."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Âû ñàïðà¢äû æàäàåöå ñêàñàâàöü óñòàíî¢êó $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Âû ñàïðà¢äû æàäàåöå ñêàñàâàöü âûäàëåííå $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Bosnian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Bosnian.nlf
new file mode 100644
index 000000000..be2ba62d3
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Bosnian.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Language ID
+5146
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1250
+# RTL - anything else than RTL means LTR
+-
+# Translation by Salih CAVKIC, cavkic@skynet.be
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Instalacija
+# ^UninstallCaption
+$(^Name) Uklanjanje
+# ^LicenseSubCaption
+: Licencno pravo korištenja
+# ^ComponentsSubCaption
+: Opcije instalacije
+# ^DirSubCaption
+: Izbor mape za instalaciju
+# ^InstallingSubCaption
+: Instaliranje
+# ^CompletedSubCaption
+: Završeno
+# ^UnComponentsSubCaption
+: Opcije uklanjanja
+# ^UnDirSubCaption
+: Mapa uklanjanja
+# ^ConfirmSubCaption
+: Potvrda
+# ^UninstallingSubCaption
+: Uklanjanje
+# ^UnCompletedSubCaption
+: Završeno uklanjanje
+# ^BackBtn
+< &Nazad
+# ^NextBtn
+&Dalje >
+# ^AgreeBtn
+&Prihvatam
+# ^AcceptBtn
+&Prihvatam uvjete licencnog ugovora
+# ^DontAcceptBtn
+&Ne prihvatam uvjete licencnog ugovora
+# ^InstallBtn
+&Instaliraj
+# ^UninstallBtn
+&Ukloni
+# ^CancelBtn
+Odustani
+# ^CloseBtn
+&Zatvori
+# ^BrowseBtn
+&Pregledaj...
+# ^ShowDetailsBtn
+Prikaži &detalje
+# ^ClickNext
+Pritisnite dugme 'Dalje' za nastavak.
+# ^ClickInstall
+Pritisnite dugme 'Instaliraj' za poèetak instalacije.
+# ^ClickUninstall
+Pritisnite dugme 'Ukloni' za poèetak uklanjanja.
+# ^Name
+Ime
+# ^Completed
+Završeno
+# ^LicenseText
+Molim proèitajte licencu prije instaliranja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite 'Prihvatam'.
+# ^LicenseTextCB
+Molim proèitajte licencu prije instaliranja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, oznaèite donji kvadratiæ. $_CLICK
+# ^LicenseTextRB
+Molim proèitajte licencu prije instaliranja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite prvu donju opciju. $_CLICK
+# ^UnLicenseText
+Molim proèitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite 'Prihvatam'.
+# ^UnLicenseTextCB
+Molim proèitajte licencu prije uklanjanja programa $(^NameDA). Ako prihvatate sve uvjete ugovora, obilježite donji kvadratiæ. $_CLICK
+# ^UnLicenseTextRB
+Molim proèitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite prvu opciju ispod. $_CLICK
+# ^Custom
+Podešavanje
+# ^ComponentsText
+Oznaèite komponente koje želite instalirati. Instaliraju se samo oznaèene komponente. Uklonite oznaku sa onih koje ne želite instalirati. $_CLICK
+# ^ComponentsSubText1
+Izaberite tip instalacije:
+# ^ComponentsSubText2_NoInstTypes
+Odaberite komponente za instalaciju:
+# ^ComponentsSubText2
+Ili po izboru oznaèite komponente koje želite instalirati:
+# ^UnComponentsText
+Oznaèite komponente koje želite ukloniti. Uklonite oznaku sa onih koje ne želite ukloniti. $_CLICK
+# ^UnComponentsSubText1
+Izaberite tip uklanjanja:
+# ^UnComponentsSubText2_NoInstTypes
+Izaberite komponente za uklanjanje:
+# ^UnComponentsSubText2
+Ili po izboru odaberite komponente koje želite da uklonite:
+# ^DirText
+Program $(^NameDA) æe biti instaliran u sljedeæu mapu. Za instalaciju na neku drugu mapu odaberite 'Pregledaj...' i odaberite drugu mapu. $_CLICK
+# ^DirSubText
+Odredišna mapa
+# ^DirBrowseText
+Izaberite mapu u koju želite instalirati program $(^NameDA):
+# ^UnDirText
+Program $(^NameDA) æe biti uklonjen iz navedene mape. Za uklanjanje iz druge mape odaberite 'Pregledaj...' i oznaèite drugu mapu. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Izaberite mapu iz koje æete program $(^NameDA) ukloniti:
+# ^SpaceAvailable
+"Slobodno prostora na disku: "
+# ^SpaceRequired
+"Potrebno prostora na disku: "
+# ^UninstallingText
+Program $(^NameDA) æe biti uklonjen iz sljedeæe mape. $_CLICK
+# ^UninstallingSubText
+Uklanjanje iz:
+# ^FileError
+Greška prilikom otvaranja datoteke za upisivanje: \r\n\t"$0"\r\n\"Odustani\" za prekid instalacije,\r\n\"Ponovi\" za ponovni pokušaj upisivanja, ili\r\n\"Ignoriši\" za zanemarenje te datoteke
+# ^FileError_NoIgnore
+Greška prilikom otvaranja datoteke za upisivanje: \r\n\t"$0"\r\n\"Ponovi\" za ponovni pokušaj zapisivanja, ili\r\n\"Odustani\" za prekid instalacije
+# ^CantWrite
+"Nemoguæe upisati: "
+# ^CopyFailed
+Greška prilikom kopiranja
+# ^CopyTo
+"Kopiraj u "
+# ^Registering
+"Prijava: "
+# ^Unregistering
+"Odjava: "
+# ^SymbolNotFound
+"Nemoguæe naæi simbol: "
+# ^CouldNotLoad
+"Nemoguæe uèitavanje: "
+# ^CreateFolder
+"Napravi mapu: "
+# ^CreateShortcut
+"Napravi preèicu: "
+# ^CreatedUninstaller
+"Program za uklanjanje: "
+# ^Delete
+"Obriši datoteku: "
+# ^DeleteOnReboot
+"Obriši prilikom ponovnog pokretanja: "
+# ^ErrorCreatingShortcut
+"Greška prilikom kreiranja preèica: "
+# ^ErrorCreating
+"Greška prilikom kreiranja: "
+# ^ErrorDecompressing
+Greška prilikom otpakivanja podataka! Ošteæen instalacijski program?
+# ^ErrorRegistering
+Greška prilikom prijavljivanja DLLa
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Izvrši: "
+# ^Extract
+"Otpakuj: "
+# ^ErrorWriting
+"Otpakivanje: greška upisivanja u datoteku "
+# ^InvalidOpcode
+Ošteæena instalacijska datoteka: neispravna opkoda
+# ^NoOLE
+"Nema OLE za: "
+# ^OutputFolder
+"Izlazna mapa: "
+# ^RemoveFolder
+"Obriši mapu: "
+# ^RenameOnReboot
+"Preimenuj prilikom ponovnog startovanja: "
+# ^Rename
+"Preimenuj: "
+# ^Skipped
+"Preskoèeno: "
+# ^CopyDetails
+Kopiraj detalje na Klembord
+# ^LogInstall
+Logiraj zapisnik procesa instalacije
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
+
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Bosnian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Bosnian.nsh
new file mode 100644
index 000000000..dacfcf7ac
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Bosnian.nsh
@@ -0,0 +1,121 @@
+;Language: Bosnian (5146)
+;By Salih Èavkiæ, cavkic@skynet.be
+
+!insertmacro LANGFILE "Bosnian" "Bosanski"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Dobrodošli u program za instalaciju $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ovaj program æe instalirati $(^NameDA) na Vaš sistem. $\r$\n$\r$\nPreporuèujemo da neizostavno zatvorite sve druge otvorene programe prije nego što definitivno zapoènete sa instaliranjem. To æe omoguæiti bolju nadogradnju odreðenih sistemskih datoteka bez potrebe da Vaš raèunar ponovo startujete. Instaliranje programa možete prekinuti pritiskom na dugme 'Odustani'.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Dobrodošli u postupak uklanjanja programa $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ovaj æe Vas vodiè provesti kroz postupak uklanjanja programa $(^NameDA).$\r$\n$\r$\nPrije samog poèetka, molim zatvorite program $(^NameDA) ukoliko je sluèajno otvoren.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licencni ugovor"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Molim proèitajte licencni ugovor $(^NameDA) prije instalacije programa."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ako prihvatate uslove licence, odaberite 'Prihvatam' za nastavak. Morate prihvatiti licencu za instalaciju programa $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ako prihvatate uslove licence, oznaèite donji kvadratiæ. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ako prihvatate uslove licence, odaberite prvu donju opciju. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licencni ugovor o pravu korištenja"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Molim proèitajte licencu prije uklanjanja programa $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ako prihvatate uslove licence, odaberite 'Prihvatam' za nastavak. Morate prihvatiti licencu za uklanjanje programa $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ako prihvatate uslove licence, oznaèite donji kvadratiæ. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ako prihvatate uslove licence, odaberite prvu donju opciju. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pritisnite 'Page Down' na tastaturi za ostatak licence."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izbor komponenti za instalaciju"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Izaberite komponente programa $(^NameDA) koje želite instalirati."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izbor komponenti za uklanjanje"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Izaberite komponente programa $(^NameDA) koje želite ukloniti."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Postavite kursor od miša iznad komponente da biste vidjeli njezin opis."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Postavite kursor od miša iznad komponente da biste vidjeli njezin opis."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Odaberite odredište za instalaciju"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Odaberite mapu u koju želite instalirati program $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Izaberite polazište za uklanjanje"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Selektirajte mapu iz koje želite ukloniti program $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instaliranje"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Molim prièekajte na završetak instalacije programa $(^NameDA)."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Kraj instalacije"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalacija je u potpunosti uspješno završila."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalacija je prekinuta"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalacija nije završila uspješno."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uklanjanje"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Molim Vas prièekajte da vodiè završi uklanjanje $(^NameDA) programa."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Uklanjanje je završeno"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uklanjanje je u potpunosti završilo uspješno."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Uklanjanje je prekinuto"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uklanjanje nije završilo uspješno."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Dovršavanje instalacije programa $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) je instaliran na Vaše raèunar.$\r$\n$\r$\nPritisnite dugme 'Kraj' za završetak."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Raèunar treba ponovno startovati za dovršavanje instalacije programa $(^NameDA). Želite li to uèiniti sada?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Završetak uklanjanja programa $(^NameDA) sa Vašeg sistema."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) je uklonjen sa Vašeg raèunara.$\r$\n$\r$\nPritisnite dugme 'Kraj' za zatvaranje ovog prozora."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Vaš raèunar trebate ponovno startovati da dovršite uklanjanje programa $(^NameDA). Želite li da odmah sad ponovo startujete raèunar?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Startuj raèunar odmah sad"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ponovno æu pokrenuti raèunar kasnije"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Pokreni program $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Prikaži datoteku &Readme"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Kraj"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izbor mape u Start meniju"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Izaberite ime za programsku mapu unutar Start menija."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Izaberite jednu mapu u Start meniju u kojoj želite da se kreiraju preèice programa. Možete takoðer unijeti ime za novu mapu ili selektirati veæ postojeæu."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nemojte praviti preèice"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Uklanjanje programa $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Program $(^NameDA) æe biti uklonjen sa Vašeg raèunara."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Jeste li sigurni da želite prekinuti instalaciju programa $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Jeste li sigurni da želite prekinuti uklanjanje $(^Name) programa?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Breton.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Breton.nlf
new file mode 100644
index 000000000..fcfaf3323
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Breton.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1150
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by KAD-Korvigelloù an Drouizig (drouizig@drouizig.org)
+# ^Branding
+Reizhiad staliañ Nullsoft %s
+# ^SetupCaption
+Staliañ ha kefluniañ $(^Name)
+# ^UninstallCaption
+Distaliañ $(^Name)
+# ^LicenseSubCaption
+: Aotre arverañ
+# ^ComponentsSubCaption
+: Dibaboù staliañ
+# ^DirSubCaption
+: Kavlec'h staliañ
+# ^InstallingSubCaption
+: O staliañ ar restroù
+# ^CompletedSubCaption
+: Echu eo
+# ^UnComponentsSubCaption
+: Dibaboù distaliañ
+# ^UnDirSubCaption
+: Kavlec'h distaliañ
+# ^ConfirmSubCaption
+: Kadarnañ
+# ^UninstallingSubCaption
+: O tistaliañ ar restroù
+# ^UnCompletedSubCaption
+: Echu eo
+# ^BackBtn
+< &Kent
+# ^NextBtn
+&War-lerc'h >
+# ^AgreeBtn
+&A-du emaon
+# ^AcceptBtn
+&Degemer holl dermoù al lañvaz emglev
+# ^DontAcceptBtn
+&Chom hep degemer termoù al lañvaz emglev
+# ^InstallBtn
+&Staliañ
+# ^UninstallBtn
+&Distaliañ
+# ^CancelBtn
+Nullañ
+# ^CloseBtn
+&Serriñ
+# ^BrowseBtn
+F&urchal...
+# ^ShowDetailsBtn
+Muioc'h a &ditouroù
+# ^ClickNext
+Klikit war « War-lerc'h » evit mont war-raok.
+# ^ClickInstall
+Klikit war « Staliañ » evit kregiñ gant ar staliadur.
+# ^ClickUninstall
+Klikit war « Distaliañ » evit kregiñ gant an distaliadur.
+# ^Name
+Anv
+# ^Completed
+Echu eo
+# ^LicenseText
+Bezit aketus en ur lenn an aotre arverañ a-raok staliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war « A-du emaon ».
+# ^LicenseTextCB
+Bezit aketus en ur lenn an aotre arverañ a-raok staliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war al log a-zindan. $_CLICK
+# ^LicenseTextRB
+Bezit aketus en ur lenn an aotre arverañ a-raok staliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, dizuzit an dibab kentañ a-zindan. $_CLICK
+# ^UnLicenseText
+Bezit aketus en ur lenn an aotre arverañ a-raok distaliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war « A-du emaon ».
+# ^UnLicenseTextCB
+Bezit aketus en ur lenn an aotre arverañ a-raok distaliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war al log a-zindan. $_CLICK
+# ^UnLicenseTextRB
+Bezit aketus en ur lenn an aotre arverañ a-raok distaliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, diuzit an dibab kentañ a-zindan. $_CLICK
+# ^Custom
+Diouzh ho kiz
+# ^ComponentsText
+Dibabit an elfennoù a fell deoc'h staliañ pe diziuzit an elfennoù a fell deoc'h leuskel a-gostez. $_CLICK
+# ^ComponentsSubText1
+Dibabit pe seurt staliañ a vo :
+# ^ComponentsSubText2_NoInstTypes
+Dibabit an elfennoù da staliañ :
+# ^ComponentsSubText2
+Pe dibabit an elfennoù diret a fell deoc'h staliañ :
+# ^UnComponentsText
+Dibabit an elfennoù a fell deoc'h distaliañ pe diziuzit an elfennoù a fell deoc'h mirout. $_CLICK
+# ^UnComponentsSubText1
+Dibabit peseurt distaliañ a vo :
+# ^UnComponentsSubText2_NoInstTypes
+Dibabit an elfennoù da zistaliañ :
+# ^UnComponentsSubText2
+Pe dibabit an elfennoù diret a fell deoc'h distaliañ :
+# ^DirText
+Staliet e vo $(^NameDA) gant ar goulev-mañ er c'havlec'h da-heul. Mar fell deoc'h dibab ur c'havlec'h all, klikit war « Furchal » ha dibabit ur c'havlec'h all. $_CLICK
+# ^DirSubText
+Kavlec'h bukenn
+# ^DirBrowseText
+Dibabit ar c'havlec'h e vo diazezet $(^NameDA) ennañ :
+# ^UnDirText
+Distaliet e vo $(^NameDA) gant ar goulev-mañ adalek ar c'havlec'h da heul. Ma fell deoc'h distaliañ adalek ur c'havlec'h all, klikit war « Furchal » ha diuzit ur c'havlec'h all. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Diuzit ar c'havlec'h evit distaliañ $(^NameDA) adalek :
+# ^SpaceAvailable
+"Egor kantenn vak : "
+# ^SpaceRequired
+"Egor kantenn rekis : "
+# ^UninstallingText
+Distaliet e vo $(^NameDA) adalek ar c'havelec'h da-heul. $_CLICK
+# ^UninstallingSubText
+Distaliañ adalek :
+# ^FileError
+Fazi en ur zigeriñ ur restr evit skrivañ : \r\n\r\n$0\r\n\r\nKlikit war « Paouez » evit paouez gant ar staliañ,\r\n« Adober » evit eseañ en-dro, pe\r\n« Tremen » evit leuskel a-gostez ar restr-mañ.
+# ^FileError_NoIgnore
+Fazi en ur zigeriñ ur restr a-benn skrivañ : \r\n\r\n$0\r\n\r\nKlikit war « Adober » evit esaeañ en-dro, pe\r\nwar « Nullañ » evit paouez gant ar staliañ.
+# ^CantWrite
+"N'haller ket skrivañ : "
+# ^CopyFailed
+Kopiañ faziet
+# ^CopyTo
+"Kopiañ da "
+# ^Registering
+"Oc'h enskrivañ : "
+# ^Unregistering
+"O tienskrivañ : "
+# ^SymbolNotFound
+"N'haller ket kavout ur simbolenn : "
+# ^CouldNotLoad
+"N'haller ket kargañ : "
+# ^CreateFolder
+"Krouiñ kavlec'h : "
+# ^CreateShortcut
+"Krouiñ berradenn : "
+# ^CreatedUninstaller
+"Skoazeller distaliañ krouet : "
+# ^Delete
+"Dilemel restr : "
+# ^DeleteOnReboot
+"Dilemel en ur adloc'hañ : "
+# ^ErrorCreatingShortcut
+"Fazi en ur grouiñ berradenn : "
+# ^ErrorCreating
+"Fazi en ur grouiñ : "
+# ^ErrorDecompressing
+Fazi en ur ziwaskañ stlenn ! Skoazeller staliañ gwastet ?
+# ^ErrorRegistering
+Fazi en ur enskrivañ an DLL
+# ^ExecShell
+"ExecShell : "
+# ^Exec
+"Lañsañ : "
+# ^Extract
+"Eztennañ : "
+# ^ErrorWriting
+"Eztennañ : fazi en ur skrivañ restr "
+# ^InvalidOpcode
+Skoazeller staliañ gwastet : opcode direizh
+# ^NoOLE
+"OLE ebet evit : "
+# ^OutputFolder
+"Kavlec'h ec'hank : "
+# ^RemoveFolder
+"Dilemel ar c'havlec'h : "
+# ^RenameOnReboot
+"Adenvel pa vez adloc'het : "
+# ^Rename
+"Adenvel : "
+# ^Skipped
+"Laosket a-gostez: "
+# ^CopyDetails
+Kopiañ ar munudoù er golver
+# ^LogInstall
+Tresañ an argerzh staliañ
+# ^Byte
+E
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Breton.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Breton.nsh
new file mode 100644
index 000000000..79d3f817c
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Breton.nsh
@@ -0,0 +1,121 @@
+;Language: Breton (1150)
+;By KAD-Korvigelloù An Drouizig
+
+!insertmacro LANGFILE "Breton" "Brezhoneg"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Degemer mat e skoazeller staliañ $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Sturiet e viot gant ar skoazeller-mañ evit staliañ $(^NameDA).$\r$\n$\r$\nGwelloc'h eo serriñ pep arload oberiant er reizhiad a-raok mont pelloc'h gant ar skoazeller-mañ. Evel-se e c'heller nevesaat ar restroù reizhiad hep rankout adloc'hañ hoc'h urzhiataer.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Degemer mat er skoazeller distaliañ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Sturiet e viot gant ar skoazeller-mañ a-benn distaliañ $(^NameDA).$\r$\n$\r$\nEn em asurit n'eo ket lañset $(^NameDA) a-raok mont pelloc'h gant an distaliañ.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lañvaz emglev"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Bezit aketus en ur lenn pep term eus al lañvaz a-raok staliañ $(^NameDA), mar plij."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Mar degemerit pep term eus al lañvaz, klikit war « War-lerc'h ». Ret eo deoc'h degemer al lañvaz evit staliañ $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Mar degemerit pep term eus al lañvaz, klikit war al log a-zindan. Ret eo deoc'h degemer al lañvaz a-benn staliañ $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Mar degemerit pep term eus al lañvaz, diuzit an dibab kentañ a-zindan. Ret eo deoc'h degemer al lañvaz a-benn staliañ $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lañvaz emglev"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Trugarez da lenn al lañvaz a-raok distaliañ $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Mar degemerit pep term eus al lañvaz, klikit war « A-du emaon » evit kenderc'hel. Ret eo deoc'h degemer al lañvaz evit distaliañ $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Mar degemerit pep term eus al lañvaz, klikit war al log a-zindan. Ret eo deoc'h degemer al lañvaz evit distaliañ $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Mar degemerit pep term eus al lañvaz, dizuit an dibab kentañ a-zindan. Ret eo deoc'h degemer al lañvaz evit distaliañ $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pouezit war « Pajenn a-raok » evit lenn ar pajennoù eus al lañvaz da-heul."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Dibab elfennoù"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Dibabit pe elfenn(où) $(^NameDA) a fell deoc'h staliañ."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Deskrivadenn"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Dibabit elfennoù"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Dibabit pe elfenn(où) $(^NameDA) a fell deoc'h distaliañ."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Lakait ho logodenn a-zioc'h an elfenn evit gwelout he deskrivadenn."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Lakait ho logodenn a-zioc'h an elfenn evit gwelout he deskrivadenn."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Dibabit al lec'hiadur staliañ"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Dibabit ar c'havlec'h ma vo lakaet $(^NameDA) ennañ."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Dibabit al lec'hiadur distaliañ"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Dibabit ar c'havlec'h e vo dilamet $(^NameDA) dioutañ."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "O staliañ"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Gortozit mar plij, emañ $(^NameDA) o vezañ staliet."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Echu eo gant ar staliañ"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Kaset eo bet da benn mat ar staliañ."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Staliañ paouezet"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "N'eo ket bet kaset da benn mat ar staliañ."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "O tistaliañ"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Gortozit mar plij, emañ $(^NameDA) o vezañ distaliet."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Echu eo gant an distaliañ"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Gant berzh eo bet kaset da benn an distaliañ."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Distaliañ paouezet"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "N'eo ket bet kaset da benn mat an distaliañ."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Oc'h echuiñ staliañ $(^NameDA) gant ar skoazeller"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Staliet eo bet $(^NameDA) war hoc'h urzhiataer.$\r$\n$\r$\nKlikit war « Echuiñ » evit serriñ ar skoazeller-mañ."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Ret eo hoc'h urzhiataer bezañ adloc'het evit ma vez kaset da benn staliañ $(^NameDA). Ha fellout a ra deoc'h adloc'hañ diouzhtu ?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Oc'h echuiñ distaliañ $(^NameDA) gant ar skoazeller"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Distaliet eo bet $(^NameDA) diouzh hoc'h urzhiataer.$\r$\n$\r$\nKlikit war « Echuiñ » evit serriñ ar skoazeller-mañ."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Ret eo hoc'h urzhiataer bezañ adloc'het evit ma vez kaset da benn distaliañ $(^NameDA). Ha fellout a ra deoc'h adloc'hañ diouzhtu ?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Adloc'hañ diouzhtu"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Fellout a ra din adloc'hañ diwezatoc'h dre zorn"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Lañsañ $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Diskouez ar restr Malennit"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Echuiñ"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Diskouez kavlec'h al Lañser loc'hañ"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Dibabit ur c'havlec'h Lañser loc'hañ evit berradennoù $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Diuzit ar c'havlec'h Lañser loc'hañ e vo savet ennañ berradennoù ar goulevioù. Gallout a rit ingal reiñ un anv evit sevel ur c'havlec'h nevez."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Chom hep sevel berradennoù"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Distaliañ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Dilemel $(^NameDA) adalek hoc'h urzhiataer."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Ha sur oc'h e fell deoc'h kuitaat staliañ $(^Name) ?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ha sur oc'h e fell deoc'h kuitaat distaliañ $(^Name) ?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Bulgarian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Bulgarian.nlf
new file mode 100644
index 000000000..a99c3bd11
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Bulgarian.nlf
@@ -0,0 +1,194 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1026
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1251
+# RTL - anything else than RTL means LTR
+-
+# Translation by Asparouh Kalyandjiev
+# Updated v2 to v6 by Plamen Penkov
+# Updated by Êèðèë Êèðèëîâ (DumpeR)
+#
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Èíñòàëèðàíå íà $(^Name)
+# ^UninstallCaption
+Èçòðèâàíå íà $(^Name)
+#^LicenseSubCaption
+: Ëèöåíçèîííî ñïîðàçóìåíèå
+#^ComponentsSubCaption
+: Îïöèè çà èíñòàëèðàíå
+# ^DirSubCaption
+: Èíñòàëèðàíå â ïàïêà
+#^InstallingSubCaption
+: Èíñòàëèðàíå
+#^CompletedSubCaption
+: Çàâúðøâàíå
+# ^UnComponentsSubCaption
+: Îïöèè çà èçòðèâàíå
+# ^UnDirSubCaption
+: Èçòðèâàíå îò ïàïêà
+# ^ConfirmSubCaption
+: Ïîòâúðæäåíèå
+#^UninstallingSubCaption
+: Èçòðèâàíå
+#^UnCompletedSubCaption
+: Çàâúðøâàíå
+# ^BackBtn
+< &Íàçàä
+#^NextBtn
+Í&àïðåä >
+# ^AgreeBtn
+&Ñúãëàñåí
+# ^AcceptBtn
+&Ñúãëàñåí ñúì ñ óñëîâèÿòà íà Ëèöåíçèîííîòî ñïîðàçóìåíèå.
+# ^DontAcceptBtn
+&Íå ñúì ñúãëàñåí ñ óñëîâèÿòà íà Ëèöåíçèîííîòî ñïîðàçóìåíèå.
+# ^InstallBtn
+&Èíñòàëèðàé
+#^UninstallBtn
+&Èçòðèé
+# ^CancelBtn
+&Îòêàç
+#^CloseBtn
+&Çàòâîðè
+#^BrowseBtn
+Ï&ðåãëåä...
+#^ShowDetailsBtn
+&Äåòàéëè
+# ^ClickNext
+Íàòèñíåòå "Íàïðåä", çà äà ïðîäúëæèòå.
+# ^ClickInstall
+Íàòèñíåòå "Èíñòàëèðàé", çà äà çàïî÷íå èíñòàëèðàíåòî.
+# ^ClickUninstall
+Íàòèñíåòå "Èçòðèé", çà äà çàïî÷íå èçòðèâàíåòî.
+# ^Name
+Èìå
+#^Completed
+Êðàé
+# ^LicenseText
+Ìîëÿ ïðî÷åòåòå Ëèöåíçèîííîòî ñïîðàçóìåíèå ïðåäè äà èíñòàëèðàòå $(^NameDA). Àêî ïðèåìàòå âñè÷êè óñëîâèÿ íà ñïîðàçóìåíèåòî, íàòèñíåòå "Ñúãëàñåí".
+# ^LicenseTextCB
+Ìîëÿ ïðî÷åòåòå Ëèöåíçèîííîòî ñïîðàçóìåíèå ïðåäè äà èíñòàëèðàòå $(^NameDA). Àêî ïðèåìàòå âñè÷êè óñëîâèÿ íà ñïîðàçóìåíèåòî, ñëîæåòå îòìåòêà â ïîëåòî ïî-äîëó. $_CLICK
+# ^LicenseTextRB
+Ìîëÿ ïðî÷åòåòå Ëèöåíçèîííîòî ñïîðàçóìåíèå ïðåäè äà èíñòàëèðàòå $(^NameDA). Àêî ïðèåìàòå âñè÷êè óñëîâèÿ íà ñïîðàçóìåíèåòî, èçáåðåòå ïúðâàòà îïöèÿ ïî-äîëó. $_CLICK
+# ^UnLicenseText
+Ìîëÿ ïðî÷åòåòå Ëèöåíçèîííîòî ñïîðàçóìåíèå ïðåäè äà èçòðèåòå $(^NameDA). Àêî ïðèåìàòå âñè÷êè óñëîâèÿ íà ñïîðàçóìåíèåòî, íàòèñíåòå "Ñúãëàñåí".
+# ^UnLicenseTextCB
+Ìîëÿ ïðî÷åòåòå Ëèöåíçèîííîòî ñïîðàçóìåíèå ïðåäè äà èçòðèåòå $(^NameDA). Àêî ïðèåìàòå âñè÷êè óñëîâèÿ íà ñïîðàçóìåíèåòî, ñëîæåòå îòìåòêà â ïîëåòî ïî-äîëó. $_CLICK
+# ^UnLicenseTextRB
+Ìîëÿ ïðî÷åòåòå Ëèöåíçèîííîòî ñïîðàçóìåíèå ïðåäè äà èçòðèåòå $(^NameDA). Àêî ïðèåìàòå âñè÷êè óñëîâèÿ íà ñïîðàçóìåíèåòî, èçáåðåòå ïúðâàòà îïöèÿ ïî-äîëó. $_CLICK
+# ^Custom
+Èíñòàëèðàíå ïî èçáîð
+#^ComponentsText
+Èçáåðåòå êîìïîíåíòèòå, êîèòî èñêàòå äà áúäàò èíñòàëèðàíè. $_CLICK
+#^ComponentsSubText1
+Èçáåðåòå òèï èíñòàëèðàíå:
+#^ComponentsSubText2_NoInstTypes
+Èçáåðåòå êîìïîíåíòè:
+#^ComponentsSubText2
+Èëè èçáåðåòå êîìïîíåíòèòå, êîèòî èñêàòå äà áúäàò èíñòàëèðàíè:
+# ^UnComponentsText
+Ñëîæåòå îòìåòêà ïðåä êîìïîíåíòèòå, êîèòî èñêàòå äà èçòðèåòå, à òåçè êîèòî íå èñêàòå äà èçòðèåòå îñòàâåòå áåç îòìåòêà. $_CLICK
+# ^UnComponentsSubText1
+Èçáåðåòå òèïà íà èçòðèâàíå:
+# ^UnComponentsSubText2_NoInstTypes
+Èçáåðåòå êîìïîíåíòèòå çà èçòðèâàíå:
+# ^UnComponentsSubText2
+Èëè, èçáåðåòå äîïúëíèòåëíè êîìïîíåíòè çà èçòðèâàíå:
+# ^DirText
+Ïðîãðàìàòà ùå èíñòàëèðà $(^NameDA) â ïîñî÷åíàòà ïàïêà. Çà äà èíñòàëèðàòå â äðóãà ïàïêà, íàòèñíåòå "Ïðåãëåä" è èçáåðåòå äðóãà ïàïêà. $_CLICK
+# ^DirSubText
+Öåëåâà ïàïêà
+# ^DirBrowseText
+Èçáåðåòå ïàïêà, â êîÿòî äà ñå èíñòàëèðà $(^NameDA):
+# ^UnDirText
+Ïðîãðàìàòà ùå èçòðèå $(^NameDA) îò ñëåäíàòà ïàïêà. Çà äà èçòðèåòå îò äðóãà ïàïêà, íàòèñíåòå "Ïðåãëåä" è èçáåðåòå äðóãà ïàïêà. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Èçáåðåòå ïàïêàòà îò êîÿòî äà ñå èçòðèå $(^NameDA):
+# ^SpaceAvailable
+"Ñâîáîäíî ïðîñòðàíñòâî: "
+#^SpaceRequired
+"Íåîáõîäèìî ïðîñòðàíñòâî: "
+# ^UninstallingText
+$(^NameDA) ùå áúäå èçòðèòà îò ñëåäíàòà ïàïêà. $_CLICK
+# ^UninstallingSubText
+Èçòðèâàíå îò:
+# ^FileError
+Ãðåøêà ïðè îòâàðÿíå íà ôàéëà çà çàïèñ: \r\n\t"$0"\r\nÍàòèñíåòå "Ïðåêðàòè", çà äà ïðåêðàòèòå èíñòàëèðàíåòî, "Ïîâòîðè", çà äà îïèòàòå îòíîâî èëè "Èãíîðèðàé", çà äà ïðîïóñíåòå òîçè ôàéë
+# ^FileError_NoIgnore
+Ãðåøêà ïðè îòâàðÿíå íà ôàéëà çà çàïèñ: \r\n\t"$0"\r\nÍàòèñíåòå "Ïîâòîðè", çà äà îïèòàòå îòíîâî èëè "Ïðåêðàòè", çà äà ïðåêðàòèòå èíñòàëèðàíåòî.
+# ^CantWrite
+"Íåóñïåøíî çàïèñâàíå íà: "
+#^CopyFailed
+Êîïèðàíåòî íåóñïåøíî
+# ^CopyTo
+"Êîïèðàíå íà "
+# ^Registering
+"Ðåãèñòðèðàíå íà: "
+# ^Unregistering
+"Äåðåãèñòðèðàíå íà: "
+#^SymbolNotFound
+"Ñèìâîëúò íå å íàìåðåí: "
+# ^CouldNotLoad
+"Íåóñïåøíî çàðåæäàíå íà: "
+# ^CreateFolder
+"Ñúçäàâàíå íà ïàïêà: "
+# ^CreateShortcut
+"Ñúçäàâàíå íà ïðÿê ïúò: "
+#^CreatedUninstaller
+"Ñúçäàâàíå íà ïðîãðàìà çà èçòðèâàíå: "
+# ^Delete
+"Èçòðèâàíå íà: "
+#^DeleteOnReboot
+"Èçòðèâàíå ñëåä ðåñòàðò: "
+#^ErrorCreatingShortcut
+"Ãðåøêà ïðè ñúçäàâàíå íà ïðåêèÿ ïúò: "
+#^ErrorCreating
+"Ãðåøêà ïðè ñúçäàâàíå íà: "
+# ^ErrorDecompressing
+Ãðåøêà ïðè äåêîìïðåñèðàíå íà äàííèòå! Âåðîÿòíî èíñòàëàöèîííèÿ ïàêåò å ïîâðåäåí.
+# ^ErrorRegistering
+Ãðåøêà ïðè ðåãèñòðèðàíå íà DLL
+#^ExecShell
+"ExecShell: "
+#^Exec
+"Èçïúëíåíèå íà: "
+#^Extract
+"Èçâëè÷àíå íà: "
+#^ErrorWriting
+"Èçâëè÷àíå íà: ãðåøêà ïðè çàïèñ âúâ ôàéë "
+#^InvalidOpcode
+Ïàêåòà å ïîâðåäåí: ãðåøåí êîä íà îïåðàöèÿ
+# ^NoOLE
+"Íÿìà OLE çà: "
+#^OutputFolder
+"Èíñòàëèðàíå â ïàïêà: "
+#^RemoveFolder
+"Èçòðèâàíå íà ïàïêà: "
+#^RenameOnReboot
+"Ïðåèìåíóâàíå ïðè ðåñòàðò: "
+# ^Rename
+"Ïðåèìåíóâàíå íà: "
+#^Skipped
+"Ïðîïóñêàíå íà: "
+# ^CopyDetails
+Êîïèðàíå íà äàííèòå â áóôåðà
+# ^LogInstall
+Çàïèñâàíå íà îò÷åò çà èíñòàëèðàíåòî
+# ^Byte
+Á
+# ^Kilo
+ Ê
+# ^Mega
+ Ì
+# ^Giga
+ Ã
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Bulgarian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Bulgarian.nsh
new file mode 100644
index 000000000..508b72f1f
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Bulgarian.nsh
@@ -0,0 +1,124 @@
+;Language: Bulgarian (1026)
+;Translated by Asparouh Kalyandjiev [acnapyx@sbline.net]
+;Review and update from v1.63 to v1.68 by Plamen Penkov [plamen71@hotmail.com]
+;Updated by Êèðèë Êèðèëîâ (DumpeR) [dumper@data.bg]
+;
+
+!insertmacro LANGFILE "Bulgarian" "Bulgarian"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Äîáðå äîøëè â Ñúâåòíèêà çà èíñòàëèðàíå íà $(^NameDA)!"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Òîé ùå èíñòàëèðà $(^NameDA) íà âàøèÿ êîìïþòúð.$\r$\n$\r$\nÏðåïîðú÷âà ñå äà çàòâîðèòå âñè÷êè äðóãè ïðèëîæåíèÿ, ïðåäè äà ïðîäúëæèòå. Òîâà ùå ïîçâîëè íà ïðîãðàìàòà äà îáíîâè íÿêîè ñèñòåìíè ôàéëîâå, áåç äà ñå ðåñòàðòèðà êîìïþòúðà.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Äîáðå äîøëè â Ñúâåòíèêà çà èçòðèâàíå íà $(^NameDA)!"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Òîé ùå âè ïîìîãíå äà èçòðèåòå $(^NameDA) îò âàøèÿ êîìïþòúð.$\r$\n$\r$\nÏðåäè äà ïðîäúëæèòå, óâåðåòå ñå ÷å $(^NameDA) íå å ñòàðòèðàíà â ìîìåíòà.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ëèöåíçèîííî ñïîðàçóìåíèå"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ìîëÿ çàïîçíàéòå ñå Ëèöåíçèîííîòî ñïîðàçóìåíèå ïðåäè äà ïðîäúëæèòå."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Àêî ïðèåìàòå óñëîâèÿòà íà ñïîðàçóìåíèåòî, íàòèñíåòå $\"Ñúãëàñåí$\", çà äà ïðîäúëæèòå. Òðÿáâà äà ïðèåìåòå ñïîðàçóìåíèåòî, çà äà èíñòàëèðàòå $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Àêî ïðèåìàòå óñëîâèÿòà íà ñïîðàçóìåíèåòî, ñëîæåòå îòìåòêà â ïîëåòî ïî-äîëó. Òðÿáâà äà ïðèåìåòå ñïîðàçóìåíèåòî, çà äà èíñòàëèðàòå $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Àêî ïðèåìàòå óñëîâèÿòà íà ñïîðàçóìåíèåòî, èçáåðåòå ïúðâàòà îïöèÿ ïî-äîëó. Òðÿáâà äà ïðèåìåòå ñïîðàçóìåíèåòî, çà äà èíñòàëèðàòå $(^NameDA) $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ëèöåíçèîííî ñïîðàçóìåíèå"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ìîëÿ çàïîçíàéòå ñå ëèöåíçèîííèòå óñëîâèÿ ïðåäè äà èçòðèåòå $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Àêî ïðèåìàòå óñëîâèÿòà íà ñïîðàçóìåíèòî, íàòèñíåòå $\"Ñúãëàñåí$\" çà äà ïðîäúëæèòå. Òðÿáâà äà ïðèåìåòå ñïîðàçóìåíèåòî, çà äà èçòðèåòå $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Àêî ïðèåìàòå óñëîâèÿòà íà ñïîðàçóìåíèåòî, ñëîæåòå îòìåòêà â ïîëåòî ïî-äîëó. Òðÿáâà äà ïðèåìåòå ñïîðàçóìåíèåòî, çà äà èçòðèåòå $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Àêî ïðèåìàòå óñëîâèÿòà íà ñïîðàçóìåíèòî, èçáåðåòå ïúðâàòà îïöèÿ ïî-äîëó. Òðÿáâà äà ïðèåìåòå ñïîðàçóìåíèåòî, çà äà èçòðèåòå $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Íàòèñíåòå êëàâèøà $\"Page Down$\", çà äà âèäèòå îñòàíàëàòà ÷àñò îò ñïîðàçóìåíèåòî."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Èçáîð íà êîìïîíåíòè"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Èçáåðåòå êîè êîìïîíåíòè íà $(^NameDA) èñêàòå äà èíñòàëèðàòå."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Îïèñàíèå"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Èçáîð íà êîìïîíåíòè"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Èçáåðåòå êîè êîìïîíåíòè íà $(^NameDA) èñêàòå äà èçòðèåòå."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ïðåìèíåòå ñ ìèøêàòà íàä îïðåäåëåí êîìïîíåíò, çà äà âèäèòå îïèñàíèåòî ìó."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ïðåìèíåòå ñ ìèøêàòà íàä îïðåäåëåí êîìïîíåíò, çà äà âèäèòå îïèñàíèåòî ìó."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Èçáîð íà ïàïêà çà èíñòàëèðàíå"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Èçáåðåòå ïàïêàòà, â êîÿòî äà ñå èíñòàëèðà $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Èçáîð íà ïàïêà çà èçòðèâàíå"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Èçáåðåòå ïàïêàòà, îò êîÿòî äà ñå èçòðèå $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Èíñòàëèðàíå"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Èç÷àêàéòå, èíñòàëèðàò ñå ôàéëîâåòå íà $(^NameDA)..."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Èíñòàëèðàíåòî çàâúðøè."
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Èíñòàëèðàíåòî çàâúðøè óñïåøíî."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Èíñòàëèðàíåòî ïðåêðàòåíî."
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Èíñòàëèðàíåòî íå çàâúðøè óñïåøíî."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Èçòðèâàíå"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Èç÷àêàéòå, èçòðèâàò ñå ôàéëîâåòå íà $(^NameDA)..."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Êðàé"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Èçòðèâàíåòî çàâúðøè óñïåøíî."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Èçòðèâàíåòî ïðåêðàòåíî."
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Èçòðèâàíåòî íå çàâúðøè íàïúëíî."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Ïðèêëþ÷âàíå íà Ñúâåòíèêà çà èíñòàëèðàíå íà $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Èíñòàëèðàíåòî íà $(^NameDA) å çàâúðøåíî.$\r$\n$\r$\nÍàòèñíåòå áóòîíà $\"Êðàé$\", çà äà çàòâîðèòå Ñúâåòíèêà."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Êîìïþòúðúò òðÿáâà äà áúäå ðåñòàðòèðàí, çà äà çàâúðøè èíñòàëèðàíåòî íà $(^NameDA). Èñêàòå ëè äà ðåñòàðòèðàòå ñåãà?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Ïðèêëþ÷âàíå íà Ñúâåòíèêà çà èçòðèâàíå íà $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Ïðîãðàìàòà $(^NameDA) áåøå èçòðèòà îò âàøèÿ êîìïþòúð.$\r$\n$\r$\nÍàòèñíåòå $\"Êðàé$\" çà äà çàòâîðèòå òîçè Ñúâåòíèê."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Êîìïþòúðúò âè òðÿáâà äà ñå ðåñòàðòèðà, çà äà ïðèêëþ÷è óñïåøíî èçòðèâàíåòî íà $(^NameDA). Èñêàòå ëè äà ðåñòàðòèðàòå ñåãà?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Äà, ðåñòàðòèðàé ñåãà"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Íå, ùå ðåñòàðòèðàì ïî-êúñíî"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "Ñòàðòèðàé $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Ïîêàæè ôàéëà $\"ReadMe$\""
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Êðàé"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Èçáîð íà ïàïêà â ìåíþòî $\"Ñòàðò$\""
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Èçáåðåòå ïàïêà â ìåíþòî $\"Ñòàðò$\" çà ïðåêè ïúòèùà êúì ïðîãðàìàòà."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Èçáåðåòå ïàïêà â ìåíþòî $\"Ñòàðò$\", â êîÿòî èñêàòå äà ñúçäàäåòå ïðåêè ïúòèùà êúì ïðîãðàìàòà. Ìîæåòå ñúùî òàêà äà âúâåäåòå èìå, çà äà ñúçäàäåòå íîâà ïàïêà."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Íå ñúçäàâàé ïðåêè ïúòèùà"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Èçòðèâàíå íà $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Èçòðèâàíå íà $(^NameDA) îò âàøèÿ êîìïþòúð."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Ñèãóðíè ëè ñòå, ÷å èñêàòå äà ïðåêðàòèòå èíñòàëèðàíåòî íà $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ñèãóðíè ëè ñòå, ÷å èñêàòå äà ïðåêðàòèòå èçòðèâàíåòî íà $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Catalan.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Catalan.nlf
new file mode 100644
index 000000000..1c41751c4
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Catalan.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1027
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by falanko
+# Corrections by Toni Hermoso Pulido
+# ^Branding
+Sistema d'instal·lació de Nullsoft %s
+# ^SetupCaption
+Instal·lació de l'aplicació $(^Name)
+# ^UninstallCaption
+Desinstal·lació de l'aplicació $(^Name)
+# ^LicenseSubCaption
+: Acord de llicència
+# ^ComponentsSubCaption
+: Opcions d'instal·lació
+# ^DirSubCaption
+: Carpeta d'instal·lació
+# ^InstallingSubCaption
+: S'està instal·lant
+# ^CompletedSubCaption
+: S'ha acabat
+# ^UnComponentsSubCaption
+: Opcions de desinstal·lació
+# ^UnDirSubCaption
+: Carpeta de desinstal·lació
+# ^ConfirmSubCaption
+: Confirmació
+# ^UninstallingSubCaption
+: S'està desinstal·lant
+# ^UnCompletedSubCaption
+: No s'ha acabat
+# ^BackBtn
+< En&rere
+# ^NextBtn
+En&davant >
+# ^AgreeBtn
+Hi estic d'a&cord
+# ^AcceptBtn
+&Accepto els termes de l'acord de llicència
+# ^DontAcceptBtn
+&No accepto els termes de l'acord de llicència
+# ^InstallBtn
+&Instal·la
+# ^UninstallBtn
+&Desinstal·la
+# ^CancelBtn
+&Cancel·la
+# ^CloseBtn
+&Tanca
+# ^BrowseBtn
+&Navega...
+# ^ShowDetailsBtn
+&Mostra els detalls
+# ^ClickNext
+Feu clic a Endavant per a continuar.
+# ^ClickInstall
+Feu clic a Instal·la per a iniciar la instal·lació.
+# ^ClickUninstall
+Feu clic a Desinstal·la per a iniciar la desinstal·lació.
+# ^Name
+Nom
+# ^Completed
+S'ha acabat
+# ^LicenseText
+Reviseu l'acord de llicència abans d'instal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, feu clic a Hi estic d'acord.
+# ^LicenseTextCB
+Reviseu l'acord de llicència abans d'instal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, activeu la casella de sota. $_CLICK
+# ^LicesnseTextRB
+Reviseu l'acord de llicència abans d'instal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, seleccioneu la primera opció de sota. $_CLICK
+# ^UnLicenseText
+Reviseu l'acord de llicència abans de desinstal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, feu clic a Hi estic d'acord.
+# ^UnLicenseTextCB
+Reviseu l'acord de llicència abans de desinstal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, activeu la la casella de sota. $_CLICK
+# ^UnLicesnseTextRB
+Reviseu l'acord de llicència abans de desinstal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, seleccioneu la primera opció de sota. $_CLICK
+# ^Custom
+Personalitzada
+# ^ComponentsText
+Activeu els components que voleu instal·lar i desactiveu els que no. $_CLICK
+# ^ComponentsSubText1
+Seleccioneu el tipus d'instal·lació:
+# ^ComponentsSubText2_NoInstTypes
+Seleccioneu els components per instal·lar:
+# ^ComponentsSubText2
+O bé, seleccioneu els components opcionals que desitgéssiu instal·lar:
+# ^UnComponentsText
+Activeu els components que voleu desinstal·lar i desactiveu els que no. $_CLICK
+# ^UnComponentsSubText1
+Seleccioneu el tipus de desinstal·lació:
+# ^UnComponentsSubText2_NoInstTypes
+Seleccioneu els components per desinstal·lar:
+# ^UnComponentsSubText2
+O bé, seleccioneu els components opcionals per desinstal·lar:
+# ^DirText
+El programa d'instal·lació instal·larà l'aplicació $(^NameDA) en la següent carpeta. Per a instal·lar-lo en una carpeta diferent, feu clic a Navega i seleccioneu-ne una altra. $_CLICK
+# ^DirSubText
+Carpeta de destinació
+# ^DirBrowseText
+Seleccioneu la carpeta on s'instal·larà l'aplicació $(^NameDA):
+# ^UnDirText
+El programa d'instal·lació desinstal·larà l'aplicació $(^NameDA) de la següent carpeta. Per a desinstal·lar-lo d'una carpeta diferent, feu clic a Navega i seleccioneu-ne una altra. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Seleccioneu la carpeta des d'on es desinstal·larà l'aplicació $(^NameDA):
+# ^SpaceAvailable
+"Espai lliure: "
+# ^SpaceRequired
+"Espai necessari: "
+# ^UninstallingText
+Es desinstal·larà l'aplicació $(^NameDA) de la següent carpeta. $_CLICK
+# ^UninstallingSubTex
+S'està desinstal·lant de:
+# ^FileError
+S'ha produït un error en obrir el fitxer en mode d'escriptura: \r\n\t"$0"\r\nFeu clic a Abandona per a aturar la instal·lació,\r\nReintenta per a tornar-ho a provar, o\r\Ignora per a ometre aquest fitxer.
+# ^FileError_NoIgnore
+S'ha produït un error en obrir el fitxer en mode d'escriptura: \r\n\t"$0"\r\nFeu clic a Reintenta per a tornar-ho a provar, o\r\Cancel·la per a aturar la instal·lació.
+# ^CantWrite
+"No s'ha pogut escriure: "
+# ^CopyFailed
+Ha fallat la còpia
+# ^CopyTo
+"Copia a "
+# ^Registering
+"S'esta registrant:"
+# ^Unregistering
+"S'està suprimint el registre: "
+# ^SymbolNotFound
+"No s'ha trobat el símbol: "
+# ^CouldNotLoad
+"No s'ha pogut carregar: "
+# ^CreateFolder
+"Crea la carpeta: "
+# ^CreateShortcut
+"Crea la drecera: "
+# ^CreatedUninstaller
+"S'ha creat el desinstal·lador: "
+# ^Delete
+"S'ha suprimit el fitxer: "
+# ^DeleteOnReboot
+"Suprimeix en reiniciar: "
+# ^ErrorCreatingShortcut
+"S'ha produït un error en crear la drecera: "
+# ^ErrorCreating
+S'ha produït un error en crear:
+# ^ErrorDecompressing
+S'ha produït un error en descomprimir les dades! L'instal·lador està corrupte?
+# ^ErrorRegistering
+S'ha produït un error en registrar una DLL
+# ^ExecShell
+"Executa l'ordre: "
+# ^Exec
+"Executa:"
+# ^Extract
+"Extreu: "
+# ^ErrorWriting
+"Extreu: s'ha produït un error en escriure el fitxer "
+# ^InvalidOpcode
+L'instal·lador està corrupte: el codi d'operació no és vàlid
+# ^NoOLE
+"No hi ha OLE per a: "
+# ^OutputFolder
+"Carpeta de sortida: "
+# ^RemoveFolder
+"Suprimeix la carpeta: "
+# ^RenameOnReboot
+"Reanomena en reiniciar: "
+# ^Rename
+"Reanomena: "
+# ^Skipped
+"S'ha omès: "
+# ^CopyDetails
+Copia els detalls al porta-retalls
+# ^LogInstall
+Registra el procés d'instal·lació
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Catalan.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Catalan.nsh
new file mode 100644
index 000000000..2a07114ff
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Catalan.nsh
@@ -0,0 +1,121 @@
+;Language: Catalan (1027)
+;By falanko, corrections by Toni Hermoso Pulido
+
+!insertmacro LANGFILE "Catalan" "Català"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Benvinguts a l'auxiliar d'instal·lació de l'aplicació $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Aquest auxiliar us guiarà durant el procés d'instal·lació de l'aplicació $(^NameDA).$\r$\n$\r$\nEs recomana tancar la resta d'aplicacions abans de començar la instal·lació. Això permetrà al programa d'instal·ació actualitzar fitxers del sistema rellevants sense haver de reiniciar l'ordinador.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Benvinguts a l'auxiliar de desinstal·lació de l'aplicació $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Aquest auxiliar us guiarà a través de la desinstal·lació de l'aplicació $(^NameDA).$\r$\n\rAbans de començar la desinstal·lació, assegureu-vos que l'aplicació $(^NameDA) no s'està executant.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acord de Llicència"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Reviseu els termes de la llicència abans d'instal·lar l'aplicació $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si accepteu tots els termes de l'acord, premeu Hi estic d'acord per a continuar. Heu d'acceptar l'acord per a poder instal·lar l'aplicació $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si accepteu tots els termes de l'acord, activeu la casella de sota. Heu d'acceptar l'acord per poder instal·lar l'aplicació $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si accepteu tots els termes de l'acord, seleccioneu la primera opció de sota. Heu d'acceptar l'acord per a poder instal·lar $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acord de llicència"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Reviseu els termes de la llicència abans de desinstal·lar l'aplicació $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si accepteu tots els termes de l'acord, premeu Hi estic d'Acord per a continuar. Heu d'acceptar l'acord per a poder desinstal·lar l'aplicació $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si accepteu tots els termes de l'acord, activeu la casella de sota. Heu d'acceptar l'acord per a poder desinstal·lar l'aplicació $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si accepteu tots els termes de l'acord, seleccioneu la primera opció de sota. Heu d'acceptar l'acord per a poder desinstal·lar l'aplicació $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Premeu AvPàg per a veure la resta de l'acord."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selecció de components"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleccioneu quines característiques de l'aplicació $(^NameDA) desitgeu instal·lar."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descripció"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selecció de components"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleccioneu quines característiques de l'aplicació $(^NameDA) desitgeu desinstal·lar."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Situeu el ratolí damunt d'un component per a veure'n la descripció."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Situeu el ratolí damunt d'un component per a veure'n la descripció."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Trieu una ubicació d'instal·lació"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Trieu la carpeta on instal·lar-hi l'aplicació $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Trieu la ubicació de desinstal·lació"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Trieu la carpeta d'on desinstal·lar l'aplicació $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "S'està instal·lant"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Si us plau, espereu mentre l'aplicació $(^NameDA) s'instal·la."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "S'ha acabat la instal·lació"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instal·lació ha acabat correctament."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "S'ha abandonat la instal·lació"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instal·lació no ha acabat correctament."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "S'està desinstal·lant"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Si us plau, espereu mentre l'aplicació $(^NameDA) es desinstal·la."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "S'ha acabat la desinstal·lació"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La desinstal·lació s'ha realitzat correctament."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "S'ha abandonat la desinstal·lació"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La desinstal·lació no ha acabat correctament."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "S'està acabant l'auxiliar d'instal·lació de l'aplicació $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "L'aplicació $(^NameDA) s'ha instal·lat a l'ordinador.$\r$\n$\r$\nFeu clic a Finalitza per a tancar aquest auxiliar."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Cal reiniciar l'ordinador perquè pugui acabar-se la instal·lació de l'aplicació $(^NameDA). Voleu reiniciar-lo ara?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "S'està acabant l'auxiliar de desinstal·lació de l'aplicació $(^NameDA)."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "L'aplicació $(^NameDA) s'ha desinstal·lat de l'ordinador.$\r$\n$\r$\nFeu clic a Finalitza per a tancar aquest auxiliar."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Cal reiniciar l'ordinador perquè pugui acabar-se la desinstal·lació de l'aplicació $(^NameDA). Voleu reiniciar-lo ara?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reinicia ara"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Reinicia més tard manualment"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "Executa l'aplicació $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostra el Llegeix-me"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Finalitza"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Tria la carpeta del menú Inicia"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Tria una carpeta del menú Inicia per a les dreceres de l'aplicació $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccioneu la carpeta del Menú Inicia en la que hi vulgueu crear les dreceres del programa. Podeu introduir-hi un altre nom si voleu crear una carpeta nova."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "No creïs les dreceres"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstal·la l'aplicació $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Suprimeix l'aplicació $(^NameDA) de l'ordinador."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Esteu segur que voleu sortir del programa d'instal·lació de l'aplicació $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Esteu segur que voleu sortir del programa de desinstal·lació de l'aplicació $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Croatian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Croatian.nlf
new file mode 100644
index 000000000..b70ca3658
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Croatian.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1050
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1250
+# RTL - anything else than RTL means LTR
+-
+# Translation by Igor Ostriz
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Instalacija
+# ^UninstallCaption
+$(^Name) Uklanjanje
+# ^LicenseSubCaption
+: Licenenèni uvjeti
+# ^ComponentsSubCaption
+: Instalacijske opcije
+# ^DirSubCaption
+: Instalacijska mapa
+# ^InstallingSubCaption
+: Instaliranje
+# ^CompletedSubCaption
+: Završeno
+# ^UnComponentsSubCaption
+: Opcije uklanjanja
+# ^UnDirSubCaption
+: Mapa uklanjanja
+# ^ConfirmSubCaption
+: Potvrda
+# ^UninstallingSubCaption
+: Uklanjanje
+# ^UnCompletedSubCaption
+: Završeno
+# ^BackBtn
+< &Nazad
+# ^NextBtn
+&Dalje >
+# ^AgreeBtn
+&Prihvaæam
+# ^AcceptBtn
+&Prihvaæam uvjete licenènog ugovora
+# ^DontAcceptBtn
+&Ne prihvaæam uvjete licenènog ugovora
+# ^InstallBtn
+&Instaliraj
+# ^UninstallBtn
+&Ukloni
+# ^CancelBtn
+Odustani
+# ^CloseBtn
+&Zatvori
+# ^BrowseBtn
+&Pregledaj...
+# ^ShowDetailsBtn
+Prikaži &detalje
+# ^ClickNext
+Za nastavak odaberite 'Dalje'.
+# ^ClickInstall
+Za poèetak instalacije odaberite 'Instaliraj'.
+# ^ClickUninstall
+Za poèetak uklanjanja odaberite 'Ukloni'.
+# ^Name
+Ime
+# ^Completed
+Završeno
+# ^LicenseText
+Molim proèitajte licencu prije instalacije programa $(^NameDA). Ukoliko prihvaæate sve uvjete ugovora, odaberite 'Prihvaæam'.
+# ^LicenseTextCB
+Molim proèitajte licencu prije instalacije programa $(^NameDA). Ukoliko prihvaæate sve uvjete ugovora, oznaèite donji kvadratiæ. $_CLICK
+# ^LicenseTextRB
+Molim proèitajte licencu prije instalacije programa $(^NameDA). Ukoliko prihvaæate sve uvjete ugovora, odaberite prvu donju opciju. $_CLICK
+# ^UnLicenseText
+Molim proèitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvaæate sve uvjete ugovora, odaberite 'Prihvaæam'.
+# ^UnLicenseTextCB
+Molim proèitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvaæate sve uvjete ugovora, oznaèite donji kvadratiæ. $_CLICK
+# ^UnLicenseTextRB
+Molim proèitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvaæate sve uvjete ugovora, odaberite prvu donju opciju. $_CLICK
+# ^Custom
+Posebna
+# ^ComponentsText
+Oznaèite komponente koje želite instalirati i uklonite oznaku s onih koje ne želite instalirati. $_CLICK
+# ^ComponentsSubText1
+Izaberite tip instalacije:
+# ^ComponentsSubText2_NoInstTypes
+Odaberite komponente za instalaciju:
+# ^ComponentsSubText2
+Ili po izboru oznaèite komponente koje želite instalirati:
+# ^UnComponentsText
+Oznaèite komponente koje želite ukloniti i uklonite oznaku s onih koje ne želite ukloniti. $_CLICK
+# ^UnComponentsSubText1
+Izaberite tip uklanjanja:
+# ^UnComponentsSubText2_NoInstTypes
+Odaberite komponente za uklanjanje:
+# ^UnComponentsSubText2
+Ili po izboru oznaèite komponente koje želite ukloniti:
+# ^DirText
+Program $(^NameDA) æe biti instaliran u slijedeæu mapu. Za instalaciju na drugo odredište odaberite 'Pregledaj' i oznaèite drugu mapu. $_CLICK
+# ^DirSubText
+Odredišna mapa
+# ^DirBrowseText
+Odaberite mapu u koju želite instalirati program $(^NameDA):
+# ^UnDirText
+Program $(^NameDA) æe biti uklonjen iz slijedeæe mape. Za uklanjanje s drugog mjesta odaberite 'Pregledaj' i oznaèite drugu mapu. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Mapa iz koje æe program $(^NameDA) biti uklonjen:
+# ^SpaceAvailable
+"Slobodno prostora na disku: "
+# ^SpaceRequired
+"Potrebno prostora na disku: "
+# ^UninstallingText
+Program $(^NameDA) æe biti uklonjen iz slijedeæe mape. $_CLICK
+# ^UninstallingSubText
+Uklanjam iz:
+# ^FileError
+Greška prilikom otvaranja datoteke za zapisivanje: \r\n\t"$0"\r\n\"Abort\" za prekid instalacije,\r\n\"Retry\" za ponovni pokušaj zapisivanja, ili\r\n\"Ignore\" za zanemarenje te datoteke
+# ^FileError_NoIgnore
+Greška prilikom otvaranja datoteke za zapisivanje: \r\n\t"$0"\r\n\"Retry\" za ponovni pokušaj zapisivanja, ili\r\n\"Cancel\" za prekid instalacije
+# ^CantWrite
+"Ne mogu zapisati: "
+# ^CopyFailed
+Greška prilikom kopiranja
+# ^CopyTo
+"Kopiraj u "
+# ^Registering
+"Prijava: "
+# ^Unregistering
+"Odjava: "
+# ^SymbolNotFound
+"Ne mogu naæi simbol: "
+# ^CouldNotLoad
+"Ne mogu uèitati: "
+# ^CreateFolder
+"Stvori mapu: "
+# ^CreateShortcut
+"Stvori preèac: "
+# ^CreatedUninstaller
+"Program za uklanjanje: "
+# ^Delete
+"Obriši datoteku: "
+# ^DeleteOnReboot
+"Obriši prilikom ponovnog pokretanja: "
+# ^ErrorCreatingShortcut
+"Greška prilikom stvaranja preèaca: "
+# ^ErrorCreating
+"Greška prilikom stvaranja: "
+# ^ErrorDecompressing
+Greška dekompresije podataka! Ošteæena instalacijska datoteka?
+# ^ErrorRegistering
+Greška prilikom prijavljivanja DLLa
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Izvrši: "
+# ^Extract
+"Otpakiraj: "
+# ^ErrorWriting
+"Otpakiranje: greška zapisivanja u datoteku "
+# ^InvalidOpcode
+Ošteæena instalacijska datoteka: neispravni opkod
+# ^NoOLE
+"Nema OLE za: "
+# ^OutputFolder
+"Izlazna mapa: "
+# ^RemoveFolder
+"Obriši mapu: "
+# ^RenameOnReboot
+"Preimenuj prilikom ponovnog pokretanja: "
+# ^Rename
+"Preimenuj: "
+# ^Skipped
+"Preskoèeno: "
+# ^CopyDetails
+Kopiraj detalje u Clipboard
+# ^LogInstall
+Logiraj instalacijski proces
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Croatian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Croatian.nsh
new file mode 100644
index 000000000..206376a35
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Croatian.nsh
@@ -0,0 +1,121 @@
+;Language: Croatian (1050)
+;By Igor Ostriz
+
+!insertmacro LANGFILE "Croatian" "Hrvatski"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Dobrodošli u instalaciju programa $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Instalacija programa $(^NameDA) na Vaše raèunalo sastoji se od nekoliko jednostavnih koraka kroz koje æe Vas provesti ovaj èarobnjak.$\r$\n$\r$\nPreporuèamo zatvaranje svih ostalih aplikacija prije samog poèetka instalacije. To æe omoguæiti nadogradnju nekih sistemskih datoteka bez potrebe za ponovnim pokretanjem Vašeg raèunala. U svakom trenutku instalaciju možete prekinuti pritiskom na 'Odustani'.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Dobrodošli u postupak uklanjanja programa $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ovaj æe Vas èarobnjak provesti kroz postupak uklanjanja programa $(^NameDA).$\r$\n$\r$\nPrije samog poèetka, molim zatvorite program $(^NameDA) ukoliko je sluèajno otvoren.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licenèni ugovor"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Molim proèitajte licencu prije instalacije programa $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ukoliko prihvaæate uvjete licence, odaberite 'Prihvaæam' za nastavak. Morate prihvatiti licencu za instalaciju programa $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ukoliko prihvaæate uvjete licence, oznaèite donji kvadratiæ. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ukoliko prihvaæate uvjete licence, odaberite prvu donju opciju. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licenèni ugovor"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Molim proèitajte licencu prije uklanjanja programa $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ukoliko prihvaæate uvjete licence, odaberite 'Prihvaæam' za nastavak. Morate prihvatiti licencu za uklanjanje programa $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ukoliko prihvaæate uvjete licence, oznaèite donji kvadratiæ. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ukoliko prihvaæate uvjete licence, odaberite prvu donju opciju. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "'Page Down' za ostatak licence."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izbor komponenti"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Odaberite komponente programa $(^NameDA) koje želite instalirati."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izbor komponenti"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Odaberite koje komponente programa $(^NameDA) želite ukloniti."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Postavite pokazivaè iznad komponente za njezin opis."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Postavite pokazivaè iznad komponente za njezin opis."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Odaberite odredište za instalaciju"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Odaberite mapu u koju želite instalirati program $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Odaberite polazište za uklanjanje"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Odaberite mapu iz koje želite ukloniti program $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instaliranje"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Molim prièekajte na završetak instalacije programa $(^NameDA)."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Kraj instalacije"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalacija je u potpunosti završila uspješno."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalacija je prekinuta"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalacija nije završila uspješno."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uklanjanje"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Molim prièekajte na završetak uklanjanja programa $(^NameDA)."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Uklanjanje završeno"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uklanjanje je u potpunosti završilo uspješno."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Uklanjanje je prekinuto"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uklanjanje nije završilo uspješno."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Dovršenje instalacije programa $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) je instaliran na Vaše raèunalo.$\r$\n$\r$\nOdaberite 'Kraj' za završetak."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Vaše raèunalo treba ponovno pokrenuti za dovršenje instalacije programa $(^NameDA). Želite li to uèiniti sada?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Završetak uklanjanja programa $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) je uklonjen s Vašeg raèunala.$\r$\n$\r$\nOdaberite 'Kraj' za zatvaranje ovog èarobnjaka."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Vaše raèunalo treba ponovno pokrenuti za dovršenje postupka uklanjanja programa $(^NameDA). Želite li to uèiniti sada?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ponovno pokreni raèunalo sada"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ponovno æu pokrenuti raèunalo kasnije"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Pokreni program $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Prikaži &Readme"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Kraj"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izbor mape u Start meniju"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Odaberite ime za programsku mapu unutar Start menija."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Program æe pripadati odabranoj programskoj mapi u Start meniju. Možete odrediti novo ime za mapu ili odabrati veæ postojeæu."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nemoj napraviti preèace"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Uklanjanje programa $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Program $(^NameDA) æe biti uklonjen s Vašeg raèunala."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Jeste li sigurni da želite prekinuti instalaciju programa $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Jeste li sigurni da želite prekinuti uklanjanje programa $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Czech.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Czech.nlf
new file mode 100644
index 000000000..7a39dd3f8
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Czech.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1029
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1250
+# RTL - anything else than RTL means LTR
+-
+# Translation by SELiCE (ls@selice.cz - http://ls.selice.cz)
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Instalovat $(^Name)
+# ^UninstallCaption
+Odinstalovat $(^Name)
+# ^LicenseSubCaption
+: Licenèní ujednání
+# ^ComponentsSubCaption
+: Možnosti instalace
+# ^DirSubCaption
+: Umístìní instalace
+# ^InstallingSubCaption
+: Instaluje se
+# ^CompletedSubCaption
+: Dokonèeno
+# ^UnComponentsSubCaption
+: Možnosti odinstalace
+# ^UnDirSubCaption
+: Odinstalovat adresáø
+# ^ConfirmSubCaption
+: Potvrzení
+# ^UninstallingSubCaption
+: Odinstalování
+# ^UnCompletedSubCaption
+: Dokonèeno
+# ^BackBtn
+< &Zpìt
+# ^NextBtn
+&Další >
+# ^AgreeBtn
+Souhl&asím
+# ^AcceptBtn
+Souhl&asím s podmínkami Licenèního ujednání
+# ^DontAcceptBtn
+&Nesouhlasím s podmínkami Licenèního ujednání
+# ^InstallBtn
+&Instalovat
+# ^UninstallBtn
+&Odinstalovat
+# ^CancelBtn
+Storno
+# ^CloseBtn
+&Zavøít
+# ^BrowseBtn
+P&rocházet...
+# ^ShowDetailsBtn
+Zobrazit &detaily
+# ^ClickNext
+Pro pokraèování kliknìte na 'Další'.
+# ^ClickInstall
+Kliknìte na 'Instalovat' pro zahájení instalace.
+# ^ClickUninstall
+Kliknìte na 'Odinstalovat' pro zahájení odinstalace.
+# ^Name
+Název
+# ^Completed
+Dokonèeno
+# ^LicenseText
+Pøed instalací $(^NameDA) si prosím pøeètìte licenèní ujednání. Jestliže souhlasíte se všema podmínkama ujednání, kliknìte 'Souhlasím'.
+# ^LicenseTextCB
+Pøed instalací $(^NameDA) si prosím pøeètìte licenèní ujednání. Jestliže souhlasíte se všema podmínkama ujednání, zaškrtnìte políèko dole. $_CLICK
+# ^LicenseTextRB
+Pøed instalací $(^NameDA) si prosím pøeètìte licenèní ujednání. Jestliže souhlasíte se všema podmínkama ujednání, zaškrtnìte níže první možnost. $_CLICK
+# ^UnLicenseText
+Pøed odinstalování $(^NameDA) si prosím pøeètìte licenèní ujednání. Jestliže souhlasíte se všema podmínkama ujednání, kliknìte 'Souhlasím'.
+# ^UnLicenseTextCB
+Pøed odinstalování $(^NameDA) si prosím pøeètìte licenèní ujednání. Jestliže souhlasíte se všema podmínkama ujednání, zaškrtnìte políèko dole. $_CLICK
+# ^UnLicenseTextRB
+Pøed odinstalování $(^NameDA) si prosím pøeètìte licenèní ujednání. Jestliže souhlasíte se všema podmínkama ujednání, zaškrtnìte níže první možnost. $_CLICK
+# ^Custom
+Vlastní
+# ^ComponentsText
+Zvolte souèásti, které chcete nainstalovat a nezatrhnìte souèásti, které instalovat nechcete. $_CLICK
+# ^ComponentsSubText1
+Zvolte zpùsob instalace:
+# ^ComponentsSubText2_NoInstTypes
+Zvolte souèásti k instalaci:
+# ^ComponentsSubText2
+Nebo zvolte volitelné souèásti, které chcete nainstalovat:
+# ^UnComponentsText
+Zatrhnìte souèásti, které chcete odinstalovat a nezatrhnìte souèásti, které odinstalovat nechcete. $_CLICK
+# ^UnComponentsSubText1
+Zvolte zpùsob odinstalace:
+# ^UnComponentsSubText2_NoInstTypes
+Zvolte souèásti pro odinstalaci:
+# ^UnComponentsSubText2
+Nebo zvolte jednotlivé souèásti, které chcete odinstalovat:
+# ^DirText
+Setup nyní nainstaluje program $(^NameDA) do následující složky. Pro instalaci do jiné složky zvolte 'Procházet' a vyberte jinou složku. $_CLICK
+# ^DirSubText
+Cílová složka
+# ^DirBrowseText
+Zvolte složku kam instalovat program $(^NameDA):
+# ^UnDirText
+Setup nyní odinstaluje program $(^NameDA) z následující složky. Pro odinstalaci z jiné složky zvolte 'Procházet' a vyberte jinou složku. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Zvolte adresáø pro odinstalaci $(^NameDA) z:
+# ^SpaceAvailable
+"Volné místo: "
+# ^SpaceRequired
+"Potøebné místo: "
+# ^UninstallingText
+Tento prùvodce z Vašeho poèítaèe odinstaluje $(^NameDA). $_CLICK
+# ^UninstallingSubText
+Odinstalovat z:
+# ^FileError
+Nelze otevøít soubor pro zápis: \r\n\t"$0"\r\nStisknìte 'Pøerušit' pro ukonèení instalace\r\nnebo 'Znovu' pro další pokus nebo\r\n'Ignorovat' pro pøeskoèení souboru
+# ^FileError_NoIgnore
+Nelze otevøít soubor pro zápis: \r\n\t"$0"\r\nStisknìte 'Znovu' pro další pokus nebo\r\n*Storno* pro ukonèení instalace
+# ^CantWrite
+"Nelze zapsat: "
+# ^CopyFailed
+Kopírování selhalo
+# ^CopyTo
+"Zkopírovat do "
+# ^Registering
+"Registrování: "
+# ^Unregistering
+"Odregistrování: "
+# ^SymbolNotFound
+"Nelze najít znak: "
+# ^CouldNotLoad
+"Nelze naèíst: "
+# ^CreateFolder
+"Vytvoøen adresáø: "
+# ^CreateShortcut
+"Vytvoøen zástupce: "
+# ^CreatedUninstaller
+"Vytvoøen odinstalátor: "
+# ^Delete
+"Smazat soubor: "
+# ^DeleteOnReboot
+"Smazat po restartu: "
+# ^ErrorCreatingShortcut
+"Chyba pøi vytváøení zástupce: "
+# ^ErrorCreating
+"Chyba pøi vytváøení: "
+# ^ErrorDecompressing
+Chyba pøi rozbalování dat! Poškozený instalátor?
+# ^ErrorRegistering
+Chyba pøi registrování DLL
+# ^ExecShell
+"Spustit shell: "
+# ^Exec
+"Spustit: "
+# ^Extract
+"Rozbalit: "
+# ^ErrorWriting
+"Rozbalit: chyba pøi zápisu do souboru "
+# ^InvalidOpcode
+Instalátor je poškozen: nesprávný kontrolní kód
+# ^NoOLE
+"Nedostupné OLE pro: "
+# ^OutputFolder
+"Výstupní složka: "
+# ^RemoveFolder
+"Odstranit složku: "
+# ^RenameOnReboot
+"Pøejmenovat pøi restartu: "
+# ^Rename
+"Pøejmenováno: "
+# ^Skipped
+"Pøeskoèeno: "
+# ^CopyDetails
+Zkopírovat podrobnosti do schránky
+# ^LogInstall
+Zaznamenat prùbìh instalace
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Czech.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Czech.nsh
new file mode 100644
index 000000000..67be62076
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Czech.nsh
@@ -0,0 +1,122 @@
+;Language: Czech (1029)
+;By SELiCE (ls@selice.cz - http://ls.selice.cz)
+;Corrected by Ondøej Vaniš - http://www.vanis.cz/ondra
+
+!insertmacro LANGFILE "Czech" "Cesky"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Vítejte v prùvodci instalace programu $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Tento prùvodce Vás provede instalací $(^NameDA).$\r$\n$\r$\nPøed zaèátkem instalace je doporuèeno zavøít všechny ostatní aplikace. Toto umožní aktualizovat dùležité systémové soubory bez restartování Vašeho poèítaèe.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Vítejte v $(^NameDA) odinstalaèním prùvodci"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Tento prùvodce Vás provede odinstalací $(^NameDA).$\r$\n$\r$\nPøed zaèátkem odinstalace, se pøesvìdète, že $(^NameDA) není spuštìn.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licenèní ujednání"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Pøed instalací programu $(^NameDA) si prosím prostudujte licenèní podmínky."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jestliže souhlasíte se všemi podmínkami ujednání, zvolte 'Souhlasím' pro pokraèování. Pro instalaci programu $(^NameDA) je nutné souhlasit s licenèním ujednáním."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jestliže souhlasíte se všemi podmínkami ujednání, zaškrtnìte níže uvedenou volbu. Pro instalaci programu $(^NameDA) je nutné souhlasit s licenèním ujednáním. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jestliže souhlasíte se všemi podmínkami ujednání, zvolte první z možností uvedených níže. Pro instalaci programu $(^NameDA) je nutné souhlasit s licenèním ujednáním. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licenèní ujednání"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Pøed odinstalováním programu $(^NameDA) si prosím prostudujte licenèní podmínky."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jestliže souhlasíte se všemi podmínkami ujednání, zvolte 'Souhlasím' pro pokraèování. Pro odinstalování programu $(^NameDA) je nutné souhlasit s licenèním ujednáním."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jestliže souhlasíte se všemi podmínkami ujednání, zaškrtnìte níže uvedenou volbu. Pro odinstalování programu $(^NameDA) je nutné souhlasit s licenèním ujednáním. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jestliže souhlasíte se všemi podmínkami ujednání, zvolte první z níže uvedených možností. Pro odinstalování programu $(^NameDA) je nutné souhlasit s licenèním ujednáním. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Stisknutím klávesy Page Down posunete text licenèního ujednání."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Volba souèástí"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Zvolte souèásti programu $(^NameDA), které chcete nainstalovat."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Popis"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Volba souèástí"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Zvolte souèásti programu $(^NameDA), které chcete odinstalovat."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Pøi pohybu myší nad instalátorem programu se zobrazí její popis."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Pøi pohybu myší nad instalátorem programu se zobrazí její popis."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Zvolte umístìní instalace"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Zvolte složku, do které bude program $(^NameDA) nainstalován."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Zvolte umístìní odinstalace"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Zvolte složku, ze které bude program $(^NameDA) odinstalován."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalace"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vyèkejte, prosím, na dokonèení instalace programu $(^NameDA)."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalace dokonèena"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalace probìhla v poøádku."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalace pøerušena"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalace nebyla dokonèena."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Odinstalace"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vyèkejte, prosím, na dokonèení odinstalace programu $(^NameDA)."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Odinstalace dokonèena"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Odinstalace probìhla v poøádku."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Odinstalace pøerušena"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Odinstalace nebyla dokonèena."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Dokonèení prùvodce programu $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) byl nainstalován na Váš poèítaè.$\r$\n$\r$\nKliknìte 'Dokonèit' pro ukonèení prùvodce."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Pro dokonèení instalace programu $(^NameDA) je nutno restartovat poèítaè. Chcete restatovat nyní?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Dokonèuji odinstalaèního prùvodce $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) byl odinstalován z Vašeho poèítaèe.$\r$\n$\r$\nKliknìte na 'Dokonèit' pro ukonèení tohoto prùvodce."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Pro dokonèení odinstalace $(^NameDA) musí být Váš poèítaè restartován. Chcete restartovat nyní?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Restartovat nyní"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Restartovat ruènì pozdìji"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Spustit program $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Zobrazit Èti-mne"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Dokonèit"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Zvolte složku v Nabídce Start"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Zvolte složku v Nabídce Start pro zástupce programu $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Zvolte složku v Nabídce Start, ve které chcete vytvoøit zástupce programu. Mùžete také zadat nové jméno pro vytvoøení nové složky."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nevytváøet zástupce"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Odinstalovat program $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Odebrat program $(^NameDA) z Vašeho poèítaèe."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Opravdu chcete ukonèit instalaci programu $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Skuteènì chcete ukonèit odinstalaci $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Danish.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Danish.nlf
new file mode 100644
index 000000000..10e0f54f3
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Danish.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1030
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Claus Futtrup
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Installation
+# ^UninstallCaption
+$(^Name) Afinstallation
+# ^LicenseSubCaption
+: Licensaftale
+# ^ComponentsSubCaption
+: Installationsmuligheder
+# ^DirSubCaption
+: Installationsmappe
+# ^InstallingSubCaption
+: Installerer
+# ^CompletedSubCaption
+: Gennemført
+# ^UnComponentsSubCaption
+: Afinstallationsmuligheder
+# ^UnDirSubCaption
+: Afinstallationsmappe
+# ^ConfirmSubCaption
+: Bekræft
+# ^UninstallingSubCaption
+: Afinstallerer
+# ^UnCompletedSubCaption
+: Gennemført
+# ^BackBtn
+< &Tilbage
+# ^NextBtn
+&Næste >
+# ^AgreeBtn
+Jeg &accepterer
+# ^AcceptBtn
+Jeg &accepterer vilkårene i licensaftalen
+# ^DontAcceptBtn
+Jeg &accepterer ikke vilkårene i licensaftalen
+# ^InstallBtn
+&Installer
+# ^UninstallBtn
+&Afinstaller
+# ^CancelBtn
+Afbryd
+# ^CloseBtn
+&Luk
+# ^BrowseBtn
+G&ennemse...
+# ^ShowDetailsBtn
+Vis &detaljer
+# ^ClickNext
+Tryk Næste for at fortsætte.
+# ^ClickInstall
+Tryk Installer for at starte installationen.
+# ^ClickUninstall
+Tryk Afinstaller for at starte afinstallationen.
+# ^Name
+Navn
+# ^Completed
+Gennemført
+# ^LicenseText
+Læs venligst licensaftalen før installationen af $(^NameDA). Hvis du accepterer alle betingelser i aftalen, skal du trykke 'Jeg accepterer'.
+# ^LicenseTextCB
+Læs venligst licensaftalen før installationen af $(^NameDA). Hvis du accepterer alle betingelser i aftalen, skal du markere afkrydsningsfeltet nedenfor. $_CLICK
+# ^LicenseTextRB
+Læs venligst licensaftalen før installationen af $(^NameDA). Hvis du accepterer alle betingelser i aftalen, skal du vælge den første mulighed nedenfor. $_CLICK
+# ^UnLicenseText
+Læs venligst licensaftalen før afinstallationen af $(^NameDA). Hvis du accepterer alle betingelser i aftalen, skal du trykke 'Jeg accepterer'
+# ^UnLicenseTextCB
+Læs venligst licensaftalen før afinstallationen af $(^NameDA). Hvis du accepterer alle betingelser i aftalen, skal du markere afkrydsningsfeltet nedenfor. $_CLICK
+# ^UnLicenseTextRB
+Læs venligst licensaftalen før afinstallationen af $(^NameDA). Hvis du accepterer alle betingelser i aftalen, skal du vælge den første mulighed nedenfor $_CLICK
+# ^Custom
+Brugerdefineret
+# ^ComponentsText
+Marker de komponenter du vil installere, og fjern markeringen af de komponenter du ikke vil installere. $_CLICK
+# ^ComponentsSubText1
+Vælg installationstype:
+# ^ComponentsSubText2_NoInstTypes
+Vælg de komponenter der skal installeres:
+# ^ComponentsSubText2
+Eller vælg de tillægskomponenter komponenter du ønsker at installere:
+# ^UnComponentsText
+Marker de komponenter du vil afinstallere, og fjern markeringen af de komponenter du ikke vil afinstallere. $_CLICK
+# ^UnComponentsSubText1
+Vælg afinstallationstype:
+# ^UnComponentsSubText2_NoInstTypes
+Vælg de komponenter der skal afinstalleres:
+# ^UnComponentsSubText2
+Eller vælg de tillægskomponenter du ønsker at afinstallere:
+# ^DirText
+Installationsguiden vil installere $(^NameDA) i følgende mappe. For at installere i en anden mappe, tryk Gennemse og vælg en anden mappe. $_CLICK
+# ^DirSubText
+Destinationsmappe
+# ^DirBrowseText
+Vælg den mappe $(^NameDA) skal installeres i:
+# ^UnDirText
+Installationsguiden vil afinstallere $(^NameDA) fra følgende mappe. For at afinstallere fra en anden mappe, tryk Gennemse og vælg en anden mappe. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Vælg den mappe hvorfra $(^NameDA) skal afinstalleres:
+# ^SpaceAvailable
+"Ledig plads: "
+# ^SpaceRequired
+"Nødvendig plads: "
+# ^UninstallingText
+$(^NameDA) vil blive afinstalleret fra følgende mappe. $_CLICK
+# ^UninstallingSubText
+Afinstallerer fra:
+# ^FileError
+Fejl ved skrivning af fil: \r\n\t"$0"\r\nTryk Afbryd for at afbryde installationen,\r\nPrøv Igen for at prøve at skrive til filen, eller\r\nIgnorer for at springe over denne fil
+# ^FileError_NoIgnore
+Fejl ved åbning af fil: \r\n\t"$0"\r\nTryk Prøv Igen for at prøve at skrive til filen, eller\r\nAfbryd for at afbryde installationen
+# ^CantWrite
+"Kan ikke skrive: "
+# ^CopyFailed
+Kopiering mislykkedes
+# ^CopyTo
+"Kopier til "
+# ^Registering
+"Registrerer: "
+# ^Unregistering
+"Afregisterer: "
+# ^SymbolNotFound
+"Kunne ikke finde symbol: "
+# ^CouldNotLoad
+"Kunne ikke hente: "
+# ^CreateFolder
+"Opret mappe: "
+# ^CreateShortcut
+"Opret genvej: "
+# ^CreatedUninstaller
+"Afinstallationsguide oprettet: "
+# ^Delete
+"Slet fil: "
+# ^DeleteOnReboot
+"Slet ved genstart: "
+# ^ErrorCreatingShortcut
+"Fejl ved oprettelse af genvej: "
+# ^ErrorCreating
+"Fejl ved oprettelse: "
+# ^ErrorDecompressing
+Fejl ved udpakning af data! Installationsguiden skadet?
+# ^ErrorRegistering
+Fejl ved registrering af DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Kør: "
+# ^Extract
+"Udpak: "
+# ^ErrorWriting
+"Udpak: Fejl ved skrivning til fil "
+# ^InvalidOpcode
+Installationsguide i stykker: Ugyldig opcode
+# ^NoOLE
+"Ingen OLE for: "
+# ^OutputFolder
+"Outputmappe: "
+# ^RemoveFolder
+"Slet mappe: "
+# ^RenameOnReboot
+"Omdøb ved genstart: "
+# ^Rename
+"Omdøb: "
+# ^Skipped
+"Sprunget over: "
+# ^CopyDetails
+Kopier detaljer til udklipsholderen
+# ^LogInstall
+Log installationsproces
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Danish.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Danish.nsh
new file mode 100644
index 000000000..1ce97e86d
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Danish.nsh
@@ -0,0 +1,121 @@
+;Language: Danish (1030)
+;By Claus Futtrup
+
+!insertmacro LANGFILE "Danish" "Dansk"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Velkommen til installationsguiden for $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Denne guide vil installere $(^NameDA) på din computer.$\r$\n$\r$\nDet anbefales, at du lukker alle kørende programmer inden start af installationsguiden. Dette vil tillade guiden at opdatere de nødvendige systemfiler uden at skulle genstarte computeren.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Velkommen til $(^NameDA) afinstallationsguiden"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Denne afinstallationsguide vil hjælpe dig gennem afinstallationen af $(^NameDA).$\r$\n$\r$\nFør start af afinstallationen skal du være sikker på at $(^NameDA) ikke kører.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licensaftale"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Læs venligst licensaftalen før du installerer $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Tryk 'Jeg accepterer' hvis du ønsker at accepterer alle vilkårene i aftalen og forsætte. Du skal acceptere vilkårene for at installere $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Hvis du accepterer alle vilkårene i aftalen, skal du markere afkrydsningsfeltet nedenfor. Du skal acceptere vilkårene for at installere $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Hvis du accepterer alle vilkårene i aftalen, skal du vælge den første mulighed nedenfor. Du skal acceptere vilkårene for at installere $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licensaftale"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Læs venligst licensvilkårene før afinstalleringen af $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Hvis du accepterer vilkårene for aftalen, skal du trykke 'Jeg accepterer' for at fortsætte. Du skal acceptere aftalen for at afinstallere $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Hvis du accepterer vilkårene for aftalen, skal du markere afkrydsningsfeltet nedenfor. Du skal acceptere aftalen for at afinstallere $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Hvis du accepterer vilkårene for aftalen, skal du vælge den første mulighed nedenfor. Du skal acceptere aftalen for at afinstallere $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tryk Page Down for at se resten af aftalen."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Vælg komponenter"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Vælg hvilke features af $(^NameDA) du vil installere."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskrivelse"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Vælg komponenter"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Vælg hvilke features af $(^NameDA) du vil afinstallere."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Placer musemarkøren over en komponent for at se beskrivelsen af komponenten."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Placer musemarkøren over en komponent for at se beskrivelsen af komponenten."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Vælg installationsmappe"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Vælg hvilken mappe du vil installere $(^NameDA) i."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Vælg afinstallationsmappe"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Vælg den mappe hvorfra du vil afinstallere $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installerer"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vent venligst mens $(^NameDA) bliver installeret."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Installation gennemført"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Installationsguiden blev gennemført med succes."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation afbrudt"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Installationsguiden blev ikke gennemført."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Afinstallerer"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vent venligst mens $(^NameDA) bliver afinstalleret."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Afinstallationen er færdig"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Afinstallationen blev afsluttet med succes."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Afinstallationen er blevet afbrudt"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Afinstallationen blev ikke genmmenført."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Afslutter $(^NameDA) installationsguiden"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) er blevet installeret på din computer.$\r$\n$\r$\nTryk 'Afslut' for at lukke installationsguiden."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Din computer skal genstartes før installationen af $(^NameDA) er afsluttet. Vil du genstarte nu?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Afslutter $(^NameDA) afinstallationsguiden"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) er blevet afinstalleret fra din computer.$\r$\n$\r$\nTryk 'Afslut' for at lukke denne guide."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Din computer skal genstartes for at gennemføre afinstallationen af $(^NameDA). Vil du genstarte nu?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Genstart nu"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Jeg genstarter selv på et andet tidspunkt"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Start $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Vis vigtig information"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Afslut"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Vælg Start Menu mappe"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Vælg en Start Menu mappe til programmets genveje."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vælg Start Menu mappen hvor du vil lave programmets genveje. Du kan også skrive et navn for at oprette en ny mappe."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Opret ikke genveje"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Afinstaller $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Slet $(^NameDA) fra din computer."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Er du sikker på, at du vil afslutte $(^Name) installationen?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Er du sikker på at du vil afbryde $(^Name) afinstallationen?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Dutch.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Dutch.nlf
new file mode 100644
index 000000000..a39a3d72c
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Dutch.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1043
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Joost Verburg & Hendri Adireans, fixes by Milan Bast
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name)-installatie
+# ^UninstallCaption
+$(^Name)-deïnstallatie
+# ^LicenseSubCaption
+: Licentieovereenkomst
+# ^ComponentsSubCaption
+: Installatieopties
+# ^DirSubCaption
+: Installatiemap
+# ^InstallingSubCaption
+: Bezig met installeren
+# ^CompletedSubCaption
+: Voltooid
+# ^UnComponentsSubCaption
+: Verwijderingsopties
+# ^UnDirSubCaption
+: Te verwijderen map
+# ^ConfirmSubCaption
+: Bevestiging
+# ^UninstallingSubCaption
+: Bezig met verwijderen
+# ^UnCompletedSubCaption
+: Voltooid
+# ^BackBtn
+< V&orige
+# ^NextBtn
+&Volgende >
+# ^AgreeBtn
+&Akkoord
+# ^AcceptBtn
+Ik &accepteer de overeenkomst
+# ^DontAcceptBtn
+Ik accepteer de overeenkomst &niet
+# ^InstallBtn
+&Installeren
+# ^UninstallBtn
+&Verwijderen
+# ^CancelBtn
+Annuleren
+# ^CloseBtn
+&Afsluiten
+# ^BrowseBtn
+&Bladeren...
+# ^ShowDetailsBtn
+&Details tonen
+# ^ClickNext
+Klik op Volgende om verder te gaan.
+# ^ClickInstall
+Klik op Installeren om de installatie te beginnen.
+# ^ClickUninstall
+Klik op Verwijderen om de deïnstallatie te beginnen.
+# ^Name
+Naam
+# ^Completed
+Voltooid
+# ^LicenseText
+Lees de licentieovereenkomst voordat u $(^NameDA) installeert. Klik op Akkoord als u de overeenkomst accepteert.
+# ^LicenseTextCB
+Lees de licentieovereenkomst voordat u $(^NameDA) installeert. Schakel het selectievakje hieronder in als u de overeenkomst accepteert. $_CLICK
+# ^LicenseTextRB
+Lees de licentieovereenkomst voordat u $(^NameDA) installeert. Selecteer de eerste optie hieronder als u de overeenkomst accepteert. $_CLICK
+# ^UnLicenseText
+Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert. Klik op Akkoord als u de overeenkomst accepteert.
+# ^UnLicenseTextCB
+Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert. Schakel het selectievakje hieronder in als u de overeenkomst accepteert. $_CLICK
+# ^UnLicenseTextRB
+Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert. Selecteer de eerste optie hieronder als u de overeenkomst accepteert. $_CLICK
+# ^Custom
+Aangepast
+# ^ComponentsText
+Selecteer de onderdelen die u wilt installeren en deselecteer welke u niet wilt installeren. $_CLICK
+# ^ComponentsSubText1
+Selecteer het installatietype:
+# ^ComponentsSubText2_NoInstTypes
+Selecteer de onderdelen die moeten worden geïnstalleerd:
+# ^ComponentsSubText2
+Of selecteer de optionele onderdelen die moeten worden geïnstalleerd:
+# ^UnComponentsText
+Selecteer de onderdelen die u wilt verwijderen en deselecteer welke u niet wilt verwijderen. $_CLICK
+# ^UnComponentsSubText1
+Selecteer het type verwijdering:
+# ^UnComponentsSubText2_NoInstTypes
+Selecteer de onderdelen die moeten worden verwijderd:
+# ^UnComponentsSubText2
+Of selecteer de optionele onderdelen die moeten worden verwijderd:
+# ^DirText
+Setup zal $(^NameDA) in de volgende map installeren. Klik op Bladeren als u $(^NameDA) in een andere map wilt installeren en selecteer deze. $_CLICK
+# ^DirSubText
+Installatiemap
+# ^DirBrowseText
+Selecteer de map om $(^NameDA) in te installeren:
+# ^UnDirText
+Setup zal $(^NameDA) uit de volgende map verwijderen. Klik op Bladeren als u $(^NameDA) uit een andere map wilt verwijderen en selecteer deze. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Selecteer de map om $(^NameDA) uit te verwijderen:
+# ^SpaceAvailable
+"Beschikbare ruimte: "
+# ^SpaceRequired
+"Vereiste ruimte: "
+# ^UninstallingText
+$(^NameDA) zal uit de volgende map worden verwijderd. $_CLICK
+# ^UninstallingSubText
+Verwijderen uit:
+# ^FileError
+Fout bij het schrijven naar bestand: \r\n\r\n$0\r\n\r\nKlik op Afbreken om de installatie te stoppen,\r\nOpnieuw om het opnieuw te proberen of\r\nNegeren om dit bestand over te slaan.
+# ^FileError_NoIgnore
+Fout bij het schrijven naar bestand: \r\n\r\n$0\r\n\r\nKlik op Opnieuw om het opnieuw te proberen of \r\nAnnuleren om de installatie te stoppen.
+# ^CantWrite
+"Kon niet schrijven: "
+# ^CopyFailed
+Kopiëren mislukt
+# ^CopyTo
+"Kopiëren naar "
+# ^Registering
+"Registreren: "
+# ^Unregistering
+"Deregistreren: "
+# ^SymbolNotFound
+"Kon symbool niet vinden: "
+# ^CouldNotLoad
+"Kon niet laden: "
+# ^CreateFolder
+"Map maken: "
+# ^CreateShortcut
+"Snelkoppeling maken: "
+# ^CreatedUninstaller
+"Deïnstallatieprogramma gemaakt: "
+# ^Delete
+"Bestand verwijderen: "
+# ^DeleteOnReboot
+"Verwijderen na opnieuw opstarten: "
+# ^ErrorCreatingShortcut
+"Fout bij maken snelkoppeling: "
+# ^ErrorCreating
+"Fout bij maken: "
+# ^ErrorDecompressing
+Fout bij uitpakken van gegevens! Gegevens beschadigd?
+# ^ErrorRegistering
+Fout bij registreren DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Uitvoeren: "
+# ^Extract
+"Uitpakken: "
+# ^ErrorWriting
+"Uitpakken: fout bij schrijven naar bestand "
+# ^InvalidOpcode
+Installatieprogramma beschadigd: ongeldige opcode
+# ^NoOLE
+"Geen OLE voor: "
+# ^OutputFolder
+"Uitvoermap: "
+# ^RemoveFolder
+"Map verwijderen: "
+# ^RenameOnReboot
+"Hernoemen na opnieuw opstarten: "
+# ^Rename
+"Hernoemen: "
+# ^Skipped
+"Overgeslagen: "
+# ^CopyDetails
+Details kopiëren naar klembord
+# ^LogInstall
+Gegevens over installatie bewaren
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Dutch.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Dutch.nsh
new file mode 100644
index 000000000..695f5e779
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Dutch.nsh
@@ -0,0 +1,129 @@
+;Language: Dutch (1043)
+;By Joost Verburg
+
+!insertmacro LANGFILE "Dutch" "Nederlands"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Welkom bij de $(^NameDA)-installatiewizard"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Deze wizard zal $(^NameDA) op uw systeem installeren.$\r$\n$\r$\nHet wordt aanbevolen alle overige toepassingen af te sluiten alvorens de installatie te starten. Dit maakt het mogelijk relevante systeembestanden bij te werken zonder uw systeem opnieuw op te moeten starten.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Welkom bij de $(^NameDA)-deïnstallatiewizard"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Deze wizard zal $(^NameDA) van uw syteem verwijderen.$\r$\n$\r$\nControleer voordat u begint met verwijderen of $(^NameDA) is afgesloten.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licentieovereenkomst"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lees de licentieovereenkomst voordat u $(^NameDA) installeert."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Klik op Akkoord om verder te gaan als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te installeren."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Schakel het selectievakje hieronder in als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te installeren."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Selecteer de eerste optie hieronder als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te installeren."
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licentieovereenkomst"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Klik op Akkoord op verder te gaan als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te verwijderen."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Schakel het selectievakje hieronder in als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te verwijderen."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Selecteer de eerste optie hieronder als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te verwijderen."
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Druk op Page Down om de rest van de overeenkomst te zien."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Onderdelen kiezen"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Kies de onderdelen die u wilt installeren."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beschrijving"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Onderdelen kiezen"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Kies de onderdelen die u wilt verwijderen."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beweeg uw muis over een onderdeel om de beschrijving te zien."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beweeg uw muis over een onderdeel om de beschrijving te zien."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Installatielocatie kiezen"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Kies de map waarin u $(^NameDA) wilt installeren."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Locatie kiezen"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Kies de map waaruit u $(^NameDA) wilt verwijderen."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Bezig met installeren"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Een ogenblik geduld terwijl $(^NameDA) wordt geïnstalleerd."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Installatie voltooid"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "De installatie is succesvol voltooid."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Installatie afgebroken"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "De installatie is niet voltooid."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Bezig met verwijderen"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Een ogenblik geduld terwijl $(^NameDA) van uw systeem wordt verwijderd."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Verwijderen gereed"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "$(^NameDA) is van uw systeem verwijderd."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Verwijderen afgebroken"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "$(^NameDA) is niet volledig van uw systeem verwijderd."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Voltooien van de $(^NameDA)-installatiewizard"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) is geïnstalleerd op uw systeem.$\r$\n$\r$\nKlik op Voltooien om deze wizard te sluiten."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Uw systeem moet opnieuw worden opgestart om de installatie van $(^NameDA) te voltooien. Wilt u nu herstarten?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Voltooien van de $(^NameDA)-deïnstallatiewizard"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) is van uw systeem verwijderd.$\r$\n$\r$\nKlik op Voltooien om deze wizard te sluiten."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Uw systeem moet opnieuw worden opgestart om het verwijderen van $(^NameDA) te voltooien. Wilt u nu herstarten?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Nu herstarten"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ik wil later handmatig herstarten"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) &starten"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Leesmij weergeven"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Voltooien"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Startmenumap kiezen"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Kies een map in het menu Start voor de snelkoppelingen van $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Kies een map in het menu Start waarin de snelkoppelingen moeten worden aangemaakt. U kunt ook een naam invoeren om een nieuwe map te maken."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Geen snelkoppelingen aanmaken"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) verwijderen"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) van uw systeem verwijderen."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Weet u zeker dat u de $(^Name)-installatie wilt afsluiten?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Weet u zeker dat u de $(^Name)-deïnstallatie wilt afsluiten?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Gebruikers kiezen"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Kies voor welke gebruikers u $(^NameDA) wilt installeren."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Selecteer of u $(^NameDA) alleen voor uzelf of voor alle gebruikers van deze computer wilt installeren. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installeer voor alle gebruikers van deze computer"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installeer alleen voor mijzelf"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/English.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/English.nlf
new file mode 100644
index 000000000..d325f0306
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/English.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1033
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+-
+# RTL - anything else than RTL means LTR
+-
+# Translation by ..... (any credits should go here)
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Setup
+# ^UninstallCaption
+$(^Name) Uninstall
+# ^LicenseSubCaption
+: License Agreement
+# ^ComponentsSubCaption
+: Installation Options
+# ^DirSubCaption
+: Installation Folder
+# ^InstallingSubCaption
+: Installing
+# ^CompletedSubCaption
+: Completed
+# ^UnComponentsSubCaption
+: Uninstallation Options
+# ^UnDirSubCaption
+: Uninstallation Folder
+# ^ConfirmSubCaption
+: Confirmation
+# ^UninstallingSubCaption
+: Uninstalling
+# ^UnCompletedSubCaption
+: Completed
+# ^BackBtn
+< &Back
+# ^NextBtn
+&Next >
+# ^AgreeBtn
+I &Agree
+# ^AcceptBtn
+I &accept the terms of the License Agreement
+# ^DontAcceptBtn
+I &do not accept the terms of the License Agreement
+# ^InstallBtn
+&Install
+# ^UninstallBtn
+&Uninstall
+# ^CancelBtn
+Cancel
+# ^CloseBtn
+&Close
+# ^BrowseBtn
+B&rowse...
+# ^ShowDetailsBtn
+Show &details
+# ^ClickNext
+Click Next to continue.
+# ^ClickInstall
+Click Install to start the installation.
+# ^ClickUninstall
+Click Uninstall to start the uninstallation.
+# ^Name
+Name
+# ^Completed
+Completed
+# ^LicenseText
+Please review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, click I Agree.
+# ^LicenseTextCB
+Please review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, click the check box below. $_CLICK
+# ^LicenseTextRB
+Please review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, select the first option below. $_CLICK
+# ^UnLicenseText
+Please review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, click I Agree.
+# ^UnLicenseTextCB
+Please review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, click the check box below. $_CLICK
+# ^UnLicenseTextRB
+Please review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, select the first option below. $_CLICK
+# ^Custom
+Custom
+# ^ComponentsText
+Check the components you want to install and uncheck the components you don't want to install. $_CLICK
+# ^ComponentsSubText1
+Select the type of install:
+# ^ComponentsSubText2_NoInstTypes
+Select components to install:
+# ^ComponentsSubText2
+Or, select the optional components you wish to install:
+# ^UnComponentsText
+Check the components you want to uninstall and uncheck the components you don't want to uninstall. $_CLICK
+# ^UnComponentsSubText1
+Select the type of uninstall:
+# ^UnComponentsSubText2_NoInstTypes
+Select components to uninstall:
+# ^UnComponentsSubText2
+Or, select the optional components you wish to uninstall:
+# ^DirText
+Setup will install $(^NameDA) in the following folder. To install in a different folder, click Browse and select another folder. $_CLICK
+# ^DirSubText
+Destination Folder
+# ^DirBrowseText
+Select the folder to install $(^NameDA) in:
+# ^UnDirText
+Setup will uninstall $(^NameDA) from the following folder. To uninstall from a different folder, click Browse and select another folder. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Select the folder to uninstall $(^NameDA) from:
+# ^SpaceAvailable
+"Space available: "
+# ^SpaceRequired
+"Space required: "
+# ^UninstallingText
+$(^NameDA) will be uninstalled from the following folder. $_CLICK
+# ^UninstallingSubText
+Uninstalling from:
+# ^FileError
+Error opening file for writing: \r\n\r\n$0\r\n\r\nClick Abort to stop the installation,\r\nRetry to try again, or\r\nIgnore to skip this file.
+# ^FileError_NoIgnore
+Error opening file for writing: \r\n\r\n$0\r\n\r\nClick Retry to try again, or\r\nCancel to stop the installation.
+# ^CantWrite
+"Can't write: "
+# ^CopyFailed
+Copy failed
+# ^CopyTo
+"Copy to "
+# ^Registering
+"Registering: "
+# ^Unregistering
+"Unregistering: "
+# ^SymbolNotFound
+"Could not find symbol: "
+# ^CouldNotLoad
+"Could not load: "
+# ^CreateFolder
+"Create folder: "
+# ^CreateShortcut
+"Create shortcut: "
+# ^CreatedUninstaller
+"Created uninstaller: "
+# ^Delete
+"Delete file: "
+# ^DeleteOnReboot
+"Delete on reboot: "
+# ^ErrorCreatingShortcut
+"Error creating shortcut: "
+# ^ErrorCreating
+"Error creating: "
+# ^ErrorDecompressing
+Error decompressing data! Corrupted installer?
+# ^ErrorRegistering
+Error registering DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Execute: "
+# ^Extract
+"Extract: "
+# ^ErrorWriting
+"Extract: error writing to file "
+# ^InvalidOpcode
+Installer corrupted: invalid opcode
+# ^NoOLE
+"No OLE for: "
+# ^OutputFolder
+"Output folder: "
+# ^RemoveFolder
+"Remove folder: "
+# ^RenameOnReboot
+"Rename on reboot: "
+# ^Rename
+"Rename: "
+# ^Skipped
+"Skipped: "
+# ^CopyDetails
+Copy Details To Clipboard
+# ^LogInstall
+Log install process
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/English.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/English.nsh
new file mode 100644
index 000000000..6fcc69fab
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/English.nsh
@@ -0,0 +1,129 @@
+;Language: English (1033)
+;By Joost Verburg
+
+!insertmacro LANGFILE "English" "English"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Welcome to the $(^NameDA) Setup Wizard"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "This wizard will guide you through the installation of $(^NameDA).$\r$\n$\r$\nIt is recommended that you close all other applications before starting Setup. This will make it possible to update relevant system files without having to reboot your computer.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Welcome to the $(^NameDA) Uninstall Wizard"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "This wizard will guide you through the uninstallation of $(^NameDA).$\r$\n$\r$\nBefore starting the uninstallation, make sure $(^NameDA) is not running.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "License Agreement"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Please review the license terms before installing $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to install $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "If you accept the terms of the agreement, click the check box below. You must accept the agreement to install $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "If you accept the terms of the agreement, select the first option below. You must accept the agreement to install $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "License Agreement"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Please review the license terms before uninstalling $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to uninstall $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "If you accept the terms of the agreement, click the check box below. You must accept the agreement to uninstall $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "If you accept the terms of the agreement, select the first option below. You must accept the agreement to uninstall $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Press Page Down to see the rest of the agreement."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Choose Components"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Choose which features of $(^NameDA) you want to install."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Description"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Choose Components"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Choose which features of $(^NameDA) you want to uninstall."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Position your mouse over a component to see its description."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Position your mouse over a component to see its description."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Choose Install Location"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Choose the folder in which to install $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Choose Uninstall Location"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Choose the folder from which to uninstall $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installing"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Please wait while $(^NameDA) is being installed."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Installation Complete"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Setup was completed successfully."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation Aborted"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Setup was not completed successfully."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uninstalling"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Please wait while $(^NameDA) is being uninstalled."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Uninstallation Complete"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uninstall was completed successfully."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Uninstallation Aborted"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uninstall was not completed successfully."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completing the $(^NameDA) Setup Wizard"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) has been installed on your computer.$\r$\n$\r$\nClick Finish to close this wizard."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Your computer must be restarted in order to complete the installation of $(^NameDA). Do you want to reboot now?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completing the $(^NameDA) Uninstall Wizard"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) has been uninstalled from your computer.$\r$\n$\r$\nClick Finish to close this wizard."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Your computer must be restarted in order to complete the uninstallation of $(^NameDA). Do you want to reboot now?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reboot now"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "I want to manually reboot later"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Run $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Show Readme"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Finish"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Choose Start Menu Folder"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Choose a Start Menu folder for the $(^NameDA) shortcuts."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Select the Start Menu folder in which you would like to create the program's shortcuts. You can also enter a name to create a new folder."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Do not create shortcuts"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Uninstall $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Remove $(^NameDA) from your computer."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Are you sure you want to quit $(^Name) Setup?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Are you sure you want to quit $(^Name) Uninstall?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Choose Users"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Choose for which users you want to install $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Select whether you want to install $(^NameDA) for yourself only or for all users of this computer. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Install for anyone using this computer"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Install just for me"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Esperanto.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Esperanto.nlf
new file mode 100644
index 000000000..c1b1303d8
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Esperanto.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID (none exists for Kurdish at the moment)
+9998
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+-
+# RTL - anything else than RTL means LTR
+-
+# Translation v4.0.3 by Felipe Castro
+# ^Branding
+Instalada Sistemo de Nullsoft %s
+# ^SetupCaption
+Instalado de $(^Name)
+# ^UninstallCaption
+Malinstalado de $(^Name)
+# ^LicenseSubCaption
+: Permes-Kontrakto
+# ^ComponentsSubCaption
+: Instaladaj Opcioj
+# ^DirSubCaption
+: Instalada Dosierujo
+# ^InstallingSubCaption
+: Oni Instalas Dosierojn
+# ^CompletedSubCaption
+: Kompletite
+# ^UnComponentsSubCaption
+: Malinstaladaj Opcioj
+# ^UnDirSubCaption
+: Malinstalada Dosierujo
+# ^ConfirmSubCaption
+: Konfirmo
+# ^UninstallingSubCaption
+: Oni malinstalas
+# ^UnCompletedSubCaption
+: Kompletite
+# ^BackBtn
+< &Antauxe
+# ^NextBtn
+&Sekve >
+# ^AgreeBtn
+&Akceptite
+# ^AcceptBtn
+Mi &akceptas la kondicxojn de la Permes-Kontrakto
+# ^DontAcceptBtn
+Mi &ne akceptas la kondicxojn de la Permes-Kontrakto
+# ^InstallBtn
+&Instali
+# ^UninstallBtn
+&Malinstali
+# ^CancelBtn
+Nuligi
+# ^CloseBtn
+&Fermi
+# ^BrowseBtn
+&Sercxi...
+# ^ShowDetailsBtn
+Vidi &Detalojn
+# ^ClickNext
+Musklaku en 'Sekve' por dauxrigi.
+# ^ClickInstall
+Musklaku en 'Instali' por ekigi la instaladon.
+# ^ClickUninstall
+Musklaku en 'Malinstali' por ekigi la malinstaladon.
+# ^Name
+Nomo
+# ^Completed
+Kompletite
+# ^LicenseText
+Bonvole revidu la permes-akordon antaux ol instali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en 'Akceptite'.
+# ^LicenseTextCB
+Bonvole revidu la permes-akordon antaux ol instali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en la suba elekt-skatolo. $_CLICK
+# ^LicenseTextRB
+Bonvole revidu la permes-akordon antaux ol instali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, elektu la unuan opcion sube. $_CLICK
+# ^UnLicenseText
+Bonvole revidu la permes-akordon antaux ol malinstali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en 'Akceptite'.
+# ^UnLicenseTextCB
+Bonvole revidu la permes-akordon antaux ol malinstali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en la suba elekt-skatolo. $_CLICK
+# ^UnLicenseTextRB
+Bonvole revidu la permes-akordon antaux ol malinstali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, elektu la unuan opcion sube. $_CLICK
+# ^Custom
+Personigite
+# ^ComponentsText
+Marku la konsisterojn, kiujn vi deziras instali kaj malmarku tiujn, kiujn vi ne deziras instali. $_CLICK
+# ^ComponentsSubText1
+Elektu la tipon de instalado:
+# ^ComponentsSubText2_NoInstTypes
+Elektu la konsisterojn por instali:
+# ^ComponentsSubText2
+Aux, elektu la nedevigajn konsisterojn, kiujn vi deziras instali:
+# ^UnComponentsText
+Marku la konsisterojn, kiujn vi volas malinstali aux male. $_CLICK
+# ^UnComponentsSubText1
+Elektu la tipon de malinstalado:
+# ^UnComponentsSubText2_NoInstTypes
+Elektu la konsisterojn por malinstali:
+# ^UnComponentsSubText2
+Aux, elektu la nedevigajn konsisterojn, kiujn vi deziras malinstali:
+# ^DirText
+$(^NameDA) estos instalita en la jena dosierujo. Por instali en alia dosierujo, musklaku en 'Sercxi...' kaj elektu gxin. $_CLICK
+# ^DirSubText
+Celota Dosierujo
+# ^DirBrowseText
+Elektu dosierujon por instali $(^NameDA):
+# ^UnDirText
+$(^NameDA) estos malinstalita el la jena dosierujo. Por malinstali en alia dosierujo, musklaku en 'Sercxi...' kaj elektu gxin. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Elektu dosierujon el kie $(^NameDA) estos malinstalita:
+# ^SpaceAvailable
+"Disponebla spaco: "
+# ^SpaceRequired
+"Postulata spaco: "
+# ^UninstallingText
+$(^NameDA) estos malinstalita el la jena dosierujo. $_CLICK
+# ^UninstallingSubText
+Malinstalado el:
+# ^FileError
+Eraro dum malfermo de dosiero por skribi: \r\n\t"$0"\r\nMusklaku en Cxesigi por finigi la instaladon,\r\Ripeti por provi refoje skribi sur la dosiero, aux\r\nPreteratenti por preteratenti tiun cxi dosieron.
+# ^FileError_NoIgnore
+Eraro dum malfermo de dosierujo por skribi: \r\n\t"$0"\r\nMusklaku en Ripeti por provi refoje skribi sur la dosiero, aux\r\nNuligi por cxesigi la instaladon.
+# ^CantWrite
+"Ne eblis skribi: "
+# ^CopyFailed
+Malsukceso dum kopio
+# ^CopyTo
+"Kopii al "
+# ^Registering
+"Oni registras: "
+# ^Unregistering
+"Oni malregistras: "
+# ^SymbolNotFound
+"Ne trovita simbolo: "
+# ^CouldNotLoad
+"Ne eblis sxargi: "
+# ^CreateFolder
+"Oni kreas subdosierujon: "
+# ^CreateShortcut
+"Oni kreas lancxilon: "
+# ^CreatedUninstaller
+"Oni kreas malinstalilon: "
+# ^Delete
+"Oni forigas dosieron: "
+# ^DeleteOnReboot
+"Forigi je restarto: "
+# ^ErrorCreatingShortcut
+"Eraro dum kreo de lancxilo: "
+# ^ErrorCreating
+"Eraro dum kreo: "
+# ^ErrorDecompressing
+Eraro dum malkompaktigo de datumaro! Cxu misrompita instalilo?
+# ^ErrorRegistering
+Eraru dum registro de DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Lancxi: "
+# ^Extract
+"Eltiri: "
+# ^ErrorWriting
+"Eltirado: eraro dum skribo de dosiero "
+# ^InvalidOpcode
+Misrompita instalilo: malvalida operaci-kodo
+# ^NoOLE
+"Sen OLE por: "
+# ^OutputFolder
+"Celota dosierujo: "
+# ^RemoveFolder
+"Oni forigas la dosierujon: "
+# ^RenameOnReboot
+"Renomigi je restarto: "
+# ^Rename
+"Oni renomigas: "
+# ^Skipped
+"Preterpasita: "
+# ^CopyDetails
+Kopii detalojn al la tondejo
+# ^LogInstall
+Registri instalad-procezo
+# ^Byte
+B
+# ^Kilo
+k
+# ^Mega
+M
+# ^Giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Esperanto.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Esperanto.nsh
new file mode 100644
index 000000000..19d778f34
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Esperanto.nsh
@@ -0,0 +1,129 @@
+;Language: Esperanto (0)
+;By Felipe Castro
+
+!insertmacro LANGFILE "Esperanto" "Esperanto"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bonvenon al la Gvidilo por Instalado de $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Tiu cxi gvidilo helpos vin dum la instalado de $(^NameDA).$\r$\n$\r$\nOni rekomendas fermi cxiujn aliajn aplikajxojn antaux ol ekigi la Instaladon. Tio cxi ebligos al la Instalilo gxisdatigi la koncernajn dosierojn de la sistemo sen bezono restartigi la komputilon.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bonvenon al la Gvidilo por Malinstalado de $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Tiu cxi gvidilo helpos vin dum la malinstalado de $(^NameDA).$\r$\n$\r$\nAntaux ol ekigi la malinstalado, certigxu ke $(^NameDA) ne estas plenumata nun.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Permes-Kontrakto"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Bonvole, kontrolu la kondicxojn de la permesilo antaux ol instali la programon $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se vi akceptas la kondicxojn, musklaku en 'Akceptite' por dauxrigi. Vi devos akcepti la kontrakton por instali la programon $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se vi akceptas la permes-kondicxojn, musklaku la suban elekt-skatolon. Vi devos akcepti la kontrakton por instali la programon $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se vi akceptas la permes-kondicxojn, elektu la unuan opcion sube. Vi devas akcepti la kontrakton por instali la programon $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Permes-Kontrakto"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Bonvole, kontrolu la kondicxojn de la permesilo antaux ol malinstali la programon $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se vi akceptas la kondicxojn, musklaku en 'Akceptite' por dauxrigi. Vi devos akcepti la kontrakton por malinstali la programon $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se vi akceptas la permes-kondicxojn, musklaku la suban elekt-skatolon. Vi devos akcepti la kontrakton por malinstali la programon $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se vi akceptas la permes-kondicxojn, elektu la unuan opcion sube. Vi devas akcepti la kontrakton por malinstali la programon $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Premu 'Page Down' por rigardi la reston de la permeso."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Elekto de Konsisteroj"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Elektu kiujn funkciojn de $(^NameDA) vi deziras instali."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Priskribo"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Elekto de Konsisteroj"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Elektu kiujn funkciojn de $(^NameDA) vi deziras malinstali."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Poziciu la muson sur konsistero por rigardi ties priskribon."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Poziciu la muson sur konsistero por rigardi ties priskribon."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Elekto de la Instalada Loko"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Elektu la dosierujon en kiun vi deziras instali la programon $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Elekto de la Malinstalada Loko"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Elektu la dosierujon el kiu vi deziras malinstali la programon $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Oni instalas"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Bonvole, atendu dum $(^NameDA) estas instalata."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalado Plenumite"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instalado sukcese plenumigxis."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalado Cxesigite"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instalado ne plenumigxis sukcese."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Oni malinstalas"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Bonvole, atendu dum $(^NameDA) estas malinstalata."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Malinstalado Plenumite"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La malinstalado sukcese plenumigxis."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Malinstalado Cxesigxite"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La malinstalado ne plenumigxis sukcese."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Oni finigas la Gvidilon por Instalado de $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) estas instalita en via komputilo.$\r$\n$\r$\nMusklaku en Finigi por fermi tiun cxi gvidilon."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Via komputilo devas esti restartigita por kompletigi la instaladon de $(^NameDA). Cxu restartigi nun?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Oni finigas la Gvidilon por Malinstalado de $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) estis forigita el via komputilo.$\r$\n$\r$\nMusklaku en Finigi por fermi tiun cxi gvidilon."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Via komputilo devas esti restartigita por kompletigi la malinstaladon de $(^NameDA). Cxu restartigi nun?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Restartigi Nun"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Mi volas restartigi permane poste"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Lancxi $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Montri Legumin"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Finigi"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Elektu Dosierujon de la Ek-Menuo"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Elektu dosierujon de la Ek-Menuo por la lancxiloj de la programo."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Elektu dosierujon de la Ek-Menuo en kiu vi deziras krei la lancxilojn de la programo. Vi povas ankaux tajpi nomon por krei novan ujon."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ne krei lancxilojn"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Malinstali $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Forigi $(^NameDA) el via komputilo."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Cxu vi certe deziras nuligi la instaladon de $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Cxu vi certe deziras nuligi la malinstaladon de $(^Name)?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Elekti Uzantojn"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Elekti por kiuj uzantoj vi deziras instali $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Elektu cxu vi volas instali $(^NameDA) por vi mem aux por cxiuj uzantoj de tiu cxi komputilo. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instali por iu ajn uzanto de tiu cxi komputilo"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instali nur por mi"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Estonian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Estonian.nlf
new file mode 100644
index 000000000..0b80a01f6
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Estonian.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1061
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1257
+# RTL - anything else than RTL means LTR
+-
+# Translation by izzo (izzo@hot.ee)
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Paigaldamine
+# ^UninstallCaption
+$(^Name) Eemaldamine
+# ^LicenseSubCaption
+: Litsentsileping
+# ^ComponentsSubCaption
+: Paigaldusvalikud
+# ^DirSubCaption
+: Paigalduskaust
+# ^InstallingSubCaption
+: Paigaldan
+# ^CompletedSubCaption
+: Valmis
+# ^UnComponentsSubCaption
+: Eemaldusvalikud
+# ^UnDirSubCaption
+: Eemalduskaust
+# ^ConfirmSubCaption
+: Kinnitus
+# ^UninstallingSubCaption
+: Eemaldan
+# ^UnCompletedSubCaption
+: Valmis
+# ^BackBtn
+< Tagasi
+# ^NextBtn
+Edasi >
+# ^AgreeBtn
+Nõustun
+# ^AcceptBtn
+Nõustun litsentsilepingu tingimustega
+# ^DontAcceptBtn
+Ei nõustu litsentsilepingu tingimustega
+# ^InstallBtn
+Paigalda
+# ^UninstallBtn
+Eemalda
+# ^CancelBtn
+Loobu
+# ^CloseBtn
+Sule
+# ^BrowseBtn
+Sirvi...
+# ^ShowDetailsBtn
+Detailid
+# ^ClickNext
+Jätkamiseks vajuta Edasi.
+# ^ClickInstall
+Paigaldamise alustamiseks vajuta Paigalda.
+# ^ClickUninstall
+Eemaldamise alustamiseks vajuta Eemalda.
+# ^Name
+Nimi
+# ^Completed
+Valmis
+# ^LicenseText
+Enne $(^NameDA) paigaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, vajuta Nõustun.
+# ^LicenseTextCB
+Enne $(^NameDA) paigaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, vali allolev märkeruut. $_CLICK
+# ^LicenseTextRB
+Enne $(^NameDA) paigaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, märgi allpool esimene valik. $_CLICK
+# ^UnLicenseText
+Enne $(^NameDA) eemaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, vajuta Nõustun.
+# ^UnLicenseTextCB
+Enne $(^NameDA) eemaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, vali allolev märkeruut. $_CLICK
+# ^UnLicenseTextRB
+Enne $(^NameDA) eemaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, märgi allpool esimene valik. $_CLICK
+# ^Custom
+Kohandatud
+# ^ComponentsText
+Märgista komponendid mida soovid paigaldada ja eemalda märgistus neilt, mida ei soovi paigaldada. $_CLICK
+# ^ComponentsSubText1
+Vali paigalduse tüüp:
+# ^ComponentsSubText2_NoInstTypes
+Vali paigaldatavad komponendid:
+# ^ComponentsSubText2
+või vali lisakomponendid mida soovid paigaldada:
+# ^UnComponentsText
+Märgista komponendid mida soovid eemaldada ja eemalda märgistus neilt, mida ei soovi eemaldada. $_CLICK
+# ^UnComponentsSubText1
+Vali eemalduse tüüp:
+# ^UnComponentsSubText2_NoInstTypes
+Vali eemaldatavad komponendid:
+# ^UnComponentsSubText2
+või vali lisakomponendid mida soovid eemaldada:
+# ^DirText
+$(^NameDA) paigaldatakse järgmisse kausta. Et mujale paigaldada, vajuta sirvi ja vali teine kaust. $_CLICK
+# ^DirSubText
+Sihtkaust
+# ^DirBrowseText
+Vali kaust kuhu $(^NameDA) paigaldada:
+# ^UnDirText
+$(^NameDA) eemaldatakse järgmisest kaustast. Et mujalt eemaldada, vajuta sirvi ja vali teine kaust. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Vali kaust kust $(^NameDA) eemaldada:
+# ^SpaceAvailable
+"Vaba ruum: "
+# ^SpaceRequired
+"Vajalik ruum: "
+# ^UninstallingText
+$(^NameDA) eemaldatakse järgmisest kaustast. $_CLICK
+# ^UninstallingSubText
+Eemaldan sealt:
+# ^FileError
+Tõrge faili avamisel kirjutamiseks: \r\n\t"$0"\r\nPaigalduse katkestamiseks vajuta Katkesta,\r\nvajuta Ürita uuesti, et faili kirjutamist uuesti proovida, või\r\nIgnoreeri, et see fail vahele jätta.
+# ^FileError_NoIgnore
+Tõrge faili avamisel kirjutamiseks: \r\n\t"$0"\r\nVajuta Ürita uuesti, et faili kirjutamist uuesti proovida, või\r\nLoobu, et paigaldamine katkestada
+# ^CantWrite
+"Ei saa kirjutada: "
+# ^CopyFailed
+Kopeerimine ebaõnnestus
+# ^CopyTo
+"Kopeeri sinna "
+# ^Registering
+"Registreerin: "
+# ^Unregistering
+"Deregistreerin: "
+# ^SymbolNotFound
+"Ei leidnud sümbolit: "
+# ^CouldNotLoad
+"Ei saanud laadida: "
+# ^CreateFolder
+"Loo kaust: "
+# ^CreateShortcut
+"Loo otsetee: "
+# ^CreatedUninstaller
+"Loodud eemaldaja: "
+# ^Delete
+"Kustuta fail: "
+# ^DeleteOnReboot
+"Kustuta taaskäivitamisel: "
+# ^ErrorCreatingShortcut
+"Tõrge otsetee loomisel: "
+# ^ErrorCreating
+"Tõrge loomisel: "
+# ^ErrorDecompressing
+Tõrge andmete lahtipakkimisel! Vigane paigaldaja?
+# ^ErrorRegistering
+Tõrge DLL-i registreerimisel
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Käivita: "
+# ^Extract
+"Paki lahti: "
+# ^ErrorWriting
+"Paki lahti: viga faili kirjutamisel "
+# ^InvalidOpcode
+Paigaldaja kõlbmatu: vigane opkood
+# ^NoOLE
+"No OLE for: "
+# ^OutputFolder
+"Väljastatav kaust: "
+# ^RemoveFolder
+"Eemalda kaust: "
+# ^RenameOnReboot
+"Taaskäivitusel nimeta ümber: "
+# ^Rename
+"Nimeta ümber: "
+# ^Skipped
+"Vahele jäetud: "
+# ^CopyDetails
+Kopeeri detailid lõikelauale
+# ^LogInstall
+Logi paigaldusprotsess
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Estonian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Estonian.nsh
new file mode 100644
index 000000000..c582b87f2
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Estonian.nsh
@@ -0,0 +1,121 @@
+;Language: Estonian (1061)
+;Translated by johnny izzo (izzo@hot.ee)
+
+!insertmacro LANGFILE "Estonian" "Eesti keel"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) paigaldamine!"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "See abiline aitab paigaldada $(^NameDA).$\r$\n$\r$\nEnne paigaldamise alustamist on soovitatav kõik teised programmid sulgeda, see võimaldab teatud süsteemifaile uuendada ilma arvutit taaskäivitamata.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) eemaldamine!"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "See abiline aitab eemaldada $(^NameDA).$\r$\n$\r$\nEnne eemaldamist vaata, et $(^NameDA) oleks suletud.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Litsentsileping"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Enne $(^NameDA) paigaldamist vaata palun litsentsileping üle."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Kui sa oled lepingu tingimustega nõus, vali jätkamiseks Nõustun. $(^NameDA) paigaldamiseks pead sa lepinguga nõustuma."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Kui nõustud lepingu tingimustega, vali allolev märkeruut. $(^NameDA) paigaldamiseks pead lepinguga nõustuma. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kui nõustud lepingu tingimustega, märgi allpool esimene valik. $(^NameDA) paigaldamiseks pead lepinguga nõustuma. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Litsentsileping"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Enne $(^NameDA) eemaldamist vaata palun litsentsileping üle."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Kui sa oled lepingu tingimustega nõus, vali jätkamiseks Nõustun. $(^NameDA) eemaldamiseks pead sa lepinguga nõustuma."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Kui nõustud lepingu tingimustega, vali allolev märkeruut. $(^NameDA) eemaldamiseks pead lepinguga nõustuma. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kui nõustud lepingu tingimustega, märgi allpool esimene valik. $(^NameDA) eemaldamiseks pead lepinguga nõustuma. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Vajuta Page Down, et näha ülejäänud teksti."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Vali komponendid"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Vali millised $(^NameDA) osad sa soovid paigaldada."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Kirjeldus"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Vali komponendid"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Vali millised $(^NameDA) osad sa soovid eemaldada."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Nihuta hiir komponendile, et näha selle kirjeldust."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Nihuta hiir komponendile, et näha selle kirjeldust."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Vali asukoht"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Vali kaust kuhu paigaldada $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Vali asukoht"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Vali kaust kust $(^NameDA) eemaldada."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Paigaldan..."
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Palun oota kuni $(^NameDA) on paigaldatud."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Programm paigaldatud"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Paigaldus edukalt sooritatud."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Paigaldus katkestatud"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Paigaldamine ebaõnnestus."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Eemaldan..."
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Palun oota kuni $(^NameDA) on eemaldatud."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Eemaldamine lõpetatud"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Eemaldamine edukalt lõpule viidud."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Eemaldamine katkestatud"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Eemaldamine ebaõnestus."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) paigalduse lõpule viimine."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) on sinu arvutisse paigaldatud.$\r$\n$\r$\nAbilise sulgemiseks vajuta Lõpeta."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) täielikuks paigaldamiseks tuleb arvuti taaskäivitada. Kas soovid arvuti kohe taaskäivitada ?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) eemaldamise lõpule viimine."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) on sinu arvutist eemaldatud.$\r$\n$\r$\nAbilise sulgemiseks vajuta Lõpeta."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) täielikuks eemaldamiseks tuleb arvuti taaskäivitada. Kas soovid arvuti kohe taaskäivitada ?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Taaskäivita kohe"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Taaskäivitan hiljem käsitsi"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "Käivita $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Kuva Loemind"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "Lõpeta"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Vali Start-menüü kaust"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Vali $(^NameDA) otseteede jaoks Start-menüü kaust."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vali Start-menüü kaust, kuhu soovid paigutada programmi otseteed. Võid ka sisestada nime, et luua uus kaust."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ära loo otseteid"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Eemalda $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Eemalda $(^NameDA) oma arvutist."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Oled sa kindel et soovid $(^Name) paigaldamise katkestada?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Oled sa kindel et soovid $(^Name) eemaldamise katkestada?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Farsi.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Farsi.nlf
new file mode 100644
index 000000000..f52319978
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Farsi.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1065
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1256
+# RTL - anything else than RTL means LTR
+RTL
+# Translation By FzerorubigD - FzerorubigD@gmail.com - Thanx to all people help me in forum.persiantools.com, Elnaz Sarbar
+# ^Branding
+ÓíÓÊã äÕÈ äÇáÓÇÝÊ %s
+# ^SetupCaption
+äÕÈ $(^Name)
+# ^UninstallCaption
+ÍÐÝ $(^Name)
+# ^LicenseSubCaption
+: ãÌæÒ äÕÈ
+# ^ComponentsSubCaption
+: ÒíäååÇì äÕÈ
+# ^DirSubCaption
+: æÔå äÕÈ
+# ^InstallingSubCaption
+: ÏÑ ÍÇá äÕÈ
+# ^CompletedSubCaption
+: ÇíÇä íÇÝÊ
+# ^UnComponentsSubCaption
+: ÒíäååÇì ÍÐÝ
+# ^UnDirSubCaption
+: æÔå ÍÐÝ
+# ^ConfirmSubCaption
+: ÊÃííÏ
+# ^UninstallingSubCaption
+: ÏÑ ÍÇá ÍÐÝ
+# ^UnCompletedSubCaption
+: ÇíÇä íÇÝÊ
+# ^BackBtn
+&ÞÈá
+# ^NextBtn
+&ÈÚÏ
+# ^AgreeBtn
+&ãæÇÝÞã
+# ^AcceptBtn
+ãä åãå ÈäÏåÇì ãÌæÒ ÑÇ ÞÈæá &ÏÇÑã
+# ^DontAcceptBtn
+ãä ÈäÏåÇì ãÌæÒ ÑÇ ÞÈæá &äÏÇÑã
+# ^InstallBtn
+&äÕÈ
+# ^UninstallBtn
+&ÍÐÝ
+# ^CancelBtn
+ÇäÕÑÇÝ
+# ^CloseBtn
+&ÈÓÊä
+# ^BrowseBtn
+&ãÑæÑ...
+# ^ShowDetailsBtn
+äãÇíÔ ÌÒÆíÇÊ
+# ^ClickNext
+ÈÑÇì ÇÏÇãå Ñæì Ϙãå ÈÚÏ ˜áí˜ ˜äíÏ.
+# ^ClickInstall
+ÈÑÇì ÔÑæÚ äÕÈ Ñæì Ϙãå äÕÈ ˜áí˜ ˜äíÏ.
+# ^ClickUninstall
+ÈÑÇì ÔÑæÚ ÍÐÝ Ñæì Ϙãå ÍÐÝ ˜áí˜ ˜äíÏ.
+# ^Name
+äÇã
+# ^Completed
+ÇíÇä íÇÝÊ
+# ^LicenseText
+áØÝÇð ÞÈá ÇÒ äÕÈ $(^NameDA) ãÊä ãÌæÒ ÑÇ ÈÎæÇäíÏ. ÇÑ åãå ÈäÏåÇì Âä ÑÇ ÞÈæá ÏÇÑíÏ Ñæì Ϙãå ãæÇÝÞã ˜áí˜ ˜äíÏ.
+# ^LicenseTextCB
+áØÝÇð ÞÈá ÇÒ äÕÈ $(^NameDA) ãÊä ãÌæÒ ÑÇ ÈÎæÇäíÏ. ÇÑ åãå ÈäÏåÇì Âä ÑÇ ÞÈæá ÏÇÑíÏ Ñæì ÌÚÈå äÔÇäåÒäì ÒíÑ ˜áí˜ ˜äíÏ. $_CLICK
+# ^LicenseTextRB
+áØÝÇð ÞÈá ÇÒ äÕÈ $(^NameDA) ãÊä ãÌæÒ ÑÇ ÈÎæÇäíÏ. ÇÑ åãå ÈäÏåÇì Âä ÑÇ ÞÈæá ÏÇÑíÏ Òíäå Çæá ÑÇ ÇäÊÎÇÈ ˜äíÏ. $_CLICK
+# ^UnLicenseText
+áØÝÇð ÞÈá ÇÒ ÍÐÝ $(^NameDA) ãÊä ãÌæÒ ÑÇ ÈÎæÇäíÏ. ÇÑ åãå ÈäÏåÇì Âä ÑÇ ÞÈæá ÏÇÑíÏ Ñæì Ϙãå ãæÇÝÞã ˜áí˜ ˜äíÏ.
+# ^UnLicenseTextCB
+áØÝÇð ÞÈá ÇÒ ÍÐÝ $(^NameDA) ãÊä ãÌæÒ ÑÇ ÈÎæÇäíÏ. ÇÑ åãå ÈäÏåÇì Âä ÑÇ ÞÈæá ÏÇÑíÏ Ñæì ÌÚÈå äÔÇäåÒäì ÒíÑ ˜áí˜ ˜äíÏ. $_CLICK
+# ^UnLicenseTextRB
+áØÝÇð ÞÈá ÇÒ ÍÐÝ $(^NameDA) ãÊä ãÌæÒ ÑÇ ÈÎæÇäíÏ. ÇÑ åãå ÈäÏåÇì Âä ÑÇ ÞÈæá ÏÇÑíÏ Òíäå Çæá ÑÇ ÇäÊÎÇÈ ˜äíÏ. $_CLICK
+# ^Custom
+ÓÝÇÑÔì
+# ^ComponentsText
+˜äÇÑ ÈÎÔåÇíì ˜å ãìÎæÇåíÏ äÕÈ ÔæäÏ äÔÇäå ÈÒäíÏ æ äÔÇäå ÈÎÔåÇíì ÑÇ ˜å äãìÎæÇåíÏ äÕÈ ÔæäÏ ÈÑÏÇÑíÏ. $_CLICK
+# ^ComponentsSubText1
+äæÚ äÕÈ ÑÇ ãÔÎÕ ˜äíÏ:
+# ^ComponentsSubText2_NoInstTypes
+ÈÎÔåÇíì ÑÇ ˜å ãìÎæÇåíÏ äÕÈ ÔæäÏ ÇäÊÎÇÈ ˜äíÏ:
+# ^ComponentsSubText2
+íÇ¡ ÈÎÔåÇì ÇÎÊíÇÑì ÑÇ ˜å ãìÎæÇåíÏ äÕÈ ÔæäÏ ÇäÊÎÇÈ ˜äíÏ:
+# ^UnComponentsText
+˜äÇÑ ÈÎÔåÇíì ˜å ãìÎæÇåíÏ ÍÐÝ ÔæäÏ äÔÇäå ÈÒäíÏ æ äÔÇäå ÈÎÔåÇíì ÑÇ ˜å äãìÎæÇåíÏ ÍÐÝ ÔæäÏ ÈÑÏÇÑíÏ. $_CLICK
+# ^UnComponentsSubText1
+äæÚ ÍÐÝ ÑÇ ÇäÊÎÇÈ ˜äíÏ:
+# ^UnComponentsSubText2_NoInstTypes
+ÈÎÔåÇíì ÑÇ ˜å ãìÎæÇåíÏ ÍÐÝ ÔæäÏ ÇäÊÎÇÈ ˜äíÏ:
+# ^UnComponentsSubText2
+íÇ¡ ÈÎÔåÇì ÇÎÊíÇÑì ÑÇ ˜å ãìÎæÇåíÏ ÍÐÝ ÔæäÏ ÇäÊÎÇÈ ˜äíÏ:
+# ^DirText
+ÈÑäÇãå äÕÈ¡ $(^NameDA) ÑÇ ÏÑ æÔå ÒíÑ äÕÈ ÎæÇåÏ ˜ÑÏ. ÈÑÇì äÕÈ ÏÑ æÔå ÏíÑ Ñæì Ϙãå ãÑæÑ ˜áí˜ ˜äíÏ æ æÔå ÏíÑì ÇäÊÎÇÈ ˜äíÏ. $_CLICK
+# ^DirSubText
+æÔå ãÞÕÏ
+# ^DirBrowseText
+ÇäÊÎÇÈ æÔå ÈÑÇì äÕÈ $(^NameDA):
+# ^UnDirText
+ÈÑäÇãå äÕÈ¡ $(^NameDA) ÑÇ ÇÒ æÔå ÒíÑ ÍÐÝ ÎæÇåÏ ˜ÑÏ. ÈÑÇì äÕÈ ÏÑ æÔå ÏíÑ Ñæì Ϙãå ãÑæÑ ˜áí˜ ˜äíÏ æ æÔå ÏíÑì ÇäÊÎÇÈ ˜äíÏ. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+ÇäÊÎÇÈ æÔå ÈÑÇì ÍÐÝ $(^NameDA):
+# ^SpaceAvailable
+"ÝÖÇì ãæÌæÏ: "
+# ^SpaceRequired
+"ÝÖÇì ãæÑÏ äíÇÒ: "
+# ^UninstallingText
+þ(^NameDA) ÇÒ æÔå ÒíÑ ÍÐÝ ÎæÇåÏ ÔÏ. $_CLICK
+# ^UninstallingSubText
+ÍÐÝ ÇÒ:
+# ^FileError
+ÎØÇ åäÇã ÈÇÒ ˜ÑÏä ÑæäÏå ÈÑÇì äæÔÊä: \r\n\r\n$0\r\n\n ÈÑÇì ÊæÞÝ äÕÈ Ñæì Abort \r\n ÈÑÇì ÊáÇÔ ãÌÏÏ Ñæì Retry \r\n æ ÈÑÇì ÕÑÝäÙÑ ÇÒ Çíä ÑæäÏå Ñæì Ignore ˜áí˜ ˜äíÏ.
+# ^FileError_NoIgnore
+ÎØÇ åäÇã ÈÇÒ ˜ÑÏä ÑæäÏå ÈÑÇì äæÔÊä: \r\n\r\n$0\r\n\nÈÑÇì ÊáÇÔ ãÌÏÏ Ñæì Retry\r\næ ÈÑÇì ÇäÕÑÇÝ Ñæì Cancel ˜áí˜ ˜äíÏ.
+# ^CantWrite
+"äæÔÊä ãã˜ä äíÓÊ: "
+# ^CopyFailed
+äÓÎåÈÑÏÇÑì äÇãæÝÞ ÈæÏ.
+# ^CopyTo
+"äÓÎåÈÑÏÇÑì ÏÑ: "
+# ^Registering
+"ÏÑ ÍÇá ËÈÊ: "
+# ^Unregistering
+"ÏÑ ÍÇá ÍÐÝ ËÈÊ: "
+# ^SymbolNotFound
+"ÚáÇãÊ íÏÇ äÔÏ: "
+# ^CouldNotLoad
+"ÈÇÑÐÇÑì ãã˜ä äíÓÊ: "
+# ^CreateFolder
+"ÇíÌÇÏ æÔå: "
+# ^CreateShortcut
+"ÇíÌÇÏ ãíÇäÈõÑ: "
+# ^CreatedUninstaller
+"ÍÐݘääÏå ÇíÌÇÏ ÔÏ: "
+# ^Delete
+"ÍÐÝ ÑæäÏå: "
+# ^DeleteOnReboot
+"ÍÐÝ åäÇã ÑÇå ÇäÏÇÒì ãÌÏÏ: "
+# ^ErrorCreatingShortcut
+"ÎØÇ åäÇã ÇíÌÇÏ ãíÇäÈõÑ: "
+# ^ErrorCreating
+"ÎØÇ åäÇã ÇíÌÇÏ: "
+# ^ErrorDecompressing
+ÎØÇ åäÇã ÈÇÒ ˜ÑÏä ÇØáÇÚÇÊ! äÕȘääÏå ÎÑÇÈ ÇÓÊ¿
+# ^ErrorRegistering
+ÎØÇ åäÇã ËÈÊ DLL
+# ^ExecShell
+"æÓÊå ÇÌÑÇíì: "
+# ^Exec
+"ÇÌÑÇ: "
+# ^Extract
+"ÇÓÊÎÑÇÌ: "
+# ^ErrorWriting
+"ÇÓÊÎÑÇÌ: ÎØÇ åäÇã äæÔÊä ÏÑ ÑæäÏå"
+# ^InvalidOpcode
+äÕȘääÏå ÎÑÇÈ ÇÓÊ: ˜Ï ÚãáíÇÊì äÇãÚÊÈÑ.
+# ^NoOLE
+"þOLE æÌæÏ äÏÇÑÏ: "
+# ^OutputFolder
+"æÔå ÎÑæÌì: "
+# ^RemoveFolder
+"ÍÐÝ æÔå: "
+# ^RenameOnReboot
+"ÊÛííÑ äÇã åäÇã ÑÇå ÇäÏÇÒì ãÌÏÏ: "
+# ^Rename
+"ÊÛííÑ äÇã: "
+# ^Skipped
+"Ôã æÔì ÔÏ: "
+# ^CopyDetails
+äÓÎåÈÑÏÇÑì ÌÒÆíÇÊ ÏÑ ˜áíÈÑÏ
+# ^LogInstall
+ËÈÊ ÑæäÏ äÕÈ
+# ^Byte
+ ÈÇíÊ
+# ^Kilo
+ ˜íáæ
+# ^Mega
+ ãÇ
+# ^Giga
+ íÇ
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Farsi.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Farsi.nsh
new file mode 100644
index 000000000..4c3e3aabf
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Farsi.nsh
@@ -0,0 +1,121 @@
+;Language: Farsi (1065)
+;By FzerorubigD - FzerorubigD@gmail.com - Thanx to all people help me in forum.persiantools.com
+
+!insertmacro LANGFILE "Farsi" "Farsi"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Èå ÈÑäÇãå äÕÈ $(^NameDA) ÎæÔ ÂãÏíÏ."
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Çíä ÈÑäÇãå ÔãÇ ÑÇ ÏÑ äÕÈ $(^NameDA) íÇÑí ãíßäÏ.$\r$\n$\r$\nÊæÕíå ãíßäíã ßáíå ÈÑäÇãå åÇí ÏÑ ÍÇá ÇÌÑÇ ÑÇ ÈÈäÏíÏ. Çíä Èå ÈÑäÇãå äÕÈ ÇÌÇÒå ãíÏåÏ ßå ÝÇíáåÇí áÇÒã ÑÇ ÈÏæä äíÇÒ Èå ÑÇå ÇäÏÇÒí ÏæÈÇÑå ßÇãíæÊÑ ÔãÇ Èå ÑæÒ ßäÏ.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Èå ÈÑäÇãå ÍÐÝ $(^NameDA) ÎæÔ ÂãÏíÏ."
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT " Çíä ÈÑäÇãå ÈÑÇí ÍÐÝ $(^NameDA) Èå ÔãÇ ßãß ãíßäÏ.$\r$\n$\r$\nÞÈá ÇÒ ÍÐÝ $(^NameDA) ãØãÆä ÔæíÏ Çíä ÈÑäÇãå ÏÑ ÍÇá ÇÌÑÇ äÈÇÔÏ.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "ÊæÇÝÞäÇãå äÕÈ"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "áØÝÇ íÔ ÇÒ äÕÈ $(^NameDA) ãÝÇÏ ÊæÇÝÞäÇãå ÑÇ ãÑæÑ ßäíÏ."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "ÇÑ ßáíå ÈäÏåÇí ÊæÇÝÞäÇãå ÑÇ ÞÈæá ÏÇÑíÏ Ïßãå ãæÇÝÞã ÑÇ ÈÝÔÇÑíÏ. ÈÑÇí äÕÈ $(^NameDA) ÔãÇ ÈÇíÓÊ Çíä ÊæÇÝÞäÇãå ÑÇ ÞÈæá ßäíÏ."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "ÇÑ ßáíå ÈäÏåÇí ÊæÇÝÞäÇãå ÑÇ ÞÈæá ÏÇÑíÏ Êíß ÒíÑ ÑÇ ÇäÊÎÇÈ ßäíÏ. ÈÑÇí äÕÈ $(^NameDA) ÔãÇ ÈÇíÓÊ Çíä ÊæÇÝÞäÇãå ÑÇ ÞÈæá ßäíÏ. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ÇÑ ßáíå ÈäÏåÇí ÊæÇÝÞäÇãå ÑÇ ÞÈæá ÏÇÑíÏ Òíäå Çæá ÑÇ ÇäÊÎÇÈ ßäíÏ. ÈÑÇí äÕÈ $(^NameDA) ÔãÇ ÈÇíÓÊ Çíä ÊæÇÝÞäÇãå ÑÇ ÞÈæá ßäíÏ. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "ÊæÇÝÞäÇãå ÍÐÝ"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "áØÝÇ ßáíå ÈäÏåÇí Çíä ÊæÇÝÞäÇãå ÑÇ ÞÈá ÇÑ ÍÐÝ $(^NameDA) ãÑæÑ ßäíÏ."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "ÇÑ ßáíå ÈäÏåÇí ÊæÇÝÞäÇãå ÑÇ ÞÈæá ÏÇÑíÏ Ïßãå ãæÇÝÞã ÑÇ ÈÝÔÇÑíÏ. ÈÑÇí ÍÐÝ $(^NameDA) ÔãÇ ÈÇíÓÊ Çíä ÊæÇÝÞäÇãå ÑÇ ÞÈæá ßäíÏ."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "ÇÑ ßáíå ÈäÏåÇí ÊæÇÝÞäÇãå ÑÇ ÞÈæá ÏÇÑíÏ Êíß ÒíÑ ÑÇ ÇäÊÎÇÈ ßäíÏ. ÈÑÇí ÍÐÝ $(^NameDA) ÔãÇ ÈÇíÓÊ Çíä ÊæÇÝÞäÇãå Ñ ÞÈæá ßäíÏ. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ÇÑ ßáíå ÈäÏåÇí ÊæÇÝÞäÇãå ÑÇ ÞÈæá ÏÇÑíÏ Òíäå Çæá ÑÇ ÇäÊÎÇÈ ßäíÏ. ÈÑÇí ÍÐÝ $(^NameDA) ÔãÇ ÈÇíÓÊ Çíä ÊæÇÝÞäÇãå Ñ ÞÈæá ßäíÏ. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ÈÑÇí ÏíÏä ãÊä Èå ÕæÑÊ ßÇãá ÇÒ ßáíÏ Page Down ÇÓÊÝÇÏå ßäíÏ."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "ÇäÊÎÇÈ ÇÌÒÇí ÈÑäÇãå "
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "ÇÌÒÇíí ÇÒ $(^NameDA) ßå ãíÎæÇåíÏ äÕÈ ÔæäÏ ÑÇ ÇäÊÎÇÈ ßäíÏ."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ÊæÖíÍÇÊ"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "ÇäÊÎÇÈ ÇÌÒÇí ÈÑäÇãå"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "ÇÌÒÇíí ÇÒ $(^NameDA) ÑÇ ßå ãíÎæÇåíÏ ÍÐÝ ßäíÏ ÇäÊÎÇÈ ßäíÏ."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "äÔÇäÑ ãÇæÓ ÑÇ ÈÑ Ñæí ÇÌÒÇíí ßå ãíÎæÇåíÏ ÈÈÑíÏ ÊÇ ÊæÖíÍÇÊ Âä ÑÇ ÈÈíäíÏ."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "äÔÇäÑ ãÇæÓ ÑÇ ÈÑ Ñæí ÇÌÒÇíí ßå ãíÎæÇåíÏ ÈÈÑíÏ ÊÇ ÊæÖíÍÇÊ Âä ÑÇ ÈÈíäíÏ."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "ÇäÊÎÇÈ æÔå äÕÈ"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "æÔå Çí ßå ãíÎæÇåíÏ $(^NameDA) ÏÑ Âä äÕÈ ÔæÏ ÑÇ ÇäÊÎÇÈ ßäíÏ."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "æÔå ÍÐÝ ÑÇ ÇäÊÎÇÈ ßäíÏ"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "æÔå Çí ßå ãíÎæÇåíÏ $(^NameDA) ÑÇ ÇÒ Âä ÍÐÝ ßäíÏ ÇäÊÎÇÈ ßäíÏ."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "äÕÈ ÈÑäÇãå"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "áØÝÇ ãÏÊ ÒãÇäí ßå $(^NameDA) ÏÑ ÍÇá äÕÈ ÇÓÊ ÑÇ ÕÈÑ ßäíÏ."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "äÕÈ ÇíÇä íÇÝÊ"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "ÈÑäÇãå äÕÈ ÈÇ ãæÝÞíÊ ÇíÇä íÇÝÊ."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "ÈÑäÇãå äÕÈ áÛæ ÔÏ."
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ÈÑäÇãå äÕÈ Èå ÕæÑÊ äíãå ÊãÇã ÇíÇä íÇÝÊ."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "ÍÐÝ ÈÑäÇãå"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "áØÝÇ ãÏÊ ÒãÇäí ßå $(^NameDA) ÏÑ ÍÇá ÍÐÝ ÇÓÊ ÑÇ ÕÈÑ ßäíÏ."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "ÍÐÝ ÇíÇä íÇÝÊ"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "ÈÑäÇãå ÍÐÝ ÈÇ ãæÝÞíÊ ÇíÇä íÇÝÊ."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "ÈÑäÇãå ÍÐÝ áÛæ ÔÏ"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "ÈÑäÇãå ÍÐÝ Èå ÕæÑÊ äíãå ÊãÇã ÇíÇä íÇÝÊ"
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "ÈÑäÇãå äÕÈ $(^NameDA) ÇíÇä íÇÝÊ"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ÈÑ Ñæí ßÇãíæÊÑ ÔãÇ äÕÈ ÔÏ.$\r$\n$\r$\nÈÑ Ñæí Ïßãå ÇíÇä ÈÑÇí ÎÑæÌ ÇÒ Çíä ÈÑäÇãå ßáíß ßäíÏ."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "ßÇãíæÊÑ ÔãÇ ÈÑÇí Êßãíá äÕÈ $(^NameDA) ÈÇíÓÊí ÏæÈÇÑå ÑÇå ÇäÏÇÒí ÔæÏ. ÂíÇ ãíÎæÇåíÏ Çíä ßÇÑ ÑÇ ÇáÇä ÇäÌÇã ÏåíÏ¿"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "ÈÑäÇãå ÍÐÝ $(^NameDA) ÇíÇä íÇÝÊ"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ÇÒ Ñæí ßÇãíæÊÑ ÔãÇ ÍÐÝ ÔÏ.$\r$\n$\r$\nÈÑ Ñæí Ïßãå ÇíÇä ÈÑÇí ÎÑæÌ ÇÒ Çíä ÈÑäÇãå ßáíß ßäíÏ."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "ßÇãíæÊÑ ÔãÇ ÈÑÇí Êßãíá ÍÐÝ$(^NameDA) ÈÇíÓÊ ÏæÈÇÑå ÑÇå ÇäÏÇÒí ÔæÏ.ÂíÇ ãíÎæÇåíÏ Çíä ßÇÑ ÑÇ ÇáÇä ÇäÌÇã ÏåíÏ¿"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "ÑÇå ÇäÏÇÒí ãÌÏÏ."
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "ãä ÎæÏã Çíä ßÇÑ ÑÇ ÇäÌÇã ÎæÇåã ÏÇÏ."
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&ÇÌÑÇí $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&äãÇíÔ ÝÇíá ÊæÖíÍÇÊ"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&ÇíÇä"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "ÇäÊÎÇÈ æÔå ÏÑ ãäæí ÈÑäÇãå åÇ"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "æÔå Çí ßå ãíÎæÇåíÏ ãíÇäÈÑåÇí $(^NameDA) ÏÑ Âä ÞÑÇÑ ÈíÑäÏ ÑÇ ÇäÊÎÇÈ ßäíÏ."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "æÔå Çí ÏÑ ãäæí ÈÑäÇãå åÇ ßå ãíÎæÇåíÏ ãíÇäÈÑåÇí ÈÑäÇãå ÏÑ ÂäÌÇ ÇíÌÇÏ ÔæäÏ ÑÇ ÇäÊÎÇÈ ßäíÏ. ÈÑÇí ÇíÌÇÏ íß æÔå ÌÏíÏ ãíÊæÇäíÏ íß äÇã ÊÇí ßäíÏ."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "ãíÇäÈÑí äÓÇÒ"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "ÍÐÝ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Çß ßÑÏä $(^NameDA) ÇÒ Ñæí ßÇãíæÊÑ ÔãÇ."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "ÂíÇ ãØãÆäíÏ ßå ãíÎæÇåíÏ ÇÒ ÈÑäÇãå äÕÈ $(^Name) ÎÇÑÌ ÔæíÏ¿"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "ÂíÇ ãØãÆäíÏ ßå ãíÎæÇåíÏ ÇÒ ÈÑäÇãå ÍÐÝ $(^Name) ÎÇÑÌ ÔæíÏ¿"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Finnish.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Finnish.nlf
new file mode 100644
index 000000000..d6e558b20
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Finnish.nlf
@@ -0,0 +1,192 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1035
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Eclipser (Jonne Lehtinen)
+# Corrections by the Mozilla.fi crew
+# ^Branding
+Nullsoftin asennusjärjestelmä %s
+# ^SetupCaption
+$(^Name) Asennus
+# ^UninstallCaption
+$(^Name) Poisto
+# ^LicenseSubCaption
+: Lisenssisopimus
+# ^ComponentsSubCaption
+: Asennusvaihtoehdot
+# ^DirSubCaption
+: Asennuskansio
+# ^InstallingSubCaption
+: Asennetaan
+# ^CompletedSubCaption
+: Valmis
+# ^UnComponentsSubCaption
+: Poistovaihtoehdot
+# ^UnDirSubCaption
+: Poistokansio
+# ^ConfirmSubCaption
+: Varmistus
+# ^UninstallingSubCaption
+: Poistetaan
+# ^UnCompletedSubCaption
+: Valmis
+# ^BackBtn
+< &Takaisin
+# ^NextBtn
+&Seuraava >
+# ^AgreeBtn
+&Hyväksyn
+# ^AcceptBtn
+Hyväksyn lisenssisopimuksen ehdot
+# ^DontAcceptBtn
+En hyväksy sopimuksen ehtoja
+# ^InstallBtn
+&Asenna
+# ^UninstallBtn
+&Poista
+# ^CancelBtn
+Peruuta
+# ^CloseBtn
+&Sulje
+# ^BrowseBtn
+S&elaa...
+# ^ShowDetailsBtn
+&Näytä tiedot
+# ^ClickNext
+Valitse Seuraava jatkaaksesi.
+# ^ClickInstall
+Valitse Asenna aloittaaksesi asennuksen.
+# ^ClickUninstall
+Valitse Poista poistaaksesi asennuksen.
+# ^Name
+Nimi
+# ^Completed
+Valmis
+# ^LicenseText
+Lue lisenssisopimus ennen asentamista. Jos hyväksyt sopimuksen kaikki ehdot, valitse Hyväksyn.
+# ^LicenseTextCB
+Lue lisenssisopimus ennen asentamista. Jos hyväksyt sopimuksen kaikki ehdot, laita rasti ruutuun. $_CLICK
+# ^LicenseTextRB
+Lue lisenssisopimus ennen asentamista. Jos hyväksyt sopimuksen kaikki ehdot, valitse ensimmäinen vaihtoehto alapuolelta. $_CLICK
+# ^UnLicenseText
+Lue lisenssisopimus ennen poistamista. Jos hyväksyt sopimuksen kaikki ehdot, valitse Hyväksyn.
+# ^UnLicenseTextCB
+Lue lisenssisopimus ennen poistamista. Jos hyväksyt sopimuksen kaikki ehdot, laita rasti ruutuun. $_CLICK
+# ^UnLicenseTextRB
+Lue lisenssisopimus ennen poistamista. Jos hyväksyt sopimuksen kaikki ehdot, valitse ensimmäinen vaihtoehto alapuolelta. $_CLICK
+# ^Custom
+Oma
+# ^ComponentsText
+Valitse komponentit, jotka haluat asentaa, ja poista valinta komponenteista, joita et halua asentaa. $_CLICK
+# ^ComponentsSubText1
+Valitse asennustyyppi:
+# ^ComponentsSubText2_NoInstTypes
+Valitse asennettavat komponentit:
+# ^ComponentsSubText2
+Tai, valitse valinnaiset komponentit, jotka haluat asentaa:
+# ^UnComponentsText
+Valitse komponentit, jotka haluat poistaa, ja poista valinta komponenteista, joita et haluat poistaa. $_CLICK
+# ^UnComponentsSubText1
+Valitse poistotyyppi:
+# ^UnComponentsSubText2_NoInstTypes
+Valitse poistettavat komponentit:
+# ^UnComponentsSubText2
+Tai, valitse valinnaiset komponentit, jotka haluat poistaa
+# ^DirText
+Asennus asentaa ohjelman $(^NameDA) seuraavaan kansioon. Jos haluat asentaa sen johonkin muuhun kansioon, valitse Selaa, ja valitse toinen kansio. $_CLICK
+# ^DirSubText
+Kohdekansio
+# ^DirBrowseText
+Valitse kansio, johon haluat asentaa ohjelman $(^NameDA):
+# ^UnDirText
+Asennus poistaa ohjelman $(^NameDA) seuraavasta kansiosta. Jos haluat poistaa sen jostakin muusta kansiosta, valitse Selaa, ja valitse toinen kansio. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Valitse kansio, josta haluat poistaa ohjelman $(^NameDA):
+# ^SpaceAvailable
+"Tilaa vapaana: "
+# ^SpaceRequired
+"Tarvittava tila: "
+# ^UninstallingText
+Tämä ohjelma poistaa ohjelman $(^NameDA) tietokoneelta. $_CLICK
+# ^UninstallingSubText
+Poistetaan kansiosta:
+# ^FileError
+Tiedostoon ei voitu kirjoittaa: \r\n\t"$0"\r\nLopeta asennus valitsemalla Hylkää,\r\nyritä uudelleen valitsemalla Uudelleen, tai\r\nohita tiedosto valitsemalla Ohita
+# ^FileError_NoIgnore
+Tiedostoon ei voitu kirjoittaa: \r\n\t"$0"\r\nYritä uudelleen valitsemalla Uudelleen, tai\r\nlopeta asennus valitsemalla Hylkää
+# ^CantWrite
+"Ei voi kirjoittaa: "
+# ^CopyFailed
+Kopiointi epäonnistui
+# ^CopyTo
+"Kopioidaan kohteeseen "
+# ^Registering
+"Rekisteröidään: "
+# ^Unregistering
+"Poistetaan rekisteröinti: "
+# ^SymbolNotFound
+"Symbolia ei löytynyt: "
+# ^CouldNotLoad
+"Ei voitu ladata: "
+# ^CreateFolder
+"Luo kansio: "
+# ^CreateShortcut
+"Luo pikakuvake: "
+# ^CreatedUninstaller
+"Poisto-ohjelma luotiin: "
+# ^Delete
+"Poista: "
+# ^DeleteOnReboot
+"Poista käynnistyksen yhteydessä: "
+# ^ErrorCreatingShortcut
+"Virhe luotaessa pikakuvaketta: "
+# ^ErrorCreating
+"Virhe luotaessa: "
+# ^ErrorDecompressing
+Pakettia ei voitu purkaa. Korruptoitunut asennusohjelma?
+# ^ErrorRegistering
+Virhe rekisteröidessä DLL-tiedostoa
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Suorita: "
+# ^Extract
+"Pura: "
+# ^ErrorWriting
+"Pura: tiedostoon ei voitu kirjoittaa "
+# ^InvalidOpcode
+Asennuspaketti on vioittunut: virheellinen opcode
+# ^NoOLE
+"Ei OLEa: "
+# ^OutputFolder
+"Kansio: "
+# ^RemoveFolder
+"Poista kansio: "
+# ^RenameOnReboot
+"Muuta nimi uudelleenkäynnistyksen yhteydessä: "
+# ^Rename
+"Muuta nimi: "
+# ^Skipped
+"Ohitettiin: "
+# ^CopyDetails
+Kopioi tiedot leikepöydälle
+# ^LogInstall
+Tallenna asennusloki
+# ^Byte
+t
+# ^Kilo
+k
+# ^Mega
+M
+# ^Giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Finnish.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Finnish.nsh
new file mode 100644
index 000000000..0f1c449e1
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Finnish.nsh
@@ -0,0 +1,123 @@
+;Compatible with Modern UI 1.86
+;Language: Finnish (1035)
+;By Eclipser (Jonne Lehtinen)
+;Updated by Puuhis (puuhis@puuhis.net)
+
+!insertmacro LANGFILE "Finnish" "Suomi"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Tervetuloa ohjelman $(^NameDA) asennukseen"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Tämä avustaja ohjaa sinut ohjelman $(^NameDA) asennuksen läpi.$\r$\n$\r$\nOn suositeltavaa sulkea kaikki muut ohjelmat ennen asennuksen aloittamista, jotta asennus voisi päivittää tiettyjä järjestelmätiedostoja käynnistämättä konetta uudelleen.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Tervetuloa $(^NameDA) -ohjelmiston poisto-ohjelmaan"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Tämä velho auttaa sinut läpi $(^NameDA) -ohjelmiston poistamisen.$\r$\n$\r$\nEnnen poisto-ohjelman aloitusta, varmista ettei $(^NameDA) ole käynnissä.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisenssisopimus"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lue lisenssiehdot tarkasti ennen ohjelman $(^NameDA) asentamista."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jos hyväksyt ehdot, valitse Hyväksyn jatkaaksesi. Sinun pitää hyväksyä ehdot asentaaksesi ohjelman $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jos hyväksyt ehdot, laita rasti alla olevaan ruutuun. Sinun pitää hyväksyä ehdot asentaaksesi ohjelman $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jos hyväksyt ehdot, valitse ensimmäinen vaihtoehto alapuolelta. Sinun pitää hyväksyä ehdot asentaaksesi ohjelman $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisenssisopimus"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lue huolellisesti lisenssiehdot ennen $(^NameDA) -ohjelmiston poistoa."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jos hyväksyt säännöt ja ehdot, paina Hyväksyn -nappia jatkaakseni. Sinun täytyy hyväksyä ehdot poistaaksesi $(^NameDA) -ohjelmiston."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jos hyväksyt ehdot, klikkaa valintaruutua alhaalla. Sinun täytyy hyväksyä ehdot poistaaksesi $(^NameDA) -ohjelmiston. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jos hyväksyt ehdot, valitse ensimmäinen vaihtoehto alhaalta. Sinun täytyy hyväksyä ehdot poistaaksesi $(^NameDA) -ohjelmiston. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Paina Page Down nähdäksesi loput sopimuksesta."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Valitse komponentit"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Valitse toiminnot, jotka haluat asentaa ohjelmaan $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Selitys"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Valitse komponentit"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Valitse $(^NameDA) toiminnot, jotka haluat poistaa."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Siirrä hiiri komponentin nimen päälle saadaksesi sen selityksen."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Siirrä hiiri komponentin nimen päälle saadaksesi sen selityksen."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Valitse asennuskohde"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Valitse hakemisto, johon haluat asentaa ohjelman $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Valitse paikka mistä poistetaan"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Valitse kansio mistä $(^NameDA) poistetaan."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Asennetaan"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Odota... $(^NameDA) asennetaan..."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Asennus valmis"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Asennus valmistui onnistuneesti."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Asennus keskeytettiin"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Asennus ei onnistunut."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Poistetaan"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Odota... Ohjelmaa $(^NameDA) poistetaan."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Poisto valmis"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Ohjelma poistettiin onnistuneesti."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Poisto lopetettu"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Ohjelmaa poisto epäonnistuneesti."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Viimeistellään ohjelman $(^NameDA) asennusta"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) on asennettu koneellesi.$\r$\n$\r$\nValitse Valmis sulkeaksesi avustajan."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Tietokoneesi pitää käynnistää uudelleen jotta ohjelman $(^NameDA) asennus saataisiin valmiiksi. Haluatko käynnistää koneen uudelleen nyt?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Viimeistellään $(^NameDA) -ohjelmiston poistamista"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) on poistettu koneeltasi.$\r$\n$\r$\nPaina Lopeta -nappia sulkeaksesi tämän velhon."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Jotta $(^NameDA) -ohjelmiston poistaminen olisi valmis, tulee tietokone käynnistää uudelleen. Haluatko uudelleenkäynnistää nyt?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Käynnistä uudelleen nyt"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Käynnistän koneen myöhemmin uudelleen"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "Käynnistä $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Näytä LueMinut"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Valmis"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Valitse Käynnistä-valikon hakemisto"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Valitse Käynnistä-valikon hakemisto ohjelman pikakuvakkeille."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Valitse Käynnistä-valikon hakemisto, johon haluaisit luoda ohjelman pikakuvakkeet. Voit myös kirjoittaa uuden nimen."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Älä luo pikakuvakkeita"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Poista $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Poista $(^NameDA) tietokoneestasi."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Haluatko varmasti lopettaa $(^Name) Asennuksen?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Oletko varma että haluat poistua $(^Name) poisto-ohjelmasta?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/French.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/French.nlf
new file mode 100644
index 000000000..1a3b822ba
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/French.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1036
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by the French NSIS team - http://www.winampfr.com/nsis.
+# Updated to v6 by Jerome Charaoui (lavamind@inetflex.com)
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Installation de $(^Name)
+# ^UninstallCaption
+Désinstallation de $(^Name)
+# ^LicenseSubCaption
+: Licence
+# ^ComponentsSubCaption
+: Options d'installation
+# ^DirSubCaption
+: Dossier d'installation
+# ^InstallingSubCaption
+: Installation des fichiers
+# ^CompletedSubCaption
+: Terminé
+# ^UnComponentsSubCaption
+: Options de désinstallation
+# ^UnDirSubCaption
+: Dossier de désinstallation
+# ^ConfirmSubCaption
+: Confirmation
+# ^UninstallingSubCaption
+: Désinstallation des fichiers
+# ^UnCompletedSubCaption
+: Terminé
+# ^BackBtn
+< &Précédent
+# ^NextBtn
+&Suivant >
+# ^AgreeBtn
+J'a&ccepte
+# ^AcceptBtn
+J'a&ccepte les termes de la licence
+# ^DontAcceptBtn
+Je &n'accepte pas les termes de la licence
+# ^InstallBtn
+&Installer
+# ^UninstallBtn
+&Désinstaller
+# ^CancelBtn
+Annuler
+# ^CloseBtn
+&Fermer
+# ^BrowseBtn
+P&arcourir...
+# ^ShowDetailsBtn
+P&lus d'infos
+# ^ClickNext
+Cliquez sur Suivant pour continuer.
+# ^ClickInstall
+Cliquez sur Installer pour démarrer l'installation.
+# ^ClickUninstall
+Cliquez sur Désinstaller pour démarrer la désinstallation.
+# ^Name
+Nom
+# ^Completed
+Terminé
+# ^LicenseText
+Veuillez examiner le contrat de licence avant d'installer $(^NameDA). Si vous acceptez tous les termes du contrat, cliquez sur J'accepte.
+# ^LicenseTextCB
+Veuillez examiner le contrat de licence avant d'installer $(^NameDA). Si vous acceptez tous les termes du contrat, cochez la boîte de contrôle ci-dessous. $_CLICK
+# ^LicesnseTextRB
+Veuillez examiner le contrat de licence avant d'installer $(^NameDA). Si vous acceptez tous les termes du contrat, sélectionnez la première option ci-dessous. $_CLICK
+# ^UnLicenseText
+Veuillez examiner le contrat de licence avant de désinstaller $(^NameDA). Si vous acceptez tous les termes du contrat, cliquez sur J'accepte.
+# ^UnLicenseTextCB
+Veuillez examiner le contrat de licence avant de désinstaller $(^NameDA). Si vous acceptez tous les termes du contrat, cochez la boîte de contrôle ci-dessous. $_CLICK
+# ^UnLicesnseTextRB
+Veuillez examiner le contrat de licence avant de désinstaller $(^NameDA). Si vous acceptez tous les termes du contrat, sélectionnez la première option ci-dessous. $_CLICK
+# ^Custom
+Personnalisée
+# ^ComponentsText
+Cochez les composants que vous désirez installer et décochez ceux que vous ne désirez pas installer. $_CLICK
+# ^ComponentsSubText1
+Type d'installation :
+# ^ComponentsSubText2_NoInstTypes
+Sélectionnez les composants à installer :
+# ^ComponentsSubText2
+Ou, sélectionnez les composants optionnels que vous voulez installer :
+# ^UnComponentsText
+Cochez les composants que vous désirez désinstaller et décochez ceux que vous ne désirez pas désinstaller. $_CLICK
+# ^UnComponentsSubText1
+Sélectionnez le type de désinstallation :
+# ^UnComponentsSubText2_NoInstTypes
+Sélectionnez les composants à désinstaller :
+# ^UnComponentsSubText2
+Ou, sélectionnez les composants optionnels que vous voulez désinstaller :
+# ^DirText
+Ceci installera $(^NameDA) dans le dossier suivant. Pour installer dans un autre dossier, cliquez sur Parcourir et choisissez un autre dossier. $_CLICK
+# ^DirSubText
+Dossier d'installation
+# ^DirBrowseText
+Sélectionnez le dossier d'installation pour $(^NameDA) :
+# ^UnDirText
+Ceci désinstallera $(^NameDA) du dossier suivant. Pour désinstaller d'un autre dossier, cliquez sur Parcourir et choisissez un autre dossier. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Sélectionnez le dossier de désinstallation pour $(^NameDA) :
+# ^SpaceAvailable
+"Espace disponible : "
+# ^SpaceRequired
+"Espace requis : "
+# ^UninstallingText
+Ce programme désinstallera $(^NameDA) de votre ordinateur. $_CLICK
+# ^UninstallingSubText
+Désinstallation à partir de :
+# ^FileError
+Erreur lors de l'ouverture du fichier en écriture : \r\n\t"$0"\r\nAppuyez sur Abandonner pour annuler l'installation,\r\nRéessayer pour réessayer l'écriture du fichier, ou\r\nIgnorer pour passer ce fichier
+# ^FileError_NoIgnore
+Erreur lors de l'ouverture du fichier en écriture : \r\n\t"$0"\r\nAppuyez sur Réessayez pour re-écrire le fichier, ou\r\nAnnuler pour abandonner l'installation
+# ^CantWrite
+"Impossible d'écrire : "
+# ^CopyFailed
+Échec de la copie
+# ^CopyTo
+"Copier vers "
+# ^Registering
+"Enregistrement : "
+# ^Unregistering
+"Suppression de l'enregistrement : "
+# ^SymbolNotFound
+"Impossible de trouver un symbole : "
+# ^CouldNotLoad
+"Impossible de charger : "
+# ^CreateFolder
+"Création du dossier : "
+# ^CreateShortcut
+"Création du raccourci : "
+# ^CreatedUninstaller
+"Création de la désinstallation : "
+# ^Delete
+"Suppression : "
+# ^DeleteOnReboot
+"Suppression au redémarrage : "
+# ^ErrorCreatingShortcut
+"Erreur lors de la création du raccourci : "
+# ^ErrorCreating
+"Erreur de la création : "
+# ^ErrorDecompressing
+Erreur lors de la décompression des données ! Installation corrompue ?
+# ^ErrorRegistering
+Erreur lors de l'enregistrement de la DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Exécution : "
+# ^Extract
+"Extraction : "
+# ^ErrorWriting
+"Extraction : erreur d'écriture du fichier "
+# ^InvalidOpcode
+Installation corrompue : opcode incorrect
+# ^NoOLE
+"Pas de OLE pour : "
+# ^OutputFolder
+"Destination : "
+# ^RemoveFolder
+"Suppression du dossier : "
+# ^RenameOnReboot
+"Renommer au redémarrage : "
+# ^Rename
+"Renommer : "
+# ^Skipped
+"Passé : "
+# ^CopyDetails
+Copier les Détails dans le Presse-papier
+# ^LogInstall
+Enregistrer le déroulement de l'installation
+# ^Byte
+o
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/French.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/French.nsh
new file mode 100644
index 000000000..c5007227d
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/French.nsh
@@ -0,0 +1,129 @@
+;Language: French (1036)
+;By Sébastien Delahaye
+
+!insertmacro LANGFILE "French" "French"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bienvenue dans le programme d'installation de $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Vous êtes sur le point d'installer $(^NameDA) sur votre ordinateur.$\r$\n$\r$\nAvant de démarrer l'installation, il est recommandé de fermer toutes les autres applications. Cela permettra la mise à jour de certains fichiers système sans redémarrer votre ordinateur.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bienvenue dans le programme de désinstallation de $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Vous êtes sur le point de désinstaller $(^NameDA) de votre ordinateur.$\r$\n$\r$\nAvant d'amorcer la désinstallation, assurez-vous que $(^NameDA) ne soit pas en cours d'exécution.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licence utilisateur"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Veuillez examiner les termes de la licence avant d'installer $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si vous acceptez les conditions de la licence utilisateur, cliquez sur J'accepte pour continuer. Vous devez accepter la licence utilisateur afin d'installer $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si vous acceptez les conditions de la licence utilisateur, cochez la case ci-dessous. Vous devez accepter la licence utilisateur afin d'installer $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si vous acceptez les conditions de la licence utilisateur, sélectionnez le premier choix ci-dessous. Vous devez accepter la licence utilisateur afin d'installer $(^NameDA)."
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licence utilisateur"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Veuillez examiner les conditions de la licence avant de désinstaller $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si vous acceptez les conditions de la licence utilisateur, cliquez sur J'accepte pour continuer. Vous devez accepter la licence utilisateur afin de désinstaller $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si vous acceptez les conditions de la licence utilisateur, cochez la case ci-dessous. Vous devez accepter la licence utilisateur afin de désintaller $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si vous acceptez les conditions de la licence utilisateur, sélectionnez le premier choix ci-dessous. Vous devez accepter la licence utilisateur afin de désinstaller $(^NameDA)."
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Appuyez sur Page Suivante pour lire le reste de la licence utilisateur."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Choisissez les composants"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Choisissez les composants de $(^NameDA) que vous souhaitez installer."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Description"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Choisissez les composants"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Cochez les composants de $(^NameDA) que vous souhaitez désinstaller."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Passez le curseur de votre souris sur un composant pour en voir la description."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Passez le curseur de votre souris sur un composant pour en voir la description."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Choisissez le dossier d'installation"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Choisissez le dossier dans lequel installer $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Choisissez le dossier de désinstallation"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Choisissez le dossier à partir duquel vous voulez désinstaller $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installation en cours"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Veuillez patienter pendant que $(^NameDA) est en train d'être installé."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Installation terminée"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "L'installation s'est terminée avec succès."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation interrompue"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "L'installation n'a pas été terminée."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Désinstallation en cours"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Veuillez patienter pendant que $(^NameDA) est en train d'être supprimé de votre ordinateur."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Désinstallation terminée"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La désinstallation s'est terminée avec succès."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Désinstallation interrompue"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La désinstallation n'a pas été terminée."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Fin de l'installation de $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) a été installé sur votre ordinateur.$\r$\n$\r$\nCliquez sur Fermer pour quitter le programme d'installation."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Votre ordinateur doit être redémarré afin de compléter l'installation de $(^NameDA). Souhaitez-vous redémarrer maintenant ?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Fin de la désinstallation de $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) a été supprimé de votre ordinateur.$\r$\n$\r$\nCliquez sur Fermer pour quitter le programme d'installation."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Votre ordinateur doit être redémarré pour terminer la désinstallation de $(^NameDA). Souhaitez-vous redémarrer maintenant ?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Redémarrer maintenant"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Je souhaite redémarrer moi-même plus tard"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "Lancer $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Afficher le fichier Readme"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Fermer"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Choisissez un dossier dans le menu Démarrer"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Choisissez un dossier dans le menu Démarrer pour les raccourcis de l'application."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Choisissez le dossier du menu Démarrer dans lequel vous voulez placer les raccourcis du programme. Vous pouvez également entrer un nouveau nom pour créer un nouveau dossier."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ne pas créer de raccourcis"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Désinstaller $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Supprimer $(^NameDA) de votre ordinateur."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Êtes-vous sûr de vouloir quitter l'installation de $(^Name) ?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Êtes-vous sûr de vouloir quitter la désinstallation de $(^Name) ?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Choix des utilisateurs"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Sélection des utilisateurs désirant utiliser $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Choix entre installer $(^NameDA) seulement pour vous-même ou bien pour tous les utilisateurs du système. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installer pour tous les utilisateurs"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installer seulement pour moi"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Galician.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Galician.nlf
new file mode 100644
index 000000000..f1e405e66
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Galician.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1110
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation v 1.0.0 by Ramon Flores
+# ^Branding
+Sistema de Instalación Nullsoft %s
+# ^SetupCaption
+Instalación de $(^Name)
+# ^UninstallCaption
+Desinstalación de $(^Name)
+# ^LicenseSubCaption
+: Contrato de licenza
+# ^ComponentsSubCaption
+: Opcións de instalación
+# ^DirSubCaption
+: Diretória de instalación
+# ^InstallingSubCaption
+: Instalando ficheiros
+# ^CompletedSubCaption
+: Concluído
+# ^UnComponentsSubCaption
+: Opcións de desinstalación
+# ^UnDirSubCaption
+: Cartafol de desinstalación
+# ^ConfirmSubCaption
+: Confirmación
+# ^UninstallingSubCaption
+: Desinstalando
+# ^UnCompletedSubCaption
+: Concluído
+# ^BackBtn
+< &Anterior
+# ^NextBtn
+&Seguinte >
+# ^AgreeBtn
+&Aceito
+# ^AcceptBtn
+Eu &aceito os termos do Contrato de licenza
+# ^DontAcceptBtn
+Eu &non aceito os termos do Contrato de licenza
+# ^InstallBtn
+&Instalar
+# ^UninstallBtn
+&Desinstalar
+# ^CancelBtn
+Cancelar
+# ^CloseBtn
+&Fechar
+# ^BrowseBtn
+&Procurar...
+# ^ShowDetailsBtn
+Ver &Detalles
+# ^ClickNext
+Clique en 'Seguinte' para continuar.
+# ^ClickInstall
+Clique en 'Instalar' para iniciar a instalación.
+# ^ClickUninstall
+Clique en 'Desinstalar' para iniciar a desinstalación.
+# ^Name
+Nome
+# ^Completed
+Concluído
+# ^LicenseText
+Por favor revexa o acordo de licenza antes de instalar $(^NameDA). Se concordar con todos os termos da licenza, clique em 'Aceito'.
+# ^LicenseTextCB
+Por favor reveja o acordo de licenza antes de instalar $(^NameDA). Se concordar con todos os termos da licenza, clique na caixa de selección abaixo. $_CLICK
+# ^LicenseTextRB
+Por favor revexa o acordo de licenza antes de instalar $(^NameDA). Se concordar con todos os termos da licenza, escolla a primeira opción abaixo. $_CLICK
+# ^UnLicenseText
+Por favor revexa o acordo de licenza antes de desinstalar $(^NameDA). Se concordar con todos os termos da licenza, clique em 'Aceito'.
+# ^UnLicenseTextCB
+Por favor reveja o acordo de licenza antes de desinstalar $(^NameDA). Se concordar con todos os termos da licenza, clique na caixa de selección abaixo. $_CLICK
+# ^UnLicenseTextRB
+Por favor revexa o acordo de licenza antes de desinstalar $(^NameDA). Se concordar con todos os termos da licenza, escolla a primeira opción abaixo. $_CLICK
+# ^Custom
+Personalizado
+# ^ComponentsText
+Marque os componentes que desexa instalar e desmarque os componentes que non desexa instalar. $_CLICK
+# ^ComponentsSubText1
+Escolla o tipo de instalación:
+# ^ComponentsSubText2_NoInstTypes
+Escolla os componentes para instalar:
+# ^ComponentsSubText2
+Ou, escolla os componentes opcionais que desexa instalar:
+# ^UnComponentsText
+Marque os componentes que queira desinstalar e vice versa. $_CLICK
+# ^UnComponentsSubText1
+Escolla o tipo de desinstalación:
+# ^UnComponentsSubText2_NoInstTypes
+Escolla os componentes para desinstalar:
+# ^UnComponentsSubText2
+Ou, escolla os componentes opcionais que queira desinstalar:
+# ^DirText
+O $(^NameDA) será instalado na seguinte directória. Para instalar nunha directória diferente, clique en 'Procurar...' e escolla outra directória. $_CLICK
+# ^DirSubText
+Directória de destino
+# ^DirBrowseText
+Escolla unha directória para instalar o $(^NameDA):
+# ^UnDirText
+O $(^NameDA) será desinstalado da seguinte directória. Para desinstalar dunha pasta diferente, clique en 'Procurar...' e escolla outra directória. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Escolla a directória de onde vai ser desinstalado o $(^NameDA):
+# ^SpaceAvailable
+"Espazo disponíbel: "
+# ^SpaceRequired
+"Espazo necesário: "
+# ^UninstallingText
+$(^NameDA) vai ser desinstalado da seguinte directória. $_CLICK
+# ^UninstallingSubText
+Desinstalando de:
+# ^FileError
+Erro ao abrir ficheiro para escrita: \r\n\t"$0"\r\nClique en Abortar para abortar a instalación,\r\nRepetir para tentar novamente a escrita do ficheiro, ou\r\nIgnorar para ignorar este ficheiro.
+# ^FileError_NoIgnore
+Erro ao abrir ficheiro para escrita: \r\n\t"$0"\r\nClique en Repetir para tentar novamente a gravación do ficheiro, ou\r\nCancelar para abortar a instalación.
+# ^CantWrite
+"Non foi posíbel escreber: "
+# ^CopyFailed
+Falla ao copiar
+# ^CopyTo
+"Copiar para "
+# ^Registering
+"Rexistando: "
+# ^Unregistering
+"Desrexistando: "
+# ^SymbolNotFound
+"Símbolo non achado: "
+# ^CouldNotLoad
+"Non foi posíbel carregar: "
+# ^CreateFolder
+"Criando diretória: "
+# ^CreateShortcut
+"Criando atallo: "
+# ^CreatedUninstaller
+"Criando desinstalador: "
+# ^Delete
+"Eliminando ficheiro: "
+# ^DeleteOnReboot
+"Eliminar ao reiniciar: "
+# ^ErrorCreatingShortcut
+"Erro ao criar atallo: "
+# ^ErrorCreating
+"Erro ao criar: "
+# ^ErrorDecompressing
+Erro ao descomprimir dados! Instalador corrompido?
+# ^ErrorRegistering
+Erro ao rexistar DLL
+# ^ExecShell
+"Executando polo Shell: "
+# ^Exec
+"Executando: "
+# ^Extract
+"Extraindo: "
+# ^ErrorWriting
+"Extraindo: erro ao escreber ficheiro "
+# ^InvalidOpcode
+Instalador corrompido: código de operación inválido
+# ^NoOLE
+"Sen OLE para: "
+# ^OutputFolder
+"Cartafol de destino: "
+# ^RemoveFolder
+"Removendo cartafol: "
+# ^RenameOnReboot
+"Renomear ao reiniciar: "
+# ^Rename
+"Renomeando: "
+# ^Skipped
+"Ignorado: "
+# ^CopyDetails
+Copiar detalles para a Área de transférencia
+# ^LogInstall
+Rexistar proceso de instalación
+# ^Byte
+B
+# kilo
+K
+# mega
+M
+# giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Galician.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Galician.nsh
new file mode 100644
index 000000000..8a57f4775
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Galician.nsh
@@ -0,0 +1,121 @@
+;Language: Galician (1110)
+;Ramon Flores
+
+!insertmacro LANGFILE "Galician" "Galego"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Benvindo ao Asistente de Instalación do $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este asistente vai axudá-lo durante a instalación do $(^NameDA).$\r$\n$\r$\nRecomenda-se fechar todas as outras aplicacións antes de iniciar a instalación. Isto posibilita actualizar os ficheiros do sistema relevantes sen ter que reiniciar o computador.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Benvindo ao Asistente de desinstalación do $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este asistente vai axudá-lo durante a desinstalación do $(^NameDA).$\r$\n$\r$\nAntes de iniciar a desinstalación, certifique-se de que o $(^NameDA) non está a executar-se.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Contrato de licenza"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor, verifique os termos da licenza antes de instalar o $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se aceitar os termos da licenza, clique en 'Aceito' para continuar. Cumpre aceitar o contrato para instalar o $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se aceitar os termos da licenza, clique na caixa de selección abaixo. Cumpre aceitar o contrato para instalar o $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se aceitar os termos da licenza, seleccione a primeira opción abaixo. Cumpre aceitar o contrato para instalar o $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Contrato de licenza"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor, verifique os termos da licenza antes de desinstalar o $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se aceitar os termos da licenza, clique en 'Aceito' para continuar. Cumpre aceitar o contrato para desinstalar o $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se aceitar os termos da licenza, clique na caixa de selección abaixo. Cumpre aceitar o contrato para desinstalar o $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se aceitar os termos da licenza, seleccione a primeira opción abaixo. Cumpre aceitar o contrato para desinstalar o $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Prema Page Down para ver o restante da licenza."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Escolla de componentes"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Escolla que características do $(^NameDA) que desexa instalar."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrición"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Escoller componentes"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Escolla que características do $(^NameDA) desexa desinstalar."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posicione o rato sobre un componente para ver a sua descrición."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posicione o rato sobre un componente para ver a sua descrición."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Escolla do local da instalación"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Escolla a directória na cal desexa instalar o $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Escolla o Local de desinstalación"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Escolla a directória de onde pretende desinstalar o $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor, agarde entanto o $(^NameDA) está sendo instalado."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalación completa"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "A instalación concluiu con suceso."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalación Abortada"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "A instalación concluiu sen suceso."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor, agarde entanto se desinstala o $(^NameDA)."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalación completa"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "A desinstalación concluiu con suceso."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalación abortada"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "A desinstalación non concluiu con suceso"
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Concluindo o Asistente de instalación do $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Instalou-se o $(^NameDA) no seu computador.$\r$\n$\r$\nClique en Rematar para fechar este asistente."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Cumpre reiniciar o seu computador para concluír a instalación do $(^NameDA). Desexa reiniciar agora?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Concluíndo o asistente de desinstalación do $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Eliminou-se $(^NameDA) do seu computador.$\r$\n$\r$\nClique em Rematar para fechar este asistente."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Cumpre reiniciar o seu computador para concluír a desinstalación do $(^NameDA). Desexa reiniciá-lo agora?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar agora"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Prefiro reinicia-lo manualmente despois"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Executar $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostrar Leame"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Rematar"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Escolla un cartafol do Menu Iniciar"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Escolla un cartafol do Menu Iniciar para os atallos do programa."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccione o cartafol do Menu Iniciar no que desexa criar os atallos do programa. Tamén é posíbel dixitar un nome para criar un novo cartafol. "
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Non criar atallos"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Eliminar o $(^NameDA) do seu computador."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Realmente desexa cancelar a instalación do $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Realmente desexa cancelar a desinstalación do $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/German.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/German.nlf
new file mode 100644
index 000000000..0b2464dde
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/German.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1031
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by L.King, changes by R. Bisswanger, Tim Kosse
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Installation
+# ^UninstallCaption
+$(^Name) Deinstallation
+# ^LicenseSubCaption
+: Lizenzabkommen
+# ^ComponentsSubCaption
+: Installations-Optionen
+# ^DirSubCaption
+: Zielverzeichnis
+# ^InstallingSubCaption
+: Installiere
+# ^CompletedSubCaption
+: Fertig
+# ^UnComponentsSubCaption
+: Deinstallations-Optionen
+# ^UnDirSubCaption
+: Quellverzeichnis
+# ^ConfirmSubCaption
+: Bestätigung
+# ^UninstallingSubCaption
+: Entferne
+# ^UnCompletedSubCaption
+: Fertig
+# ^BackBtn
+< &Zurück
+# ^NextBtn
+&Weiter >
+# ^AgreeBtn
+&Annehmen
+# ^AcceptBtn
+Ich &akzeptiere das Lizenzabkommen.
+# ^DontAcceptBtn
+Ich &lehne das Lizenzabkommen ab.
+# ^InstallBtn
+&Installieren
+# ^UninstallBtn
+&Deinstallieren
+# ^CancelBtn
+Abbrechen
+# ^CloseBtn
+&Beenden
+# ^BrowseBtn
+&Durchsuchen...
+# ^ShowDetailsBtn
+&Details anzeigen
+# ^ClickNext
+Klicken Sie auf Weiter, um fortzufahren.
+# ^ClickInstall
+Klicken Sie auf Installieren, um die Installation zu starten.
+# ^ClickUninstall
+Klicken Sie auf Deinstallieren, um die Deinstallation zu starten.
+# ^Name
+Name
+# ^Completed
+Fertig
+# ^LicenseText
+Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) installieren. Wenn Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen.
+# ^LicenseTextCB
+Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) installieren. Wenn Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kontrollkästchen. $_CLICK
+# ^LicenseTextRB
+Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) installieren. Wenn Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie die entsprechende Option. $_CLICK
+# ^UnLicenseText
+Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) entfernen. Wenn Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen.
+# ^UnLicenseTextCB
+Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) entfernen. Wenn Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kontrollkästchen. $_CLICK
+# ^UnLicenseTextRB
+Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) entfernen. Wenn Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie die entsprechende Option. $_CLICK
+# ^Custom
+Benutzerdefiniert
+# ^ComponentsText
+Wählen Sie die Komponenten aus, die Sie installieren möchten und wählen Sie diejenigen ab, die Sie nicht installieren wollen. $_CLICK
+# ^ComponentsSubText1
+Installations-Typ bestimmen:
+# ^ComponentsSubText2_NoInstTypes
+Wählen Sie die Komponenten aus, die Sie installieren möchten:
+# ^ComponentsSubText2
+oder wählen Sie zusätzliche Komponenten aus, die Sie installieren möchten:
+# ^UnComponentsText
+Wählen Sie die Komponenten aus, die Sie entfernen möchten und wählen Sie diejenigen ab, die Sie nicht entfernen wollen. $_CLICK
+# ^UnComponentsSubText1
+Deinstallations-Typ bestimmen:
+# ^UnComponentsSubText2_NoInstTypes
+Wählen Sie die Komponenten aus, die Sie entfernen möchten:
+# ^UnComponentsSubText2
+oder wählen Sie zusätzliche Komponenten aus, die Sie entfernen möchten:
+# ^DirText
+$(^NameDA) wird in das unten angegebene Verzeichnis installiert. Falls Sie in ein anderes Verzeichnis installieren möchten, klicken Sie auf Durchsuchen und wählen Sie ein anderes Verzeichnis aus. $_CLICK
+# ^DirSubText
+Zielverzeichnis
+# ^DirBrowseText
+Wählen Sie das Verzeichnis aus, in das Sie $(^NameDA) installieren möchten:
+# ^UnDirText
+$(^NameDA) wird aus dem unten angegebenen Verzeichnis entfernt. Falls sich $(^NameDA) in einem anderen Verzeichnis befindet, klicken Sie auf Durchsuchen und wählen Sie das richtige Verzeichnis aus. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Wählen Sie das Verzeichnis aus, in dem sich $(^NameDA) befindet:
+# ^SpaceAvailable
+"Verfügbarer Speicher: "
+# ^SpaceRequired
+"Benötigter Speicher: "
+# ^UninstallingText
+$(^NameDA) wird aus dem unten angegebenen Verzeichnis entfernt. $_CLICK
+# ^UninstallingSubText
+Entferne aus:
+# ^FileError
+Fehler beim Überschreiben der Datei: \r\n\t"$0"\r\nKlicken Sie auf Abbrechen, um abzubrechen,\r\nauf Wiederholen, um den Schreibvorgang erneut zu versuchen\r\noder auf Ignorieren, um diese Datei zu überspringen.
+# ^FileError_NoIgnore
+Fehler beim Überschreiben der Datei: \r\n\t"$0"\r\nKlicken Sie auf Wiederholen, um den Schreibvorgang erneut zu versuchen\r\noder auf Abbrechen, um die Installation zu beenden.
+# ^CantWrite
+"Fehler beim Schreiben: "
+# ^CopyFailed
+Kopieren fehlgeschlagen
+# ^CopyTo
+"Kopiere nach "
+# ^Registering
+"Registriere: "
+# ^Unregistering
+"Deregistriere: "
+# ^SymbolNotFound
+"Symbol ist nicht vorhanden: "
+# ^CouldNotLoad
+"Fehler beim Laden von "
+# ^CreateFolder
+"Erstelle Verzeichnis: "
+# ^CreateShortcut
+"Erstelle Verknüpfung: "
+# ^CreatedUninstaller
+"Erstelle Deinstallations-Programm: "
+# ^Delete
+"Lösche Datei: "
+# ^DeleteOnReboot
+"Lösche Datei nach Neustart: "
+# ^ErrorCreatingShortcut
+"Fehler beim Erstellen der Verknüpfung: "
+# ^ErrorCreating
+"Fehler beim Erstellen: "
+# ^ErrorDecompressing
+Fehler beim Dekomprimieren. Beschädigtes Installations-Programm?
+# ^ErrorRegistering
+Fehler beim Registrieren der DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Starte: "
+# ^Extract
+"Dekomprimiere: "
+# ^ErrorWriting
+"Dekomprimierung: Fehler beim Schreiben der Datei "
+# ^InvalidOpcode
+Beschädigtes Installations-Programm: ungültiger Befehlscode
+# ^NoOLE
+"Kein OLE für: "
+# ^OutputFolder
+"Zielverzeichnis: "
+# ^RemoveFolder
+"Entferne Verzeichnis: "
+# ^RenameOnReboot
+"Umbenennen nach Neustart: "
+# ^Rename
+"Umbenennen: "
+# ^Skipped
+"Übersprungen: "
+# ^CopyDetails
+Details in die Zwischenablage kopieren
+# ^LogInstall
+Installationsverlauf protokollieren
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/German.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/German.nsh
new file mode 100644
index 000000000..64001d406
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/German.nsh
@@ -0,0 +1,129 @@
+;Language: German (1031)
+;By L.King, changes by K. Windszus & R. Bisswanger & M. Simmack & D. Weiß
+
+!insertmacro LANGFILE "German" "Deutsch"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Willkommen beim Installations-$\r$\nAssistenten für $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Dieser Assistent wird Sie durch die Installation von $(^NameDA) begleiten.$\r$\n$\r$\nEs wird empfohlen, vor der Installation alle anderen Programme zu schließen, damit bestimmte Systemdateien ohne Neustart ersetzt werden können.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Willkommen beim Deinstallations-$\r$\nAssistenten für $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Dieser Assistent wird Sie durch die Deinstallation von $(^NameDA) begleiten.$\r$\n$\r$\nBitte beenden Sie $(^NameDA), bevor Sie mit der Deinstallation fortfahren.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lizenzabkommen"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Bitte lesen Sie die Lizenzbedingungen durch, bevor Sie mit der Installation fortfahren."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Falls Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu können."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Falls Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kästchen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu können. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Falls Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie unten die entsprechende Option. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu können. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lizenzabkommen"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Bitte lesen Sie die Lizenzbedingungen durch, bevor Sie mit der Deinstallation von $(^NameDA) fortfahren."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Falls Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu können."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Falls Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kästchen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu können. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Falls Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie unten die entsprechende Option. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu können. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Drücken Sie die Bild-nach-unten Taste, um den Rest des Abkommens zu sehen."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Komponenten auswählen"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Wählen Sie die Komponenten aus, die Sie installieren möchten."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beschreibung"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Komponenten auswählen"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Wählen Sie die Komponenten aus, die Sie entfernen möchten."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Bewegen Sie den Mauszeiger über eine Komponente, um ihre Beschreibung zu sehen."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Bewegen Sie den Mauszeiger über eine Komponente, um ihre Beschreibung zu sehen."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Zielverzeichnis auswählen"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Wählen Sie das Verzeichnis aus, in das $(^NameDA) installiert werden soll."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Verzeichnis für Deinstallation auswählen"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Wählen Sie das Verzeichnis aus, aus dem $(^NameDA) entfernt werden soll."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installiere..."
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Bitte warten Sie, während $(^NameDA) installiert wird."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Die Installation ist vollständig"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Die Installation wurde erfolgreich abgeschlossen."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Abbruch der Installation"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Die Installation wurde nicht vollständig abgeschlossen."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Deinstalliere..."
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Bitte warten Sie, während $(^NameDA) entfernt wird."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Die Deinstallation ist vollständig"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Die Deinstallation wurde erfolgreich abgeschlossen."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Abbruch der Deinstallation"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Die Deinstallation wurde nicht vollständig abgeschlossen."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Die Installation von $(^NameDA) wird abgeschlossen"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) wurde auf Ihrem Computer installiert.$\r$\n$\r$\nKlicken Sie auf Fertig stellen, um den Installations-Assistenten zu schließen."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Windows muss neu gestartet werden, um die Installation von $(^NameDA) zu vervollständigen. Möchten Sie Windows jetzt neu starten?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Die Deinstallation von $(^NameDA) wird abgeschlossen"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ist von Ihrem Computer entfernt worden.$\r$\n$\r$\nKlicken Sie auf Fertig stellen, um den Assistenten zu schließen."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Windows muss neu gestartet werden, um die Deinstallation von $(^NameDA) zu vervollständigen. Möchten Sie Windows jetzt neu starten?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Jetzt neu starten"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Windows später selbst neu starten"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) ausführen"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Liesmich anzeigen"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Fertig stellen"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Startmenü-Ordner bestimmen"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Bestimmen Sie einen Startmenü-Ordner für die Programmverknüpfungen."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Wählen Sie den Startmenü-Ordner für die Programmverknüpfungen aus. Falls Sie einen neuen Ordner erstellen möchten, geben Sie dessen Namen ein."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Keine Verknüpfungen erstellen"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Deinstallation von $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) wird von Ihrem Computer entfernt."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Sind Sie sicher, dass Sie die Installation von $(^Name) abbrechen wollen?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Sind Sie sicher, dass Sie die Deinstallation von $(^Name) abbrechen möchten?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Benutzer auswählen"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Wählen Sie die Benutzer aus, für die Sie $(^NameDA) installieren wollen."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Wählen Sie aus, ob Sie $(^NameDA) nur für den eigenen Gebrauch oder für die Nutzung durch alle Benutzer dieses Systems installieren möchten. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installation für alle Benutzer dieses Computers"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installation nur für mich"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Greek.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Greek.nlf
new file mode 100644
index 000000000..0caed2295
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Greek.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1032
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1253
+# RTL - anything else than RTL means LTR
+-
+# Translation by Makidis N. Michael - http://dias.aueb.gr/~p3010094/
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+ÅãêáôÜóôáóç ôïõ '$(^Name)'
+# ^UninstallCaption
+ÁðåãêáôÜóôáóç ôïõ '$(^Name)'
+# ^LicenseSubCaption
+: Óõìöùíßá ¢äåéáò ×ñÞóçò
+# ^ComponentsSubCaption
+: ÅðéëïãÝò ÅãêáôÜóôáóçò
+# ^DirSubCaption
+: ÖÜêåëïò ÅãêáôÜóôáóçò
+# ^InstallingSubCaption
+: ÅãêáôÜóôáóç óå åîÝëéîç
+# ^CompletedSubCaption
+: Ïëïêëçñþèçêå
+# ^UnComponentsSubCaption
+: ÅðéëïãÝò ÁðåãêáôÜóôáóçò
+# ^UnDirSubCaption
+: ÖÜêåëïò ÁðåãêáôÜóôáóçò
+# ^ConfirmSubCaption
+: Åðéâåâáßùóç
+# ^UninstallingSubCaption
+: ÁðåãêáôÜóôáóç óå åîÝëéîç
+# ^UnCompletedSubCaption
+: Ïëïêëçñþèçêå
+# ^BackBtn
+< &Ðßóù
+# ^NextBtn
+&Åðüìåíï >
+# ^AgreeBtn
+&Óõìöùíþ
+# ^AcceptBtn
+&ÁðïäÝ÷ïìáé ôïõò üñïõò ôçò Üäåéáò ÷ñÞóçò
+# ^DontAcceptBtn
+&Äåí áðïäÝ÷ïìáé ôïõò üñïõò ôçò Üäåéáò ÷ñÞóçò
+# ^InstallBtn
+&ÅãêáôÜóôáóç
+# ^UninstallBtn
+Áðå&ãêáôÜóô.
+# ^CancelBtn
+¢êõñï
+# ^CloseBtn
+&Êëåßóéìï
+# ^BrowseBtn
+Á&íáæÞôçóç...
+# ^ShowDetailsBtn
+&ËåðôïìÝñåéåò
+# ^ClickNext
+ÊÜíôå êëéê óôï Åðüìåíï ãéá íá óõíå÷ßóåôå.
+# ^ClickInstall
+ÊÜíôå êëéê óôï ÅãêáôÜóôáóç ãéá íá áñ÷ßóåôå ôçí åãêáôÜóôáóç.
+# ^ClickUninstall
+ÊÜíôå êëéê óôï ÁðåãêáôÜóôáóç ãéá íá áñ÷ßóåôå ôçí áðåãêáôÜóôáóç.
+# ^Name
+¼íïìá
+# ^Completed
+Ïëïêëçñþèçêå
+# ^LicenseText
+ÅëÝãîôå ôçí Üäåéá ÷ñÞóçò ðñéí åãêáôáóôÞóåôå ôï '$(^NameDA)'. ÅÜí áðïäÝ÷åóôå üëïõò ôïõò üñïõò, êÜíôå êëéê óôï Óõìöùíþ.
+# ^LicenseTextCB
+ÅëÝãîôå ôçí Üäåéá ÷ñÞóçò ðñéí åãêáôáóôÞóåôå ôï '$(^NameDA)'. ÅÜí áðïäÝ÷åóôå üëïõò ôïõò üñïõò, êÜíôå êëéê óôçí åðéëïãÞ ðáñáêÜôù. $_CLICK
+# ^LicenseTextRB
+ÅëÝãîôå ôçí Üäåéá ÷ñÞóçò ðñéí åãêáôáóôÞóåôå ôï '$(^NameDA)'. ÅÜí áðïäÝ÷åóôå üëïõò ôïõò üñïõò, êÜíôå êëéê óôçí ðñþôç åðéëïãÞ ðáñáêÜôù. $_CLICK
+# ^UnLicenseText
+ÅëÝãîôå ôçí Üäåéá ÷ñÞóçò ðñéí áðåãêáôáóôÞóåôå ôï '$(^NameDA)'. ÅÜí áðïäÝ÷åóôå üëïõò ôïõò üñïõò, êÜíôå êëéê óôï Óõìöùíþ.
+# ^UnLicenseTextCB
+ÅëÝãîôå ôçí Üäåéá ÷ñÞóçò ðñéí áðåãêáôáóôÞóåôå ôï '$(^NameDA)'. ÅÜí áðïäÝ÷åóôå üëïõò ôïõò üñïõò, êÜíôå êëéê óôçí åðéëïãÞ ðáñáêÜôù. $_CLICK
+# ^UnLicenseTextRB
+ÅëÝãîôå ôçí Üäåéá ÷ñÞóçò ðñéí áðåãêáôáóôÞóåôå ôï '$(^NameDA)'. ÅÜí áðïäÝ÷åóôå üëïõò ôïõò üñïõò, êÜíôå êëéê óôçí ðñþôç åðéëïãÞ ðáñáêÜôù. $_CLICK
+# ^Custom
+ÐñïóáñìïóìÝíç
+# ^ComponentsText
+ÅðéëÝîôå ôá óôïé÷åßá ðïõ èÝëåôå íá åãêáôáóôÞóåôå êáé áðïåðéëÝîôå ôá óôïé÷åßá ðïõ äå èÝëåôå íá åãêáôáóôÞóåôå. $_CLICK
+# ^ComponentsSubText1
+ÅðéëÝîôå ôýðï åãêáôÜóôáóçò:
+# ^ComponentsSubText2_NoInstTypes
+ÅðéëÝîôå ôá óôïé÷åßá ðïõ èÝëåôå íá åãêáôáóôÞóåôå:
+# ^ComponentsSubText2
+¹, åðéëÝîôå ôá ðñïáéñåôéêÜ óôïé÷åßá ðïõ èÝëåôå íá åãêáôáóôÞóåôå:
+# ^UnComponentsText
+ÅðéëÝîôå ôá óôïé÷åßá ðïõ èÝëåôå íá áðåãêáôáóôÞóåôå êáé áðïåðéëÝîôå ôá óôïé÷åßá ðïõ äå èÝëåôå íá áðåãêáôáóôÞóåôå. $_CLICK
+# ^UnComponentsSubText1
+ÅðéëÝîôå ôýðï áðåãêáôÜóôáóçò:
+# ^UnComponentsSubText2_NoInstTypes
+ÅðéëÝîôå ôá óôïé÷åßá ðïõ èÝëåôå íá áðåãêáôáóôÞóåôå:
+# ^UnComponentsSubText2
+¹, åðéëÝîôå ôá ðñïáéñåôéêÜ óôïé÷åßá ðïõ èÝëåôå íá áðåãêáôáóôÞóåôå:
+# ^DirText
+Ôï ðñüãñáììá åãêáôÜóôáóçò èá åãêáôáóôÞóåé ôï '$(^NameDA)' óôïí ðáñáêÜôù öÜêåëï. Ãéá íá ôï åãêáôáóôÞóåôå óå Ýíáí Üëëï öÜêåëï, êÜíôå êëéê óôï ÁíáæÞôçóç êáé åðéëÝîôå êÜðïéïí Üëëï öÜêåëï. $_CLICK
+# ^DirSubText
+ÖÜêåëïò ÅãêáôÜóôáóçò
+# ^DirBrowseText
+ÅðéëÝîôå ôï öÜêåëï åãêáôÜóôáóçò ãéá ôï '$(^NameDA)':
+# ^UnDirText
+Ôï ðñüãñáììá åãêáôÜóôáóçò èá áðåãêáôáóôÞóåé ôï '$(^NameDA)' áðü ôïí ðáñáêÜôù öÜêåëï. Ãéá íá áðåãêáôáóôÞóåôå áðü Ýíáí Üëëï öÜêåëï, êÜíôå êëéê óôï ÁíáæÞôçóç êáé åðéëÝîôå êÜðïéïí Üëëï öÜêåëï. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+ÅðéëÝîôå ôï öÜêåëï áðåãêáôÜóôáóçò ãéá ôï '$(^NameDA)':
+# ^SpaceAvailable
+"ÄéáèÝóéìïò ÷þñïò: "
+# ^SpaceRequired
+"Áðáéôïýìåíïò ÷þñïò: "
+# ^UninstallingText
+Ôï '$(^NameDA)' èá áðåãêáôáóôáèåß áðü ôïí áêüëïõèï öÜêåëï. $_CLICK
+# ^UninstallingSubText
+ÁðåãêáôÜóô. áðü:
+# ^FileError
+ÓöÜëìá êáôÜ ôï Üíïéãìá áñ÷åßïõ ãéá åããñáöÞ: \r\n\t"$0"\r\nÅðéëÝîôå ìáôáßùóç ãéá íá ìáôáéþóåôå ôçí åãêáôÜóôáóç,\r\nåðáíÜëçøç ãéá íá äïêéìÜóåôå íá ãñÜøåôå ôï áñ÷åßï ðÜëé, Þ\r\nðáñÜâëåøç ãéá íá ðáñáëåßøåôå áõôü ôï áñ÷åßï.
+# ^FileError_NoIgnore
+ÓöÜëìá êáôÜ ôï Üíïéãìá áñ÷åßïõ ãéá åããñáöÞ: \r\n\t"$0"\r\nÅðéëÝîôå åðáíÜëçøç ãéá íá äïêéìÜóåôå íá ãñÜøåôå ôï áñ÷åßï ðÜëé, Þ\r\nìáôáßùóç ãéá íá ìáôáéþóåôå ôçí åãêáôÜóôáóç.
+# ^CantWrite
+"Áäõíáìßá åããñáöÞò: "
+# ^CopyFailed
+ÁíôéãñáöÞ áðÝôõ÷å
+# ^CopyTo
+"ÁíôéãñáöÞ óôï "
+# ^Registering
+"Êáôá÷þñçóç: "
+# ^Unregistering
+"ÊáôÜñãçóç êáôá÷þñçóçò: "
+# ^SymbolNotFound
+"Áäõíáìßá åýñåóçò óõìâüëïõ: "
+# ^CouldNotLoad
+"Áäõíáìßá öüñôùóçò: "
+# ^CreateFolder
+"Äçìéïõñãßá öáêÝëïõ: "
+# ^CreateShortcut
+"Äçìéïõñãßá óõíôüìåõóçò: "
+# ^CreatedUninstaller
+"Äçìéïõñãßá ðñïãñÜììáôïò áðåãêáôÜóôáóçò: "
+# ^Delete
+"ÄéáãñáöÞ áñ÷åßïõ: "
+# ^DeleteOnReboot
+"ÄéáãñáöÞ óôçí åðáíåêêßíçóç: "
+# ^ErrorCreatingShortcut
+"ÓöÜëìá óôç äçìéïõñãßá óõíôüìåõóçò: "
+# ^ErrorCreating
+"ÓöÜëìá óôç äçìéïõñãßá: "
+# ^ErrorDecompressing
+ÓöÜëìá óôçí áðïóõìðßåóç äåäïìÝíùí! ÊáôåóôñáììÝíï ðñüãñáììá åãêáôÜóôáóçò;
+# ^ErrorRegistering
+ÓöÜëìá êáôá÷þñçóçò ôïõ DLL
+# ^ExecShell
+"ÅêôÝëåóç (ExecShell): "
+# ^Exec
+"ÅêôÝëåóç: "
+# ^Extract
+"Áðïóõìðßåóç: "
+# ^ErrorWriting
+"Áðïóõìðßåóç: óöÜëìá åããñáöÞò óôï áñ÷åßï "
+# ^InvalidOpcode
+ÅãêáôÜóôáóç êáôåóôñáììÝíç: ìç-Ýãêõñï opcode
+# ^NoOLE
+"¼÷é OLE ãéá ôï: "
+# ^OutputFolder
+"ÖÜêåëïò åîüäïõ: "
+# ^RemoveFolder
+"ÄéáãñáöÞ öáêÝëïõ: "
+# ^RenameOnReboot
+"Ìåôïíïìáóßá óôçí åðáíåêêßíçóç: "
+# ^Rename
+"Ìåôïíïìáóßá: "
+# ^Skipped
+"Ðáñáëåßöèçêå: "
+# ^CopyDetails
+ÁíôéãñáöÞ ëåðôïìåñåéþí óôï Ðñü÷åéñï
+# ^LogInstall
+ÊáôáãñáöÞ äéáäéêáóßáò åãêáôÜóôáóçò
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Greek.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Greek.nsh
new file mode 100644
index 000000000..ef3d3f4dc
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Greek.nsh
@@ -0,0 +1,121 @@
+;Language: Greek (1032)
+;By Makidis N. Michael - http://dias.aueb.gr/~p3010094/
+
+!insertmacro LANGFILE "Greek" "Greek"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Êáëþò Þëèáôå óôçí ÅãêáôÜóôáóç ôïõ '$(^NameDA)'"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ï ïäçãüò áõôüò èá óáò êáèïäçãÞóåé êáôÜ ôç äéÜñêåéá ôçò åãêáôÜóôáóçò ôïõ '$(^NameDA)'.$\r$\n$\r$\nÓõíéóôÜôáé íá êëåßóåôå üëåò ôéò Üëëåò åöáñìïãÝò ðñéí îåêéíÞóåôå ôçí ÅãêáôÜóôáóç. Áõôü èá åðéôñÝøåé óôçí ÅãêáôÜóôáóç íá åíçìåñþóåé ôá ó÷åôéêÜ áñ÷åßá óõóôÞìáôïò ÷ùñßò ôçí åðáíåêêßíçóç ôïõ õðïëïãéóôÞ óáò.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Êáëþò Þëèáôå óôïí ïäçãü áðåãêáô. ôïõ '$(^NameDA)'"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ï ïäçãüò áõôüò èá óáò êáèïäçãÞóåé êáôÜ ôç äéÜñêåéá ôçò áðåãêáôÜóôáóçò ôïõ '$(^NameDA)'.$\r$\n$\r$\nÐñéí îåêéíÞóåôå ôçí áðåãêáôÜóôáóç, âåâáéùèåßôå üôé ôï '$(^NameDA)' äåí ôñÝ÷åé.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Óõìöùíßá ¢äåéáò ×ñÞóçò"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "ÅëÝãîôå ôçí Üäåéá ÷ñÞóçò ðñéí åãêáôáóôÞóåôå ôï '$(^NameDA)'."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "ÅÜí áðïäÝ÷åóôå ôïõò üñïõò ôçò Üäåéáò ÷ñÞóçò, êÜíôå êëéê óôï Óõìöùíþ ãéá íá óõíå÷ßóåôå. ÐñÝðåé íá áðïäå÷èåßôå ôç óõìöùíßá ãéá íá åãêáôáóôÞóåôå ôï '$(^NameDA)'."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "ÅÜí áðïäÝ÷åóôå ôïõò üñïõò ôçò Üäåéáò ÷ñÞóçò, êÜíôå êëéê óôçí åðéëïãÞ ðáñáêÜôù. ÐñÝðåé íá áðïäå÷èåßôå ôç óõìöùíßá ãéá íá åãêáôáóôÞóåôå ôï '$(^NameDA)'. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ÅÜí áðïäÝ÷åóôå ôïõò üñïõò ôçò Üäåéáò ÷ñÞóçò, êÜíôå êëéê óôçí ðñþôç åðéëïãÞ ðáñáêÜôù. ÐñÝðåé íá áðïäå÷èåßôå ôç óõìöùíßá ãéá íá åãêáôáóôÞóåôå ôï '$(^NameDA)'. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Óõìöùíßá ¢äåéáò ×ñÞóçò"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "ÅëÝãîôå ôçí Üäåéá ÷ñÞóçò ðñéí áðåãêáôáóôÞóåôå ôï '$(^NameDA)'."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "ÅÜí áðïäÝ÷åóôå ôïõò üñïõò ôçò Üäåéáò ÷ñÞóçò, êÜíôå êëéê óôï Óõìöùíþ ãéá íá óõíå÷ßóåôå. ÐñÝðåé íá áðïäå÷èåßôå ôç óõìöùíßá ãéá íá áðåãêáôáóôÞóåôå ôï '$(^NameDA)'."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "ÅÜí áðïäÝ÷åóôå ôïõò üñïõò ôçò Üäåéáò ÷ñÞóçò, êÜíôå êëéê óôçí åðéëïãÞ ðáñáêÜôù. ÐñÝðåé íá áðïäå÷èåßôå ôç óõìöùíßá ãéá íá áðåãêáôáóôÞóåôå ôï '$(^NameDA)'. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ÅÜí áðïäÝ÷åóôå ôïõò üñïõò ôçò Üäåéáò ÷ñÞóçò, êÜíôå êëéê óôçí ðñþôç åðéëïãÞ ðáñáêÜôù. ÐñÝðåé íá áðïäå÷èåßôå ôç óõìöùíßá ãéá íá áðåãêáôáóôÞóåôå ôï '$(^NameDA)'. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ÐáôÞóôå ôï Page Down ãéá íá äåßôå ôï õðüëïéðï ôçò Üäåéáò ÷ñÞóçò."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "ÅðéëïãÞ Óôïé÷åßùí"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "ÅðéëÝîôå ôá óôïé÷åßá ôïõ '$(^NameDA)' ðïõ èÝëåôå íá åãêáôáóôÞóåôå."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ÐåñéãñáöÞ"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "ÅðéëïãÞ Óôïé÷åßùí"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "ÅðéëÝîôå ôá óôïé÷åßá ôïõ '$(^NameDA)' ðïõ èÝëåôå íá áðåãêáôáóôÞóåôå."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ÐåñÜóôå ôï äåßêôç ôïõ ðïíôéêéïý ðÜíù áðü Ýíá óôïé÷åßï ãéá íá äåßôå ôçí ðåñéãñáöÞ ôïõ."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ÐåñÜóôå ôï äåßêôç ôïõ ðïíôéêéïý ðÜíù áðü Ýíá óôïé÷åßï ãéá íá äåßôå ôçí ðåñéãñáöÞ ôïõ."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "ÅðéëïãÞ ÈÝóçò ÅãêáôÜóôáóçò"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "ÅðéëÝîôå ôï öÜêåëï ìÝóá óôïí ïðïßï èá åãêáôáóôáèåß ôï '$(^NameDA)'."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "ÅðéëïãÞ ÈÝóçò ÁðåãêáôÜóôáóçò"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "ÅðéëÝîôå ôï öÜêåëï áðü ôïí ïðïßï èá áðåãêáôáóôáèåß ôï '$(^NameDA)'."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "ÅãêáôÜóôáóç Óå ÅîÝëéîç"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ðáñáêáëþ ðåñéìÝíåôå üóï ôï '$(^NameDA)' åãêáèßóôáôáé."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Ç ÅãêáôÜóôáóç Ïëïêëçñþèçêå"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Ç åãêáôÜóôáóç ïëïêëçñþèçêå åðéôõ÷þò."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Ç ÅãêáôÜóôáóç Äéáêüðçêå"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Ç åãêáôÜóôáóç äåí ïëïêëçñþèçêå åðéôõ÷þò."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "ÁðåãêáôÜóôáóç Óå ÅîÝëéîç"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Ðáñáêáëþ ðåñéìÝíåôå üóï ôï '$(^NameDA)' áðåãêáèßóôáôáé."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Ç ÁðåãêáôÜóôáóç Ïëïêëçñþèçêå"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Ç áðåãêáôÜóôáóç ïëïêëçñþèçêå åðéôõ÷þò."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ç ÁðåãêáôÜóôáóç Äéáêüðçêå"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Ç áðåãêáôÜóôáóç äåí ïëïêëçñþèçêå åðéôõ÷þò."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "ÏëïêëÞñùóç ôçò ÅãêáôÜóôáóçò ôïõ '$(^NameDA)'"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Ôï '$(^NameDA)' åãêáôáóôÜèçêå óôïí õðïëïãéóôÞ óáò.$\r$\n$\r$\nÊÜíôå êëéê óôï ÔÝëïò ãéá íá êëåßóåôå áõôüí ôïí ïäçãü."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "ÐñÝðåé íá ãßíåé åðáíåêêßíçóç ôïõ õðïëïãéóôÞ óáò ãéá íá ïëïêëçñùèåß ç åãêáôÜóôáóç ôïõ '$(^NameDA)'. ÈÝëåôå íá åðáíåêêéíÞóåôå ôïí õðïëïãéóôÞ óáò ôþñá;"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "ÏëïêëÞñùóç ôçò ÁðåãêáôÜóôáóçò ôïõ '$(^NameDA)'"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Ôï '$(^NameDA)' áðåãêáôáóôÜèçêå áðü ôïí õðïëïãéóôÞ óáò.$\r$\n$\r$\nÊÜíôå êëéê óôï ÔÝëïò ãéá íá êëåßóåôå áõôüí ôïí ïäçãü."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "ÐñÝðåé íá ãßíåé åðáíåêêßíçóç ôïõ õðïëïãéóôÞ óáò ãéá íá ïëïêëçñùèåß ç áðåãêáôÜóôáóç ôïõ '$(^NameDA)'. ÈÝëåôå íá åðáíåêêéíÞóåôå ôïí õðïëïãéóôÞ óáò ôþñá;"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Íá ãßíåé åðáíåêêßíçóç ôþñá"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Èá åðáíåêêéíÞóù ôïí õðïëïãéóôÞ ìïõ áñãüôåñá"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&ÅêôÝëåóç ôïõ '$(^NameDA)'"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "ÅìöÜíéóç ôïõ &áñ÷åßïõ Readme"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&ÔÝëïò"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "ÅðéëïãÞ ÖáêÝëïõ ãéá ôï Ìåíïý ¸íáñîç"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "ÅðéëÝîôå Ýíá öÜêåëï ôïõ ìåíïý ¸íáñîç ãéá ôéò óõíôïìåýóåéò ôïõ '$(^NameDA)'."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "ÅðéëÝîôå Ýíá öÜêåëï ôïõ ìåíïý ¸íáñîç ãéá ôéò óõíôïìåýóåéò ôïõ ðñïãñÜììáôïò. Ìðïñåßôå åðßóçò íá åéóÜãåôå Ýíá üíïìá ãéá íá äçìéïõñãÞóåôå Ýíá íÝï öÜêåëï."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Íá ìç äçìéïõñãçèïýí óõíôïìåýóåéò"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "ÁðåãêáôÜóôáóç ôïõ '$(^NameDA)'"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Áöáßñåóç ôïõ '$(^NameDA)' áðü ôïí õðïëïãéóôÞ óáò."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Åßóôå óßãïõñïé ðùò èÝëåôå íá ôåñìáôßóåôå ôçí åãêáôÜóôáóç ôïõ '$(^Name)';"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Åßóôå óßãïõñïé ðùò èÝëåôå íá ôåñìáôßóåôå ôçí áðåãêáôÜóôáóç ôïõ '$(^Name)';"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Hebrew.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Hebrew.nlf
new file mode 100644
index 000000000..7acde6f2b
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Hebrew.nlf
@@ -0,0 +1,190 @@
+# Hebrew NSIS language file
+NLF v6
+# Language ID
+1037
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1255
+# RTL - anything else than RTL means LTR
+RTL
+# Translation by Amir Szekely (aka KiCHiK), fixed by Yaron Shahrabani
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+äú÷ðú $(^Name)
+# ^UninstallCaption
+äñøú $(^Name)
+# ^LicenseSubCaption
+: äñëí øéùåé
+# ^ComponentsSubCaption
+: àôùøåéåú äú÷ðä
+# ^DirSubCaption
+: úé÷ééú äú÷ðä
+# ^InstallingSubCaption
+: îú÷éï
+# ^CompletedSubCaption
+: ääú÷ðä äåùìîä
+# ^UnComponentsSubCaption
+: àôùøåéåú äñøä
+# ^UnDirSubCaption
+: úé÷ééä ìäñøä
+# ^ConfirmSubCaption
+: àéùåø äñøä
+# ^UninstallingSubCaption
+: îñéø
+# ^UnCompletedSubCaption
+: ääñøä äåùìîä
+# ^BackBtn
+< ä&÷åãí
+# ^NextBtn
+ä&áà >
+# ^AgreeBtn
+àðé &îñëéí
+# ^AcceptBtn
+àðé &îñëéí ìúðàé äñëí äøéùåé
+# ^DontAcceptBtn
+àðé &ìà îñëéí ìúðàé äñëí äøéùåé
+# ^InstallBtn
+&äú÷ï
+# ^UninstallBtn
+&äñø
+# ^CancelBtn
+áéèåì
+# ^CloseBtn
+ñâåø&
+# ^BrowseBtn
+&òééï...
+# ^ShowDetailsBtn
+ä&öâ ôøèéí
+# ^ClickNext
+ìçõ òì äáà ëãé ìäîùéê.
+# ^ClickInstall
+ìçõ òì äú÷ï ëãé ìäúçéì àú ääú÷ðä.
+# ^ClickUninstall
+ìçõ òì äñø ëãé ìäúçéì àú ääñøä.
+# ^Name
+ùí
+# ^Completed
+äôòåìä äåùìîä
+# ^LicenseText
+àðà ñ÷åø àú äñëí äøéùåé ìôðé äú÷ðú $(^NameDA). àí äéðê î÷áì àú ëì úðàé ääñëí, ìçõ 'àðé îñëéí'.
+# ^LicenseTextCB
+àðà ñ÷åø àú äñëí äøéùåé ìôðé äú÷ðú $(^NameDA). àí äéðê î÷áì àú ëì úðàé ääñëí, ñîï àú úéáú äñéîåï ùìäìï. $_CLICK
+# ^LicenseTextRB
+àðà ñ÷åø àú äñëí äøéùåé ìôðé äú÷ðú $(^NameDA). àí äéðê î÷áì àú ëì úðàé ääñëí, áçø áàôùøåú äøàùåðä ùìäìï. $_CLICK
+# ^UnLicenseText
+àðà ñ÷åø àú äñëí äøéùåé ìôðé äñøú $(^NameDA). àí äéðê îñëéí ìëì úðàé ääñëí, ìçõ 'àðé îñëéí'.
+# ^UnLicenseTextCB
+àðà ñ÷åø àú äñëí äøéùåé ìôðé äñøú $(^NameDA). àí äéðê îñëéí ìëì úðàé ääñëí, ñîï àú úéáú äñéîåï ùìäìï. $_CLICK
+# ^UnLicenseTextRB
+àðà ñ÷åø àú äñëí äøéùåé ìôðé äñøú $(^NameDA). àí äéðê îñëéí ìëì úðàé ääñëí, áçø áàôùøåú äøàùåðä ùìäìï. $_CLICK
+# ^Custom
+îåúàí àéùéú
+# ^ComponentsText
+ñîï àú äøëéáéí ùáøöåðê ìäú÷éï åáèì àú äñéîåï ùì øëéáéí ùàéï áøöåðê ìäú÷éï. $_CLICK
+# ^ComponentsSubText1
+áçø ñåâ äú÷ðä:
+# ^ComponentsSubText2_NoInstTypes
+áçø øëéáéí ìäú÷ðä:
+# ^ComponentsSubText2
+àå, áçø øëéáé øùåú ìäú÷ðä:
+# ^UnComponentsText
+ñîï àú äøëéáéí ùáøöåðê ìäñéø åáèì àú äñéîåï ùì øëéáéí ùàéï áøöåðê ìäñéø. $_CLICK
+# ^UnComponentsSubText1
+áçø ñåâ äñøä:
+# ^UnComponentsSubText2_NoInstTypes
+áçø øëéáéí ìäñøä:
+# ^UnComponentsSubText2
+àå, áçø øëéáé øùåú ìäñøä:
+# ^DirText
+úåëðéú æå úú÷éï àú $(^NameDA) ìúé÷ééä ùìäìï. ëãé ìäú÷éï ìúé÷ééä àçøú, ìçõ òì 'òééï' åáçø úé÷ééä àçøú. $_CLICK
+# ^DirSubText
+úé÷ééú éòã
+# ^DirBrowseText
+áçø úé÷ééä ìäú÷ðú $(^NameDA):
+# ^UnDirText
+úåëðéú æå úñéø àú $(^NameDA) îäúé÷ééä ùìäìï. ëãé ìäñéø îúé÷ééä àçøú, ìçõ òì 'òééï' åáçø úé÷ééä àçøú. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+áçø úé÷ééä îîðä úåñø $(^NameDA):
+# ^SpaceAvailable
+"î÷åí ôðåé: "
+# ^SpaceRequired
+"î÷åí ãøåù: "
+# ^UninstallingText
+äñøú $(^NameDA) úúáöò îäúé÷ééä ùìäìï. $_CLICK
+# ^UninstallingSubText
+îñéø î:
+# ^FileError
+àøòä ùâéàä áòú ôúéçú ÷åáõ ìëúéáä:\r\n\t"$0"\r\nìçõ òì áéèåì ëãé ìáèì àú ääú÷ðä,\r\nðñä ùðéú ëãé ìðñåú ìôúåç àú ä÷åáõ ùåá, àå\r\näúòìí ëãé ìãìâ òì ä÷åáõ
+# ^FileError_NoIgnore
+àøòä ùâéàä áòú ôúéçú ÷åáõ ìëúéáä:\r\n\t"$0"\r\nìçõ òì ðñä ùðéú ëãé ìðñåú ìôúåç àú ä÷åáõ ùåá, àå\r\náéèåì ëãé ìáèì àú äúú÷ðä
+# ^CantWrite
+"ìà ðéúï ìëúåá: "
+# ^CopyFailed
+ääòú÷ä ðëùìä
+# ^CopyTo
+äòú÷ ì-
+# ^Registering
+"øåùí: "
+# ^Unregistering
+"áéèåì øéùåí: "
+# ^SymbolNotFound
+"ñîì ìà ðîöà: "
+# ^CouldNotLoad
+"ìà ðéúï ìèòåï: "
+# ^CreateFolder
+"öåø úé÷ééä: "
+# ^CreateShortcut
+"öåø ÷éöåø ãøê: "
+# ^CreatedUninstaller
+"îñéø äú÷ðä ðåöø: "
+# ^Delete
+"îç÷ ÷åáõ: "
+# ^DeleteOnReboot
+"îç÷ àçøé àúçåì: "
+# ^ErrorCreatingShortcut
+"ùâéàä áòú éöéøú ÷éöåø ãøê: "
+# ^ErrorCreating
+"ùâéàä áòú éöéøú: "
+# ^ErrorDecompressing
+ùâéàä áòú ôøéùú îéãò! äú÷ðä ôâåîä?
+# ^ErrorRegistering
+ùâéàä áòú øéùåí DLL
+# ^ExecShell
+"áöò ôòåìú-÷åáõ: "
+# ^Exec
+"áöò: "
+# ^Extract
+"ôøåù: "
+# ^ErrorWriting
+"ôøåù: ùâéàä áòú ëúéáä ì÷åáõ "
+# ^InvalidOpcode
+äú÷ðä ôâåîä! ô÷åãú áéöåò ùâåéä
+# ^NoOLE
+"àéï OLE ì: "
+# ^OutputFolder
+"úé÷ééú ôìè: "
+# ^RemoveFolder
+"äñø úé÷ééä: "
+# ^RenameOnReboot
+"ùðä ùí ìàçø àúçåì: "
+# ^Rename
+"ùðä ùí: "
+# ^Skipped
+"ãìâ: "
+# ^CopyDetails
+äòú÷ ôøèéí ììåç
+# ^LogInstall
+ùîåø øéùåí ôòéìåéåú ääú÷ðä
+# ^Byte
+"á
+# ^Kilo
+" ÷"
+# ^Mega
+" î"
+# ^Giga
+" â"
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Hebrew.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Hebrew.nsh
new file mode 100644
index 000000000..625201b18
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Hebrew.nsh
@@ -0,0 +1,129 @@
+;Language: Hebrew (1037)
+;By Yaron Shahrabani
+
+!insertmacro LANGFILE "Hebrew" "Hebrew"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "áøåëéí äáàéí ìàùó ääú÷ðä ùì $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "àùó æä éðçä àúëí áîäìê ääú÷ðä ùì $(^NameDA).$\r$\n$\r$\nîåîìõ ìñâåø ëì úåëðéú àçøú ìôðé äúçìú ääú÷ðä. ôòåìä æå úàôùø ìàùó ìòãëï ÷áöé îòøëú ììà àéúçåì äîçùá.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "áøåëéí äáàéí ìàùó ääñøä ùì $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "àùó æä éðçä àúëí áîäìê ääñøä ùì $(^NameDA).$\r$\n$\r$\nîåîìõ ìñâåø ëì úåëðéú àçøú ìôðé äúçìú ääñøä. ôòåìä æå úàôùø ìàùó ìòãëï ÷áöé îòøëú ììà àéúçåì äîçùá.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "äñëí øéùåé"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "ðà òééï áúðàé äñëí äøéùåé ìôðé äú÷ðú $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "àí àúä î÷áì àú úðàé ääñëí, ìçõ òì 'àðé îñëéí' ëãé ìäîùéê. àí ìà úñëéí ìúðàé ääñëí ìà úåëì ìäú÷éï àú $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "àí àúä î÷áì àú úðàé ääñëí, ñîï àú úéáú äáçéøä ùìäìï. òìééê ì÷áì àú úðàé ääñëí áëãé ìäú÷éï àú $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "àí àúä î÷áì àú úðàé ääñëí, áçø áàôùøåú äøàùåðä ùìäìï. òìééê ì÷áì àú ääñëí ëãé ìäú÷éï àú $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "äñëí øéùåé"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "ðà òééï áúðàé äñëí äøéùåé ìôðé äñøú $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "àí àúä î÷áì àú úðàé ääñëí, ìçõ òì 'àðé îñëéí' ëãé ìäîùéê. àí ìà ú÷áì àú úðàé ääñëí ìà úåëì ìäñéø àú $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "àí àúä î÷áì àú úðàé ääñëí, ñîï àú úéáú äáçéøä ùìäìï. òìééê ì÷áì àú úðàé ääñëí ëãé ìäñéø àú $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "àí àúä î÷áì àú úðàé ääñëí, áçø áàôùøåú äøàùåðä ùìäìï. òìééê ì÷áì àú ääñëí ëãé ìäñéø àú $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ëãé ìöôåú áùàø äñëí äøéùåé ìçõ òì Page Down."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "áçø øëéáéí"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "áçø àéìå øëéáéí ùì $(^NameDA) áøöåðê ìäú÷éï."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "úéàåø"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "áçø øëéáéí"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "áçø àéìå úëåðåú ùì $(^NameDA) áøöåðê ìäñéø."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "äòáø àú äòëáø îòì øëéá ëìùäå áëãé ìöôåú áúéàåøå."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "äòáø àú äòëáø îòì øëéá ëìùäå áëãé ìöôåú áúéàåøå."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "áçø îé÷åí ìäú÷ðä"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "áçø àú äúé÷ééä áä àúä îòåðééï ìäú÷éï àú $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "áçø îé÷åí ìäñøä"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "áçø àú äúé÷ééä îîðä àúä îòåðééï ìäñéø àú $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "îú÷éï"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "àðà äîúï áæîï ù-$(^NameDA) îåú÷ï."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "ääú÷ðä äåùìîä"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "ääú÷ðä äåùìîä áîìåàä."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "ääú÷ðä áåèìä"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ääú÷ðä ìà äåùìîä äîìåàä."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "îñéø"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "àðà äîúï áæîï ù-$(^NameDA) îåñø îäîçùá."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "ääñøä äåùìîä"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "ääñøä äåùìîä áîìåàä."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "ääñøä áåèìä"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "ääñøä ìà äåùìîä áîìåàä."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "îùìéí àú àùó ääú÷ðä ùì $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) äåú÷ï áäöìçä.$\r$\n$\r$\nìçõ òì ñéåí ëãé ìñâåø àú äàùó."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "òìééê ìàúçì àú äîçùá ëãé ìñééí àú äú÷ðú $(^NameDA). äàí áøöåðê ìàúçì ëòú?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "îùìéí àú àùó ääñøä ùì $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) äåñø áäöìçä.$\r$\n$\r$\nìçõ òì ñéåí ëãé ìñâåø àú äàùó."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "òìééê ìàúçì àú äîçùá ëãé ìñééí àú äñøú $(^NameDA). äàí áøöåðê ìàúçì ëòú?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "àúçì ëòú"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "áøöåðé ìàúçì éãðéú îàåçø éåúø"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&äøõ àú $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&äöâ îñîê '÷øà àåúé'"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&ñééí"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "áçø úé÷ééä áúôøéè ääúçìä"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "áçø áúé÷ééú úôøéè ääúçìä áä éååöøå ÷éöåøé äãøê ùì äúåëðéú."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "áçø áúé÷ééä îúôøéè ääúçìä áä áøöåðê ìéöåø àú ÷éöåøé äãøê òáåø äúåëðéú. áàôùøåúê âí ìä÷ìéã àú ùí äúé÷ééä ëãé ìéöåø úé÷ééä çãùä."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "àì úéöåø ÷éöåøé ãøê"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "äñø àú $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "äñø àú $(^NameDA) îäîçùá."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "äàí àúä áèåç ùáøöåðê ìöàú îäú÷ðú $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "äàí àúä áèåç ùáøöåðê ìöàú îäñøú $(^Name)?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "áçø îùúîùéí"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "áçø ìàéìå îùúîùéí ìäú÷éï àú $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "áçø äàí ìäú÷éï àú $(^NameDA) ìòöîê àå ìëì äîùúîùéí ùì äîçùá. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "äú÷ï ìëì îùúîùé äîçùá"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "äú÷ï ø÷ ìîùúîù ùìé"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Hungarian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Hungarian.nlf
new file mode 100644
index 000000000..4a411d2de
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Hungarian.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1038
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1250
+# RTL - anything else than RTL means LTR
+-
+# Translation by Soft-Trans Bt. (V2)
+# Translation by Orfanik Kft. (V3-V6)
+# ^Branding
+Nullsoft Telepítõrendszer %s
+# ^SetupCaption
+$(^Name) Telepítõ
+# ^UninstallCaption
+$(^Name) Eltávolító
+# ^LicenseSubCaption
+: Licencszerzõdés
+# ^ComponentsSubCaption
+: Telepítési lehetõségek
+# ^DirSubCaption
+: Célmappa
+# ^InstallingSubCaption
+: Fájlok telepítése
+# ^CompletedSubCaption
+: Kész
+# ^UnComponentsSubCaption
+: Eltávolítási lehetõségek
+# ^UnDirSubCaption
+: Eltávolítás mappája
+# ^ConfirmSubCaption
+: Megerõsítés
+# ^UninstallingSubCaption
+: Fájlok eltávolítása
+# ^UnCompletedSubCaption
+: Kész
+# ^BackBtn
+< &Vissza
+# ^NextBtn
+&Tovább >
+# ^AgreeBtn
+&Elfogadom
+# ^AcceptBtn
+&Elfogadom a Licencszerzõdés feltételeit
+# ^DontAcceptBtn
+&Nem fogadom el a Licencszerzõdés feltételeit
+# ^InstallBtn
+&Telepítés
+# ^UninstallBtn
+&Eltávolítás
+# ^CancelBtn
+&Mégse
+# ^CloseBtn
+&Bezárás
+# ^BrowseBtn
+&Tallózás...
+# ^ShowDetailsBtn
+&Részletek
+# ^ClickNext
+Kattintson a Tovább-ra a folytatáshoz.
+# ^ClickInstall
+Kattintson a Telepítésre a telepítéshez.
+# ^ClickUninstall
+Kattintson az Eltávolításra az eltávolításhoz.
+# ^Name
+Név
+# ^Completed
+Kész
+# ^LicenseText
+A(z) $(^NameDA) telepítése elõtt tekintse át a szerzõdés feltételeit. Ha elfogadja a szerzõdés valamennyi feltételét, az Elfogadom gombbal folytathatja.
+# ^LicenseTextCB
+A(z) $(^NameDA) telepítése elõtt tekintse át a szerzõdés feltételeit. Ha elfogadja a szerzõdés valamennyi feltételét, jelölje be a Jelölõnégyzeten. $_CLICK
+# ^LicenseTextRB
+A(z) $(^NameDA) telepítése elõtt tekintse át a szerzõdés feltételeit. Ha elfogadja a szerzõdés valamennyi feltételét, válassza az elsõ lehetõséget. $_CLICK
+# ^UnLicenseText
+A(z) $(^NameDA) eltávolítása elõtt tekintse át a szerzõdés feltételeit. Ha elfogadja a szerzõdés valamennyi feltételét, az Elfogadom gombbal folytathatja.
+# ^UnLicenseTextCB
+A(z) $(^NameDA) eltávolítása elõtt tekintse át a szerzõdés feltételeit. Ha elfogadja a szerzõdés valamennyi feltételét, jelölje be a Jelölõnégyzeten. $_CLICK
+# ^UnLicenseTextRB
+A(z) $(^NameDA) eltávolítása elõtt tekintse át a szerzõdés feltételeit. Ha elfogadja a szerzõdés valamennyi feltételét, válassza az elsõ lehetõséget. $_CLICK
+# ^Custom
+Egyéni
+# ^ComponentsText
+Jelölje be azokat az összetevõket amelyeket telepíteni kíván és törölje a jelölést a nem kívánt összetevõknél. $_CLICK
+# ^ComponentsSubText1
+Válassza ki a telepítés típusát:
+# ^ComponentsSubText2_NoInstTypes
+Válassza ki a telepítendõ összetevõket:
+# ^ComponentsSubText2
+vagy, jelölje ki a választható összetevõk közül a telepíteni kívánta(ka)t:
+# ^UnComponentsText
+Jelölje be azokat az összetevõket amelyeket el kíván távolítani és törölje a jelölést az eltávolítani nem kívánt összetevõknél. $_CLICK
+# ^UnComponentsSubText1
+Válassza ki az Eltávolítás típusát:
+# ^UnComponentsSubText2_NoInstTypes
+Válassza ki az eltávolítandó összetevõket:
+# ^UnComponentsSubText2
+vagy, jelölje ki a választható összetevõk közül az eltávolítani kívánta(ka)t:
+# ^DirText
+A $(^NameDA) a következõ mappába kerül. Másik mappa választásához kattintson a Tallózás gombra. $_CLICK
+# ^DirSubText
+Telepítés helye
+# ^DirBrowseText
+A(z) $(^NameDA) telepítési helyének kiválasztása:
+# ^UnDirText
+A(z) $(^NameDA) eltávolítása a következõ mappából. Másik mappa választásához kattintson a Tallózás gombra. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Válassza ki, hogy a $(^NameDA) melyik mappából kerüljön eltávolításra:
+# ^SpaceAvailable
+"Szabad terület: "
+# ^SpaceRequired
+"Helyigény: "
+# ^UninstallingText
+A(z) $(^NameDA) eltávolítása következik a számítógéprõl. $_CLICK
+# ^UninstallingSubText
+Eltávolítás helye:
+# ^FileError
+Hiba történt a fájl írásra történõ megnyitásakor: \r\n\t"$0"\r\nA Mégse gomb megnyomásával megszakíthatja a telepítést,\r\naz Ismét gombbal megismételheti a fájl írását,\r\na Kihagyás gombbal kihagyhatja ezt a fájlt.
+# ^FileError_NoIgnore
+Hiba történt a fájl írásra történõ megnyitásakor: \r\n\t"$0"\r\nAz Újra gomb megnyomásával megismételheti a mûveletet, vagy \r\na Mégse gombbal megszakíthatja a telepítést.
+# ^CantWrite
+"Nem írható: "
+# ^CopyFailed
+A másolás megszakadt
+# ^CopyTo
+"Másolás ide: "
+# ^Registering
+"Bejegyzés: "
+# ^Unregistering
+"Eltávolítás: "
+# ^SymbolNotFound
+"A következõ szimbólum nem található: "
+# ^CouldNotLoad
+"Nem tölthetõ be: "
+# ^CreateFolder
+"Mappa létrehozás: "
+# ^CreateShortcut
+"Parancsikon létrehozása: "
+# ^CreatedUninstaller
+"Létrehozott eltávolító: "
+# ^Delete
+"Törölt fájl: "
+# ^DeleteOnReboot
+"Rendszerindításkor törlendõ: "
+# ^ErrorCreatingShortcut
+"Hiba a parancsikon létrehozásakor: "
+# ^ErrorCreating
+"Hiba a létrehozáskor: "
+# ^ErrorDecompressing
+Hiba az adatok kibontásakor! Megsérült a Telepítõ?
+# ^ErrorRegistering
+Hiba a DLL regisztrálásakor
+# ^ExecShell
+"Végrehajtás a hozzárendeléseken keresztül: "
+# ^Exec
+"Végrehajtás: "
+# ^Extract
+"Kibontás: "
+# ^ErrorWriting
+"Kibontás: Hiba a fájl írásakor "
+# ^InvalidOpcode
+Sérült a telepítõ: hibás utasítás
+# ^NoOLE
+"Nincs OLE: "
+# ^OutputFolder
+"Kimeneti mappa: "
+# ^RemoveFolder
+"Mappa eltávolítása: "
+# ^RenameOnReboot
+"Átnevezés rendszerindításkor: "
+# ^Rename
+"Átnevezés: "
+# ^Skipped
+"Kihagyott: "
+# ^CopyDetails
+Adatok vágólapra másolása
+# ^LogInstall
+Telepítõ ellenõrzõlista
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Hungarian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Hungarian.nsh
new file mode 100644
index 000000000..d1181bbac
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Hungarian.nsh
@@ -0,0 +1,122 @@
+;Language: Hungarian (1038)
+;Translation by Jozsef Tamas Herczeg ( - 1.61-ig),
+; Lajos Molnar (Orfanik) ( 1.62 - tõl)
+
+!insertmacro LANGFILE "Hungarian" "Magyar"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Üdvözli a(z) $(^NameDA) Telepítõ Varázsló"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "A(z) $(^NameDA) telepítése következik a számítógépre.$\r$\n$\r$\nJavasoljuk, hogy indítás elõtt zárja be a futó alkalmazásokat. Így a telepítõ a rendszer újraindítása nélkül tudja frissíteni a szükséges rendszerfájlokat.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Üdvözli a(z) $(^NameDA) Eltávolító Varázsló"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ez a varázsló segíti a(z) $(^NameDA) eltávolításában.$\r$\n$\r$\nMielõtt elkezdi az eltávilítást gyõzõdjön meg arról, hogy a(z) $(^NameDA) nem fut.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licencszerzõdés"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "A(z) $(^NameDA) telepítése elõtt tekintse át a szerzõdés feltételeit."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ha elfogadja a szerzõdés valamennyi feltételét, az Elfogadom gombbal folytathatja. El kell fogadnia a(z) $(^NameDA) telepítéséhez."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Amennyiben elfogadja a feltételeket, jelölje be a jelölõnényzeten. A(z) $(^NameDA) telepítéséhez el kell fogadnia a feltételeket. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Amennyiben elfogadja a feltételeket, válassza az elsõ opciót. A(z) $(^NameDA) telepítéséhez el kell fogadnia a feltételeket. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licencszerzõdés"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "A(z) $(^NameDA) eltávolítása elõtt tekintse át a szerzõdés feltételeit."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ha elfogadja a szerzõdés valamennyi feltételét, az Elfogadom gombbal folytathatja. El kell fogadnia a(z) $(^NameDA) eltávolításához."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Amennyiben elfogadja a feltételeket, jelölje be a jelölõnényzeten. A(z) $(^NameDA) eltávolításához el kell fogadnia a feltételeket. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Amennyiben elfogadja a feltételeket, válassza az elsõ opciót. A(z) $(^NameDA) eltávolításához el kell fogadnia a feltételeket. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "A PageDown gombbal olvashatja el a szerzõdés folytatását."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Összetevõk kiválasztása"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Válassza ki, hogy a(z) $(^NameDA) mely funkcióit kívánja telepíteni."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Leírás"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Összetevõk kiválasztása"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Válassza ki, hogy a(z) $(^NameDA) mely funkcióit kívánja eltávolítani."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Vigye rá az egeret az összetevõre, hogy megtekinthesse a leírását."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Vigye rá az egeret az összetevõre, hogy megtekinthesse a leírását."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Telepítési hely kiválasztása"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Válassza ki a(z) $(^NameDA) telepítésének mappáját."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Telepítési hely kiválasztása"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Válassza ki a(z) $(^NameDA) telepítésének mappáját."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Telepítési folyamat"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Kis türelmet a(z) $(^NameDA) telepítéséig."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Telepítés befejezõdött"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "A telepítés sikeresen befejezõdött."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "A telepítés megszakadt"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "A telepítés sikertelen volt."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Eltávolítási folyamat"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Kis türelmet a(z) $(^NameDA) eltávolításáig."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Az eltávolítás befejezõdött"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Az eltávolítás sikeresen befejezõdött."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Az eltávolítás megszakadt"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Az eltávolítás sikertelen volt."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "A(z) $(^NameDA) telepítése megtörtént."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "A(z) $(^NameDA) telepítése megtörtént.$\r$\n$\r$\nA Befejezés gomb megnyomásával zárja be a varázslót."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "A(z) $(^NameDA) telepítésének befejezéséhez újra kell indítani a rendszert. Most akarja újraindítani?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "A(z) $(^NameDA) eltávolítás varázslójának befejezése."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "A(z) $(^NameDA) eltávolítása sikeresen befejezõdött.$\r$\n$\r$\nA Finish-re kattintva bezárul ez a varázsló."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "A számítógépet újra kell indítani, hogy a(z) $(^NameDA) eltávolítása teljes legyen. Akarja most újraindítani a rendszert?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Most indítom újra"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Késõbb fogom újraindítani"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) futtatása"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "OlvassEl fájl megjelenítése"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Befejezés"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Start menü mappa kijelölése"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Start menü mappa kijelölése a program parancsikonjaihoz."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Jelöljön ki egy mappát a Start menüben, melybe a program parancsikonjait fogja elhelyezni. Beírhatja új mappa nevét is."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nincs parancsikon elhelyezés"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "A(z) $(^NameDA) Eltávolítása."
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "A(z) $(^NameDA) eltávolítása következik a számítógéprõl."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Biztos, hogy ki akar lépni a(z) $(^Name) Telepítõbõl?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Biztos, hogy ki akar lépni a(z) $(^Name) Eltávolítóból?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Icelandic.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Icelandic.nlf
new file mode 100644
index 000000000..6375697e5
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Icelandic.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+15
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Gretar Orri Kristinsson
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Uppsetning
+# ^UninstallCaption
+$(^Name) Fjarlæging
+# ^LicenseSubCaption
+: Notandaleyfissamningur
+# ^ComponentsSubCaption
+: Uppsetningarvalmöguleikar
+# ^DirSubCaption
+: Uppsetningarskráarsafn
+# ^InstallingSubCaption
+: Set upp
+# ^CompletedSubCaption
+: Lokið
+# ^UnComponentsSubCaption
+: Fjarlægingarvalmöguleikar
+# ^UnDirSubCaption
+: Fjarlægingarskráarsafn
+# ^ConfirmSubCaption
+: Staðfesting
+# ^UninstallingSubCaption
+: Fjarlægi
+# ^UnCompletedSubCaption
+: Lokið
+# ^BackBtn
+< &Til baka
+# ^NextBtn
+&Áfram >
+# ^AgreeBtn
+Ég &Samþykki
+# ^AcceptBtn
+Ég &samþykki skilmála leyfissamningsins
+# ^DontAcceptBtn
+Ég samþykki &ekki skilmála leyfissamningsins
+# ^InstallBtn
+&Setja upp
+# ^UninstallBtn
+&Fjarlægja
+# ^CancelBtn
+Hætta við
+# ^CloseBtn
+&Loka
+# ^BrowseBtn
+&Vafra...
+# ^ShowDetailsBtn
+Sýna &upplýsingar
+# ^ClickNext
+Smelltu á 'Áfram' til að halda áfram.
+# ^ClickInstall
+Smelltu á 'Setja upp' til þess að hefja uppsetninguna.
+# ^ClickUninstall
+Smelltu á 'Fjarlægja' til að hefja fjarlægingar ferlið.
+# ^Name
+Nafn
+# ^Completed
+Lokið
+# ^LicenseText
+Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, smelltu þá á 'Ég samþykki'.
+# ^LicenseTextCB
+Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, hakaðu þá í kassann hér að neðan. $_CLICK
+# ^LicenseTextRB
+Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, veldu þá fyrsta valmöguleikann hér að neðan. $_CLICK
+# ^UnLicenseText
+Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, smelltu þá á 'Ég samþykki'.
+# ^UnLicenseTextCB
+Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, hakaðu þá í kassann hér að neðan. $_CLICK
+# ^UnLicenseTextRB
+Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, veldu þá fyrsta valmöguleikann hér að neðan. $_CLICK
+# ^Custom
+Sjálfval
+# ^ComponentsText
+Hakaðu við þá íhluti sem þú vilt setja upp og taktu hakið af þeim íhlutum sem þú vilt ekki setja upp. $_CLICK
+# ^ComponentsSubText1
+Veldu tegund uppsetningar:
+# ^ComponentsSubText2_NoInstTypes
+Veldu þá íhluti sem á að setja upp:
+# ^ComponentsSubText2
+Eða, veldu valfrjálsa íhluti á að setja upp:
+# ^UnComponentsText
+Hakaðu við þá íhluti sem þú vilt fjarlægja og taktu hakið af þeim íhlutum sem þú vilt ekki fjarlægja. $_CLICK
+# ^UnComponentsSubText1
+Veldu tegund fjarlægingar:
+# ^UnComponentsSubText2_NoInstTypes
+Veldu íhluti sem á að fjarlægja:
+# ^UnComponentsSubText2
+Eða, veldu valfrjálsa íhluti sem á að fjarlægja:
+# ^DirText
+Uppsetningin mun setja $(^NameDA) upp í eftirfarandi skráarsafn. Til að setja forritið upp í annað skráarsafn, smelltu á 'Vafra...' og veldu annað skráarsafn. $_CLICK
+# ^DirSubText
+Uppsetningarskráarsafn
+# ^DirBrowseText
+Veldu það skráarsafn sem þú vilt setja $(^NameDA) upp í:
+# ^UnDirText
+Uppsetningin mun fjarlægja $(^NameDA) úr eftirfarandi skráarsafni. Til að fjarlægja forritið úr öðru skráarsafni, smelltu á 'Vafra...' og veldu annað skráarsafn. $_CLICK
+# ^UnDirSubText
+"Fjarlægingarskráarsafn"
+# ^UnDirBrowseText
+Veldu það skráarsafn sem þú vilt fjarlægja $(^NameDA) úr:
+# ^SpaceAvailable
+"Tiltækt rými: "
+# ^SpaceRequired
+"Nauðsynlegt rými: "
+# ^UninstallingText
+$(^NameDA) verður fjarlægt úr eftirfarandi skráarsafni. $_CLICK
+# ^UninstallingSubText
+Fjarlægi úr:
+# ^FileError
+Villa við að skrifa í skrá: \r\n\r\n$0\r\n\r\nSmelltu á 'Hætta við' til að stoppa uppsetninguna,\r\n'Reyna aftur' til að gera aðra tilraun, eða\r\n'Hunsa' til sleppa þessari skrá.
+# ^FileError_NoIgnore
+Villa við að skrifa í skrá: \r\n\r\n$0\r\n\r\nSmelltu á 'Reyna aftur' til að gera aðra tilraun, eða\r\n'Hætta við' til að stoppa uppsetninguna.
+# ^CantWrite
+"Get ei skrifað: "
+# ^CopyFailed
+Afritun mistókst
+# ^CopyTo
+"Afrita til "
+# ^Registering
+"Skrásetja: "
+# ^Unregistering
+"Afskrá: "
+# ^SymbolNotFound
+"Fann ekki tákn: "
+# ^CouldNotLoad
+"Gat ekki hlaðið inn: "
+# ^CreateFolder
+"Búa til skráarsafn: "
+# ^CreateShortcut
+"Búa til flýtileið: "
+# ^CreatedUninstaller
+"Bjó til fjarlægingarhjálp: "
+# ^Delete
+"Eyða skrá: "
+# ^DeleteOnReboot
+"Eyða við endurræsingu: "
+# ^ErrorCreatingShortcut
+"Villa við gerð flýtileiðar: "
+# ^ErrorCreating
+"Villa við gerð: "
+# ^ErrorDecompressing
+Villa við afþjöppun gagna! Biluð uppsetningarhjálp?
+# ^ErrorRegistering
+Villa við skrásetningu DLL
+# ^ExecShell
+"Keyrslugluggi: "
+# ^Exec
+"Keyra: "
+# ^Extract
+"Færa út: "
+# ^ErrorWriting
+"Færa út: villa við að skrifa í skrá "
+# ^InvalidOpcode
+Uppsetningarhjálp biluð: rangur stýrikóði
+# ^NoOLE
+"Engin OLE fyrir: "
+# ^OutputFolder
+"Útskráarsafn: "
+# ^RemoveFolder
+"Fjarlægja skráarsafn: "
+# ^RenameOnReboot
+"Endurskíra við endurræsingu: "
+# ^Rename
+"Endurskíra: "
+# ^Skipped
+"Sleppt: "
+# ^CopyDetails
+Afrita upplýsingar til skrifbrettis
+# ^LogInstall
+Skrá uppsetningarferli
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Icelandic.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Icelandic.nsh
new file mode 100644
index 000000000..0d39eb067
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Icelandic.nsh
@@ -0,0 +1,121 @@
+;Language: Icelandic (15)
+;By Gretar Orri Kristinsson
+
+!insertmacro LANGFILE "Icelandic" "Icelandic"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Velkominn til $(^NameDA) uppsetningarhjálparinnar"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Þessi hjálp mun leiða þig í gegnum uppsetninguna á $(^NameDA).$\r$\n$\r$\nMælt er með því að þú lokir öllum öðrum forritum áður en uppsetningin hefst. Þetta mun gera uppsetningarforritinu kleyft að uppfæra kerfiskrár án þess að endurræsa tölvuna.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Velkomin(n) til $(^NameDA) fjarlægingarhjálparinnar"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Þessi hjálp mun leiða þig í gegnum fjarlæginguna á $(^NameDA).$\r$\n$\r$\nÁður en fjarlæging hefst skal ganga úr skugga um að $(^NameDA) sé ekki opið.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Notandaleyfissamningur"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Vinsamlegast skoðaðu Notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ef þú samþykkir skilmála samningsins, smelltu þá á 'Ég samþykki' til að halda áfram. Þú verður að samþykkja samninginn til þess að setja upp $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ef þú samþykkir skilmála samningsins, hakaðu þá í kassann hér að neðan. Þú verður að samþykkja samninginn til þess að setja upp $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ef þú samþykkir skilmála samningsins, veldu þá fyrsta valmöguleikann hér að neðan. Þú verður að samþykkja samninginn til þess að setja upp $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Leyfissamningur"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Vinsamlegast skoðaðu leyfissamninginn vel áður en fjarlæging á $(^NameDA) hefst."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ef þú samþykkir skilmála samningsins, smelltu þá á 'Ég samþykki' til að halda áfram. Þú verður að samþykkja samninginn til þess að fjarlægja $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ef þú samþykkir skilmála samningsins, hakaðu þá í kassann hér að neðan. Þú verður að samþykkja samninginn til þess að fjarlægja $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ef þú samþykkir skilmála samningsins, veldu þá fyrsta valmöguleikann hér að neðan. Þú verður að samþykkja samninginn til þess að fjarlægja $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Smelltu á 'PageDown' takkann á lyklaborðinu til að sjá afganginn af samningnum."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Velja íhluti"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Veldu hvaða $(^NameDA) íhluti þú vilt setja upp."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Lýsing"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Velja íhluti"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Velja hvaða $(^NameDA) íhluti þú vilt fjarlægja."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Færðu músina yfir íhlut til að fá lýsinguna á honum."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Færðu músina yfir íhlut til að fá lýsinguna á honum."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Veldu uppsetningarskáarsafn"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Veldu það skráarsafn sem þú vilt setja $(^NameDA) upp í."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Velja fjarlægingarskáarsafn"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Veldu það skráarsafn sem þú vilt fjarlægja $(^NameDA) úr."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Set upp"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vinsamlegast dokaðu við meðan $(^NameDA) er sett upp."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Uppsetningu lokið"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Uppsetning tókst."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Hætt við uppsetningu"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Uppsetningu lauk ekki sem skildi."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Fjarlægi"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vinsamlegast dokaðu við á meðan $(^NameDA) er fjarlægt."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Fjarlægingu lokið"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Fjarlæging tókst."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Hætt við fjarlægingu"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Fjarlægingu lauk ekki sem skildi."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Ljúka $(^NameDA) uppsetningarhjálpinni"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) er nú upp sett á tölvunni þinni.$\r$\n$\r$\nSmelltu á 'Ljúka' til að loka þessari hjálp."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Til að ljúka uppsetningunni á $(^NameDA) verður að endurræsa tölvuna. Viltu endurræsa núna?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Ljúka $(^NameDA) fjarlægingarhjálpinni"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) hefur nú verið fjarlægt úr tölvunni.$\r$\n$\r$\nSmelltu á 'Ljúka' til að loka þessari hjálp."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Til að ljúka fjarlægingunni á $(^NameDA) verður að endurræsa tölvuna. Viltu endurræsa núna?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Endurræsa núna"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ég vil endurræsa seinna"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Keyra $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Skoða LestuMig"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Ljúka"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Velja skráarsafn 'Start' valmyndar"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Veldu skráarsafn $(^NameDA) flýtileiða fyrir 'Start' valmyndina."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Veldu skráarsafn flýtileiða forritsins fyrir 'Start' valmyndina. Þú getur einnig búið til nýtt skráarsafn með því að setja inn nýtt nafn."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ekki búa til flýtileiðir í 'Start' valmyndinni"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Fjarlægja $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Fjarlægja $(^NameDA) úr tölvunni."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Ertu viss um að þú viljir loka $(^Name) uppsetningarhjálpinni?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ertu viss um að þú viljir loka $(^Name) fjarlægingarhjálpinni?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Indonesian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Indonesian.nlf
new file mode 100644
index 000000000..c3295c618
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Indonesian.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1057
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+-
+# RTL - anything else than RTL means LTR
+-
+# Translation ariel825010106@yahoo.com [visit www.ariel106.cjb.net]
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Setup $(^Name)
+# ^UninstallCaption
+Uninstall $(^Name)
+# ^LicenseSubCaption
+: Perihal Lisensi
+# ^ComponentsSubCaption
+: Options Instalasi
+# ^DirSubCaption
+: Folder Instalasi
+# ^InstallingSubCaption
+: Menginstall
+# ^CompletedSubCaption
+: Selesai
+# ^UnComponentsSubCaption
+: Options Uninstal
+# ^UnDirSubCaption
+: Folder Uninstal
+# ^ConfirmSubCaption
+: Konfirmasi
+# ^UninstallingSubCaption
+: Meng-uninstall
+# ^UnCompletedSubCaption
+: Selsai
+# ^BackBtn
+< &Mundur
+# ^NextBtn
+&Maju >
+# ^AgreeBtn
+Saya &setuju
+# ^AcceptBtn
+Saya s&etuju dengan Perihal Lisensi
+# ^DontAcceptBtn
+Saya &tidak setuju dengan Perihal Lisensi
+# ^InstallBtn
+&Instal
+# ^UninstallBtn
+&Uninstal
+# ^CancelBtn
+Cancel
+# ^CloseBtn
+&Tutup
+# ^BrowseBtn
+B&rowse...
+# ^ShowDetailsBtn
+Buka &lagi
+# ^ClickNext
+Klik Maju untuk melanjutkan.
+# ^ClickInstall
+Klik Instal untuk memulai instalasi.
+# ^ClickUninstall
+Klik Uninstall untuk memulai uninstalasi.
+# ^Name
+Nama
+# ^Completed
+Selesai
+# ^LicenseText
+Silahkan membaca lisensi berikut sebelum menginstall $(^NameDA). Jika anda menerima semua yang ada di lisensi, klik Saya setuju.
+# ^LicenseTextCB
+Silahkan membaca linsensi berikut sebelum menginstall $(^NameDA). Jika anda menerima semua yang ada di lisensi, beri tanda centang. $_CLICK
+# ^LicenseTextRB
+Silahkan membaca linsensi berikut sebelum menginstall $(^NameDA). Jika anda menerima semua yang ada di lisensi, pilihlah salah satu item dibawah ini. $_CLICK
+# ^UnLicenseText
+Silahkan membaca linsensi berikut sebelum meng-uninstall $(^NameDA). Jika anda menerima semua yang ada di lisensi, klik Saya setuju.
+# ^UnLicenseTextCB
+Silahkan membaca linsensi berikut sebelum meng-uninstall $(^NameDA). Jika anda menerima semua yang ada di lisensi, beri tanda centang. $_CLICK
+# ^UnLicenseTextRB
+Silahkan membaca linsensi berikut sebelum meng-uninstall $(^NameDA). Jika anda menerima semua yang ada di lisensi, pilihlah salah satu item dibawah ini. $_CLICK
+# ^Custom
+Custom
+# ^ComponentsText
+Beri tanda centang pada komponen yang mau di install and hilangkan tanda centang pada komponen yang tidak perlu di install. $_CLICK
+# ^ComponentsSubText1
+Pilih tipe instalasi:
+# ^ComponentsSubText2_NoInstTypes
+Pilih komponen-komponen untuk di install:
+# ^ComponentsSubText2
+Atau, pilih komponen berikut untuk di install:
+# ^UnComponentsText
+Beri tanda centang pada komponen yang mau di uninstall and hilangkan tanda centang pada komponen yang tidak perlu di uninstall. $_CLICK
+# ^UnComponentsSubText1
+Pilih tipe un-instalasi:
+# ^UnComponentsSubText2_NoInstTypes
+Pilih komponen-komponen untuk di un-install:
+# ^UnComponentsSubText2
+Atau, pilih komponen berikut untuk di un-install:
+# ^DirText
+Setup akan menginstall $(^NameDA) pada folder berikut. Untuk memilih folder lainnya, klik Browse dan pilih folder pilihan anda. $_CLICK
+# ^DirSubText
+Folder tujuan
+# ^DirBrowseText
+Pilih folder untuk menginstall $(^NameDA):
+# ^UnDirText
+Setup akan meng-uninstall $(^NameDA) dari folder berikut. Untuk memilih folder lainnya, klik Browse dan pilih folder pilihan anda. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Pilih folder untuk meng-uninstall $(^NameDA):
+# ^SpaceAvailable
+"Ruang disk yang tersedia: "
+# ^SpaceRequired
+"Ruang disk yang dibutuhkan: "
+# ^UninstallingText
+$(^NameDA) akan di-uninstall dari folder berikut. $_CLICK
+# ^UninstallingSubText
+Meng-uninstall:
+# ^FileError
+Tidak dapat menulis pada file: \r\n\t"$0"\r\nKlik abort untuk membatalkan instalasi,\r\nretry untuk mencoba lagi, atau\r\nignore untuk mengacuhkan file ini.
+# ^FileError_NoIgnore
+Tidak dapat menulis pada file: \r\n\t"$0"\r\nKlik retry untuk mencoba lagi, atau\r\ncancel untuk membatalkan instalasi
+# ^CantWrite
+"Tidak bisa menulis pada: "
+# ^CopyFailed
+Gagal meng-copy
+# ^CopyTo
+"Meng-copy ke "
+# ^Registering
+"Mendaftarkan modul: "
+# ^Unregistering
+"Melepas modul: "
+# ^SymbolNotFound
+"Tidak dapat menemukan : "
+# ^CouldNotLoad
+"Tidak dapat membuka: "
+# ^CreateFolder
+"Membuat folder: "
+# ^CreateShortcut
+"Membuat shortcut: "
+# ^CreatedUninstaller
+"Membuat program unistall: "
+# ^Delete
+"Menghapus file: "
+# ^DeleteOnReboot
+"Akan dihapus pada reboot: "
+# ^ErrorCreatingShortcut
+"Tidak dapat membuat shortcut: "
+# ^ErrorCreating
+"Error creating: "
+# ^ErrorDecompressing
+Error pada saat membuka data! Program Installer rusak
+# ^ErrorRegistering
+Error mendaftarkan modul DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Menjalankan: "
+# ^Extract
+"Meng-ekstrak: "
+# ^ErrorWriting
+"Ekstrak: error pada saat menulis ke file "
+# ^InvalidOpcode
+Installer rusak: opcode tidak lengkap
+# ^NoOLE
+"OLE tidak ditemukan: "
+# ^OutputFolder
+"Folder tujuan: "
+# ^RemoveFolder
+"Menghapus folder: "
+# ^RenameOnReboot
+"Akan di-Rename pada reboot: "
+# ^Rename
+"Rename: "
+# ^Skipped
+"Dilewati: "
+# ^CopyDetails
+Copy Details ke Clipboard
+# ^LogInstall
+Catat proses instalasi
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Indonesian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Indonesian.nsh
new file mode 100644
index 000000000..149f87ea2
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Indonesian.nsh
@@ -0,0 +1,121 @@
+;Language: Indonesian (1057)
+;By Ariel825010106@yahoo.com [visit www.ariel106.cjb.net]
+
+!insertmacro LANGFILE "Indonesian" "Indonesian"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Selamat datang di $(^NameDA) Setup Wizard"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Setup Wizard akan membantu anda pada proses instalasi $(^NameDA).$\r$\n$\r$\nSangat disarankan untuk menutup program lainnya sebelum memulai Setup ini. Ini memungkinkan untuk merubah file yang dipakai oleh sistem tanpa harus me-reboot komputer anda.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Selamat datang di $(^NameDA) Uninstall Wizard"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Uninstall Wizard akan membantu anda pada proses uninstalasi $(^NameDA).$\r$\n$\r$\nSebelum memulai uninstalasi, pastikan dulu $(^NameDA) tidak sedang berjalan.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Perihal Lisensi"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Silahkan membaca lisensi berikut sebelum menginstall $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jika anda menerima semua yang ada di lisensi, klik Saya setuju untuk melanjutkan. Anda harus setuju untuk dapat menginstall $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jika anda menerima semua yang ada di lisensi, beri tanda centang. Anda harus setuju untuk dapat menginstall $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jika anda menerima semua yang ada di lisensi, pilihlah salah satu item dibawah ini. Anda harus setuju untuk dapat menginstall $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Perihal Lisensi"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Silahkan membaca lisensi berikut sebelum meng-uninstall $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jika anda menerima semua yang ada di lisensi, klik Saya setuju untuk melanjutkan. Anda harus setuju untuk dapat meng-uninstall $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jika anda menerima semua yang ada di lisensi, beri tanda centang. Anda harus setuju untuk dapat meng-uninstall $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jika anda menerima semua yang ada di lisensi, pilihlah salah satu item dibawah ini. Anda harus setuju untuk dapat meng-uninstall $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tekan Page Down untuk melihat selanjutnya."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Pilih Komponen"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Pilih fasilitas dari $(^NameDA) yang ingin di-install."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Deskripsi"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Pilih Komponen"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Pilih fasilitas dari $(^NameDA) yang ingin di-uninstall."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Tunjuk ke salah satu komponen untuk melihat deskripsi tentang komponen itu."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Tunjuk ke salah satu komponen untuk melihat deskripsi tentang komponen itu."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Pilih Lokasi Install"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Pilih folder untuk meng-install $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Pilih Lokasi Uninstall"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Pilih folder untuk meng-uninstall $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Install"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Mohon tunggu selama $(^NameDA) sedang di-install."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalasi Selesai"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Setup sudah selesai."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalasi Dibatalkan"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Setup belum selesai secara sempurna."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uninstall"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Mohon tunggu selama $(^NameDA) sedang di-uninstall."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Proses Uninstall Selesai"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uninstall sudah selesai."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Proses Uninstall Dibatalkan"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uninstall belum selesai secara sempurna."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Menyelesaikan $(^NameDA) Setup Wizard"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) sudah ter-install di komputer anda.$\r$\n$\r$\nKlik Selesai untuk menutup Setup Wizard."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Komputer anda harus di reboot untuk menyelesaikan proses instalasi $(^NameDA). Apakah anda mau reboot sekarang juga?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Menyelesaikan $(^NameDA) Uninstall Wizard"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) sudah ter-uninstall di komputer anda.$\r$\n$\r$\nKlik Selesai untuk menutup Setup Wizard."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Komputer anda harus di reboot untuk menyelesaikan proses uninstall $(^NameDA). Apakah anda mau reboot sekarang juga?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reboot sekarang"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Reboot nanti saja"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Jalankan $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Buka file Readme"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Selesai"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Pilih Folder Start Menu"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Pilih folder Start Menu untuk meletakan shortcut $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Pilih folder Start Menu dimana ingin diletakan shortcut program ini. Bisa juga memasukan nama folder yang belum ada untuk membuatnya."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Jangan buat shortcut"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Uninstall $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Menghapus $(^NameDA) dari komputer anda."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Apa anda yakin ingin menghentikan Setup $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Apa anda yakin ingin menghentikan Uninstall $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Irish.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Irish.nlf
new file mode 100644
index 000000000..999b2786b
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Irish.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+2108
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Kevin P. Scannell < scannell at slu dot edu >
+# ^Branding
+Córas Suiteála Nullsoft %s
+# ^SetupCaption
+Socrú $(^Name)
+# ^UninstallCaption
+Díshuiteáil $(^Name)
+# ^LicenseSubCaption
+: Comhaontú um Cheadúnas
+# ^ComponentsSubCaption
+: Roghanna Suiteála
+# ^DirSubCaption
+: Fillteán Suiteála
+# ^InstallingSubCaption
+: Suiteáil
+# ^CompletedSubCaption
+: Críochnaithe
+# ^UnComponentsSubCaption
+: Roghanna Díshuiteála
+# ^UnDirSubCaption
+: Fillteán Díshuiteála
+# ^ConfirmSubCaption
+: Deimhniú
+# ^UninstallingSubCaption
+: Díshuiteáil
+# ^UnCompletedSubCaption
+: Críochnaithe
+# ^BackBtn
+< Ar Ai&s
+# ^NextBtn
+Ar &Aghaidh >
+# ^AgreeBtn
+Gl&acaim Leis
+# ^AcceptBtn
+Táim toilteanach &glacadh le coinníollacha an Chomhaontú um Cheadúnas
+# ^DontAcceptBtn
+Nílim &toilteanach glacadh le coinníollacha an Chomhaontú um Cheadúnas
+# ^InstallBtn
+&Suiteáil
+# ^UninstallBtn
+&Díshuiteáil
+# ^CancelBtn
+Cealaigh
+# ^CloseBtn
+&Dún
+# ^BrowseBtn
+B&rabhsáil...
+# ^ShowDetailsBtn
+Taispeáin &sonraí
+# ^ClickNext
+Cliceáil "Ar Aghaidh" chun leanúint ar aghaidh.
+# ^ClickInstall
+Cliceáil "Suiteáil" chun tosú.
+# ^ClickUninstall
+Cliceáil "Díshuiteáil" chun tosú.
+# ^Name
+Ainm
+# ^Completed
+Críochnaithe
+# ^LicenseText
+Déan iniúchadh ar an gComhaontú um Cheadúnas sula suiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, cliceáil "Glacaim Leis".
+# ^LicenseTextCB
+Déan iniúchadh ar an gComhaontú um Cheadúnas sula suiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, cliceáil an ticbhosca thíos. $_CLICK
+# ^LicenseTextRB
+Déan iniúchadh ar an gComhaontú um Cheadúnas sula suiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, roghnaigh an chéad rogha thíos. $_CLICK
+# ^UnLicenseText
+Déan iniúchadh ar an gComhaontú um Cheadúnas sula ndíshuiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, cliceáil "Glacaim Leis".
+# ^UnLicenseTextCB
+Déan iniúchadh ar an gComhaontú um Cheadúnas sula ndíshuiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, cliceáil an ticbhosca thíos. $_CLICK
+# ^UnLicenseTextRB
+Déan iniúchadh ar an gComhaontú um Cheadúnas sula ndíshuiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, roghnaigh an chéad rogha thíos. $_CLICK
+# ^Custom
+Saincheaptha
+# ^ComponentsText
+Roghnaigh na comhpháirteanna is mian leat a shuiteáil, agus díroghnaigh na comhpháirteanna nach mian leat a shuiteáil. $_CLICK
+# ^ComponentsSubText1
+Roghnaigh cineál na suiteála:
+# ^ComponentsSubText2_NoInstTypes
+Roghnaigh na comhpháirteanna is mian leat a shuiteáil:
+# ^ComponentsSubText2
+Nó, roghnaigh na comhpháirteanna roghnacha is mian leat a shuiteáil:
+# ^UnComponentsText
+Roghnaigh na comhpháirteanna is mian leat a dhíshuiteáil, agus díroghnaigh na comhpháirteanna nach mian leat a dhíshuiteáil. $_CLICK
+# ^UnComponentsSubText1
+Roghnaigh cineál na díshuiteála:
+# ^UnComponentsSubText2_NoInstTypes
+Roghnaigh comhpháirteanna le díshuiteáil:
+# ^UnComponentsSubText2
+Nó, roghnaigh na comhpháirteanna roghnacha is mian leat a dhíshuiteáil:
+# ^DirText
+Cuirfidh an Suiteálaí $(^NameDA) san fhillteán seo a leanas. Más mian leat suiteáil i bhfillteán difriúil, cliceáil "Brabhsáil" agus roghnaigh fillteán eile. $_CLICK
+# ^DirSubText
+Sprioc-Fhillteán
+# ^DirBrowseText
+Roghnaigh an fillteán inar mian leat $(^NameDA) a shuiteáil:
+# ^UnDirText
+Bainfidh an Suiteálaí $(^NameDA) amach as an bhfillteán seo a leanas. Más mian leat é a dhíshuiteáil ó fhillteán difriúil, cliceáil "Brabhsáil" agus roghnaigh fillteán eile. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Roghnaigh an fillteán ar mian leat $(^NameDA) a dhíshuiteáil as:
+# ^SpaceAvailable
+"Spás le fáil: "
+# ^SpaceRequired
+"Spás de dhíth: "
+# ^UninstallingText
+Díshuiteálfar $(^NameDA) ón fhillteán seo a leanas. $_CLICK
+# ^UninstallingSubText
+Á dhíshuiteáil ó:
+# ^FileError
+Earráid agus comhad á scríobh: \r\n\r\n$0\r\n\r\nCliceáil "Abort" chun an tsuiteáil a stopadh,\r\n"Retry" chun iarracht eile a dhéanamh, nó\r\n"Ignore" chun neamhaird a dhéanamh den chomhad seo.
+# ^FileError_NoIgnore
+Earráid agus comhad á scríobh: \r\n\r\n$0\r\n\r\nCliceáil "Retry" chun iarracht eile a dhéanamh, nó\r\n"Cancel" chun an tsuiteáil a stopadh.
+# ^CantWrite
+"Ní féidir scríobh: "
+# ^CopyFailed
+Theip ar an gcóipeáil
+# ^CopyTo
+"Cóipeáil go "
+# ^Registering
+"Clárú: "
+# ^Unregistering
+"Díchlárú: "
+# ^SymbolNotFound
+"Níorbh fhéidir siombail a aimsiú: "
+# ^CouldNotLoad
+"Níorbh fhéidir luchtú: "
+# ^CreateFolder
+"Cruthaigh fillteán: "
+# ^CreateShortcut
+"Cruthaigh aicearra: "
+# ^CreatedUninstaller
+"Cruthaíodh díshuiteálaí: "
+# ^Delete
+"Scrios comhad: "
+# ^DeleteOnReboot
+"Scrios ag am atosaithe: "
+# ^ErrorCreatingShortcut
+"Earráid agus aicearra á chruthú: "
+# ^ErrorCreating
+"Earráid le linn cruthaithe: "
+# ^ErrorDecompressing
+Earráid agus sonraí á ndíchomhbhrú! Suiteálaí truaillithe?
+# ^ErrorRegistering
+Earráid agus DLL á chlárú
+# ^ExecShell
+"Blaosc: "
+# ^Exec
+"Rith: "
+# ^Extract
+"Bain Amach: "
+# ^ErrorWriting
+"Extract: earráid le linn scríofa "
+# ^InvalidOpcode
+Díshuiteálaí truaillithe: cód neamhbhailí oibríochta
+# ^NoOLE
+"Gan OLE le haghaidh: "
+# ^OutputFolder
+"Fillteán aschurtha: "
+# ^RemoveFolder
+"Bain fillteán: "
+# ^RenameOnReboot
+"Athainmnigh ag am atosaithe: "
+# ^Rename
+"Athainmnigh: "
+# ^Skipped
+"Neamhaird déanta de: "
+# ^CopyDetails
+Cóipeáil Sonraí go dtí an Ghearrthaisce
+# ^LogInstall
+Logáil an próiseas suiteála
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Irish.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Irish.nsh
new file mode 100644
index 000000000..7187af98f
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Irish.nsh
@@ -0,0 +1,121 @@
+;Language: Irish (2108)
+;By Kevin P. Scannell < scannell at slu dot edu >
+
+!insertmacro LANGFILE "Irish" "Irish"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Fáilte go dtí Draoi Suiteála $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Déanfaidh an draoi seo treorú duit tríd an suiteáil de $(^NameDA).$\r$\n$\r$\nMoltar duit gach feidhmchlár eile a dhúnadh sula dtosaíonn tú an Suiteálaí. Cinnteoidh sé seo gur féidir na comhaid oiriúnacha a nuashonrú gan do ríomhaire a atosú.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Fáilte go dtí Draoi Díshuiteála $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Déanfaidh an draoi seo treorú duit tríd an díshuiteáil de $(^NameDA).$\r$\n$\r$\nBí cinnte nach bhfuil $(^NameDA) ag rith sula dtosaíonn tú an díshuiteáil.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Comhaontú um Cheadúnas"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Déan iniúchadh ar choinníollacha an cheadúnais sula suiteálann tú $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Má ghlacann tú le coinníollacha an chomhaontaithe, cliceáil $\"Glacaim Leis$\" chun leanúint ar aghaidh. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a shuiteáil."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Má ghlacann tú le coinníollacha an chomhaontaithe, cliceáil an ticbhosca thíos. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a shuiteáil. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Má ghlacann tú le coinníollacha an chomhaontaithe, roghnaigh an chéad rogha thíos. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a dhíshuiteáil. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Comhaontú um Cheadúnas"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Déan iniúchadh ar choinníollacha an cheadúnais sula ndíshuiteálann tú $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Má ghlacann tú le coinníollacha an chomhaontaithe, cliceáil $\"Glacaim Leis$\" chun leanúint ar aghaidh. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a dhíshuiteáil."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Má ghlacann tú le coinníollacha an chomhaontaithe, cliceáil an ticbhosca thíos. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a dhíshuiteáil. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Má ghlacann tú le coinníollacha an chomhaontaithe, roghnaigh an chéad rogha thíos. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a dhíshuiteáil. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Brúigh $\"Page Down$\" chun an chuid eile den cheadúnas a léamh."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Roghnaigh Comhpháirteanna"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Roghnaigh na gnéithe $(^NameDA) ba mhaith leat suiteáil."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Cur Síos"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Roghnaigh Comhpháirteanna"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Roghnaigh na gnéithe $(^NameDA) ba mhaith leat díshuiteáil."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Cuir do luch os cionn comhpháirte chun cur síos a fheiceáil."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Cuir do luch os cionn comhpháirte chun cur síos a fheiceáil."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Roghnaigh Suíomh na Suiteála"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Roghnaigh an fillteán inar mian leat $(^NameDA) a shuiteáil."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Roghnaigh Suíomh na Díshuiteála"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Roghnaigh an fillteán ar mian leat $(^NameDA) a dhíshuiteáil as."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Á Shuiteáil"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Fan go fóill; $(^NameDA) á shuiteáil."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Suiteáil Críochnaithe"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "D'éirigh leis an tsuiteáil."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Suiteáil Tobscortha"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Níor éirigh leis an tsuiteáil."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Á Dhíshuiteáil"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Fan go fóill; $(^NameDA) á dhíshuiteáil."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Díshuiteáil Críochnaithe"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "D'éirigh leis an díshuiteáil."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Díshuiteáil Tobscortha"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Níor éirigh leis an díshuiteáil."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Draoi Suiteála $(^NameDA) á Chríochnú"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Suiteáladh $(^NameDA) ar do ríomhaire.$\r$\n$\r$\nCliceáil $\"Críochnaigh$\" chun an draoi seo a dhúnadh."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Ní mór duit do ríomhaire a atosú chun suiteáil $(^NameDA) a chur i gcrích. Ar mhaith leat atosú anois?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Draoi Díshuiteála $(^NameDA) á Chríochnú"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Díshuiteáladh $(^NameDA) ó do ríomhaire.$\r$\n$\r$\nCliceáil $\"Críochnaigh$\" chun an draoi seo a dhúnadh."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Ní mór duit do ríomhaire a atosú chun díshuiteáil $(^NameDA) a chur i gcrích. Ar mhaith leat atosú anois?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Atosaigh anois"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Atosóidh mé de láimh níos déanaí"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Rith $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Tai&speáin comhad README"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Críochnaigh"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Roghnaigh Fillteán sa Roghchlár Tosaigh"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Roghnaigh fillteán sa Roghchlár Tosaigh a gcuirfear aicearraí $(^NameDA) ann."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Roghnaigh an fillteán sa Roghchlár Tosaigh inar mian leat aicearraí an chláir a chruthú. Is féidir freisin fillteán nua a chruthú trí ainm nua a iontráil."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ná cruthaigh aicearraí"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Díshuiteáil $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Bain $(^NameDA) ó do ríomhaire."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "An bhfuil tú cinnte gur mian leat Suiteálaí $(^Name) a scor?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "An bhfuil tú cinnte gur mian leat Díshuiteálaí $(^Name) a scor?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Italian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Italian.nlf
new file mode 100644
index 000000000..7b483622d
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Italian.nlf
@@ -0,0 +1,192 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1040
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation orginally started by Orfanik - http://www.orfanik.hu
+# Updated v2 to v6 by Alessandro Staltari < staltari (a) geocities.com >
+# corrected by < mdalco@gmail.com >
+# ^Branding
+Sistema di installazione Nullsoft %s
+# ^SetupCaption
+Installazione di $(^Name)
+# ^UninstallCaption
+Disinstallazione di $(^Name)
+# ^LicenseSubCaption
+: Licenza d'uso
+# ^ComponentsSubCaption
+: Opzioni di installazione
+# ^DirSubCaption
+: Cartella di installazione
+# ^InstallingSubCaption
+: Installazione dei file
+# ^CompletedSubCaption
+: Completata
+# ^UnComponentsSubCaption
+: Opzioni di disinstallazione
+# ^UnDirSubCaption
+: Cartella di disinstallazione
+# ^ConfirmSubCaption
+: Conferma
+# ^UninstallingSubCaption
+: Rimozione dei file
+# ^UnCompletedSubCaption
+: Completata
+# ^BackBtn
+< &Indietro
+# ^NextBtn
+&Avanti >
+# ^AgreeBtn
+&Accetto
+# ^AcceptBtn
+&Accetto le condizioni della licenza
+# ^DontAcceptBtn
+&Non accetto le condizioni della licenza
+# ^InstallBtn
+Ins&talla
+# ^UninstallBtn
+&Disinstalla
+# ^CancelBtn
+Annulla
+# ^CloseBtn
+&Fine
+# ^BrowseBtn
+S&foglia...
+# ^ShowDetailsBtn
+Mostra &dettagli
+# ^ClickNext
+Per proseguire, scegliere Avanti.
+# ^ClickInstall
+Per avviare l'installazione, selezionare Installa.
+# ^ClickUninstall
+Per avviare la disinstallazione, selezionare Disinstalla.
+# ^Name
+Nome
+# ^Completed
+Completata
+# ^LicenseText
+Leggere la licenza prima di procedere con l'installazione di $(^NameDA). Se si accettano le condizioni di licenza, selezionare Accetto.
+# ^LicenseTextCB
+Leggere la licenza prima di procedere con l'installazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare la casella sottostante. $_CLICK
+# ^LicesnseTextRB
+Leggere la licenza prima di procedere con l'installazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare la prima delle opzioni sottoindicate. $_CLICK
+# ^UnLicenseText
+Leggere la licenza prima di procedere con la disinstallazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare Accetto. $_CLICK
+# ^UnLicenseTextCB
+Leggere la licenza prima di procedere con la disinstallazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare la casella sottostante. $_CLICK
+# ^UnLicesnseTextRB
+Leggere la licenza prima di procedere con la disinstallazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare la prima delle opzioni sottoindicate. $_CLICK
+# ^Custom
+Personalizzata
+# ^ComponentsText
+Selezionare i componenti che si desidera installare.
+# ^ComponentsSubText1
+Selezionare il tipo d'installazione:
+# ^ComponentsSubText2_NoInstTypes
+Selezionare i componenti da installare:
+# ^ComponentsSubText2
+Oppure, selezionare i componenti opzionali che si desidera installare:
+# ^UnComponentsText
+Selezionare i componenti che si desidera disinstallare.
+# ^UnComponentsSubText1
+Selezionare il tipo di disinstallazione:
+# ^UnComponentsSubText2_NoInstTypes
+Selezionare i componenti da disinstallare:
+# ^UnComponentsSubText2
+Oppure, selezionare i componenti opzionali che si desidera disinstallare :
+# ^DirText
+Questa procedura installerà $(^NameDA) nella cartella seguente. Per installare in una cartella diversa, selezionare Sfoglia e sceglierne un'altra. $_CLICK
+# ^DirSubText
+Cartella di destinazione
+# ^DirBrowseText
+Selezionare la cartella dove installare $(^NameDA):
+# ^UnDirText
+Questa procedura disinstallerà $(^NameDA) nella cartella seguente. Per disinstallare da una cartella diversa, selezionare Sfoglia e sceglierene un'altra. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Selezionare la cartella dalla quale disinstallare $(^NameDA):
+# ^SpaceAvailable
+"Spazio disponibile: "
+# ^SpaceRequired
+"Spazio richiesto: "
+# ^UninstallingText
+$(^NameDA) verrà disinstallato dalla cartella seguente. $_CLICK
+# ^UninstallingSubText
+Rimozione da:
+# ^FileError
+Errore nell'apertura del file per la scrittura: \r\n\t"$0"\r\nSeleziona Termina per interrompere l'installazione,\r\nsu Riprova per ritentare, oppure\r\nsu Ignora per saltare questo file.
+# ^FileError_NoIgnore
+Errore nell'apertura del file per la scrittura: \r\n\t"$0"\r\nSeleziona Riprova per ritentare, oppure\r\nsu Termina per interrompere l'installazione
+# ^CantWrite
+"Impossibile scrivere: "
+# ^CopyFailed
+Copia fallita
+# ^CopyTo
+"Copia in "
+# ^Registering
+"Registrazione in corso: "
+# ^Unregistering
+"Deregistrazione in corso: "
+# ^SymbolNotFound
+"Impossibile trovare il simbolo: "
+# ^CouldNotLoad
+"Impossibile caricare: "
+# ^CreateFolder
+"Crea cartella: "
+# ^CreateShortcut
+"Crea collegamento: "
+# ^CreatedUninstaller
+"Creato il programma di disinstallazione: "
+# ^Delete
+"Elimina file: "
+# ^DeleteOnReboot
+"Elimina al riavvio: "
+# ^ErrorCreatingShortcut
+"Errore nella creazione del collegamento: "
+# ^ErrorCreating
+"Errore nella creazione: "
+# ^ErrorDecompressing
+Errore nella decompressione dei dati! Programma di installazione corrotto?
+# ^ErrorRegistering
+Errore nella registrazione della DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Esecuzione: "
+# ^Extract
+"Estrazione: "
+# ^ErrorWriting
+"Estrazione: errore nella scrittura sul file "
+# ^InvalidOpcode
+Programma di installazione corrotto: opcode non valido
+# ^NoOLE
+"Nessuna OLE per: "
+# ^OutputFolder
+"Cartella di destinazione: "
+# ^RemoveFolder
+"Rimuovi cartella: "
+# ^RenameOnReboot
+"Rinomina al riavvio: "
+# ^Rename
+Rinomina
+# ^Skipped
+"Saltato: "
+# ^CopyDetails
+Copia i dettagli negli appunti
+# ^LogInstall
+Log del processo di installazione
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Italian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Italian.nsh
new file mode 100644
index 000000000..3597b0222
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Italian.nsh
@@ -0,0 +1,131 @@
+;Language: Italian (1040)
+;By SANFACE Software v1.67 accents
+;Review and update from v1.65 to v1.67 by Alessandro Staltari < staltari (a) geocities.com >
+;Review and update from v1.67 to v1.68 by Lorenzo Bevilacqua < meow811@libero.it >
+
+!insertmacro LANGFILE "Italian" "Italiano"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Benvenuti nel programma di installazione di $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Questo programma installerà $(^NameDA) nel vostro computer.$\r$\n$\r$\nSi raccomanda di chiudere tutte le altre applicazioni prima di iniziare l'installazione. Questo permetterà al programma di installazione di aggiornare i file di sistema senza dover riavviare il computer.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Benvenuti nella procedura guidata di disinstallazione di $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Questa procedura vi guiderà nella disinstallazione di $(^NameDA).$\r$\n$\r$\nPrima di iniziare la disinstallazione, assicuratevi che $(^Name) non sia in esecuzione.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licenza d'uso"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Prego leggere le condizioni della licenza d'uso prima di installare $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se si accettano i termini della licenza d'uso scegliere Accetto per continuare. È necessario accettare i termini della licenza d'uso per installare $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se si accettano i termini della licenza d'uso, selezionare la casella sottostante. È necessario accettare i termini della licenza d'uso per installare $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se si accettano i termini della licenza d'uso, selezionare la prima opzione sottostante. È necessario accettare i termini della licenza d'uso per installare $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licenza d'uso"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Prego leggere le condizioni della licenza d'uso prima di disinstallare $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se si accettano i termini della licenza d'uso scegliere Accetto per continuare. È necessario accettare i termini della licenza d'uso per disinstallare $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se si accettano i termini della licenza d'uso, selezionare la casella sottostante. È necessario accettare i termini della licenza d'uso per disinstallare $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se si accettano i termini della licenza d'uso, selezionare la prima opzione sottostante. È necessario accettare i termini della licenza d'uso per disinstallare $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Premere Page Down per vedere il resto della licenza d'uso."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selezione dei componenti"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Selezionare i componenti di $(^NameDA) che si desidera installare."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrizione"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selezione componenti"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Scegliere i componenti di $(^NameDA) che si desidera disinstallare."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posizionare il puntatore del mouse sul componente per vederne la descrizione."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posizionare il puntatore del mouse sul componente per vederne la descrizione."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Scelta della cartella di installazione"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Scegliere la cartella nella quale installare $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Scelta della cartella da cui disinstallare"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Scegliere la cartella dalla quale disinstallare $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installazione in corso"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Prego attendere mentre $(^NameDA) viene installato."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Installazione completata"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "L'installazione è stata completata con successo."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Installazione interrotta"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "L'installazione non è stata completata correttamente."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Disinstallazione in corso"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Prego attendere mentre $(^NameDA) viene disinstallato."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Disinstallazione completata"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La disinstallazione è stata completata con successo."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Disinstallazione interrotta"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La disintallazione non è stata completata correttamente."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completamento dell'installazione di $(^NameDA)."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) è stato installato sul vostro computer.$\r$\n$\r$\nScegliere Fine per chiudere il programma di installazione."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Il computer deve essere riavviato per completare l'installazione di $(^NameDA). Vuoi riavviarlo ora?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completamento della disinstallazione di $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) è stato disinstallato dal computer.$\r$\n$\r$\nSelezionare Fine per terminare questa procedura."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Il computer deve essere riavviato per completare l'installazione di $(^NameDA). Vuoi riavviarlo ora?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Riavvia adesso"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Preferisco riavviarlo manualmente più tardi"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "Esegui $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Mostra il file Readme"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Fine"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Scelta della cartella del menu Start"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Scegliere una cartella del menu Start per i collegamenti del programma."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Scegliere la cartella del menu Start in cui verranno creati i collegamenti del programma. È possibile inserire un nome per creare una nuova cartella."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Non creare i collegamenti al programma."
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Disinstalla $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Rimuove $(^NameDA) dal computer."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Sei sicuro di voler interrompere l'installazione di $(^Name) ?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Sei sicuro di voler interrompere la disinstallazione di $(^Name)?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Scelta degli Utenti"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Scegliete per quali utenti volete installare $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Scegliete se volete installare $(^NameDA) solo per voi o per tutti gli utenti di questo sistema. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installazione per tutti gli utenti"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installazione personale"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Japanese.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Japanese.nlf
new file mode 100644
index 000000000..33ae55e6b
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Japanese.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1041
+# Font and size - dash (-) means default
+‚l‚r ‚oƒSƒVƒbƒN
+9
+# Codepage - dash (-) means ANSI code page
+932
+# RTL - anything else than RTL means LTR
+-
+# Translation by Dnanako, updated by Takahiro Yoshimura
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) ƒZƒbƒgƒAƒbƒv
+# ^UninstallCaption
+$(^Name) ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹
+# ^LicenseSubCaption
+Fƒ‰ƒCƒZƒ“ƒXŒ_–ñ‘
+# ^ComponentsSubCaption
+FƒCƒ“ƒXƒg[ƒ‹ ƒIƒvƒVƒ‡ƒ“
+# ^DirSubCaption
+FƒCƒ“ƒXƒg[ƒ‹ ƒtƒHƒ‹ƒ_
+# ^InstallingSubCaption
+FƒCƒ“ƒXƒg[ƒ‹
+# ^CompletedSubCaption
+FŠ®—¹
+# ^UnComponentsSubCaption
+: ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹ ƒIƒvƒVƒ‡ƒ“
+# ^UnDirSubCaption
+: ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹ ƒtƒHƒ‹ƒ_
+# ^ComfirmSubCaption
+FŠm”F
+# ^UninstallingSubCaption
+FƒAƒ“ƒCƒ“ƒXƒg[ƒ‹
+# ^UnCompletedSubCaption
+FŠ®—¹
+# ^BackBtn
+< –ß‚é(&B)
+# ^NextBtn
+ŽŸ‚Ö(&N) >
+# ^AgreeBtn
+“¯ˆÓ‚·‚é(&A)
+# ^AcceptBtn
+‚±‚̃‰ƒCƒZƒ“ƒXŒ_–ñ‘‚É“¯ˆÓ‚µ‚Ü‚·(&A)
+# ^DontAcceptBtn
+‚±‚̃‰ƒCƒZƒ“ƒXŒ_–ñ‘‚ɂ͓¯ˆÓ‚Å‚«‚Ü‚¹‚ñ(&D)
+# ^InstallBtn
+ƒCƒ“ƒXƒg[ƒ‹
+# ^UninstallBtn
+±Ý²Ý½Ä°Ù(&U)
+# ^CancelBtn
+ƒLƒƒƒ“ƒZƒ‹
+# ^CloseBtn
+•‚¶‚é(&C)
+# ^BrowseBtn
+ŽQÆ(&R)...
+# ^ShowDetailsBtn
+Úׂð•\ަ(&D)
+# ^ClickNext
+‘±‚¯‚é‚É‚Í [ŽŸ‚Ö] ‚ðƒNƒŠƒbƒN‚µ‚ĉº‚³‚¢B
+# ^ClickInstall
+ƒCƒ“ƒXƒg[ƒ‹‚ðŽn‚ß‚é‚É‚Í [ƒCƒ“ƒXƒg[ƒ‹] ‚ðƒNƒŠƒbƒN‚µ‚ĉº‚³‚¢B
+# ^ClickUninstall
+ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚ðŽn‚ß‚é‚É‚Í [±Ý²Ý½Ä°Ù] ‚ðƒNƒŠƒbƒN‚µ‚ĉº‚³‚¢B
+# ^Name
+ƒAƒvƒŠƒP[ƒVƒ‡ƒ“
+# ^Completed
+Š®—¹
+# ^LicenseText
+$(^NameDA)‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚é‘O‚ÉAƒ‰ƒCƒZƒ“ƒXŒ_–ñ‘‚ðŠm”F‚µ‚ĉº‚³‚¢BŒ_–ñ‘‚Ì‘S‚Ä‚ÌðŒ‚É“¯ˆÓ‚·‚é‚È‚ç‚ÎA[“¯ˆÓ‚·‚é] ƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚ĉº‚³‚¢B
+# ^LicenseTextCB
+$(^NameDA)‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚é‘O‚ÉAƒ‰ƒCƒZƒ“ƒXŒ_–ñ‘‚ðŠm”F‚µ‚ĉº‚³‚¢BŒ_–ñ‘‚Ì‘S‚Ä‚ÌðŒ‚É“¯ˆÓ‚·‚é‚È‚ç‚ÎA‰º‚̃`ƒFƒbƒNƒ{ƒbƒNƒX‚ðƒNƒŠƒbƒN‚µ‚ĉº‚³‚¢B $_CLICK
+# ^LicenseTextRB
+$(^NameDA)‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚é‘O‚ÉAƒ‰ƒCƒZƒ“ƒXŒ_–ñ‘‚ðŠm”F‚µ‚ĉº‚³‚¢BŒ_–ñ‘‚Ì‘S‚Ä‚ÌðŒ‚É“¯ˆÓ‚·‚é‚È‚ç‚ÎA‰º‚É•\ަ‚³‚ê‚Ä‚¢‚éƒIƒvƒVƒ‡ƒ“‚Ì‚¤‚¿Aʼn‚Ì‚à‚Ì‚ð‘I‚ñ‚ʼnº‚³‚¢B $_CLICK
+# ^UnLicenseText
+$(^NameDA)‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚é‘O‚ÉAƒ‰ƒCƒZƒ“ƒXŒ_–ñ‘‚ðŠm”F‚µ‚ĉº‚³‚¢BŒ_–ñ‘‚Ì‘S‚Ä‚ÌðŒ‚É“¯ˆÓ‚·‚é‚È‚ç‚ÎA[“¯ˆÓ‚·‚é] ƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚ĉº‚³‚¢B
+# ^UnLicenseTextCB
+$(^NameDA)‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚é‘O‚ÉAƒ‰ƒCƒZƒ“ƒXŒ_–ñ‘‚ðŠm”F‚µ‚ĉº‚³‚¢BŒ_–ñ‘‚Ì‘S‚Ä‚ÌðŒ‚É“¯ˆÓ‚·‚é‚È‚ç‚ÎA‰º‚̃`ƒFƒbƒNƒ{ƒbƒNƒX‚ðƒNƒŠƒbƒN‚µ‚ĉº‚³‚¢B $_CLICK
+# ^UnLicenseTextRB
+$(^NameDA)‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚é‘O‚ÉAƒ‰ƒCƒZƒ“ƒXŒ_–ñ‘‚ðŠm”F‚µ‚ĉº‚³‚¢BŒ_–ñ‘‚Ì‘S‚Ä‚ÌðŒ‚É“¯ˆÓ‚·‚é‚È‚ç‚ÎA‰º‚É•\ަ‚³‚ê‚Ä‚¢‚éƒIƒvƒVƒ‡ƒ“‚Ì‚¤‚¿Aʼn‚Ì‚à‚Ì‚ð‘I‚ñ‚ʼnº‚³‚¢B $_CLICK
+# ^Custom
+ƒJƒXƒ^ƒ€
+# ^ComponentsText
+ƒCƒ“ƒXƒg[ƒ‹‚µ‚½‚¢ƒRƒ“ƒ|[ƒlƒ“ƒg‚Ƀ`ƒFƒbƒN‚ð•t‚¯‚ĉº‚³‚¢B•s—v‚È‚à‚̂ɂ‚¢‚Ä‚ÍAƒ`ƒFƒbƒN‚ðŠO‚µ‚ĉº‚³‚¢B $_CLICK
+# ^ComponentsSubText1
+ƒCƒ“ƒXƒg[ƒ‹ ƒ^ƒCƒv‚ð‘I‘ðF
+# ^ComponentsSubText2_NoInstTypes
+ƒCƒ“ƒXƒg[ƒ‹ ƒRƒ“ƒ|[ƒlƒ“ƒg‚ð‘I‘ðF
+# ^ComponentsSubText2
+‚Ü‚½‚ÍAƒCƒ“ƒXƒg[ƒ‹ ƒIƒvƒVƒ‡ƒ“ ƒRƒ“ƒ|[ƒlƒ“ƒg‚ð‘I‘ðF
+# ^UnComponentsText
+ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚µ‚½‚¢ƒRƒ“ƒ|[ƒlƒ“ƒg‚Ƀ`ƒFƒbƒN‚ð•t‚¯‚ĉº‚³‚¢B‚»‚¤‚łȂ¢‚à‚̂ɂ‚¢‚Ä‚ÍAƒ`ƒFƒbƒN‚ðŠO‚µ‚ĉº‚³‚¢B $_CLICK
+# ^UnComponentsSubText1
+ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹ ƒ^ƒCƒv‚ð‘I‘ðF
+# ^UnComponentsSubText2_NoInstTypes
+ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹ ƒRƒ“ƒ|[ƒlƒ“ƒg‚ð‘I‘ðF
+# ^UnComponentsSubText2
+‚Ü‚½‚ÍAƒAƒ“ƒCƒ“ƒXƒg[ƒ‹ ƒIƒvƒVƒ‡ƒ“ ƒRƒ“ƒ|[ƒlƒ“ƒg‚ð‘I‘ðF
+# ^DirText
+$(^NameDA)‚ðˆÈ‰º‚̃tƒHƒ‹ƒ_‚ɃCƒ“ƒXƒg[ƒ‹‚µ‚Ü‚·BˆÙ‚È‚Á‚½ƒtƒHƒ‹ƒ_‚ɃCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚ÍA[ŽQÆ] ‚ð‰Ÿ‚µ‚ÄA•ʂ̃tƒHƒ‹ƒ_‚ð‘I‘ð‚µ‚Ä‚‚¾‚³‚¢B $_CLICK
+# ^DirSubText
+ƒCƒ“ƒXƒg[ƒ‹æ ƒtƒHƒ‹ƒ_
+# ^DirBrowseText
+$(^NameDA)‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚éƒtƒHƒ‹ƒ_‚ð‘I‘ð‚µ‚Ä‚‚¾‚³‚¢F
+# ^UnDirText
+$(^NameDA)‚ðˆÈ‰º‚̃tƒHƒ‹ƒ_‚©‚çƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚µ‚Ü‚·BˆÙ‚È‚Á‚½ƒtƒHƒ‹ƒ_‚©‚çƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚ÍA[ŽQÆ] ‚ð‰Ÿ‚µ‚ÄA•ʂ̃tƒHƒ‹ƒ_‚ð‘I‘ð‚µ‚Ä‚‚¾‚³‚¢B $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+$(^NameDA)‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚éƒtƒHƒ‹ƒ_‚ð‘I‘ð‚µ‚Ä‚‚¾‚³‚¢F
+# ^SpaceAvailable
+—˜—p‰Â”\‚ȃfƒBƒXƒNƒXƒy[ƒXF
+# ^SpaceRequired
+•K—v‚ȃfƒBƒXƒNƒXƒy[ƒXF
+# ^UninstallingText
+$(^NameDA)‚ÍAˆÈ‰º‚̃tƒHƒ‹ƒ_‚©‚çƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ü‚·B $_CLICK
+# ^UninstallingSubText
+ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹Œ³F
+# ^FileError
+‰Šúƒtƒ@ƒCƒ‹‚Ì쬃Gƒ‰[F\r\n\t"$0"\r\nƒCƒ“ƒXƒg[ƒ‹‚𒆎~‚·‚é‚ɂ͒†Ž~‚ð,\r\nĂт±‚̃tƒ@ƒCƒ‹‚Ìì¬‚ðŽŽ‚Ý‚é‚É‚ÍÄŽŽs‚ð, ‚Ü‚½\r\n‚±‚̃tƒ@ƒCƒ‹‚ðƒXƒLƒbƒv‚µ‚Ä‘±‚¯‚é‚ɂ͖³Ž‹‚ð‰Ÿ‚µ‚Ä‚‚¾‚³‚¢
+# ^FileError_NoIgnore
+‰Šúƒtƒ@ƒCƒ‹‚Ì쬃Gƒ‰[: \r\n\t"$0"\r\nĂт±‚̃tƒ@ƒCƒ‹‚Ìì¬‚ðŽŽ‚Ý‚é‚É‚ÍÄŽŽs‚ð, ‚Ü‚½\r\nƒCƒ“ƒXƒg[ƒ‹‚𒆎~‚·‚é‚ɂ̓Lƒƒƒ“ƒZƒ‹‚ð‰Ÿ‚µ‚ĉº‚³‚¢
+# ^CantWrite
+쬂ł«‚Ü‚¹‚ñF
+# ^CopyFailed
+ƒRƒs[‚ÍŽ¸”s‚µ‚Ü‚µ‚½
+# ^CopyTo
+ƒRƒs[‚µ‚Ü‚·
+# ^Registering
+“o˜^’†:
+# ^Unregistering
+“o˜^‰ðœ’†:
+# ^SymbolNotFound
+ƒVƒ“ƒ{ƒ‹‚ðŒ©‚Â‚¯‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñF
+# ^CouldNotLoad
+ƒ[ƒh‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñF
+# ^CreateFolder
+ƒtƒHƒ‹ƒ_‚Ìì¬F
+# ^CreateShortcut
+ƒVƒ‡[ƒgƒJƒbƒg‚Ìì¬F
+# ^CreatedUninstaller
+ƒAƒ“ƒCƒ“ƒXƒg[ƒ‰‚Ìì¬F
+# ^Delete
+ƒtƒ@ƒCƒ‹‚ÌíœF
+# ^DeleteOnReboot
+ƒŠƒu[ƒgŽž‚ÉíœF
+# ^ErrorCreatingShortcut
+ƒVƒ‡[ƒgƒJƒbƒg‚Ì쬃Gƒ‰[F
+# ^ErrorCreating
+쬃Gƒ‰[F
+# ^ErrorDecompressing
+ƒf[ƒ^‚Ì’ŠoƒGƒ‰[\r\n\r\nƒCƒ“ƒXƒg[ƒ‰‚ª”j‘¹‚µ‚Ä‚¢‚Ü‚·B
+# ^ErrorRegistering
+DLL‚Ì“o˜^ƒGƒ‰[
+# ^ExecShell
+Šg’£Žq‚ÌŠÖ˜A•t‚¯ŽÀs:
+# ^Execute
+ŽÀsF
+# ^Extract
+’ŠoF
+# ^ErrorWriting
+’ŠoFƒtƒ@ƒCƒ‹ì¬ƒGƒ‰[
+# ^InvalidOpcode
+ƒCƒ“ƒXƒg[ƒ‹‚Ì•s³F–³Œø‚Èopcode
+# ^NoOLE
+OLE‚ª‚ ‚è‚Ü‚¹‚ñF
+# ^OutputFolder
+o—ÍæƒtƒHƒ‹ƒ_F
+# ^RemoveFolder
+ƒtƒHƒ‹ƒ_‚ÌíœF
+# ^RenameOnReboot
+ƒŠƒu[ƒgŽž‚É–¼‘O‚Ì•ÏXF
+# ^Rename
+–¼‘O‚Ì•ÏXF
+# ^Skipped
+ƒXƒLƒbƒvF
+# ^CopyDetails
+ƒNƒŠƒbƒvƒ{[ƒh‚ÖÚׂðƒRƒs[
+# ^LogInstall
+ƒCƒ“ƒXƒg[ƒ‹ƒvƒƒZƒX‚ðƒƒOƒw‹L˜^
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Japanese.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Japanese.nsh
new file mode 100644
index 000000000..092036794
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Japanese.nsh
@@ -0,0 +1,122 @@
+;Language: Japanese (1041)
+;By Dnanako
+;Translation updated by Takahiro Yoshimura
+
+!insertmacro LANGFILE "Japanese" "Japanese"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) ƒZƒbƒgƒAƒbƒv ƒEƒBƒU[ƒh‚ւ悤‚±‚»"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "‚±‚̃EƒBƒU[ƒh‚ÍA$(^NameDA)‚̃Cƒ“ƒXƒg[ƒ‹‚ðƒKƒCƒh‚µ‚Ä‚¢‚«‚Ü‚·B$\r$\n$\r$\nƒZƒbƒgƒAƒbƒv‚ðŠJŽn‚·‚é‘O‚ÉA‘¼‚Ì‚·‚ׂẴAƒvƒŠƒP[ƒVƒ‡ƒ“‚ðI—¹‚·‚邱‚Æ‚ð„§‚µ‚Ü‚·B‚±‚ê‚É‚æ‚Á‚ăZƒbƒgƒAƒbƒv‚ªƒRƒ“ƒsƒ…[ƒ^‚ðÄ‹N“®‚¹‚¸‚ÉAƒVƒXƒeƒ€ ƒtƒ@ƒCƒ‹‚ðXV‚·‚邱‚Æ‚ªo—ˆ‚邿‚¤‚ɂȂè‚Ü‚·B$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹ ƒEƒBƒU[ƒh‚ւ悤‚±‚»"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "‚±‚̃EƒBƒU[ƒh‚ÍA$(^NameDA)‚̃Aƒ“ƒCƒ“ƒXƒg[ƒ‹‚ðƒKƒCƒh‚µ‚Ä‚¢‚«‚Ü‚·B$\r$\n$\r$\nƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚ðŠJŽn‚·‚é‘O‚ÉA$(^NameDA)‚ª‹N“®‚µ‚Ä‚¢‚È‚¢‚±‚Æ‚ðŠm”F‚µ‚ĉº‚³‚¢B$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "ƒ‰ƒCƒZƒ“ƒXŒ_–ñ‘"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA)‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚é‘O‚ÉAƒ‰ƒCƒZƒ“ƒXðŒ‚ðŠm”F‚µ‚Ä‚‚¾‚³‚¢B"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Œ_–ñ‘‚Ì‚·‚ׂĂÌðŒ‚É“¯ˆÓ‚·‚é‚È‚ç‚ÎA[“¯ˆÓ‚·‚é] ‚ð‘I‚ñ‚ŃCƒ“ƒXƒg[ƒ‹‚𑱂¯‚Ä‚‚¾‚³‚¢B$(^NameDA) ‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚ÍAŒ_–ñ‘‚É“¯ˆÓ‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Œ_–ñ‘‚Ì‚·‚ׂĂÌðŒ‚É“¯ˆÓ‚·‚é‚È‚ç‚ÎA‰º‚̃`ƒFƒbƒNƒ{ƒbƒNƒX‚ðƒNƒŠƒbƒN‚µ‚Ä‚‚¾‚³‚¢B$(^NameDA) ‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚ÍAŒ_–ñ‘‚É“¯ˆÓ‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Œ_–ñ‘‚Ì‚·‚ׂĂÌðŒ‚É“¯ˆÓ‚·‚é‚È‚ç‚ÎA‰º‚É•\ަ‚³‚ê‚Ä‚¢‚éƒIƒvƒVƒ‡ƒ“‚Ì‚¤‚¿Aʼn‚Ì‚à‚Ì‚ð‘I‚ñ‚ʼnº‚³‚¢B$(^NameDA) ‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚ÍAŒ_–ñ‘‚É“¯ˆÓ‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "ƒ‰ƒCƒZƒ“ƒXŒ_–ñ‘"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA)‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚é‘O‚ÉAƒ‰ƒCƒZƒ“ƒXðŒ‚ðŠm”F‚µ‚Ä‚‚¾‚³‚¢B"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Œ_–ñ‘‚Ì‚·‚ׂĂÌðŒ‚É“¯ˆÓ‚·‚é‚È‚ç‚ÎA[“¯ˆÓ‚·‚é] ‚ð‘I‚ñ‚ŃAƒ“ƒCƒ“ƒXƒg[ƒ‹‚𑱂¯‚Ä‚‚¾‚³‚¢B$(^NameDA) ‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚ÍAŒ_–ñ‘‚É“¯ˆÓ‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Œ_–ñ‘‚Ì‚·‚ׂĂÌðŒ‚É“¯ˆÓ‚·‚é‚È‚ç‚ÎA‰º‚̃`ƒFƒbƒNƒ{ƒbƒNƒX‚ðƒNƒŠƒbƒN‚µ‚Ä‚‚¾‚³‚¢B$(^NameDA) ‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚ÍAŒ_–ñ‘‚É“¯ˆÓ‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Œ_–ñ‘‚Ì‚·‚ׂĂÌðŒ‚É“¯ˆÓ‚·‚é‚È‚ç‚ÎA‰º‚É•\ަ‚³‚ê‚Ä‚¢‚éƒIƒvƒVƒ‡ƒ“‚Ì‚¤‚¿Aʼn‚Ì‚à‚Ì‚ð‘I‚ñ‚ʼnº‚³‚¢B$(^NameDA) ‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚ÍAŒ_–ñ‘‚É“¯ˆÓ‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "[Page Down]‚ð‰Ÿ‚µ‚ÄŒ_–ñ‘‚ð‚·‚×‚Ä‚¨“ǂ݂‚¾‚³‚¢B"
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "ƒRƒ“ƒ|[ƒlƒ“ƒg‚ð‘I‚ñ‚Å‚‚¾‚³‚¢B"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "$(^NameDA)‚̃Cƒ“ƒXƒg[ƒ‹ ƒIƒvƒVƒ‡ƒ“‚ð‘I‚ñ‚Å‚‚¾‚³‚¢B"
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "à–¾"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "ƒRƒ“ƒ|[ƒlƒ“ƒg‚ð‘I‚ñ‚Å‚‚¾‚³‚¢B"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "$(^NameDA)‚̃Aƒ“ƒCƒ“ƒXƒg[ƒ‹ ƒIƒvƒVƒ‡ƒ“‚ð‘I‚ñ‚Å‚‚¾‚³‚¢B"
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ƒRƒ“ƒ|[ƒlƒ“ƒg‚Ìã‚Ƀ}ƒEƒX ƒJ[ƒ\ƒ‹‚ðˆÚ“®‚·‚邯A‚±‚±‚Éà–¾‚ª•\ަ‚³‚ê‚Ü‚·B"
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ƒRƒ“ƒ|[ƒlƒ“ƒg‚Ìã‚Ƀ}ƒEƒX ƒJ[ƒ\ƒ‹‚ðˆÚ“®‚·‚邯A‚±‚±‚Éà–¾‚ª•\ަ‚³‚ê‚Ü‚·B"
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "ƒCƒ“ƒXƒg[ƒ‹æ‚ð‘I‚ñ‚Å‚‚¾‚³‚¢B"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA)‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚éƒtƒHƒ‹ƒ_‚ð‘I‚ñ‚Å‚‚¾‚³‚¢B"
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹Œ³‚ð‘I‚ñ‚Å‚‚¾‚³‚¢B"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA)‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚éƒtƒHƒ‹ƒ_‚ð‘I‚ñ‚Å‚‚¾‚³‚¢B"
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "ƒCƒ“ƒXƒg[ƒ‹"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA)‚ðƒCƒ“ƒXƒg[ƒ‹‚µ‚Ä‚¢‚Ü‚·B‚µ‚΂炂¨‘Ò‚¿‚‚¾‚³‚¢B"
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "ƒCƒ“ƒXƒg[ƒ‹‚ÌŠ®—¹"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "ƒCƒ“ƒXƒg[ƒ‹‚ɬŒ÷‚µ‚Ü‚µ‚½B"
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "ƒCƒ“ƒXƒg[ƒ‹‚Ì’†Ž~"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ƒZƒbƒgƒAƒbƒv‚ͳí‚ÉŠ®—¹‚³‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B"
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA)‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚µ‚Ä‚¢‚Ü‚·B‚µ‚΂炂¨‘Ò‚¿‚‚¾‚³‚¢B"
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚ÌŠ®—¹"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚ɬŒ÷‚µ‚Ü‚µ‚½B"
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚Ì’†Ž~"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚ͳí‚ÉŠ®—¹‚³‚ê‚Ü‚¹‚ñ‚Å‚µ‚½B"
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) ƒZƒbƒgƒAƒbƒv ƒEƒBƒU[ƒh‚ÍŠ®—¹‚µ‚Ü‚µ‚½B"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA)‚ÍA‚±‚̃Rƒ“ƒsƒ…[ƒ^‚ɃCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ü‚µ‚½B$\r$\n$\r$\nƒEƒBƒU[ƒh‚ð•‚¶‚é‚É‚Í [Š®—¹] ‚ð‰Ÿ‚µ‚Ä‚‚¾‚³‚¢B"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) ‚̃Cƒ“ƒXƒg[ƒ‹‚ðŠ®—¹‚·‚é‚É‚ÍA‚±‚̃Rƒ“ƒsƒ…[ƒ^‚ðÄ‹N“®‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B¡‚·‚®Ä‹N“®‚µ‚Ü‚·‚©H"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹ ƒEƒBƒU[ƒh‚ÍŠ®—¹‚µ‚Ü‚µ‚½B"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA)‚ÍA‚±‚̃Rƒ“ƒsƒ…[ƒ^‚©‚çƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ü‚µ‚½B$\r$\n$\r$\nƒEƒBƒU[ƒh‚ð•‚¶‚é‚É‚Í [Š®—¹] ‚ð‰Ÿ‚µ‚Ä‚‚¾‚³‚¢B"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) ‚̃Aƒ“ƒCƒ“ƒXƒg[ƒ‹‚ðŠ®—¹‚·‚é‚É‚ÍA‚±‚̃Rƒ“ƒsƒ…[ƒ^‚ðÄ‹N“®‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B¡‚·‚®Ä‹N“®‚µ‚Ü‚·‚©H"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "¡‚·‚®Ä‹N“®‚·‚é"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Œã‚ÅŽè“®‚ÅÄ‹N“®‚·‚é"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA)‚ðŽÀs(&R)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Readme ‚ð•\ަ‚·‚é(&S)"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "Š®—¹(&F)"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "ƒXƒ^[ƒgƒƒjƒ…[ ƒtƒHƒ‹ƒ_‚ð‘I‚ñ‚Å‚‚¾‚³‚¢B"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "$(^NameDA)‚̃Vƒ‡[ƒgƒJƒbƒg‚ð쬂·‚éƒXƒ^[ƒgƒƒjƒ…[ ƒtƒHƒ‹ƒ_‚ð‘I‚ñ‚ʼnº‚³‚¢B"
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "‚±‚̃vƒƒOƒ‰ƒ€‚̃Vƒ‡[ƒgƒJƒbƒg‚ð쬂µ‚½‚¢ƒXƒ^[ƒgƒƒjƒ…[ ƒtƒHƒ‹ƒ_‚ð‘I‘ð‚µ‚Ä‚‚¾‚³‚¢B‚Ü‚½A쬂·‚éV‚µ‚¢ƒtƒHƒ‹ƒ_‚É–¼‘O‚ð‚‚¯‚邱‚Æ‚à‚Å‚«‚Ü‚·B"
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "ƒVƒ‡[ƒgƒJƒbƒg‚ð쬂µ‚È‚¢"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA)‚̃Aƒ“ƒCƒ“ƒXƒg[ƒ‹"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA)‚ð‚±‚ÌƒRƒ“ƒsƒ…[ƒ^‚©‚ç휂µ‚Ü‚·B"
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "$(^Name) ƒZƒbƒgƒAƒbƒv‚𒆎~‚µ‚Ü‚·‚©H"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name) ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚𒆎~‚µ‚Ü‚·‚©H"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Korean.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Korean.nlf
new file mode 100644
index 000000000..b9d5a0f21
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Korean.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1042
+# Font and size - dash (-) means default
+±¼¸²
+9
+# Codepage - dash (-) means ANSI code page
+949
+# RTL - anything else than RTL means LTR
+-
+# Translation by dTomoyo dtomoyo@empal.com ( ~V2.0 BETA2 ) / By hardkoder@gmail.com (V2.0 BETA3 ~ )
+# ^Branding
+³Î¼ÒÇÁÆ® ¼³Ä¡ ½Ã½ºÅÛ %s
+# ^SetupCaption
+$(^Name) ¼³Ä¡
+# ^UninstallCaption
+$(^Name) Á¦°Å
+# ^LicenseSubCaption
+: »ç¿ë±Ç °è¾à µ¿ÀÇ
+# ^ComponentsSubCaption
+: ¼³Ä¡ ¿É¼Ç
+# ^DirSubCaption
+: Æú´õ ÁöÁ¤
+# ^InstallingSubCaption
+: ÆÄÀÏ ¼³Ä¡Áß
+# ^CompletedSubCaption
+: ¼³Ä¡ ¿Ï·á
+# ^UnComponentsSubCaption
+: Á¦°Å ¿É¼Ç
+# ^UnDirSubCaption
+: Á¦°Å Æú´õ
+# ^ConfirmSubCaption
+: È®ÀÎ
+# ^UninstallingSubCaption
+: Á¦°ÅÁß
+# ^UnCompletedSubCaption
+: Á¦°Å ¿Ï·á
+# ^BackBtn
+< µÚ·Î
+# ^NextBtn
+´ÙÀ½ >
+# ^AgreeBtn
+µ¿ÀÇÇÔ
+# ^AcceptBtn
+À§ »çÇ׿¡ µ¿ÀÇÇÕ´Ï´Ù.
+# ^DontAcceptBtn
+µ¿ÀÇÇÏÁö ¾Ê½À´Ï´Ù.
+# ^InstallBtn
+¼³Ä¡
+# ^UninstallBtn
+Á¦°Å
+# ^CancelBtn
+Ãë¼Ò
+# ^CloseBtn
+´ÝÀ½
+# ^BrowseBtn
+ã¾Æº¸±â...
+# ^ShowDetailsBtn
+ÀÚ¼¼È÷ º¸±â
+# ^ClickNext
+°è¼ÓÇϽ÷Á¸é '´ÙÀ½' ¹öưÀ» ´·¯ ÁÖ¼¼¿ä.
+# ^ClickInstall
+¼³Ä¡¸¦ ½ÃÀÛÇϽ÷Á¸é '¼³Ä¡' ¹öưÀ» ´·¯ ÁÖ¼¼¿ä.
+# ^ClickUninstall
+'Á¦°Å' ¹öưÀ» ´©¸£¸é Á¦°Å°¡ ½ÃÀ۵˴ϴÙ.
+# ^Name
+À̸§
+# ^Completed
+¿Ï·á
+# ^LicenseText
+$(^NameDA)(À»)¸¦ ¼³Ä¡Çϱâ Àü¿¡ »ç¿ë±Ç °è¾à ³»¿ëÀ» »ìÆìº¸½Ã±â ¹Ù¶ø´Ï´Ù. ³»¿ë¿¡ µ¿ÀÇÇϼ̴ٸé 'µ¿ÀÇÇÔ'À» ´·¯ ÁÖ¼¼¿ä.
+# ^LicenseTextCB
+$(^NameDA)(À»)¸¦ ¼³Ä¡Çϱâ Àü¿¡ »ç¿ë±Ç °è¾à ³»¿ëÀ» »ìÆìº¸½Ã±â ¹Ù¶ø´Ï´Ù. ³»¿ë¿¡ µ¿ÀÇÇÏ¼Ì´Ù¸é ¾Æ·¡ »çÇ×À» Ã¼Å©ÇØ ÁÖ¼¼¿ä. $_CLICK
+# ^LicesnseTextRB
+$(^NameDA)(À»)¸¦ ¼³Ä¡Çϱâ Àü¿¡ »ç¿ë±Ç °è¾à ³»¿ëÀ» »ìÆìº¸½Ã±â ¹Ù¶ø´Ï´Ù. ³»¿ë¿¡ µ¿ÀÇÇÏ¼Ì´Ù¸é ¾Æ·¡ ¿É¼ÇÀ» ¼±ÅÃÇØ ÁÖ¼¼¿ä. $_CLICK
+# ^UnLicenseText
+$(^NameDA)(À»)¸¦ Á¦°ÅÇϱâ Àü¿¡ »ç¿ë±Ç °è¾à ³»¿ëÀ» »ìÆìº¸½Ã±â ¹Ù¶ø´Ï´Ù. ³»¿ë¿¡ µ¿ÀÇÇϼ̴ٸé 'µ¿ÀÇÇÔ'À» ´·¯ ÁÖ¼¼¿ä.
+# ^UnLicenseTextCB
+$(^NameDA)(À»)¸¦ Á¦°ÅÇϱâ Àü¿¡ »ç¿ë±Ç °è¾à ³»¿ëÀ» »ìÆìº¸½Ã±â ¹Ù¶ø´Ï´Ù. ³»¿ë¿¡ µ¿ÀÇÇÏ¼Ì´Ù¸é ¾Æ·¡ »çÇ×À» Ã¼Å©ÇØ ÁÖ¼¼¿ä. $_CLICK
+# ^UnLicesnseTextRB
+$(^NameDA)(À»)¸¦ Á¦°ÅÇϱâ Àü¿¡ »ç¿ë±Ç °è¾à ³»¿ëÀ» »ìÆìº¸½Ã±â ¹Ù¶ø´Ï´Ù. ³»¿ë¿¡ µ¿ÀÇÇÏ¼Ì´Ù¸é ¾Æ·¡ ¿É¼ÇÀ» ¼±ÅÃÇØ ÁÖ¼¼¿ä. $_CLICK
+# ^Custom
+»ç¿ëÀÚ Á¤ÀÇ
+# ^ComponentsText
+¼³Ä¡¸¦ ¿øÇϽô ±¸¼º ¿ä¼Ò¸¦ ¼±ÅÃÇÏ¿© Áֽñ⠹ٶø´Ï´Ù. $_CLICK
+# ^ComponentsSubText1
+¼³Ä¡ ÇüÅ ¼±ÅÃ:
+# ^ComponentsSubText2_NoInstTypes
+¼³Ä¡ÇÏ·Á´Â ±¸¼º ¿ä¼Ò ¼±ÅÃ:
+# ^ComponentsSubText2
+±¸¼º¿ä¼Ò Á÷Á¢ ¼±ÅÃ:
+# ^UnComponentsText
+Á¦°Å¸¦ ¿øÇÏ´Â ±¸¼º ¿ä¼Ò¸¦ Ã¼Å©ÇØ Áֽñ⠹ٶø´Ï´Ù. $_CLICK
+# ^UnComponentsSubText1
+Á¦°Å ÇüÅ ¼±ÅÃ:
+# ^UnComponentsSubText2_NoInstTypes
+Á¦°ÅÇÏ·Á´Â ±¸¼º ¿ä¼Ò ¼±ÅÃ:
+# ^UnComponentsSubText2
+Á¦°ÅÇÏ·Á´Â ±¸¼º¿ä¼Ò Á÷Á¢ ¼±ÅÃ:
+# ^DirText
+$(^NameDA)(À»)¸¦ ´ÙÀ½ Æú´õ¿¡ ¼³Ä¡ÇÒ ¿¹Á¤ÀÔ´Ï´Ù. \r\n´Ù¸¥ Æú´õ¿¡ ¼³Ä¡ÇÏ°í ½ÍÀ¸½Ã¸é 'ã¾Æº¸±â' ¹öưÀ» ´·¯¼ ´Ù¸¥ Æú´õ¸¦ ¼±ÅÃÇØ ÁÖ¼¼¿ä. $_CLICK
+# ^DirSubText
+¼³Ä¡ Æú´õ
+# ^DirBrowseText
+$(^NameDA)(À»)¸¦ ´ÙÀ½ Æú´õ¿¡ ¼³Ä¡ÇÕ´Ï´Ù:
+# ^UnDirText
+$(^NameDA)(À»)¸¦ ´ÙÀ½ Æú´õ¿¡¼ Á¦°ÅÇÒ ¿¹Á¤ÀÔ´Ï´Ù. \r\n´Ù¸¥ Æú´õ¿¡¼ Á¦°ÅÇÏ°í ½ÍÀ¸½Ã¸é 'ã¾Æº¸±â' ¹öưÀ» ´·¯¼ ´Ù¸¥ Æú´õ¸¦ ¼±ÅÃÇØ ÁÖ¼¼¿ä. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+$(^NameDA)(À»)¸¦ ´ÙÀ½ Æú´õ¿¡¼ Á¦°Å ÇÕ´Ï´Ù:
+# ^SpaceAvailable
+"³²Àº µð½ºÅ© °ø°£: "
+# ^SpaceRequired
+"ÇÊ¿äÇÑ µð½ºÅ© °ø°£: "
+# ^UninstallingText
+½Ã½ºÅÛ¿¡¼ $(^NameDA)(À»)¸¦ Á¦°Å ÇÒ °ÍÀÔ´Ï´Ù. $_CLICK
+# ^UninstallingText
+Á¦°Å ´ë»ó:
+# ^FileError
+´ÙÀ½ ÆÄÀÏÀ» ¿ ¼ö ¾ø½À´Ï´Ù.: \r\n\t"$0"\r\n'Áß´Ü'À» ´·¯ ¼³Ä¡¸¦ Á¾·áÇϰųª,\r'´Ù½Ã ½Ãµµ'¸¦ ´·¯ ´Ù½Ã ½ÃµµÇØ º¸°Å³ª,\r'¹«½Ã'¸¦ ´·¯ ÀÌ ÆÄÀÏÀ» °Ç³Ê ¶Ù¼¼¿ä.
+# ^FileError_NoIgnore
+´ÙÀ½ ÆÄÀÏÀ» ¿ ¼ö ¾ø½À´Ï´Ù.: \r\n\t"$0"\r\n'´Ù½Ã ½Ãµµ'¸¦ ´·¯ ´Ù½Ã ½ÃµµÇØ º¸°Å³ª,\r'Ãë¼Ò'¸¦ ´·¯ ¼³Ä¡¸¦ Á¾·áÇϼ¼¿ä.
+# ^CantWrite
+"±â·ÏÇÒ ¼ö ¾øÀ½: "
+# ^CopyFailed
+º¹»ç ½ÇÆÐ
+# ^CopyTo
+"ÆÄÀÏ º¹»ç "
+# ^Registering
+"µî·ÏÁß: "
+# ^Unregistering
+"µî·Ï ÇØÁ¦Áß: "
+# ^SymbolNotFound
+"½Éº¼À» ãÀ» ¼ö ¾øÀ½: "
+# ^CouldNotLoad
+"ºÒ·¯¿Ã ¼ö ¾øÀ½: "
+# ^CreateFolder
+"Æú´õ »ý¼º: "
+# ^CreateShortcut
+"¹Ù·Î °¡±â »ý¼º: "
+# ^CreatedUninstaller
+"¾ðÀνºÅç·¯ »ý¼º: "
+# ^Delete
+"ÆÄÀÏ »èÁ¦: "
+# ^DeleteOnReboot
+"ÀçºÎÆÃ½Ã »èÁ¦: "
+# ^ErrorCreatingShortcut
+"¹Ù·Î °¡±â »ý¼º ¿À·ù: "
+# ^ErrorCreating
+"»ý¼º ½ÇÆÐ: "
+# ^ErrorDecompressing
+¾ÐÃà ÇØÁ¦Áß ¿À·ù ¹ß»ý! ¼³Ä¡ ÆÄÀÏÀÌ ¼Õ»óµÇ¾ú½À´Ï´Ù.
+# ^ErrorRegistering
+DLL µî·Ï ½ÇÆÐ
+# ^ExecShell
+"½© ½ÇÇà: "
+# ^Exec
+"½ÇÇà: "
+# ^Extract
+"¾ÐÃà ÇØÁ¦: "
+# ^ErrorWriting
+"¾ÐÃà ÇØÁ¦: ÆÄÀÏÀ» ±â·ÏÇÏ´Â µµÁß ¿À·ù ¹ß»ý "
+# ^InvalidOpcode
+ÀνºÅç·¯ ¼Õ»óµÊ: À߸øµÈ ½ÇÇàÄÚµå
+# ^NoOLE
+"OLE Á¤º¸ ¾øÀ½: "
+# ^OutputFolder
+"´ë»ó Æú´õ: "
+# ^RemoveFolder
+"Æú´õ »èÁ¦: "
+# ^RenameOnReboot
+"ÀçºÎÆÃ½Ã À̸§ º¯°æ: "
+# ^Rename
+"À̸§ º¯°æ: "
+# ^Skipped
+"°Ç³Ê¶Ü: "
+# ^CopyDetails
+ÀÚ¼¼ÇÑ ³»¿ëÀ» Ŭ¸³º¸µå·Î º¹»ç
+# ^LogInstall
+¼³Ä¡ ·Î±× ÀÛ¼º
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Korean.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Korean.nsh
new file mode 100644
index 000000000..0be1a38e3
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Korean.nsh
@@ -0,0 +1,121 @@
+;Language: Korean (1042)
+;By linak linak@korea.com ( ~ V2.0 BETA3 ) By kippler@gmail.com(www.kipple.pe.kr) ( V2.0 BETA3 ~ ) (last update:2007/09/05)
+
+!insertmacro LANGFILE "Korean" "Korean"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) ¼³Ä¡¸¦ ½ÃÀÛÇÕ´Ï´Ù."
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "ÀÌ ÇÁ·Î±×·¥Àº ´ç½ÅÀÇ ÄÄÇ»ÅÍ¿¡ $(^NameDA)(À»)¸¦ ¼³Ä¡ÇÒ °ÍÀÔ´Ï´Ù.$\r$\n$\r$\n¼³Ä¡¸¦ ½ÃÀÛÇϱâ Àü °¡´ÉÇÑ ÇÑ ¸ðµç ÇÁ·Î±×·¥À» Á¾·áÇÏ¿© Áֽñ⠹ٶø´Ï´Ù. ÀÌ´Â ÀçºÎÆÃÀ» ÇÏÁö ¾Ê°í¼µµ ½Ã½ºÅÛ ÆÄÀÏÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ°Ô ÇØÁÝ´Ï´Ù.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) Á¦°Å¸¦ ½ÃÀÛÇÕ´Ï´Ù."
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "ÀÌ ÇÁ·Î±×·¥Àº ´ç½ÅÀÇ ÄÄÇ»ÅÍ¿¡¼ $(^NameDA)(À»)¸¦ Á¦°ÅÇÒ °ÍÀÔ´Ï´Ù.$\r$\n$\r$\nÁ¦°Å¸¦ ½ÃÀÛÇϱâ Àü¿¡ $(^NameDA)(À»)¸¦ Á¾·áÇÏ¿© Áֽñ⠹ٶø´Ï´Ù.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "»ç¿ë±Ç °è¾à"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA)(À»)¸¦ ¼³Ä¡ÇϽñâ Àü¿¡ »ç¿ë±Ç °è¾à ³»¿ëÀ» »ìÆìº¸½Ã±â ¹Ù¶ø´Ï´Ù."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "³»¿ë¿¡ µ¿ÀÇÇϼ̴ٸé 'µ¿ÀÇÇÔ'À» ´·¯ ÁÖ¼¼¿ä. $(^NameDA)(À»)¸¦ ¼³Ä¡Çϱâ À§Çؼ´Â ¹Ýµå½Ã ³»¿ë¿¡ µ¿ÀÇÇÏ¼Å¾ß ÇÕ´Ï´Ù."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "³»¿ë¿¡ µ¿ÀÇÇÏ¼Ì´Ù¸é ¾Æ·¡ »çÇ×À» ¼±ÅÃÇØ ÁÖ¼¼¿ä. $(^NameDA)(À»)¸¦ ¼³Ä¡Çϱâ À§Çؼ´Â ¹Ýµå½Ã ³»¿ë¿¡ µ¿ÀÇÇÏ¼Å¾ß ÇÕ´Ï´Ù. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "³»¿ë¿¡ µ¿ÀÇÇϼ̴ٸé ù ¹øÂ° »çÇ×À» ¼±ÅÃÇØ ÁÖ¼¼¿ä. $(^NameDA)(À»)¸¦ ¼³Ä¡Çϱâ À§Çؼ´Â ¹Ýµå½Ã ³»¿ë¿¡ µ¿ÀÇÇÏ¼Å¾ß ÇÕ´Ï´Ù. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "»ç¿ë±Ç °è¾à µ¿ÀÇ"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA)(À»)¸¦ Á¦°ÅÇϽñâ Àü¿¡ »ç¿ë±Ç °è¾à ³»¿ëÀ» »ìÆìº¸½Ã±â ¹Ù¶ø´Ï´Ù."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "³»¿ë¿¡ µ¿ÀÇÇϼ̴ٸé 'µ¿ÀÇÇÔ'À» ´·¯ ÁÖ¼¼¿ä. $(^NameDA)(À»)¸¦ Á¦°ÅÇϱâ À§Çؼ´Â ¹Ýµå½Ã ³»¿ë¿¡ µ¿ÀÇÇÏ¼Å¾ß ÇÕ´Ï´Ù."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "³»¿ë¿¡ µ¿ÀÇÇÏ¼Ì´Ù¸é ¾Æ·¡ »çÇ×À» ¼±ÅÃÇØ ÁÖ¼¼¿ä. $(^NameDA)(À»)¸¦ Á¦°ÅÇϱâ À§Çؼ´Â ¹Ýµå½Ã ³»¿ë¿¡ µ¿ÀÇÇÏ¼Å¾ß ÇÕ´Ï´Ù. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "³»¿ë¿¡ µ¿ÀÇÇϼ̴ٸé ù ¹øÂ° »çÇ×À» ¼±ÅÃÇØ ÁÖ¼¼¿ä. $(^NameDA)(À»)¸¦ Á¦°ÅÇϱâ À§Çؼ´Â ¹Ýµå½Ã ³»¿ë¿¡ µ¿ÀÇÇÏ¼Å¾ß ÇÕ´Ï´Ù. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "»ç¿ë±Ç °è¾à µ¿ÀÇ »çÇ×ÀÇ ³ª¸ÓÁö ºÎºÐÀ» º¸½Ã·Á¸é [Page Down] ۸¦ ´·¯ ÁÖ¼¼¿ä."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "±¸¼º ¿ä¼Ò ¼±ÅÃ"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "¼³Ä¡ÇϰíÀÚ ÇÏ´Â $(^NameDA)ÀÇ ±¸¼º ¿ä¼Ò¸¦ ¼±ÅÃÇØ ÁÖ¼¼¿ä."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "»ó¼¼ ¼³¸í"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "±¸¼º ¿ä¼Ò ¼±ÅÃ"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Á¦°ÅÇϰíÀÚ ÇÏ´Â $(^NameDA)ÀÇ ±¸¼º ¿ä¼Ò¸¦ ¼±ÅÃÇØ ÁÖ¼¼¿ä."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "»ó¼¼ ¼³¸íÀ» º¸°í ½ÍÀ¸½Å ºÎºÐ¿¡ ¸¶¿ì½º¸¦ ¿Ã·Á³õÀ¸¼¼¿ä."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "»ó¼¼ ¼³¸íÀ» º¸°í ½ÍÀ¸½Å ºÎºÐ¿¡ ¸¶¿ì½º¸¦ ¿Ã·Á³õÀ¸¼¼¿ä."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "¼³Ä¡ À§Ä¡ ¼±ÅÃ"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA)(À»)¸¦ ¼³Ä¡ÇÒ Æú´õ¸¦ ¼±ÅÃÇØ ÁÖ¼¼¿ä."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Á¦°Å À§Ä¡ ¼±ÅÃ"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA)(À»)¸¦ Á¦°ÅÇÒ Æú´õ¸¦ ¼±ÅÃÇØ ÁÖ¼¼¿ä."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "¼³Ä¡Áß"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA)(À»)¸¦ ¼³Ä¡ÇÏ´Â µ¿¾È Àá½Ã ±â´Ù·Á ÁÖ¼¼¿ä."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "¼³Ä¡ ¿Ï·á"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "¼³Ä¡°¡ ¼º°øÀûÀ¸·Î ¿Ï·áµÇ¾ú½À´Ï´Ù."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "¼³Ä¡ Ãë¼Ò"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ÇÁ·Î±×·¥ ¼³Ä¡°¡ Ãë¼ÒµÇ¾ú½À´Ï´Ù."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Á¦°ÅÁß"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA)(À»)¸¦ Á¦°ÅÇÏ´Â µ¿¾È Àá½Ã ±â´Ù·Á Áֽñ⠹ٶø´Ï´Ù."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Á¦°Å ¸¶Ä§"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "ÇÁ·Î±×·¥À» ¼º°øÀûÀ¸·Î Á¦°ÅÇÏ¿´½À´Ï´Ù."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "ÇÁ·Î±×·¥ Á¦°Å Ãë¼Ò"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "ÇÁ·Î±×·¥ Á¦°Å°¡ Ãë¼ÒµÇ¾ú½À´Ï´Ù."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) ¼³Ä¡ ¿Ï·á"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA)ÀÇ ¼³Ä¡°¡ ¿Ï·áµÇ¾ú½À´Ï´Ù. ¼³Ä¡ ÇÁ·Î±×·¥À» ¸¶Ä¡·Á¸é '¸¶Ä§' ¹öưÀ» ´·¯ ÁÖ¼¼¿ä."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA)ÀÇ ¼³Ä¡¸¦ ¿Ï·áÇϱâ À§Çؼ´Â ½Ã½ºÅÛÀ» ´Ù½Ã ½ÃÀÛÇØ¾ß ÇÕ´Ï´Ù. Áö±Ý ÀçºÎÆÃ ÇϽðڽÀ´Ï±î?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Á¦°Å ¿Ï·á"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA)ÀÇ Á¦°Å°¡ ¿Ï·á µÇ¾ú½À´Ï´Ù."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA)ÀÇ Á¦°Å¸¦ ¿Ï·áÇϱâ À§Çؼ´Â ½Ã½ºÅÛÀ» ´Ù½Ã ½ÃÀÛÇØ¾ß ÇÕ´Ï´Ù. Áö±Ý ÀçºÎÆÃ ÇϽðڽÀ´Ï±î?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Áö±Ý ÀçºÎÆÃ ÇϰڽÀ´Ï´Ù."
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "³ªÁß¿¡ ÀçºÎÆÃ ÇϰڽÀ´Ï´Ù."
+ ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) ½ÇÇàÇϱâ(&R)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Readme ÆÄÀÏ º¸±â(&S)"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "¸¶Ä§"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "½ÃÀÛ ¸Þ´º Æú´õ ¼±ÅÃ"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "ÇÁ·Î±×·¥ÀÇ ¹Ù·Î °¡±â ¾ÆÀÌÄÜÀÌ »ý¼ºµÉ ½ÃÀÛ ¸Þ´º Æú´õ ¼±ÅÃ."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "ÇÁ·Î±×·¥ÀÇ ¹Ù·Î °¡±â ¾ÆÀÌÄÜÀÌ »ý¼ºµÉ ½ÃÀÛ ¸Þ´º Æú´õ¸¦ ¼±ÅÃÇϼ¼¿ä. »õ·Î¿î Æú´õ¸¦ »ý¼ºÇÏ·Á¸é Æú´õ À̸§À» ÀÔ·ÂÇϼ¼¿ä."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "¹Ù·Î °¡±â ¾ÆÀÌÄÜÀ» ¸¸µéÁö ¾Ê°Ú½À´Ï´Ù."
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) Á¦°Å"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) Á¦°ÅÇϱâ"
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "$(^Name) ¼³Ä¡¸¦ Ãë¼ÒÇϽðڽÀ´Ï±î?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name) Á¦°Å¸¦ Ãë¼ÒÇϽðڽÀ´Ï±î?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Kurdish.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Kurdish.nlf
new file mode 100644
index 000000000..8716a1d74
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Kurdish.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID (none exists for Kurdish at this time)
+9999
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+-
+# RTL - anything else than RTL means LTR
+-
+# Translation by Rêzan Tovjîn(chagy) (retovjin@hotmail.com.com)
+# ^Branding
+Nullsoft Pergala Sazkirinê %s
+# ^SetupCaption
+$(^Name) Sazkirin
+# ^UninstallCaption
+$(^Name) Rakirin
+# ^LicenseSubCaption
+: Peymana Lîsansê
+# ^ComponentsSubCaption
+: Vebijêrkên Sazkirinê
+# ^DirSubCaption
+: Peldanka Sazkirinê
+# ^InstallingSubCaption
+: Tê Sazkirin
+# ^CompletedSubCaption
+: Qediya
+# ^UnComponentsSubCaption
+: Vebijêrkên Rakirinê
+# ^UnDirSubCaption
+: Peldanka Rakirinê
+# ^ConfirmSubCaption
+: Erêkirin
+# ^UninstallingSubCaption
+: Tê Rakirin
+# ^UnCompletedSubCaption
+: Qediya
+# ^BackBtn
+< &Vegere
+# ^NextBtn
+&Bidomîne >
+# ^AgreeBtn
+&Ez Dipejirînim
+# ^AcceptBtn
+Þertên Peymanê &Dipejirînim
+# ^DontAcceptBtn
+Þertên Peymanê Napejirînim
+# ^InstallBtn
+&Saz Bike
+# ^UninstallBtn
+&Rake
+# ^CancelBtn
+Betal
+# ^CloseBtn
+&Bigire
+# ^BrowseBtn
+&Çavlêgerîn...
+# ^ShowDetailsBtn
+Hûragahiyan &Nîþan Bide
+# ^ClickNext
+Ji bo berdewamê 'Bidomîne'yê bitikîne.
+# ^ClickInstall
+Ji bo destpêka sazkirinê 'Saz Bike'yê bitikîne.
+# ^ClickUninstall
+Ji bo destpêka rakirinê 'Rake' bitikîne.
+# ^Name
+nav
+# ^Completed
+Qediya
+# ^LicenseText
+Ji kerema xwe re berî tu bernameya $(^NameDA) saz bikî, çavekî li peymana lîsansê bigerîne. Heke tu hemû þertên peymanê dipejirînî, 'Ez Dipejirînim'ê bitikîne.
+# ^LicenseTextCB
+Ji kerema xwe re berî tu bernameya $(^NameDA) saz bikî, çavekî li peymana lîsansê bigerîne. Heke tu hemû þertan dipejirînî, zeviya erêkirinê ya jêrîn dagire. $_CLICK
+# ^LicenseTextRB
+Ji kerema xwe re berî tu bernameya $(^NameDA) saz bikî çavekî li peymana lîsansê bigerîne. Heke tu hemû þertên peymanê dipejirînî, zeviya vebijêrkê ya jêrîn dagire. $_CLICK
+# ^UnLicenseText
+Ji kerema xwe re berî tu bernameya $(^NameDA) rakî, çavekî li peymana lîsansê bigerîne. Heke tu hemû þertên peymanê dipejirînî, 'Ez Dipejirînim'ê bitikîn.
+# ^UnLicenseTextCB
+Ji kerema xwe re berî tu bernameya $(^NameDA) ji pergala xwe rakî, çavekî li peymana lîsansê bigerîne. Heke tu hemû þertên peymanê dipejirînî, zeviya jêrîn a erêkirinê dagire. $_CLICK
+# ^UnLicenseTextRB
+Ji kerema xwe re berî tu bernameya $(^NameDA) ji pergala xwe rakî, çavekî li peymana lîsansê bigerîne. Heke tu hemû þertên peymanê dipejirînî, zeviya vebijêrkê ya jêrîn dagire. $_CLICK
+# ^Custom
+Taybet
+# ^ComponentsText
+Beþên tu dixwazî saz bikî hilbijêre û niqirên 'check' beþên tu naxwazî werin sazkirin rake. $_CLICK
+# ^ComponentsSubText1
+Awayê sazkirinê hilbijêre:
+# ^ComponentsSubText2_NoInstTypes
+Beþên dê werin sazkirin hilbijêre:
+# ^ComponentsSubText2
+an jî, beþên beþên tu dixwazî werin sazkirin hilbijêre:
+# ^UnComponentsText
+Beþên tu dixwazî rakî hilbijêre, an jî niqira 'check'a ber beþên tu daxwazî were rakirin, rake. $_CLICK
+# ^UnComponentsSubText1
+Awayê rakirinê hilbijêre:
+# ^UnComponentsSubText2_NoInstTypes
+Beþên dê werin rakirin hilbijêre:
+# ^UnComponentsSubText2
+an jî beþên tu dixwazî werin rakirin hilbijêre:
+# ^DirText
+$(^NameDA) dê ji aliyê sazkirinê ve li peldanka jêrîn were sazkirin. Ji bo tu li peldankeke din saz bikî 'Çavlêgerîn'ê bitikîne û peldankeke din hilbijêre. $_CLICK
+# ^DirSubText
+Peldanka Armanckirî
+# ^DirBrowseText
+Peldanka tu dixwazî bernameya $(^NameDA) lê were sazkirin hilbijêre:
+# ^UnDirText
+$(^NameDA) dê ji aliyê sazkirinê ve ji peldanka jêrîn were rakirin. Ji bo tu ji peldankeke cuda rakî 'Çavlêgerîn'ê bitikîne û peldankeke din hilbijêre. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Peldanka tu dixwazî bernameya $(^NameDA) jê were rakirin hilbijêre:
+# ^SpaceAvailable
+"Herêma vala ku dikare were bikaranîn: "
+# ^SpaceRequired
+"Herêma vala ya pêwist: "
+# ^UninstallingText
+Bernameya $(^NameDA) dê ji peldanka jêrîn were rakirin. $_CLICK
+# ^UninstallingSubText
+tê rakirin:
+# ^FileError
+Dosya ji bo nivîsandinê venebû: \r\n\t"$0"\r\nJi bo destjêberdana sazkirinê abort'ê bitikîne,\r\nji bo ceribandina ji nû ve retry'ê , an jî\r\nji bo tu dosiyê tune bihesibînî û berdewam bikî ignore'yê bitikîne
+# ^FileError_NoIgnore
+Dosya ji bo nivîsandinê vebenebû: \r\n\t"$0"\r\nJi bo nivîsandina ji nû ve retry'yê, an jî\r\nJi bo destjêberdana sazkirinê abort'ê hilbijêre
+# ^CantWrite
+"Nehate Nivîsandin: "
+# ^CopyFailed
+Çewtiya Jibergirtinê
+# ^CopyTo
+"Ji Ber Bigire "
+# ^Registering
+"Tê Tomarkirin: "
+# ^Unregistering
+"Tomarî Tê Jêbirin: "
+# ^SymbolNotFound
+"Dawêr Nehate Dîtin: "
+# ^CouldNotLoad
+"Nehate Barkirin: "
+# ^CreateFolder
+"Peldankê Çêke: "
+# ^CreateShortcut
+"Kineriyê Çêke: "
+# ^CreatedUninstaller
+"Sêrbazê Rakirinê Hate Çêkirin: "
+# ^Delete
+"Dosyayê Jê Bibe: "
+# ^DeleteOnReboot
+"Dema ji nû ve dest pê kir dosiyê jê bibe: "
+# ^ErrorCreatingShortcut
+"Dema çêkirina kineriyê çewtî derket: "
+# ^ErrorCreating
+"Çewtiya çêkirinê: "
+# ^ErrorDecompressing
+Di dema vekirina daneyan de çewtî derket! Sazkirina Çewt?
+# ^ErrorRegistering
+Çewtiya tomariya DLL
+# ^ExecShell
+"Qalikê Xebatê: "
+# ^Exec
+"Bixebitîne: "
+# ^Extract
+"Veke: "
+# ^ErrorWriting
+"Veke: Dema li dosiyê hate nivîsîn çewtiyek derket "
+# ^InvalidOpcode
+Sazkirina Xirabe: koda nerast pêkanînê
+# ^NoOLE
+"OLE nehate dîtin: "
+# ^OutputFolder
+"Peldanka derketinê: "
+# ^RemoveFolder
+"Peldankê jê bibe: "
+# ^RenameOnReboot
+"Dema ji nû hate destpêkirin ji nû ve bi nav bike: "
+# ^Rename
+"Nav Biguhere: "
+# ^Skipped
+"Hate gavkirin: "
+# ^CopyDetails
+Hûragahiyan li Pano'yê binivîse
+# ^LogInstall
+Pêkanîna sazkirinê li lênûska rewþê binivîse
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Kurdish.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Kurdish.nsh
new file mode 100644
index 000000000..ab246d456
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Kurdish.nsh
@@ -0,0 +1,122 @@
+;Language: Kurdish
+;By Rêzan Tovjîn
+;Updated by Erdal Ronahî (erdal.ronahi@gmail.com)
+
+!insertmacro LANGFILE "Kurdish" "Kurdî"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) Tu bi xêr hatî sêrbaziya sazkirinê"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ev sêrbaz dê di dema sazkirina $(^NameDA) de rêberiya te bike.$\r$\n$\r$\nBerî tu dest bi sazkirinê bikî, em pêþniyar dikin tu hemû bernameyên vekirî bigirî. Bi vî rengî beyî tu komputera ji nû ve vekî dê hinek dosiyên pergalê bêpirsgirêk werin sazkirin.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Tu bi xêr hatî sêrbaziya rakirina bernameya $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ev sêrbaz ji bo rakirina bernameya $(^NameDA) dê alîkariya te bike.$\r$\n$\r$\nBerî tu dest bi rakirina bernameyê bikî, bernameyên vekirî hemûyan bigire. Bi vî rengî dû re tu mecbûr namînî ku komputera xwe bigirî û ji nû ve veki.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Peymana Lîsansê"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ji kerema xwe re berî tu bernameya $(^NameDA) saz bikî, peymana lîsansê bixwîne."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Heke tu þertên peymanê dipejirînî, 'Ez Dipejirînim'ê bitikîne. Ji bo sazkirina bernameya $(^NameDA) divê tu þertên peymanê bipejirînî."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Heke tu þertên peymanê dipejirînî, zeviya piþtrastkirinê ya jêrîn dagire. Ji bo tu bikarî bernameya $(^NameDA) saz bikî divê tu þertên peymanê bipejirînî. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Heke tu þertên peymanê dipejirînî, biþkojka erêkirinê ya jêrîn bitikîne. Ji bo sazkirina bernameya $(^NameDA) divê tu þertên peymanê bipejirînî. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Peymana Lîsansê"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Berî tu bernameya $(^NameDA) ji pergala xwe rakî peymanê bixwîne."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Heke tu þertên peymanê dipejirînî, 'Dipejirînim'ê bitikîne. Ji bo rakirina bernameya $(^NameDA) divê tu þertên peymanê bipejirînî."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Heke tu þertên peymanê dipejirînî, zeviya erêkirinê ya jêrîn dagire. Ji bo tu bernameya $(^NameDA) ji pergala xwe rakî divê tu peymanê bipejirînî. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Heke tu þertên peymanê dipejirînî, biþkojka erêkirinê ya jêrîn hilbijêre. Ji bo tu bernameya $(^NameDA) ji pergala xwe rakî divê tu þertên peymanê bipejirînî. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Ji bo dûmahîka peymanê biþkojka 'page down' bitikîne."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Hilbijartina pareyan"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Ji bo sazkirina $(^NameDA) pareyên tu dixwazî hilbijêre."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Dazanîn"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Hilbijartina Pareyan"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Pareya bernameya $(^NameDA) ku tu dixwazî rakî hilbijêre."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ji bo tu der barê pareyan de agahiyan bistînî nîþanekê bibe ser pareyekê."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ji bo tu der barê pareyan de agahiyan bistînî nîþanekê bibe ser pareyekê."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Hilbijartina peldanka armanckirî"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Peldanka tu dixwazî bernameya $(^NameDA) tê de were sazkirin hilbijêre."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Hilbijartina Peldanka Dê Were Rakirin"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Peldanka bernameya $(^NameDA) ku tudixwazî rakî hilbijêre."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Tê sazkirin"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ji kerema xwe re heta sazkirina $(^NameDA) biqede raweste."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Sazkirin Qediya"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Sazkirin bi serkeftinî qediya."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Sazkirin hate betalkirin"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Sazkirin be tevahî qediya."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Tê rakirin"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Heta bernameya $(^NameDA) ji pergala te were rakirin raweste."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Rakirina Bernameyê Biqedîne"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Rakirina bernameyê bi serkeftin pêk hat."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Rakirina bernameyê hate betalkirin"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Rakirina bernameyê neqediya."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Sêrbaziya sazkirina $(^NameDA) diqede."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) li komputera te hate barkirin.$\r$\n$\r$\n'Biqedîne'yê bitikîne û sazkirinê bi dawî bîne."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Ji bo bidawîkirina sazkirina $(^NameDA) divê tu komputerê ji nû ve vekî.Tu dixwazî komputerê ji nû ve vekî?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Sêrbaziya Rakirina Bernameya $(^NameDA) Tê Temamkirin"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Bernameya $(^NameDA) ji pergale hate rakirin.$\r$\n$\r$\nJi bo girtina sêrbaz 'biqedîne'yê bitikîne."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Ji bo rakirina bernameya $(^NameDA) biqede divê tu komputera xwe ji nû ve vekî. Tu dixwazî niha komputera te were girtin û ji nû ve dest pê bike?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ji nû ve veke"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ezê paþê ji nû ve vekim."
+ ${LangFileString} MUI_TEXT_FINISH_RUN "Bernameya $(^NameDA) bixebitîne"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Dosiya min bixwîne/readme &nîþan bide"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Biqedîne"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Hilbijartina Peldanka Pêþeka Destpêkê"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Peldanka pêþeka destpêkê ya ku dê kineriya $(^NameDA) tê de were bikaranîn hilbijêre."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Peldanka pêþeka destpêkê ya ku dê kineriya bernameyê tê de were bicihkirin hilbijêre. Tu dikarî bi navekî nû peldankeke nû ava bikî."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Bêyî çêkirina kineriyê bidomîne"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Bernameya $(^NameDA) Rake"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Rakirina bernameya $(^NameDA) ji pergala te."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Tu bawer î ku dixwazî ji sazkirina $(^Name) derkevî?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Tu bawer î ku dixwazî dest ji rakirina bernameya $(^Name) berdî?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Latvian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Latvian.nlf
new file mode 100644
index 000000000..280a02864
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Latvian.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1062
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1257
+# RTL - anything else than RTL means LTR
+-
+# Translation by Valdis Griíis (valmiera-9@inbox.lv)
+# Corrections by Kristaps Meòìelis / x-f (x-f 'AT' inbox.lv)
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+'$(^Name)' Uzstâdîðana
+# ^UninstallCaption
+'$(^Name)' Atinstalçðana
+# ^LicenseSubCaption
+: Licences lîgums
+# ^ComponentsSubCaption
+: Uzstâdîðanas opcijas
+# ^DirSubCaption
+: Uzstâdîðanas mape
+# ^InstallingSubCaption
+: Notiek uzstâdîðana
+# ^CompletedSubCaption
+: Uzstâdîðana pabeigta.
+# ^UnComponentsSubCaption
+: Atinstalçðanas opcijas
+# ^UnDirSubCaption
+: Atinstalçðanas mape
+# ^ConfirmSubCaption
+: Apstiprinâðana
+# ^UninstallingSubCaption
+: Notiek atinstalçðana
+# ^UnCompletedSubCaption
+: Atinstalçðana pabeigta
+# ^BackBtn
+< &Atpakaï
+# ^NextBtn
+&Tâlâk >
+# ^AgreeBtn
+Es &piekrîtu
+# ^AcceptBtn
+Es &piekrîtu licences lîguma noteikumiem
+# ^DontAcceptBtn
+Es &nepiekrîtu licences lîguma noteikumiem
+# ^InstallBtn
+&Uzstâdît
+# ^UninstallBtn
+&Atinstalçt
+# ^CancelBtn
+Atcelt
+# ^CloseBtn
+Ai&zvçrt
+# ^BrowseBtn
+Pâ&rlûkot...
+# ^ShowDetailsBtn
+Parâdît &detaïas
+# ^ClickNext
+Spiediet 'Tâlâk', lai turpinâtu.
+# ^ClickInstall
+Spiediet 'Uzstâdît', lai sâktu uzstâdîðanas procesu.
+# ^ClickUninstall
+Spiediet 'Atinstalçt', lai sâktu atinstalçðanas procesu.
+# ^Name
+Vârds
+# ^Completed
+Uzstâdîðana pabeigta
+# ^LicenseText
+Lûdzu izlasiet licences lîgumu pirms '$(^NameDA)' uzstâdîðanas. Ja piekrîtat licences lîguma noteikumiem, tad spiediet 'Es piekrîtu'.
+# ^LicenseTextCB
+Lûdzu izlasiet licences lîgumu pirms '$(^NameDA)' uzstâdîðanas. Ja piekrîtat licences lîguma noteikumiem, tad atzîmçjiet izvçles rûtiòu. $_CLICK
+# ^LicenseTextRB
+Lûdzu izlasiet licences lîgumu pirms '$(^NameDA)' uzstâdîðanas. Ja piekrîtat licences lîguma noteikumiem, tad izvçlieties pirmo zemâkesoðo opciju. $_CLICK
+# ^UnLicenseText
+Lûdzu izlasiet licences lîgumu pirms '$(^NameDA)' atinstalçðanas. Ja piekrîtat licences lîguma noteikumiem, tad spiediet 'Es piekrîtu'.
+# ^UnLicenseTextCB
+Lûdzu izlasiet licences lîgumu pirms '$(^NameDA)' atinstalçðanas. Ja piekrîtat licences lîguma noteikumiem, tad atzîmçjiet izvçles rûtiòu. $_CLICK
+# ^UnLicenseTextRB
+Lûdzu izlasiet licences lîgumu pirms '$(^NameDA)' atinstalçðanas. Ja piekrîtat licences lîguma noteikumiem, tad izvçlieties zemâkesoðo opciju. $_CLICK
+# ^Custom
+Pielâgots
+# ^ComponentsText
+Izvçlieties, kurus komponentus vçlaties uzstâdît un neiezîmçjiet tos, kurus nevçlaties uzstâdît. $_CLICK
+# ^ComponentsSubText1
+Izvçlieties uzstâdîðanas veidu:
+# ^ComponentsSubText2_NoInstTypes
+Izvçlieties uzstâdâmos komponentus:
+# ^ComponentsSubText2
+Vai arî – izvçlieties tikai nepiecieðamos komponentus, kurus vçlaties uzstâdît:
+# ^UnComponentsText
+Izvçlieties, kurus komponentus atinstalçt un neiezîmçjiet tos, kurus nevçlaties atinstalçt. $_CLICK
+# ^UnComponentsSubText1
+Izvçlieties atinstalçðanas veidu:
+# ^UnComponentsSubText2_NoInstTypes
+Izvçlieties atinstalçjamos komponentus:
+# ^UnComponentsSubText2
+Vai arî – izvçlieties tikai nepiecieðamos komponentus, kurus vçlaties atinstalçt:
+# ^DirText
+'$(^NameDA)' tiks uzstâdîta ðajâ mapç. Lai to uzstâdîtu citâ mapç, nospiediet 'Pârlûkot' un izvçlieties citu mapi. $_CLICK
+# ^DirSubText
+Uzstâdîðanas mape
+# ^DirBrowseText
+Izvçlieties mapi, kurâ uzstâdît '$(^NameDA)':
+# ^UnDirText
+'$(^NameDA)' tiks atinstalçta no ðîs mapes. Lai to atinstalçtu no citas mapes, nospiediet 'Pârlûkot' un izvçlieties citu mapi. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Izvçlieties mapi, no kuras atinstalçt '$(^NameDA)':
+# ^SpaceAvailable
+"Pieejamais diska apjoms: "
+# ^SpaceRequired
+"Nepiecieðamais diska apjoms: "
+# ^UninstallingText
+'$(^NameDA)' tiks atinstalçta no ðîs mapes. $_CLICK
+# ^UninstallingSubText
+Atinstalçðana no:
+# ^FileError
+Kïûda atverot failu rakstîðanai: \r\n\t"$0"\r\nNospiediet 'Atcelt', lai atceltu uzstâdîðanas procesu,\r\n'Mçìinât vçlreiz', lai atkârtoti mçìinâtu rakstît failâ vai\r\n'Ignorçt', lai izlaistu ðî faila uzstâdîðanu
+# ^FileError_NoIgnore
+Kïûda atverot failu rakstîðanai: \r\n\t"$0"\r\nNospiediet 'Atcelt', lai pârtrauktu uzstâdîðanas procesu
+# ^CantWrite
+"Nevar ierakstît: "
+# ^CopyFailed
+Kopçðana neizdevâs
+# ^CopyTo
+"Kopç uz "
+# ^Registering
+"Reìistrç: "
+# ^Unregistering
+"Atreìistrç: "
+# ^SymbolNotFound
+"Simbols nav atrasts: "
+# ^CouldNotLoad
+"Nav iespçjams ielâdçt: "
+# ^CreateFolder
+"Izveido mapi: "
+# ^CreateShortcut
+"Izveido saîsni: "
+# ^CreatedUninstaller
+"Izveidots atinstalçtâjs: "
+# ^Delete
+"Dzçð failu: "
+# ^DeleteOnReboot
+"Dzçst pçc pârstartçðanas: "
+# ^ErrorCreatingShortcut
+"Kïûda veidojot saîsni: "
+# ^ErrorCreating
+"Kïûda veidojot: "
+# ^ErrorDecompressing
+Kïûda atkompresçjot datus! Bojâta instalâcija?
+# ^ErrorRegistering
+Kïûda reìistrçjot DLL failu
+# ^ExecShell
+"Izpilda èaulâ: "
+# ^Exec
+"Izpilda: "
+# ^Extract
+"Atspieþ: "
+# ^ErrorWriting
+"Atspieðana: kïûda rakstot failâ "
+# ^InvalidOpcode
+Instalâcija bojâta: nederîgs CRC kods
+# ^NoOLE
+"Nav OLE priekð: "
+# ^OutputFolder
+"Izvades mape: "
+# ^RemoveFolder
+"Dzçð mapi: "
+# ^RenameOnReboot
+"Pârsaukt pçc pârstartçðanas: "
+# ^Rename
+"Pârsaukt: "
+# ^Skipped
+"Izlaists: "
+# ^CopyDetails
+Iekopçt detaïas starpliktuvç
+# ^LogInstall
+Ierakstît þurnâla failâ uzstâdîðanas procesu
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Latvian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Latvian.nsh
new file mode 100644
index 000000000..fb8c4c5f7
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Latvian.nsh
@@ -0,0 +1,122 @@
+;Language: Latvieðu [Latvian] - (1062)
+;By Valdis Griíis
+;Corrections by Kristaps Meòìelis / x-f (x-f 'AT' inbox.lv)
+
+!insertmacro LANGFILE "Latvian" "Latvieðu"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Esiet sveicinâti '$(^NameDA)' uzstâdîðanas vednî"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ðis uzstâdîðanas vednis jums palîdzçs veikt '$(^NameDA)' uzstâdîðanu.$\r$\n$\r$\nÏoti ieteicams aizvçrt citas programmas pirms ðîs programmas uzstâdîðanas veikðanas. Tas ïaus atjaunot svarîgus sistçmas failus bez datora pârstartçðanas.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Esiet sveicinâti '$(^NameDA)' atinstalçðanas vednî"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ðis vednis jums palîdzçs veikt '$(^NameDA)' atinstalçðanu.$\r$\n$\r$\nPirms sâkt atinstalçðanas procesu, pârliecinieties, vai '$(^NameDA)' paðlaik nedarbojas.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licences lîgums"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lûdzu izlasiet licences lîgumu pirms '$(^NameDA)' uzstâdîðanas."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ja piekrîtat licences lîguma noteikumiem, spiediet 'Piekrîtu', lai turpinâtu uzstâdîðanu. Jums ir jâpiekrît licences noteikumiem, lai uzstâdîtu '$(^NameDA)'."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ja piekrîtat licences lîguma noteikumiem, tad atzîmçjiet izvçles rûtiòu. Jums ir jâpiekrît licences noteikumiem, lai uzstâdîtu '$(^NameDA)'. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ja piekrîtat licences lîguma noteikumiem, tad izvçlieties pirmo zemâkesoðo opciju. Jums ir jâpiekrît licences noteikumiem, lai uzstâdîtu '$(^NameDA)'. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licences lîgums"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lûdzu izlasiet licences lîgumu pirms '$(^NameDA)' atinstalçðanas."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ja piekrîtat licences noteikumiem, spiediet 'Piekrîtu', lai turpinâtu. Jums ir jâpiekrît licences noteikumiem, lai atinstalçtu '$(^NameDA)'."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ja piekrîtat licences lîguma noteikumiem, tad iezîmçjiet izvçles rûtiòu. Jums ir jâpiekrît licences noteikumiem, lai atinstalçtu '$(^NameDA)'. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ja piekrîtat licences lîguma noteikumiem, tad izvçlieties pirmo zemâkesoðo opciju. Jums ir jâpiekrît licences noteikumiem, lai atinstalçtu '$(^NameDA)'. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Spiediet 'Page Down', lai aplûkotu visu lîgumu."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izvçlieties komponentus"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Izvçlieties nepiecieðamâs '$(^NameDA)' sastâvdaïas, kuras uzstâdît."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Apraksts"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izvçlieties komponentus"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Izvçlieties nepiecieðamâs '$(^NameDA)' sastâvdaïas, kuras atinstalçt."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Novietojiet peles kursoru uz komponenta, lai tiktu parâdîts tâ apraksts."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Novietojiet peles kursoru uz komponenta, lai tiktu parâdîts tâ apraksts."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Izvçlieties uzstâdîðanas mapi"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Izvçlieties mapi, kurâ uzstâdît '$(^NameDA)'."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Izvçlieties atinstalçðanas mapi"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Izvçlieties mapi, no kuras notiks '$(^NameDA)' atinstalçðana."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Notiek uzstâdîðana"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Lûdzu uzgaidiet, kamçr notiek '$(^NameDA)' uzstâdîðana."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Uzstâdîðana pabeigta"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Uzstâdîðana noritçja veiksmîgi."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Uzstâdîðana atcelta"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Uzstâdîðana nenoritçja veiksmîgi."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Notiek atinstalçðana"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Lûdzu uzgaidiet, kamçr '$(^NameDA)' tiek atinstalçta."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Atinstalçðana pabeigta"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Atinstalçðana noritçja veiksmîgi."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Atinstalçðana atcelta"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Atinstalçðana nenoritçja veiksmîgi."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Tiek pabeigta '$(^NameDA)' uzstâdîðana"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "'$(^NameDA)' tika veiksmîgi uzstâdîta jûsu datorâ.$\r$\n$\r$\nNospiediet 'Pabeigt', lai aizvçrtu vedni."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Jûsu datoru ir nepiecieðams pârstartçt, lai pabeigtu '$(^NameDA)' uzstâdîðanu. Vai vçlaties pârstartçt datoru tûlît?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Tiek pabeigta '$(^NameDA)' atinstalâcija"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "'$(^NameDA)' tika veiksmîgi izdzçsta no jûsu datora.$\r$\n$\r$\nNospiediet 'Pabeigt', lai aizvçrtu vedni."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Jûsu datoru nepiecieðams pârstartçt, lai pabeigtu '$(^NameDA)' atinstalçðanu. Vai vçlaties pârstartçt datoru tûlît?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Pârstartçt tûlît"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Es vçlos pârstartçt pats vçlâk"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "P&alaist '$(^NameDA)'"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Pa&râdît LasiMani failu"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Pabeigt"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izvçlieties 'Start Menu' folderi"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Izvçlieties 'Start Menu' mapi '$(^NameDA)' saîsnçm."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Izvçlieties 'Start Menu' mapi, kurâ tiks izveidotas programmas saîsnes. Varat arî pats izveidot jaunu mapi."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Neveidot saîsnes"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "'$(^NameDA)' atinstalçðana"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Dzçst '$(^NameDA)' no jûsu datora."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Vai tieðâm vçlaties pârtraukt '$(^Name)' uzstâdîðanu?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Vai tieðâm vçlaties pârtraukt '$(^Name)' atinstalçðanu?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Lithuanian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Lithuanian.nlf
new file mode 100644
index 000000000..50fff1b96
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Lithuanian.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1063
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1257
+# RTL - anything else than RTL means LTR
+-
+# Translation by Vytautas Krivickas (Vytautas)
+# Updated by Danielius Scepanskis (Daan daniel@takas.lt) 2004.03.24
+# ^Branding
+Nullsoft instaliavimo sistema %s
+# ^SetupCaption
+$(^Name) Ádiegimas
+# ^UninstallCaption
+$(^Name) Ðalinti
+# ^LicenseSubCaption
+: Naudojimo sutartis
+# ^ComponentsSubCaption
+: Ádiegimo nustatymai
+# ^DirSubCaption
+: Ádiegimo katalogas
+# ^InstallingSubCaption
+: Ádiegiama
+# ^CompletedSubCaption
+: Baigta
+# ^UnComponentsSubCaption
+: Iðtrinimo nustatymai
+# ^UnDirSubCaption
+: Iðtrinimo katalogas
+# ^ConfirmSubCaption
+: Patvirtinimas
+# ^UninstallingSubCaption
+: Panaikinama
+# ^UnCompletedSubCaption
+: Baigta
+# ^BackBtn
+< &Atgal
+# ^NextBtn
+&Toliau >
+# ^AgreeBtn
+Að &sutinku
+# ^AcceptBtn
+Að &sutinku su naudojimo sutarties sàlygomis
+# ^DontAcceptBtn
+Að &nesutinku su naudojimo sutarties sàlygomis
+# ^InstallBtn
+&Ádiegti
+# ^UninstallBtn
+&Panaikinti
+# ^CancelBtn
+Nutraukti
+# ^CloseBtn
+&Uþdaryti
+# ^BrowseBtn
+P&asirinkti...
+# ^ShowDetailsBtn
+Parodyti &detales
+# ^ClickNext
+Paspauskite toliau
+# ^ClickInstall
+Paspauskite ádiegti
+# ^ClickUninstall
+Paspauskite iðtrinti
+# ^Name
+Vardas
+# ^Completed
+Baigta
+# ^LicenseText
+Praðome perskaityti sutartá prieð ádiegdami $(^NameDA). Jei jûs sutinkate su nurodytomis sàlygomis, spauskite Sutinku.
+# ^LicenseTextCB
+Praðome perskaityti sutartá prieð ádiegdami $(^NameDA). Jei jûs sutinkate su nurodytomis sàlygomis, padëkite varnelæ tam skirtame laukelyje. $_CLICK
+# ^LicenseTextRB
+Praðome perskaityti sutartá prieð ádiegdami $(^NameDA). Jei jûs sutinkate su nurodytomis sàlygomis, pasirinkite pirmà pasirinkimà esantá þemiau. $_CLICK
+# ^UnLicenseText
+Praðome perskaityti sutartá prieð iðtrinant $(^NameDA). Jei jûs sutinkate su nurodytomis sàlygomis, spauskite Sutinku.
+# ^UnLicenseTextCB
+Praðome perskaityti sutartá prieð iðtrinant $(^NameDA). Jei jûs sutinkate su nurodytomis sàlygomis, padëkite varnelæ tam skirtame laukelyje. $_CLICK
+# ^UnLicenseTextRB
+Praðome perskaityti sutartá prieð iðtrinant $(^NameDA). Jei jûs sutinkate su nurodytomis sàlygomis, pasirinkite pirmà pasirinkimà esantá þemiau. $_CLICK
+# ^Custom
+Kitoks
+# ^ComponentsText
+Padëkite varneles laukeliuose komponentø kuriuos norite ádiegti ir nuimkite nuo kuriø nenorite ádiegti. $_CLICK
+# ^ComponentsSubText1
+Pasirinkite ádiegimo bûdà:
+# ^ComponentsSubText2_NoInstTypes
+Pasirinkite komponentus, kuriuos ádiegti:
+# ^ComponentsSubText2
+Arba, pasirinkite neprivalomus komponentus, kuriuos jûs norite ádiegti:
+# ^UnComponentsText
+Padëkite varneles laukeliuose komponentø kuriuos norite paðalinti ir nuimkite nuo kuriø nenorite paðalinti. $_CLICK
+# ^UnComponentsSubText1
+Pasirinkite ðalinimo bûdà:
+# ^UnComponentsSubText2_NoInstTypes
+Pasirinkite komponentus, kuriuos ðalinti:
+# ^UnComponentsSubText2
+Arba, pasirinkite neprivalomus komponentus, kuriuos jûs norite paðalinti:
+# ^DirText
+Ádiegimas dabar ádiegs $(^NameDA) ðiame kataloge. Jeigu norite pakeisti ðá katalogà, paspauskite Pasirinkti. $_CLICK
+# ^DirSubText
+Ádiegimo katalogas
+# ^DirBrowseText
+Pasirinkite katalogà, kur ádiegti $(^NameDA):
+# ^UnDirText
+Ádiegimas dabar paðalins $(^NameDA) ið ðio katalogo. Jeigu norite pakeisti ðá katalogà paspauskite Pasirinkti. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Pasirinkite katalogà ið kurio paðalinti $(^NameDA):
+# ^SpaceAvailable
+Yra vietos:
+# ^SpaceRequired
+Reikia vietos:
+# ^UninstallingText
+$(^NameDA) dabar bus paðalintas ið ðio katalogo. $_CLICK
+# ^UninstallingSubText
+Trinama ið:
+# ^FileError
+Klaida atidarant failà áraðymui: \r\n\t"$0"\r\nPaspauskite Nutraukti, jei norite nutraukti ádiegimà,\r\nPakartoti, jei norite pabandyti dar kartà áraðyti failà, ar\r\nIgnoruoti, jei norite praleisti ðá failà
+# ^FileError_NoIgnore
+Klaida atidarant failà áraðymui: \r\n\t"$0"\r\nPaspauskite Pakartoti, jei norite pabandyti dar kartà áraðyti failà, ar\r\nNutraukti, jei norite nutraukti ádiegimà.
+# ^CantWrite
+"Negalima áraðyti: "
+# ^CopyFailed
+Kopijavimas nepavyko
+# ^CopyTo
+Kopijuoti á
+# ^Registering
+"Uþregistruojama: "
+# ^Unregistering
+"Iðregistruojama: "
+# ^SymbolNotFound
+Nerastas simbolis:
+# ^CouldNotLoad
+Negaliu ákrauti:
+# ^CreateFolder
+Sukurti katalogà:
+# ^CreateShortcut
+Sukurti nuorodà:
+# ^CreatedUninstaller
+Sukurti panaikinimo programà:
+# ^Delete
+Iðtrinti failà:
+# ^DeleteOnReboot
+"Iðtrinti perkraunant: "
+# ^ErrorCreatingShortcut
+"Klaida kuriant nuorodà: "
+# ^ErrorCreating
+"Klaida kuriant: "
+# ^ErrorDecompressing
+Klaida iðskleidþiant duomenis! Sugadintas ádiegimo failas?
+# ^ErrorRegistering
+Klaida uþregistruojant DLL
+# ^ExecShell
+"VykdytiShell: "
+# ^Exec
+"Vykdyti: "
+# ^Extract
+"Iðskleisti: "
+# ^ErrorWriting
+Iðskleisti: klaida áraðant á failà
+# ^InvalidOpcode
+Ádiegimo failas sugadintas: neteisingas opkodas
+# ^NoOLE
+"Nëra OLE dël: "
+# ^OutputFolder
+"Paskirties katalogas: "
+# ^RemoveFolder
+"Panaikinti katalogà: "
+# ^RenameOnReboot
+"Pervardinti perkraunant: "
+# ^Rename
+"Pervardinti: "
+# ^Skipped
+"Praleista: "
+# ^CopyDetails
+Kopijuoti detales á atmintá
+# ^LogInstall
+Áraðyti ádiegimo detales
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Lithuanian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Lithuanian.nsh
new file mode 100644
index 000000000..dcc331ae9
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Lithuanian.nsh
@@ -0,0 +1,121 @@
+;Language: Lithuanian (1063)
+;By Vytautas Krivickas (Vytautas). Updated by Danielius Scepanskis (Daan daniel@takas.lt) 2004.01.09
+
+!insertmacro LANGFILE "Lithuanian" "Lietuviu"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Sveiki atvykæ á $(^NameDA) ádiegimo programà."
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ði programa jums padës lengvai ádiegti $(^NameDA).$\r$\n$\r$\nRekomenduojama iðjungti visas programas, prieð pradedant ádiegimà. Tai leis atnaujinti sistemos failus neperkraunat kompiuterio.$\r$\n$\r$\n"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Sveiki atvykæ á $(^NameDA) paðalinimo programà."
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ði programa jums padës lengvai iðtrinti $(^NameDA).$\r$\n$\r$\nPrieð pradedant pasitikrinkite kad $(^NameDA) yra iðjungta.$\r$\n$\r$\n"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Naudojimo sutartis"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Praðome perskaityti sutartá prieð ádiegdami $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jei jûs sutinkate su nurodytomis sàlygomis, spauskite Sutinku. Jûs privalote sutikti, jei norite ádiegti $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jei jûs sutinkate su nurodytomis sàlygomis, padëkite varnelæ tam skirtame laukelyje. Jûs privalote sutikti, jei norite ádiegti $(^NameDA). "
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jei jûs sutinkate su nurodytomis sàlygomis, pasirinkite pirmà pasirinkimà esantá þemiau. Jûs privalote sutikti, jei norite ádiegti $(^NameDA). "
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Naudojimo sutartis"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Praðome perskaityti sutartá prieð $(^NameDA) paðalinimà."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jei jûs sutinkate su nurodytomis sàlygomis, spauskite Sutinku. Jûs privalote sutikti, jei norite iðtrinti $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "s, padëkite varnelæ tam skirtame laukelyje. Jûs privalote sutikti, jei norite iðtrinti $(^NameDA). "
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jei jûs sutinkate su nurodytomis sàlygomis, pasirinkite pirmà pasirinkimà esantá þemiau. Jûs privalote sutikti, jei norite iðtrinti $(^NameDA)."
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Paspauskite Page Down ir perskaitykite visà sutartá."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Pasirinkite"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Pasirinkite kokias $(^NameDA) galimybes jûs norite ádiegti."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Paaiðkinimas"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Pasirinkite"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Pasirinkite kokias $(^NameDA) galimybes jûs norite paðalinti."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Uþveskite pelës þymeklá ant komponento ir pamatysite jo apraðymà."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Uþveskite pelës þymeklá ant komponento ir pamatysite jo apraðymà."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Pasirinkite ádiegimo vietà"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Pasirinkite katalogà á kûri ádiegsite $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Pasirinkite iðtrinimo vietà"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Pasirinkite katalogà ið kurio iðtrinsite $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Diegiama"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Praðome palaukti, kol $(^NameDA) bus ádiegtas."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Ádiegimas baigtas"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Ádiegimas baigtas sekmingai."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Ádiegimas nutrauktas"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Ádiegimas nebuvo baigtas sekmingai."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Ðalinama"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Praðome palaukti, kol $(^NameDA) bus paðalinta."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Programos paðalinimas baigtas"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Iðtrynimas baigtas sekmingai."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Iðtrynimas nutrauktas"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Iðtrynimas nebuvo baigtas sekmingai."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Baigiu $(^NameDA) ádiegimo procesà"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) buvo ádiegtas á jûsø kompiuterá.$\r$\n$\r$\nPaspauskite Baigti."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Jûsø kompiuteris turi bûti perkrautas, kad bûtø baigtas $(^NameDA) ádiegimas. Ar jûs norite perkrauti dabar?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Baigiu $(^NameDA) paðalinimo programà."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) buvo iðtrinta ið jûsø kompiuterio.$\r$\n$\r$\nPaspauskite Baigti."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Jûsø kompiuteris turi bûti perkrautas, kad bûtø baigtas $(^NameDA) paðalinimas. Ar jûs norite perkrauti dabar?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Perkrauti dabar"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Að noriu perkrauti veliau pats"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Leisti $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Parodyti dokumentacijà"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Baigti"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Pasirinkite Start Menu katalogà"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Pasirinkite Start Menu katalogà, kuriame bus sukurtos programos nuorodos."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Pasirinkite Start Menu katalogà, kuriame bus sukurtos programos nuorodos. Jûs taip pat galite sukurti naujà katalogà."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nekurti nuorodø"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Panaikinti $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Iðtrinti $(^NameDA) ið jûsø kompiuterio."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Ar jûs tikrai norite iðjungti $(^Name) ádiegimo programà?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ar jûs tikrai norite iðjungti $(^Name) paðalinimo programà?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Luxembourgish.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Luxembourgish.nlf
new file mode 100644
index 000000000..4638d7858
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Luxembourgish.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+4103
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Jo Hoeser
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Installatioun
+# ^UninstallCaption
+$(^Name) Desinstallatioun
+# ^LicenseSubCaption
+: Lizenzofkommes
+# ^ComponentsSubCaption
+: Installatiouns-Optiounen
+# ^DirSubCaption
+: Zielverzeechnis
+# ^InstallingSubCaption
+: Installéieren
+# ^CompletedSubCaption
+: Färdeg
+# ^UnComponentsSubCaption
+: Desinstallatiuons-Optiounen
+# ^UnDirSubCaption
+: Quellverzeechnes
+# ^ConfirmSubCaption
+: Bestätegung
+# ^UninstallingSubCaption
+: Läschen
+# ^UnCompletedSubCaption
+: Färdeg
+# ^BackBtn
+< &Zréck
+# ^NextBtn
+&Weider >
+# ^AgreeBtn
+&Unhuelen
+# ^AcceptBtn
+Ech &huelen d'Lizenzofkommes un.
+# ^DontAcceptBtn
+Ech &lehnen d'Lizenzofkommes of.
+# ^InstallBtn
+&Installéieren
+# ^UninstallBtn
+&Desinstalléieren
+# ^CancelBtn
+Ofbriechen
+# ^CloseBtn
+&Zou maan
+# ^BrowseBtn
+&Duerchsichen...
+# ^ShowDetailsBtn
+&Details uweisen
+# ^ClickNext
+Klick op weider fir weiderzefueren
+# ^ClickInstall
+Klick op Installéieren, fir d'Installatioun unzefänken.
+# ^ClickUninstall
+Klick op Desinstalléieren, fir d'Desinstallatioun unzefänken.
+# ^Name
+Numm
+# ^Completed
+Färdeg
+# ^LicenseText
+W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) installéiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, klick op Unhuelen.
+# ^LicenseTextCB
+W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) installéiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, aktivéier d'Kontrollkeschtchen. $_CLICK
+# ^LicenseTextRB
+W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) installéiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, wiel d'entsprichend Optioun. $_CLICK
+# ^UnLicenseText
+W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) desinstalléiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, klick op Unhuelen.
+# ^UnLicenseTextCB
+W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) desinstalléiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, aktivéier d'Kontrollkeschtchen. $_CLICK
+# ^UnLicenseTextRB
+W.e.g. d'Lizenzoofkommes liesen, ierts de $(^NameDA) desinstalléiers. Wanns de all Bedengungen vum Oofkommes akzeptéiers, wiel d'entspriechend Optioun. $_CLICK
+# ^Custom
+Benutzerdefiniert
+# ^ComponentsText
+Wiel d'Komponenten aus, déis de wëlls installéieren an wiel déijéineg of, déis de net installéieren wëlls. $_CLICK
+# ^ComponentsSubText1
+Installatiouns-Typ bestëmmen:
+# ^ComponentsSubText2_NoInstTypes
+Wiel d'Komponenten aus, déis de installéieren wëlls:
+# ^ComponentsSubText2
+oder wiel zousätzlech Komponenten aus déis de installéieren wëlls:
+# ^UnComponentsText
+Wiel d'Komponenten aus déis de desinstalléieren wëlls an wiel déijéineg of, déis de net desinstalléieren wëlls. $_CLICK
+# ^UnComponentsSubText1
+Deinstallatiouns-Typ bestëmmen:
+# ^UnComponentsSubText2_NoInstTypes
+Wiel d'Komponenten aus, déis de desinstalléieren wëlls:
+# ^UnComponentsSubText2
+oder wiel zusätzlech Komponenten aus, déis de desinstalléieren wëlls:
+# ^DirText
+$(^NameDA) gëtt an den Dossier installéiert deen fierginn gouf. Wanns de et an een aneren Dossier installéieren wëlls, klick op Duechsichen an wiel een aneren Dossier aus. $_CLICK
+# ^DirSubText
+Zielverzeechnes
+# ^DirBrowseText
+Wiel en Dossier aus wuers de $(^NameDA) installéieren wëlls:
+# ^UnDirText
+$(^NameDA) gëtt an deem Dossier desinstalléiert, deen uginn gouf. Wann $(^NameDA) an engem aneren Dossier ass, klick op Duechsichen an wiel een aneren Dossier aus. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Wiel den Dossier aus wou $(^NameDA) dran installéiert ass:
+# ^SpaceAvailable
+"Verfügbaren Späicher: "
+# ^SpaceRequired
+"Gebrauchten Späicher: "
+# ^UninstallingText
+$(^NameDA) gëtt aus dem ausgewielten Dossier desinstalléiert. $_CLICK
+# ^UninstallingSubText
+Desinstalléieren aus:
+# ^FileError
+Fehler beim Iwwerschreiwen vun der Datei: \r\n\t"$0"\r\nKlick op ofbriechen fir den Setup ze verloossen,\r\nop Widderhuelen fir den Setup nach eng Kéier duechzeféieren\r\n oder op Ignoréieren fir des Datei ze iwwersprengen an weiderzefueren.
+# ^FileError_NoIgnore
+Fehler beim Iwwerschreiwen vun der Datei: \r\n\t"$0"\r\nKlick op Widderhuelen fir den Setup nach eng Kéier duechzeféieren,\r\noder op ofbriechen fir den Setup ze verloossen.
+# ^CantWrite
+"Fehler beim Schreiwen: "
+# ^CopyFailed
+Kopéieren fehlgeschloen
+# ^CopyTo
+"Kopéiere an "
+# ^Registering
+"Registréieren: "
+# ^Unregistering
+"Deregistréieren: "
+# ^SymbolNotFound
+"Symbol ass net do: "
+# ^CouldNotLoad
+"Fehler beim Lueden vun: "
+# ^CreateFolder
+"Maan Dossier: "
+# ^CreateShortcut
+"Maan Oofkierzung: "
+# ^CreatedUninstaller
+"Man Desinstallatiouns-Programm: "
+# ^Delete
+"Läschen Datei: "
+# ^DeleteOnReboot
+"Läschen Datei no engem Neistart: "
+# ^ErrorCreatingShortcut
+"Fehler beim man vun enger Oofkierzung: "
+# ^ErrorCreating
+"Fehler beim maan: "
+# ^ErrorDecompressing
+Fehler beim Dekompriméieren. Installations-Programm beschiedegt?
+# ^ErrorRegistering
+Fehler beim Registréieren vun der DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Starten: "
+# ^Extract
+"Dekompriméieren: "
+# ^ErrorWriting
+"Dekompriméierung: Fehler beim Schreiwen vun der Datei "
+# ^InvalidOpcode
+Installations-Programm Beschiedegt: net zoulässegen Befehlscode
+# ^NoOLE
+"Keen OLE fier: "
+# ^OutputFolder
+"Zieldossier: "
+# ^RemoveFolder
+"Läschen Dossier: "
+# ^RenameOnReboot
+"Gett no Neistart embenannt: "
+# ^Rename
+"Embenennen: "
+# ^Skipped
+"Iwwersprongen: "
+# ^CopyDetails
+Detailler an d'Zwëschenooflag kopéieren
+# ^LogInstall
+Installatioun protokolléieren
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Luxembourgish.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Luxembourgish.nsh
new file mode 100644
index 000000000..639ab5a11
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Luxembourgish.nsh
@@ -0,0 +1,121 @@
+;Language: Luxembourgish (1031)
+;By Snowloard, changes by Philo
+
+!insertmacro LANGFILE "Luxembourgish" "Lëtzebuergesch"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Wëllkomm beim Installatiouns-$\r$\nAssistent vun $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Dësen Assistent wärt dech duech d'Installatioun vun $(^NameDA) begleeden.$\r$\n$\r$\nEt gëtt ugeroden alleguer d'Programmer di am Moment lafen zouzemaan, datt bestëmmt Systemdateien ouni Neistart ersat kënne ginn.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Wëllkomm am Desinstallatiouns-$\r$\n\Assistent fir $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Desen Assistent begleet dech duech d'Desinstallatioun vun $(^NameDA).$\r$\n$\r$\nW.e.g. maach $(^NameDA) zu, ierts de mat der Desinstallatioun ufänks.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lizenzofkommes"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "W.e.g. d'Lizenzoofkommes liesen, ierts de mat der Installatioun weiderfiers."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Wanns de alleguer d'Bedengungen vum Ofkommes akzeptéiers, klick op Unhuelen. Du muss alleguer d'Fuerderungen unerkennen, fir $(^NameDA) installéieren ze kënnen."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Wanns de alleguer d'Bedengungen vum Ofkommes akzeptéiers, aktivéier d'Këschtchen. Du muss alleguer d'Fuerderungen unerkennen, fir $(^NameDA) installéieren ze kënnen. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Wanns de alleguer d'Bedengungen vum Ofkommes akzeptéiers, wiel ënnen di entspriechend Äntwert aus. Du muss alleguer d'Fuerderungen unerkennen, fir $(^NameDA) installéieren ze kënnen. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lizenzofkommes"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "W.e.g. lies d'Lizenzofkommes duech ierts de mat der Desinstallatioun vun $(^NameDA) weiderfiers."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Wanns de d'Fuerderungen vum Ofkommes akzeptéiers, klick op unhuelen. Du muss d'Ofkommes akzeptéieren, fir $(^NameDA) kënnen ze desinstalléieren."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Wanns de d'Fuerderungen vum Ofkommes akzeptéiers, aktivéier d'Këschtchen. Du muss d'Ofkommes akzeptéieren, fir $(^NameDA) kënnen ze desinstalléieren. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Wanns de d'Fuerderungen vum Ofkommes akzeptéiers, wiel ënnen di entspriechend Optioun. Du muss d'Oofkommes akzeptéieren, fir $(^NameDA) kennen ze desinstalléieren. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Dréck d'PageDown-Tast fir den Rescht vum Ofkommes ze liesen."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Komponenten auswielen"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Wiel d'Komponenten aus, déis de wëlls installéieren."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beschreiwung"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Komponenten auswielen"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Wiel eng Komponent aus, déis de desinstalléieren wëlls."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Hal den Mausfeil iwwer eng Komponent, fir d'Beschreiwung dervun ze gesinn."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Hal den Mausfeil iwwer eng Komponent, fir d'Beschreiwung dervun ze gesinn."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Zielverzeechnes auswielen"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Wiel den Dossier aus, an deen $(^NameDA) installéiert soll ginn."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Dossier fir d'Desinstallatioun wielen"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Wiel den Dossier aus, aus dem $(^NameDA) desinstalléiert soll ginn."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installéieren..."
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Waard w.e.g während deem $(^NameDA) installéiert gëtt."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Installatioun färdeg"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "D'Installatioun ass feelerfräi oofgeschloss ginn."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Installatioun ofgebrach"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "D'Installatioun ass net komplett ofgeschloss ginn."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalléieren..."
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "W.e.g. waard, während deems $(^NameDA) desinstalléiert gëtt."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstallatioun ofgeschloss"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "D'Desinstallatioun ass erfollegräich ofgeschloss ginn."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstallatioun oofbriechen"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Desinstallatioun ass net erfollegräich ofgeschloss ginn."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "D'Installatioun vun $(^NameDA) gëtt ofgeschloss."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ass um Computer installéiert ginn.$\r$\n$\r$\nKlick op färdeg maan, fir den Installatiouns-Assistent zou ze maan.."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Den Windows muss nei gestart ginn, fir d'Installatioun vun $(^NameDA) ofzeschléissen. Wëlls de Windows lo néi starten?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Desinstallatioun vun $(^NameDA) gëtt ofgeschloss"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ass vum Computer desinstalléiert ginn.$\r$\n$\r$\nKlick op Ofschléissen fir den Assistent zou ze maan."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Windows muss néi gestart gin, fir d'Desinstallatioun vun $(^NameDA) ze vervollstännegen. Wëlls de Windows lo néi starten?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Lo néi starten"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Spéider manuell néi starten"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) op maan"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Liesmech op maan"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Färdeg man"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Startmenü-Dossier bestëmmen"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Bestëmm een Startmanü-Dossier an deen d'Programmofkierzungen kommen."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Bestëmm een Startmanü-Dossier an deen d'Programmofkierzungen kommen. Wanns de een néien Dossier man wells, gëff deem säin zukünftegen Numm an."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Keng Ofkierzungen man"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstallatioun vun $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) gett vum Computer desinstalléiert."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Bass de sécher, dass de d'Installatioun vun $(^Name) ofbriechen wëlls?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Bass de sécher, dass de d'Desinstallatioun vun $(^Name) ofbriechen wëlls?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Macedonian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Macedonian.nlf
new file mode 100644
index 000000000..818ab8e65
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Macedonian.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1071
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1251
+# RTL - anything else than RTL means LTR
+-
+# Translation by Sasko Zdravkin [wingman2083@yahoo.com]
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Èíñòàëèðàœå íà $(^Name)
+# ^UninstallCaption
+Äåèíñòàëèðàœå íà $(^Name)
+# ^LicenseSubCaption
+: Ëèöåíöåí Äîãîâîð
+# ^ComponentsSubCaption
+: Èíñòàëàöèîíè Îïöèè
+# ^DirSubCaption
+: Èíñòàëàöèîíåí Äèðåêòîðèóì
+# ^InstallingSubCaption
+: Èíñòàëèðà
+# ^CompletedSubCaption
+: Çàâðøåíî
+# ^UnComponentsSubCaption
+: Äåèíñòàëàöèîíè Îïöèè
+# ^UnDirSubCaption
+: Äåèíñòàëàöèîíåí Äèðåêòîðèóì
+# ^ConfirmSubCaption
+: Ïîòâðäà
+# ^UninstallingSubCaption
+: Äåèíñòàëèðà
+# ^UnCompletedSubCaption
+: Çàâðøåíî
+# ^BackBtn
+< &Íàçàä
+# ^NextBtn
+Í&àïðåä >
+# ^AgreeBtn
+&Äà
+# ^AcceptBtn
+&Ãè ïðèôààì óñëîâèòå îä Ëèöåíöíèîò Äîãîâîð
+# ^DontAcceptBtn
+Í&å ãè ïðèôààì óñëîâèòå îä Ëèöåíöíèîò Äîãîâîð
+# ^InstallBtn
+&Èíñòàëèðà¼
+# ^UninstallBtn
+&Äåèíñòàëèðà¼
+# ^CancelBtn
+Îòêàæè
+# ^CloseBtn
+&Çàòâîðè
+# ^BrowseBtn
+&Ïðåáàðóâà¼...
+# ^ShowDetailsBtn
+Ï&îêàæè Äåòàëè
+# ^ClickNext
+Ïðèòèñíåòå 'Íàïðåä' çà äà ïðîäîëæèòå.
+# ^ClickInstall
+Ïðèòèñíåòå 'Èíñòàëèðà¼' çà äà ñå èíñòàëèðà.
+# ^ClickUninstall
+Ïðèòèñíåòå 'Äåèíñòàëèðà¼' çà äà ñå äåèíñòàëèðà.
+# ^Name
+Èìå
+# ^Completed
+Çàâðøåíî
+# ^LicenseText
+Âå ìîëèìå ïðî÷èòà¼òå ãî Ëèöåíöíèîò Äîãîâîð ïðåä äà ñå èíñòàëèðà $(^NameDA). Àêî ãè ïðèôààòå ñèòå óñëîâè, ïðèòèñíåòå 'Äà'.
+# ^LicenseTextCB
+Âå ìîëèìå ïðî÷èòà¼òå ãî Ëèöåíöíèîò Äîãîâîð ïðåä äà ñå èíñòàëèðà $(^NameDA). Àêî ãè ïðèôààòå ñèòå óñëîâè, ïðèòèñíåòå ãî Check box-îò ïîäîëå. $_CLICK
+# ^LicenseTextRB
+Âå ìîëèìå ïðî÷èòà¼òå ãî Ëèöåíöíèîò Äîãîâîð ïðåä äà ñå èíñòàëèðà $(^NameDA). Àêî ãè ïðèôààòå ñèòå óñëîâè, îäáåðåòå ¼à ïðâàòà îïöè¼à ïîäîëå. $_CLICK
+# ^UnLicenseText
+Âå ìîëèìå ïðî÷èòà¼òå ãî Ëèöåíöíèîò Äîãîâîð ïðåä äà ñå äåèíñòàëèðà $(^NameDA). Àêî ãè ïðèôààòå ñèòå óñëîâè, ïðèòèñíåòå 'Äà'.
+# ^UnLicenseTextCB
+Âå ìîëèìå ïðî÷èòà¼òå ãî Ëèöåíöíèîò Äîãîâîð ïðåä äà ñå äåèíñòàëèðà $(^NameDA). Àêî ãè ïðèôààòå ñèòå óñëîâè, ïðèòèñíåòå ãî Check box-îò ïîäîëå. $_CLICK
+# ^UnLicenseTextRB
+Âå ìîëèìå ïðî÷èòà¼òå ãî Ëèöåíöíèîò Äîãîâîð ïðåä äà ñå äåèíñòàëèðà $(^NameDA). Àêî ãè ïðèôààòå ñèòå óñëîâè, îäáåðåòå ¼à ïðâàòà îïöè¼à ïîäîëå. $_CLICK
+# ^Custom
+Ïîäåñåíî
+# ^ComponentsText
+×åêèðà¼òå ãè êîìïîíåíòèòå øòî ñàêàòå äà ñå èíñòàëèðààò èëè äå÷åêèðà¼òå ãè òèå øòî íå ñàêàòå äà ñå èíñòàëèðààò. $_CLICK
+# ^ComponentsSubText1
+Îäáåðåòå âèä íà èíñòàëàöè¼à:
+# ^ComponentsSubText2_NoInstTypes
+Îäáåðåòå ãè êîìïîíåíòèòå øòî å ñå èíñòàëèðààò:
+# ^ComponentsSubText2
+èëè, îäáåðåòå äðóãè êîìïîíåíòè øòî ñàêàòå äà ñå èíñòàëèðààò:
+# ^UnComponentsText
+×åêèðà¼òå ãè êîìïîíåíòèòå øòî ñàêàòå äà ñå äåèíñòàëèðààò èëè äå÷åêèðà¼òå ãè òèå øòî íå ñàêàòå äà ñå äåèíñòàëèðààò. $_CLICK
+# ^UnComponentsSubText1
+Îäáåðåòå ãî âèäîò íà äåèíñòàëàöè¼àòà:
+# ^UnComponentsSubText2_NoInstTypes
+Îäáåðåòå ãè êîìïîíåíòèòå øòî å ñå äåèíñòàëèðààò:
+# ^UnComponentsSubText2
+èëè, îäáåðåòå äðóãè êîìïîíåíòè øòî ñàêàòå äà ñå äåèíñòàëèðààò:
+# ^DirText
+Èíñòàëàöèîíèîò ïðîãðàì å ãî èíñòàëèðà $(^NameDA) âî ñëåäíèîâ äèðåêòîðèóì. Çà äà èíñòàëèðàòå âî äðóã, ïðèòèñíåòå 'Ïðåáàðóâà¼' è îäáåðåòå äðóã äèðåêòîðèóì. $_CLICK
+# ^DirSubText
+Äèðåêòîðèóì êàäå øòî å ñå èíñòàëèðà
+# ^DirBrowseText
+Îäáåðåòå äèðåêòîðèóì çà èíñòàëèðàœå íà $(^NameDA):
+# ^UnDirText
+Èíñòàëàöèîíèîò ïðîãðàì å ãî äåèíñòàëèðà $(^NameDA) îä ñëåäíèîâ äèðåêòîðèóì. Çà äà äåèíñòàëèðàòå îä äðóã, ïðèòèñíåòå 'Ïðåáàðóâà¼' è îäáåðåòå äðóã äèðåêòîðèóì. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Îäáåðåòå ãî äèðåêòîðèóìîò çà äåèíñòàëèðàœå íà $(^NameDA):
+# ^SpaceAvailable
+"Ñëîáîäåí ïðîñòîð: "
+# ^SpaceRequired
+"Ïîòðåáåí ïðîñòîð: "
+# ^UninstallingText
+$(^NameDA) å áèäå äåèíñòàëèðàí îä ñëåäíèîâ äèðåêòîðèóì. $_CLICK
+# ^UninstallingSubText
+Äåèíñòàëèðà îä:
+# ^FileError
+Ãðåøêà ïðè îòâàðàœåòî íà äàòîòåêàòà çà çàïèøóâàœå: \r\n\t"$0"\r\nÏðèòèñíåòå 'Îòêàæè' çà äà ¼à îòêàæåòå èíñòàëàöè¼àòà,\r\n'Ïðîáà¼' çà äà ïðîáà äà ¼à çàïèøå äàòîòåêàòà, èëè\r\n'Èãíîðèðà¼' çà äà ¼à ïðåðèïà äàòîòåêàòà
+# ^FileError_NoIgnore
+Ãðåøêà ïðè îòâàðàœåòî íà äàòîòåêàòà çà çàïèøóâàœå: \r\n\t"$0"\r\nÏðèòèñíåòå 'Ïðîáà¼' çà äà ïðîáà äà ¼à çàïèøå äàòîòåêàòà, èëè\r\n'Îòêàæè' çà äà ¼à îòêàæå èíñòàëàöè¼àòà
+# ^CantWrite
+"Íå ìîæå äà çàïèøå: "
+# ^CopyFailed
+Êîïèðàœåòî íå óñïåà
+# ^CopyTo
+"Êîïèð༠äî "
+# ^Registering
+"Ðåãèñòðèðà: "
+# ^Unregistering
+"Äåðåãèñòðèðà: "
+# ^SymbolNotFound
+"Íå ìîæå äà ãî íà¼äå ñèìáîëîò: "
+# ^CouldNotLoad
+"Íå ìîæå äà ëîàäèðà: "
+# ^CreateFolder
+"Ñîçäàäè äèðåêòîðèóì: "
+# ^CreateShortcut
+"Ñîçäàäè êðàòåíèöà: "
+# ^CreatedUninstaller
+"Ñîçäàäåí äåèíñòàëàòîð: "
+# ^Delete
+"Èçáðèøàíà äàòîòåêà: "
+# ^DeleteOnReboot
+"Èçáðèøè ïîñëå ðåñòàðòèðàœå: "
+# ^ErrorCreatingShortcut
+"Ãðåøêà ïðè ñîçäàâàœåòî íà ñêðàòåíèöàòà: "
+# ^ErrorCreating
+"Ãðåøêà ïðè ñîçäàâàœåòî: "
+# ^ErrorDecompressing
+Ãðåøêà ïðè îòïàêóâàœåòî íà ïîäàòîöèòå! Ðàñèïàí èíñòàëàöèîíåí ïðîãðàì?
+# ^ErrorRegistering
+Ãðåøêà ïðè ðåãèñòðèðàœåòî íà DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Ïîêðåíè: "
+# ^Extract
+"Îòïàêóâàíî: "
+# ^ErrorWriting
+"Îòïàêóâà¼: ãðåøêà ïðè ñíèìàœåòî âî äàòîòåêàòà "
+# ^InvalidOpcode
+Ðàñèïàí èíñòàëàöèîíåí ïðîãðàì: ïîãðåøåí êîä
+# ^NoOLE
+"Íåìà OLE çà: "
+# ^OutputFolder
+"Èíñòàëàöèîíåí äèðåêòîðèóì: "
+# ^RemoveFolder
+"Èçáðèøàí äèðåêòîðèóì: "
+# ^RenameOnReboot
+"Ïðåèìåíóâ༠ïîñëå ðåñòàðòèðàœå: "
+# ^Rename
+"Ïðåèìåíóâà¼: "
+# ^Skipped
+"Ïðåðèïàíî: "
+# ^CopyDetails
+Êîïèð༠ãè Äåòàëèòå âî Clipboard-îò
+# ^LogInstall
+Ñíèìè ëîã çà èíñòàëàöèîíèòå ïðîöåñè
+# ^Byte
+á
+# ^Kilo
+Ê
+# ^Mega
+Ì
+# ^Giga
+Ã
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Macedonian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Macedonian.nsh
new file mode 100644
index 000000000..bcc779739
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Macedonian.nsh
@@ -0,0 +1,121 @@
+;Language: Macedonian (1071)
+;By Sasko Zdravkin [wingman2083@yahoo.com]
+
+!insertmacro LANGFILE "Macedonian" "Macedonian"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Äîáðî äî¼äîâòå âî èíñòàëàöè¼àòà íà $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Îâî¼ ïðîãðàì å âå âîäè íèç èíñòàëàöè¼àòà íà $(^NameDA).$\r$\n$\r$\nÏðåïîðà÷àíî å äà ãè çàòâîðèòå ñèòå ïðîãðàìè ïðåä äà èíñòàëèðàòå. Îâà å äîçâîëè èíñòàëàöèîíèîò ïðîãðàì äà îáíîâè íåêîè ñèñòåìñêè äàòîòåêè áåç äà ãî ðåñòàðòèðà êîìï¼óòåðîò.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Äîáðî äî¼äîâòå âî äåèíñòàëàöè¼àòà íà $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Îâî¼ ïðîãðàì å âå âîäè íèç äåèíñòàëàöè¼àòà íà $(^NameDA).$\r$\n$\r$\nÏðåä äà ¼à ïî÷íåòå äåèíñòàëàöè¼àòà íà $(^NameDA) ïðîâåðåòå äàëè å èñêëó÷åíà ïðîãðàìàòà.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ëèöåíöåí Äîãîâîð"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Âå ìîëèìå ïðîâåðåòå ãè ëèöåíöíèòå óñëîâè ïðåä äà ãî èíñòàëèðàòå $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Àêî ãè ïðèôààòå óñëîâèòå îä äîãîâîðîò, ïðèòèñíåòå 'Äà' çà äà ïðîäîëæèòå. Ìîðà äà ãî ïðèôàòèòå äîãîâîðîò çà äà ãî èíñòàëèðàòå $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Àêî ãè ïðèôààòå óñëîâèòå îä äîãîâîðîò, ÷åêèðà¼òå ãî check box-îò ïîäîëå. Ìîðà äà ãî ïðèôàòèòå äîãîâîðîò çà ãî èíñòàëèðàòå $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Àêî ãè ïðèôààòå óñëîâèòå îä äîãîâîðîò, îäáåðåòå ¼à ïðâàòà îïöè¼à ïîäîëå. Ìîðà äà ãî ïðèôàòèòå äîãîâîðîò çà ãî èíñòàëèðàòå $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ëèöåíöåí Äîãîâîð"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Âå ìîëèìå ïðîâåðåòå ãè ëèöåíöíèòå óñëîâè ïðåä äà ãî äåèíñòàëèðàòå $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Àêî ãè ïðèôààòå óñëîâèòå îä äîãîâîðîò, ïðèòèñíåòå 'Äà' çà äà ïðîäîëæèòå. Ìîðà äà ãî ïðèôàòèòå äîãîâîðîò çà äà ãî äåèíñòàëèðàòå $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Àêî ãè ïðèôààòå óñëîâèòå îä äîãîâîðîò, ÷åêèðà¼òå ãî check box-îò ïîäîëå. Ìîðà äà ãî ïðèôàòèòå äîãîâîðîò çà ãî äåèíñòàëèðàòå $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Àêî ãè ïðèôààòå óñëîâèòå îä äîãîâîðîò, îäáåðåòå ¼à ïðâàòà îïöè¼à ïîäîëå. Ìîðà äà ãî ïðèôàòèòå äîãîâîðîò çà ãî äåèíñòàëèðàòå $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Ïðèòèñíåòå 'Page Down' çà äà ãî âèäåòå îñòàíàòèîò äåë îä äîãîâîðîò."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Îäáåðåòå Êîìïîíåíòè"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Îäáåðåòå êîè ðàáîòè îä $(^NameDA) ñàêàòå äà ñå èíñòàëèðààò."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Îá¼àñíåíèå"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Îäáåðåòå Êîìïîíåíòè"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Îäáåðåòå êîè ðàáîòè îä $(^NameDA) ñàêàòå äà ñå äåèíñòàëèðààò."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Îäíåñåòå ãî êóðñîðîò äî êîìïîíåíòàòà çà äà ãî âèäåòå íå¼çèíîòî îá¼àñíåíèå."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Îäíåñåòå ãî êóðñîðîò äî êîìïîíåíòàòà çà äà ãî âèäåòå íå¼çèíîòî îá¼àñíåíèå."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Îäáåðåòå ¼à ëîêàöè¼àòà çà èíñòàëèðàœå"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Îäáåðåòå ãî äèðåêòîðèóìîò êàäå øòî ñàêàòå äà ñå èíñòàëèðà $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Îäáåðåòå ¼à ëîêàöè¼àòà çà äåèíñòàëèðàœå"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Îäáåðåòå ãî äèðåêòîðèóìîò îä êî¼ ñàêàòå äà ñå äåèíñòàëèðà $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Èíñòàëèðà"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Âå ìîëèìå ïî÷åêà¼òå äîäåêà $(^NameDA) ñå èíñòàëèðà."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Èíñòàëàöè¼àòà å çàâðøåíà"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Èíñòàëèðàœåòî áåøå óñïåøíî."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Èíñòàëàöè¼àòà å îòêàæàíà"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Èíñòàëèðàœåòî íå áåøå óñïåøíî çàâðøåíî."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Äåèíñòàëèðà"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Âå ìîëèìå ïî÷åêà¼òå äîäåêà $(^NameDA) ñå äåèíñòàëèðà."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Äåèíñòàëàöè¼àòà å çàâðøåíà"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Äåèíñòàëèðàœåòî áåøå óñïåøíî."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Äåèíñòàëàöè¼àòà å îòêàæàíà"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Äåèíñòàëèðàœåòî íå áåøå óñïåøíî çàâðøåíî."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Çàâðøóâà èíñòàëèðàœåòî íà $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) å èíñòàëèðàí íà âàøèîò êîìï¼óòåð.$\r$\n$\r$\nÏðèòèñíåòå 'Êðà¼' çà äà ãî çàòâîðèòå èíñòàëàöèîíèîò ïðîãðàì."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Âàøèîò êîìï¼óòåð ìîðà äà ñå ðåñòàðòèðà çà äà çàâðøè èíñòàëàöè¼àòà íà $(^NameDA). Äàëè ñàêàòå äà ñå ðåñòàðòèðà ñåãà?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Çàâðøóâà äåèíñòàëèðàœåòî íà $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) å äåèíñòàëèðàí îä âàøèîò êîìï¼óòåð.$\r$\n$\r$\nÏðèòèñíåòå 'Êðà¼' çà äà ãî çàòâîðèòå äåèíñòàëàöèîíèîò ïðîãðàì."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Âàøèîò êîìï¼óòåð ìîðà äà ñå ðåñòàðòèðà çà äà çàâðøè äåèíñòàëàöè¼àòà íà $(^NameDA). Äàëè ñàêàòå äà ñå ðåñòàðòèðà ñåãà?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ðåñòàðòèð༠ñåãà"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Àêî ñàêàòå äà ãî ðåñòàðòèðàòå ïîäîöíà"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "Ïîê&ðåíè ãî $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Îòâîð&è 'Ïðî÷èò༠Ìå'"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Êðà¼"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Îäáåðåòå äèðåêòîðèóì çà Ñòàðò Ìåíèòî"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Îäáåðåòå äèðåêòîðèóì âî Ñòàðò Ìåíèòî çà êðåèðàœå ñêðàòåíèöà íà $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Îäáåðåòå ãî äèðåêòîðèóìîò âî Ñòàðò Ìåíèòî âî êî¼ ñàêàòå äà ñå êðåèðà ñêðàòåíèöà çà ïðîãðàìàòà. Èñòî òàêà ìîæåòå äà âíåñåòå äðóãî èìå çà äà ñå êðåèðà íîâ äèðåêòîðèóì."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Íå êðåèð༠ñêðàòåíèöà"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Äåèíñòàëèð༠ãî $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Îäñòðàíåòå ãî $(^NameDA) îä âàøèîò êîìï¼óòåð."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Ñèãóðíè ëè ñòå äåêà ñàêàòå äà ñå îòêàæåòå îä èíñòàëàöè¼àòà íà $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ñèãóðíè ëè ñòå äåêà ñàêàòå äà ñå îòêàæåòå îä äåèíñòàëàöè¼àòà íà $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Malay.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Malay.nlf
new file mode 100644
index 000000000..48fc96822
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Malay.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1086
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+-
+# RTL - anything else than RTL means LTR
+-
+# Translation muhammadazwa@yahoo.com
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Setup $(^Name)
+# ^UninstallCaption
+Uninstall $(^Name)
+# ^LicenseSubCaption
+: Perlesenan
+# ^ComponentsSubCaption
+: Pilihan kemasukan
+# ^DirSubCaption
+: Folder kemasukan
+# ^InstallingSubCaption
+: Memasang
+# ^CompletedSubCaption
+: Selesai
+# ^UnComponentsSubCaption
+: Pilihan membuang
+# ^UnDirSubCaption
+: Folder Uninstal
+# ^ConfirmSubCaption
+: Kepastian
+# ^UninstallingSubCaption
+: Membuang
+# ^UnCompletedSubCaption
+: Tidak Selesai
+# ^BackBtn
+< &Ke Belakang
+# ^NextBtn
+&Ke Depan >
+# ^AgreeBtn
+Saya &setuju
+# ^AcceptBtn
+Saya s&etuju dengan Perlesenan
+# ^DontAcceptBtn
+Saya &tidak setuju dengan Perlesenan
+# ^InstallBtn
+&Masukkan
+# ^UninstallBtn
+&Buang
+# ^CancelBtn
+Batal
+# ^CloseBtn
+&Tutup
+# ^BrowseBtn
+S&elusur...
+# ^ShowDetailsBtn
+Buka &lagi
+# ^ClickNext
+Klik Ke Depan untuk teruskan.
+# ^ClickInstall
+Klik Masukkan untuk kemasukkan.
+# ^ClickUninstall
+Klik Uninstall untuk membuang.
+# ^Name
+Nama
+# ^Completed
+Selesai
+# ^LicenseText
+Sila baca lesen sebelum memasukkan $(^NameDA). Jika anda terima perlesenan, klik Saya setuju.
+# ^LicenseTextCB
+Sila baca lesen sebelum memasukkan $(^NameDA). Jika terima, beri tanda dicheckbox. $_CLICK
+# ^LicenseTextRB
+Sila baca lesen sebelum sebelum membuang $(^NameDA). Jika anda terima perlesenan, pilihlah salah satu item dibawah ini. $_CLICK
+# ^UnLicenseText
+Sila baca lesen sebelum sebelum membuang $(^NameDA). Jika anda terima perlesenan, klik Saya setuju.
+# ^UnLicenseTextCB
+Sila baca lesen sebelum memasukkan $(^NameDA). Jika terima, beri tanda dicheckbox. $_CLICK
+# ^UnLicenseTextRB
+Sila baca lesen sebelum sebelum membuang $(^NameDA).Jika anda terima perlesenan, pilihlah salah satu item dibawah ini. $_CLICK
+# ^Custom
+Custom
+# ^ComponentsText
+Beri tanda dicheckbox pada komponen yang ingin dimasukkan and hilangkan tanda pada komponen yang tidak perlu dimasukkan. $_CLICK
+# ^ComponentsSubText1
+Pilih kemasukan:
+# ^ComponentsSubText2_NoInstTypes
+Pilih komponen-komponen untuk dimasukkan:
+# ^ComponentsSubText2
+Atau, pilih komponen berikut untuk dimasukkan:
+# ^UnComponentsText
+Beri tanda dicheckbox pada komponen yang ingin dimasukkan and hilangkan tanda pada komponen yang tidak perlu dimasukkan. $_CLICK
+# ^UnComponentsSubText1
+Pilih tipe un-kemasukan:
+# ^UnComponentsSubText2_NoInstTypes
+Pilih komponen-komponen untuk di buang:
+# ^UnComponentsSubText2
+Atau, pilih komponen berikut untuk di buang:
+# ^DirText
+Setup akan memasukkan $(^NameDA) pada folder berikut. Untuk memilih folder lainnya, klik Selusur dan pilih folder pilihan anda. $_CLICK
+# ^DirSubText
+Folder tujuan
+# ^DirBrowseText
+Pilih folder untuk memasukkan $(^NameDA):
+# ^UnDirText
+Setup akan membuang $(^NameDA) dari folder berikut. Untuk memilih folder lainnya, klik Selusur dan pilih folder pilihan anda. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Pilih folder untuk dibuang $(^NameDA):
+# ^SpaceAvailable
+"Ruang cakera keras yang ada: "
+# ^SpaceRequired
+"Ruang cakera keras yang diperlukan: "
+# ^UninstallingText
+$(^NameDA) akan buang dari folder berikut. $_CLICK
+# ^UninstallingSubText
+Membuang:
+# ^FileError
+Tidak dapat menulis pada fail: \r\n\t"$0"\r\nKlik abort untuk membatalkan kemasukan,\r\nretry untuk cuba lagi, atau\r\nignore untuk abaikan fail ini.
+# ^FileError_NoIgnore
+Tidak dapat menulis pada fail: \r\n\t"$0"\r\nKlik retry untuk cuba lagi, atau\r\ncancel untuk batalkan kemasukan
+# ^CantWrite
+"Gagal menulis pada: "
+# ^CopyFailed
+Gagal menyalin
+# ^CopyTo
+"Menyalin ke "
+# ^Registering
+"Mendaftarkan modul: "
+# ^Unregistering
+"Melepaskan modul: "
+# ^SymbolNotFound
+"Symbol tidak jumpa : "
+# ^CouldNotLoad
+"Tidak dapat membuka: "
+# ^CreateFolder
+"Membuat folder: "
+# ^CreateShortcut
+"Membuat pintasan: "
+# ^CreatedUninstaller
+"Membuat program unistall: "
+# ^Delete
+"Memadam fail: "
+# ^DeleteOnReboot
+"Akan dipadam ketika reboot: "
+# ^ErrorCreatingShortcut
+"Tidak dapat membuat pintasan: "
+# ^ErrorCreating
+"Ralat penciptaan: "
+# ^ErrorDecompressing
+Ralat ketika membuka data! Program Installer rosak
+# ^ErrorRegistering
+Ralat mendaftarkan modul DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Menjalankan: "
+# ^Extract
+"Mengekstrak: "
+# ^ErrorWriting
+"Ekstrak: ralat ketika menulis ke fail "
+# ^InvalidOpcode
+Installer rosak: opcode tidak lengkap
+# ^NoOLE
+"OLE tidak ditemukan: "
+# ^OutputFolder
+"Folder tujuan: "
+# ^RemoveFolder
+"Menghapuskan folder: "
+# ^RenameOnReboot
+"Menamakan semula pada reboot: "
+# ^Rename
+"Menamakan semula: "
+# ^Skipped
+"Diabaikan: "
+# ^CopyDetails
+Salin terperinci ke clipboard
+# ^LogInstall
+Catat proses kemasukan
+# ^Byte
+Bait
+# ^Kilo
+Kilo
+# ^Mega
+Mega
+# ^Giga
+Giga
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Malay.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Malay.nsh
new file mode 100644
index 000000000..4911452be
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Malay.nsh
@@ -0,0 +1,121 @@
+;Language: Malay (1086)
+;By muhammadazwa@yahoo.com
+
+!insertmacro LANGFILE "Malay" "Malay"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Assalamualaikum, Selamat datang ke $(^NameDA) Setup Wizard"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Setup Wizard akan membantu anda untuk memasukkan $(^NameDA).$\r$\n$\r$\nSila tutup program aplikasi yang lain sebelum Setup ini dimulakan. Ini supaya tiada proses reboot komputer diperlukan.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Selamat datang ke $(^NameDA) Uninstall Wizard"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Uninstall Wizard akan membantu anda pada proses membuang $(^NameDA).$\r$\n$\r$\nSebelum membuang, pastikan dulu $(^NameDA) dimatikan.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Perlesenan"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Sila baca teks lesen berikut sebelum memasukkan $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jika anda bersetuju, klik Saya setuju untuk teruskan. Anda mesti setuju untuk sebelum aplikasi dapat dimasukkan $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jika anda bersetuju dengan syarat-syarat lesen, sila tanda dicheckbox. Anda mesti setuju sebelum memasukkan $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jika anda terima semua yang ada di lesen, pilihlah salah satu item dibawah ini. Anda mesti setuju sebelum memasukkan $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Tentang Lesen"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Sila baca teks lesen sebelum membuang $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jika anda menerima lesen, klik Saya setuju untuk teruskan. Anda mesti setuju untuk dapat membuang $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jika anda menerima semua yang ada di lesen, beri tanda dicheckbox. Anda mesti setuju untuk dapat membuang $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jika anda menerima semua yang ada di lesen, pilihlah salah satu item dibawah ini. Anda mesti setuju untuk dapat membuang $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tekan Page Down untuk melihat teks selebihnya."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Pilih Komponen"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Pilih fungsi-fungsi dari $(^NameDA) yang ingin dimasukkan."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Penerangan"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Pilih Komponen"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Pilih fungsi-fungsi $(^NameDA) yang ingin dibuang."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Alihkan tetikus ke komponen untuk mengetahui penerangannya."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Alihkan tetikus ke komponen untuk mengetahui penerangannya."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Pilih Lokasi Kemasukan"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Pilih folder untuk memasukkan $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Pilih Lokasi Uninstall"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Pilih folder untuk meng-uninstall $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Pemasangan"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Sila tunggu ketika $(^NameDA) sedang dimasukkan."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Proses Selesai"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Setup sudah selesai."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Proses Dibatalkan"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Setup terbatal."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uninstall"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Sila tunggu ketika $(^NameDA) sedang di-buang."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Proses Uninstall Selesai"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uninstall sudah selesai."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Proses Uninstall Dibatalkan"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uninstall belum selesai secara sempurna."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Menyelesaikan $(^NameDA) Setup Wizard"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) sudah dimasukkan di komputer anda.$\r$\n$\r$\nKlik Selesai untuk menutup Setup Wizard."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Komputer anda harus direboot untuk menyelesaikan proses memasukkan $(^NameDA). Apakah anda hendak reboot sekarang juga?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Menyelesaikan $(^NameDA) Uninstall Wizard"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) sudah dibuang dari komputer anda.$\r$\n$\r$\nKlik Selesai untuk menutup Setup Wizard."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Komputer anda harus di reboot untuk menyelesaikan proses membuang $(^NameDA). Reboot sekarang?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reboot sekarang"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Reboot nanti"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Jalankan $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Buka fail Readme"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Selesai"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Pilih Folder Start Menu"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Pilih folder Start Menu untuk meletakkan pintasan $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Pilih folder Start Menu untuk perletakkan pintasan aplikasi ini. Boleh cipta nama folder anda sendiri."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Tidak perlu pintasan"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Buang $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Padam $(^NameDA) dari komputer anda."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Adakan anda yakin ingin membatalkan Setup $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Adakan anda yakin ingin membatalkan proses buang $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Mongolian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Mongolian.nlf
new file mode 100644
index 000000000..c49c2ae7a
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Mongolian.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1104
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1251
+# RTL - anything else than RTL means LTR
+-
+# Translation by Bayarsaikhan Enkhtaivan. ebayaraa@gmail.com
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Ñóóëãàö
+# ^UninstallCaption
+$(^Name) Ñóóëãàñíûã óñòãàõ
+# ^LicenseSubCaption
+: Ëèöåíçèéí çºâøººðºë
+# ^ComponentsSubCaption
+: Ñóóëãàõ ñîíãîëò
+# ^DirSubCaption
+: Ñóóëãàõ Õàâòàñ
+# ^InstallingSubCaption
+:Ñóóëãàæ áàéíà
+# ^CompletedSubCaption
+: Äóóñëàà
+# ^UnComponentsSubCaption
+: Ñóóëãàñíûã óñòãàõûí Ñîíãîëò
+# ^UnDirSubCaption
+: Ñóóëãàñíûã óñòãàõ Õàâòàñ
+# ^ConfirmSubCaption
+: Áàòëàìæ
+# ^UninstallingSubCaption
+: Ñóóëãàñíûã óñòãàæ áàéíà
+# ^UnCompletedSubCaption
+: Äóóñëàà
+# ^BackBtn
+< &Áóöàõ
+# ^NextBtn
+&Öààø>
+# ^AgreeBtn
+&Çºâøººð뺺
+# ^AcceptBtn
+Áè Ëèöåíçèéí Çºâøººðëèéí ç¿éë¿¿äèéã &çºâøººð÷ áàéíà
+# ^DontAcceptBtn
+Áè Ëèöåíçèéí Çºâøººðëèéí ç¿éë¿¿äèéã &çºâøººðºõã¿é áàéíà
+# ^InstallBtn
+&Ñóóëãà
+# ^UninstallBtn
+&Óñòãà
+# ^CancelBtn
+Áîëèõ
+# ^CloseBtn
+&Xaax
+# ^BrowseBtn
+Õ&ºòëºõ...
+# ^ShowDetailsBtn
+&Äýëãýðýíã¿é
+# ^ClickNext
+Öààø äýýð äàðâàë ¿ðãýëæèëíý.
+# ^ClickInstall
+Ñóóëãà äýýð äàðâàë ñóóëãàö ýõýëíý.
+# ^ClickUninstall
+Óñòãà äýýð äàðâàë ñóóëãàöûí óñòãàëò ýõýëíý.
+# ^Name
+Íýð
+# ^Completed
+Äóóñëàà
+# ^LicenseText
+$(^NameDA)-ã ñóóëãàõûí ºìíº Ëèöåíçèéí Çºâøººðëèéã óíøèíà óó. Õýðýâ òà çºâøèëöëèéí ç¿éë¿¿äèéã çºâøººð÷ áàéâàë, Çºâøººð뺺-ã äàðíà óó.
+# ^LicenseTextCB
+$(^NameDA)-ã ñóóëãàõûí ºìíº Ëèöåíçèéí Çºâøººðëèéã óíøèíà óó. Õýðýâ òà çºâøèëöëèéí ç¿éë¿¿äèéã çºâøººð÷ áàéâàë, äîîðõ í¿äèéã ÷àãòàëíà óó. $_CLICK
+# ^LicenseTextRB
+$(^NameDA)-ã ñóóëãàõûí ºìíº Ëèöåíçèéí Çºâøººðëèéã óíøèíà óó. Õýðýâ òà çºâøèëöëèéí ç¿éë¿¿äèéã çºâøººð÷ áàéâàë, äîîðõ ýõíèé ñîíãîëòûã ñîíãîíî óó. $_CLICK
+# ^UnLicenseText
+$(^NameDA)-ã ñóóëãàõûí ºìíº Ëèöåíçèéí Çºâøººðëèéã óíøèíà óó. Õýðýâ òà çºâøèëöëèéí ç¿éë¿¿äèéã çºâøººð÷ áàéâàë, Çºâøººð뺺-ã äàðíà óó.
+# ^UnLicenseTextCB
+$(^NameDA)-ã ñóóëãàõûí ºìíº Ëèöåíçèéí Çºâøººðëèéã óíøèíà óó. Õýðýâ òà çºâøèëöëèéí ç¿éë¿¿äèéã çºâøººð÷ áàéâàë, äîîðõ í¿äèéã ÷àãòàëíà óó. $_CLICK
+# ^UnLicenseTextRB
+$(^NameDA)-ã ñóóëãàõûí ºìíº Ëèöåíçèéí Çºâøººðëèéã óíøèíà óó. Õýðýâ òà çºâøèëöëèéí ç¿éë¿¿äèéã çºâøººð÷ áàéâàë, äîîðõ ýõíèé ñîíãîëòûã ñîíãîíî óó. $_CLICK
+# ^Custom
+Áóñàä
+# ^ComponentsText
+Ñóóëãàõûã õ¿ññýí íýãäëýý ÷àãòëààä, ñóóëãàõûã õ¿ñýõã¿é áóéãàà á¿¿ ÷àãòëààðàé. $_CLICK
+# ^ComponentsSubText1
+Ñóóëãàõ òºðëèéã ñîíãîíî óó:
+# ^ComponentsSubText2_NoInstTypes
+Ñóóëãàõ íýãäëèéã ñîíãîíî óó:
+# ^ComponentsSubText2
+Ýñâýë, çààâàë ñóóëãàõã¿é áàéõ íýãäë¿¿äèéã ñîíãî:
+# ^UnComponentsText
+Óñòãàõûã õ¿ññýí íýãäëýý ÷àãòëààä, óñòãàõûã õ¿ñýõã¿é áàéãààãàà á¿¿ ÷àãòëààðàé. $_CLICK
+# ^UnComponentsSubText1
+Óñòãàõ òºðëèéã ñîíãîíî óó:
+# ^UnComponentsSubText2_NoInstTypes
+Óñòãàõ íýãäë¿¿äèéã ñîíãîíî óól:
+# ^UnComponentsSubText2
+Ýñâýë, çààâàë óñòãàõã¿é áàéõ íýãäë¿¿äèéã ñîíãî:
+# ^DirText
+$(^NameDA) íü äàðààõ õàâòñàíä ñóóíà. ªºð ãàçàð ñóóëãàõûã õ¿ñâýë Õºòëºõ òîâ÷ äýýð äàðàí ººð õàâòàñ ñîíãîíî óó. $_CLICK
+# ^DirSubText
+Çîðèëòîò Õàâòàñ
+# ^DirBrowseText
+$(^NameDA)-ûã ñóóëãàõ õàâòñûã ñîíãîõ:
+# ^UnDirText
+$(^NameDA)-ã óã õàâòàñíààñ óñòãàíà. ªºð ãàçðààñ óñòãàõûã õ¿ñâýë Õºòëºõ òîâ÷ äýýð äàðàí ººð õàâòàñ ñîíãîíî óó. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+$(^NameDA)-ã óñòãàõ õàâòñûã ñîíãîõ:
+# ^SpaceAvailable
+"Áîëîìæèò çàé: "
+# ^SpaceRequired
+"Øààðäàãäàõ çàé: "
+# ^UninstallingText
+$(^NameDA) íü óã õàâòàñíààñ óñòãàãäëàà. $_CLICK
+# ^UninstallingSubText
+Óñòãàãäàõ ãàçàð:
+# ^FileError
+Ôàéë áè÷èõýýð íýýõýä àëäëàà: \r\n\t"$0"\r\nÒàñëàõ äàðâàë ñóóëãàëò òàñëàãäàíà,\r\nÄàõüÿ äàðâàë ôàéëûã áè÷èõýýð äàõèí îðîëäîíî,\r\nýñâýë ¯ë òîîõ äàðâàë óã ôàéëûã àëãàñíà
+# ^FileError_NoIgnore
+Ôàéë áè÷èõýýð íýýõýä àëäëàà: \r\n\t"$0"\r\nÄàõèÿ äàðâàë ôàéëûã áè÷èõýýð äàõèí îðîëäîíî, \r\nýñâýë áîëèõ äàðâàë ñóóëãàëò òàñëàãäàíà
+# ^CantWrite
+"Áè÷èæ ÷àäñàíã¿é: "
+# ^CopyFailed
+Õóóëàëò á¿òñýíã¿é
+# ^CopyTo
+"Õóóëàõ íü "
+# ^Registering
+"Á¿ðòãýæ áàéíà: "
+# ^Unregistering
+"Á¿ðòãýëèéã àðèëãàæ áàéíà: "
+# ^SymbolNotFound
+"Òýìäýã õàéãäñàíã¿é: "
+# ^CouldNotLoad
+"Äóóäàãäñàíã¿é: "
+# ^CreateFolder
+"¯¿ñãýõ õàâòàñ: "
+# ^CreateShortcut
+"¯¿ñãýõ shortcut: "
+# ^CreatedUninstaller
+"¯¿ññýí uninstaller: "
+# ^Delete
+"Ôàéë óñòãàõ: "
+# ^DeleteOnReboot
+"Ä.à÷ààëàõàä óñòãàõ: "
+# ^ErrorCreatingShortcut
+"Shortcut ¿¿ñãýõýä àëäëàà: "
+# ^ErrorCreating
+"¯¿ñãýõ àëäàà: "
+# ^ErrorDecompressing
+ªãºãäºë çàäëàõàä àëäëàà! Ñóóëãàö ýâäýð÷ýý?
+# ^ErrorRegistering
+DLL á¿ðòã¿¿ëýõýä àëäëàà
+# ^ExecShell
+"Àæèëëóóëàõ êîìàíä(ExecShell): "
+# ^Exec
+"Àæèëëóóëàõ: "
+# ^Extract
+"Çàäëàõ: "
+# ^ErrorWriting
+"Çàäëàëò:ôàéë ðóó áè÷èõýä àëäàà "
+# ^InvalidOpcode
+Ñóóëãàö ýâäýð÷ýý: çàäëàõ êîä áóðóó
+# ^NoOLE
+"OLE áàéõã¿é: "
+# ^OutputFolder
+"Ãàðãàõ õàâòàñ: "
+# ^RemoveFolder
+"Óñòãàõ õàâòàñ: "
+# ^RenameOnReboot
+"Ä.à÷ààëàõàä äàõèí íýðëýõ: "
+# ^Rename
+"Äàõèí íýðëýõ: "
+# ^Skipped
+"Àëãàññàí: "
+# ^CopyDetails
+Äýëãýðýíã¿éã Clipboard ðóó õóóëàõ
+# ^LogInstall
+Ñóóëãàõ ÿâöûí áàðèìò
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Mongolian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Mongolian.nsh
new file mode 100644
index 000000000..40ff03ed7
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Mongolian.nsh
@@ -0,0 +1,121 @@
+;Language: Mongolian (1104)
+;By Bayarsaikhan Enkhtaivan
+
+!insertmacro LANGFILE "Mongolian" "Mongolian"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) Ñóóëãàöàä òàâòàé ìîðèë"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "$(^NameDA) ñóóëãàöûí èëáý÷èíã òà øóóä àøèãëàæ áîëíî.$\r$\n$\r$\n¯¿íèéã ñóóëãàõûí ºìíº áóñàä á¿õ ïðîãðàìóóäàà õààõûã çºâëºæ áàéíà. Ñèñòåìèéí ôàéëóóäûã øèíý÷èëáýë êîìïüþòåðýý äàõèí à÷ààëàõã¿é áàéõ áîëîìæòîé.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) Ñóóëãàöûã óñòãàõ èëáý÷èíä òàâòàé ìîðèë"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "$(^NameDA) óñòãàöûí èëáý÷èíã òà øóóä àøèãëàæ áîëíî.$\r$\n$\r$\nÓñòãàõûí ºìíº $(^NameDA) íü àæèëëààã¿é ýñýõèéã øàëãà.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ëèöåíçèéí çºâøººðºë"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA)-ûã ñóóëãàõûíõàà ºìíº çºâøèëöëèéí ç¿éë¿¿äèéã óíøèíà óó."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Õýðýâ çºâøèëöëèéí ç¿éëñèéã çºâøººð÷ áàéâàë, Çºâøººð뺺 òîâ÷èéã äàðàí ¿ðãýëæë¿¿ëíý ¿¿. $(^NameDA)-ûã ñóóëãàõûí òóëä çààâàë çºâøººðºõ øààðäëàãàòàé."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Õýðýâ çºâøèëöëèéí ç¿éëñèéã çºâøººð÷ áàéâàë, Ǻâëºõ õàéðöãèéã äàðàí ¿ðãýëæë¿¿ëíý ¿¿. $(^NameDA)-ûã ñóóëãàõûí òóëä çààâàë çºâøººðºõ øààðäëàãàòàé. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Õýðýâ çºâøèëöëèéí ç¿éëñèéã çºâøººð÷ áàéâàë, äîîðõîîñ ýõíèéã íü ñîíãîí ¿ðãýëæë¿¿ëíý ¿¿. $(^NameDA)-ûã ñóóëãàõûí òóëä çààâàë çºâøººðºõ øààðäëàãàòàé. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ëèöåíçèéí çºâøººðºë"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA) óñòãàõûí ºìíº çºâøèëöëèéí ç¿éëñèéã óíøèíà óó."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Õýðýâ çºâøèëöëèéí ç¿éëñèéã çºâøººð÷ áàéâàë, Çºâøººð뺺 òîâ÷èéã äàðàí ¿ðãýëæë¿¿ëíý ¿¿. $(^NameDA)-ûã óñòãàõûí òóëä çààâàë çºâøººðºõ øààðäëàãàòàé."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Õýðýâ çºâøèëöëèéí ç¿éëñèéã çºâøººð÷ áàéâàë, Ǻâëºõ õàéðöãèéã äàðàí ¿ðãýëæë¿¿ëíý ¿¿. $(^NameDA)-ûã óñòãàõûí òóëä çààâàë çºâøººðºõ øààðäëàãàòàé. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Õýðýâ çºâøèëöëèéí ç¿éëñèéã çºâøººð÷ áàéâàë, äîîðõîîñ ýõíèéã íü ñîíãîí ¿ðãýëæë¿¿ëíý ¿¿. $(^NameDA)-ûã óñòãàõûí òóëä çààâàë çºâøººðºõ øààðäëàãàòàé. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Page Down òîâ÷èéã äàðàí çºâøèëöëèéã äîîø ã¿éëãýíý ¿¿."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Íýãäëèéã ñîíãîõ"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "$(^NameDA)-ûã ñóóëãàõàä øààðäàãäàõ õýñãèéã ñîíãîíî óó."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Òàéëáàð"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Íýãäëèéã ñîíãîõ"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "$(^NameDA)-ûí óñòãàõ øààðäëàãàòàé íýãäëèéã ñîíãîõ."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Òà õóëãàíààðàà íýãäëèéí äýýð î÷èõîä ò¿¿íèé òàéëáàðûã õàðóóëíà."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Òà õóëãàíààðàà íýãäëèéí äýýð î÷èõîä ò¿¿íèé òàéëáàðûã õàðóóëíà."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Ñóóëãàõ áàéðëàëûã ñîíãîõ"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA) ñóóëãàöûí ñóóëãàõ çàìûã ñîíãî."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Óñòãàöûí áàéðëàëûã ñîíãîõ"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA)-ûã óñòãàõ õàâòñûã ñîíãîõ."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Ñóóëãàæ áàéíà"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA)-ûã ñóóëãàæ äóóñòàë ò¿ð õ¿ëýýíý ¿¿."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Ñóóëãàæ äóóñëàà"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Ñóóëãàö àìæèëòòàé áîëîâ."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Ñóóëãàëò òàñëàãäëàà"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Ñóóëãàëò àìæèëòã¿é áîëîâ."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Óñòãàæ áàéíà"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) -ûã çàéëóóëæ äóóñòàë ò¿ð õ¿ëýýíý ¿¿."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Óñòãàæ äóóñëàà"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Óñòãàëò àìæèëòòàé äóóñëàà."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Óñòãàö òàñëàãäëàà"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Óñòãàëò àìæèëòã¿é áîëëîî."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) Ñóóëãàöûí èëáý÷èí äóóñëàà"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) íü òàíû êîìïüþòåðò ñóóëàà.$\r$\n$\r$\nÒºãñãºë äýýð äàðâàë õààíà."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA)-ûí ñóóëãàöûí äàðààëàëä òà êîìïüþòåðýý äàõèí à÷ààëñíààð äóóñíà. Òà äàõèí à÷ààëàõûã õ¿ñýæ áàéíà óó?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) Óñòãàöûí èëáý÷èí äóóñëàà"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) íü òàíû êîìïüþòåðýýñ çàéëóóëàãäëàà.$\r$\n$\r$\nÒºãñãºë äýýð äàðâàë õààíà."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) Óñòãàöûí äàðààëàëä òà êîìïüþòåðýý äàõèí à÷ààëñíààð äóóñíà. Òà ä.à÷ààëìààð áàéíà óó?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ä.À÷ààë"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Áè äàðàà ä.à÷ààëàõûã õ¿ñýæ áàéíà."
+ ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) àæèëëóóëàõ"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Readme õàðóóëàõ"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Òºãñãºë"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Start öýñíèé õàâòñûã ñîíãî"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Start öýñ äýõ $(^NameDA) shortcut-ûí õàâòñûã ñîíãî."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Start öýñýíä ïðîãðàìûí shortcut ¿¿ñãýõ õàâòñûã ñîíãî. Ýñâýë òà øèíý íýðýýð ¿¿ñãýæ áîëíî."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Do not create shortcuts"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA)--ûí Óñòãàö"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) -ûã òàíû êîìïüþòåðýýñ çàéëóóëàõ."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "$(^Name) -ûí ñóóëãàöààñ ãàðìààð áàéíà óó?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name) Óñòãàöààñ ãàðìààð áàéíà óó?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Norwegian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Norwegian.nlf
new file mode 100644
index 000000000..13703957a
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Norwegian.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1044
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Jonas Lindstrøm (jonasc_88@hotmail.com). Reviewed and fixed by Jan Ivar Beddari
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) installasjon
+# ^UninstallCaption
+$(^Name) avinstallasjon
+# ^LicenseSubCaption
+: Lisensavtale
+# ^ComponentsSubCaption
+: Installasjonsvalg
+# ^DirSubCaption
+: Installasjonsmappe
+# ^InstallingSubCaption
+: Installerer
+# ^CompletedSubCaption
+: Ferdig
+# ^UnComponentsSubCaption
+: Avinstallasjonsvalg
+# ^UnDirSubCaption
+: Avinstallasjonsmappe
+# ^ConfirmSubCaption
+: Bekreft
+# ^UninstallingSubCaption
+: Avinstallerer
+# ^UnCompletedSubCaption
+: Ferdig
+# ^BackBtn
+< &Tilbake
+# ^NextBtn
+&Neste >
+# ^AgreeBtn
+&Godta
+# ^AcceptBtn
+Jeg &godtar vilkårene i lisensavtalen
+# ^DontAcceptBtn
+Jeg godtar &ikke vilkårene i lisensavtalen
+# ^InstallBtn
+&Installer
+# ^UninstallBtn
+&Avinstaller
+# ^CancelBtn
+Avbryt
+# ^CloseBtn
+&Lukk
+# ^BrowseBtn
+Bla &gjennom...
+# ^ShowDetailsBtn
+Vis &detaljer
+# ^ClickNext
+Trykk Neste for å fortsette.
+# ^ClickInstall
+Trykk Installer for å starte installasjonen.
+# ^ClickUninstall
+Trykk Avinstaller for å starte avinstallasjonen.
+# ^Name
+Navn
+# ^Completed
+Ferdig
+# ^LicenseText
+Vennligst les gjennom lisensavtalen før du installerer $(^Name). Hvis du godtar vilkårene i avtalen, trykk på Godta.
+# ^LicenseTextCB
+Vennligst les gjennom lisensavtalen før du installerer $(^Name). Hvis du godtar vilkårene i avtalen, merk av under. $_CLICK
+# ^LicenseTextRB
+Vennligst les gjennom lisensavtalen før du installerer $(^Name). Hvis du godtar vilkårene i avtalen, velg det første alternativet. $_CLICK
+# ^UnLicenseText
+Vennligst les gjennom lisensavtalen før du avinstallerer $(^Name). Hvis du godtar vilkårene i avtalen, trykk på Godta.
+# ^UnLicenseTextCB
+Vennligst les gjennom lisensavtalen før du avinstallerer $(^Name). Hvis du godtar vilkårene i avtalen, merk av under. $_CLICK
+# ^UnLicenseTextRB
+Vennligst les gjennom lisensavtalen før du avinstallerer $(^Name). Hvis du godtar vilkårene i avtalen, velg det første alternativet. $_CLICK
+# ^Custom
+Egendefinert
+# ^ComponentsText
+Merk komponentene du vil installere og fjern merkingen for de du ikke vil installere. $_CLICK
+# ^ComponentsSubText1
+Velg hvilken måte du vil installere på:
+# ^ComponentsSubText2_NoInstTypes
+Merk komponenter du vil installere:
+# ^ComponentsSubText2
+Eller merk de valgfrie komponentene du ønsker å installere:
+# ^UnComponentsText
+Merk komponentene du vil avinstallere og fjern merkingen for de du vil beholde. $_CLICK
+# ^UnComponentsSubText1
+Velg hvilken måte du vil avinstallere på:
+# ^UnComponentsSubText2_NoInstTypes
+Merk komponenter du vil avinstallere:
+# ^UnComponentsSubText2
+Eller merk de valgfrie komponentene du ønsker å avinstallere:
+# ^DirText
+$(^Name) vil bli installert i følgende mappe. For å velge en annen mappe, trykk Bla gjennom. $_CLICK
+# ^DirSubText
+Målmappe
+# ^DirBrowseText
+Velg mappe du vil installere $(^Name) i:
+# ^UnDirText
+$(^Name) i følgende mappe vil bli avinstallert. For å velge en annen mappe, trykk Bla gjennom. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Velg mappe du vil avinstallere $(^Name) fra:
+# ^SpaceAvailable
+"Ledig plass: "
+# ^SpaceRequired
+"Nødvendig plass: "
+# ^UninstallingText
+Denne veiviseren vil avinstallere $(^Name) fra din datamaskin. $_CLICK
+# ^UninstallingSubText
+Avinstallerer fra:
+# ^FileError
+Feil under åpning av fil for skriving: \r\n\t\"$0\"\r\nTrykk Avbryt for å avbryte installasjonen,\r\nPrøv igjen for å prøve igjen, eller\r\nIgnorer for å hoppe over denne filen
+# ^FileError_NoIgnore
+Feil under åpning av fil for skriving: \r\n\t\"$0\"\r\nTrykk Prøv igjen for å prøve igjen, or\r\neller Avbryt for å avbryte installasjonen
+# ^CantWrite
+"Kan ikke skrive: "
+# ^CopyFailed
+Kopiering mislyktes
+# ^CopyTo
+"Kopier til "
+# ^Registering
+"Registrerer: "
+# ^Unregistering
+""Avregistrerer: "
+# ^SymbolNotFound
+"Kunne ikke finne symbol: "
+# ^CouldNotLoad
+"Kunne ikke laste: "
+# ^CreateFolder
+"Lag mappe: "
+# ^CreateShortcut
+"Lag snarvei: "
+# ^CreatedUninstaller
+"Avinstallasjon laget: "
+# ^Delete
+"Slett fil: "
+# ^DeleteOnReboot
+"Slett ved omstart: "
+# ^ErrorCreatingShortcut
+"Feil under opprettelse av snarvei: "
+# ^ErrorCreating
+"Feil under opprettelse av: "
+# ^ErrorDecompressing
+Feil under utpakking av data! Installasjonsprogrammet kan være skadet.
+# ^ErrorRegistering
+Feil under registrering av DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Kjøre: "
+# ^Extract
+"Pakk ut: "
+# ^ErrorWriting
+"Pakk ut: Feil under skriving til fil "
+# ^InvalidOpcode
+Installasjonsprogrammet er skadet: ukjent kode
+# ^NoOLE
+"Ingen OLE for: "
+# ^OutputFolder
+"Ut-mappe: "
+# ^RemoveFolder
+"Fjern mappe: "
+# ^RenameOnReboot
+"Gi nytt navn ved omstart: "
+# ^Rename
+"Gi nytt navn: "
+# ^Skipped
+"Hoppet over: "
+# ^CopyDetails
+Kopier detaljer til utklippstavlen
+# ^LogInstall
+Loggfør installasjonsprosessen
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Norwegian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Norwegian.nsh
new file mode 100644
index 000000000..2ca316002
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Norwegian.nsh
@@ -0,0 +1,121 @@
+;Language: Norwegian (2068)
+;By Jonas Lindsrøm (jonasc_88@hotmail.com) Reviewed and fixed by Jan Ivar Beddari, d0der at online.no
+
+!insertmacro LANGFILE "Norwegian" "Norwegian"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Velkommen til veiviseren for installasjon av $(^NameDA) "
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Denne veiviseren vil lede deg gjennom installasjonen av $(^NameDA).$\r$\n$\r$\nDet anbefales at du avslutter alle andre programmer før du fortsetter. Dette vil la installasjonsprogrammet forandre på systemfiler uten at du må starte datamaskinen på nytt.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Velkommen til veiviseren for avinstallasjon av $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Denne veiviseren vil lede deg gjennom avinstallasjonen av $(^NameDA).$\r$\n$\r$\nFør du fortsetter må du forsikre deg om at $(^NameDA) ikke kjører.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisensavtale"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Vennligst les gjennom lisensavtalen før du starter installasjonen av $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Hvis du godtar lisensavtalen trykk Godta for å fortsette. Du må godta lisensavtalen for å installere $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Hvis du godtar lisensavtalen, kryss av på merket under. Du må godta lisensavtalen for å installere $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Hvis du godtar lisensavtalen, velg det første alternativet ovenfor. Du må godta lisensavtalen for å installere $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisensavtale"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Vennligst les gjennom lisensavtalen før du avinstallerer $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Hvis du godtar lisensavtalen trykk Godta for å fortsette. Du må godta lisensavtalen for å avintallere $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Hvis du godtar lisensavtalen, kryss av på merket under. Du må godta lisensavtalen for å avinstallere $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Hvis du godtar lisensavtalen, velg det første alternativet ovenfor. Du må godta lisensavtalen for å avinstallere $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Trykk Page Down knappen for å se resten av lisensavtalen."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Velg komponenter"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Velg hvilke deler av $(^NameDA) du ønsker å installere."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskrivelse"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Velg komponenter"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Velg hvilke deler av $(^NameDA) du ønsker å avinstallere."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beveg musen over komponentene for å se beskrivelsen."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beveg musen over komponentene for å se beskrivelsen."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Velg installasjonsmappe"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Velg hvilken mappe du vil installere $(^NameDA) i."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Velg mappe for avinstallasjon"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Velg mappen du vil avinstallere $(^NameDA) fra."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installasjonen pågår"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vennligst vent mens $(^NameDA) blir installert."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Installasjonen er ferdig"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Installasjonen ble fullført uten feil."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Installasjonen er avbrutt"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Installasjonen ble ikke fullført riktig."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Avinstallasjon pågår"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vennligst vent mens $(^NameDA) blir avinstallert."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Avinstallasjon ferdig"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Avinstallasjonen ble utført uten feil."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Avinstallasjon avbrutt"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Avinstallasjonen ble ikke utført riktig."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Avslutter $(^NameDA) installasjonsveiviser"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) er klart til bruk på din datamskin.$\r$\n$\r$\nTrykk Ferdig for å avslutte installasjonsprogrammet."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Du må starte datamaskinen på nytt for å fullføre installasjonen av $(^NameDA). Vil du starte datamaskinen på nytt nå?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Fullfører avinstallasjonen av $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) har blitt avinstallert fra din datamaskin.$\r$\n$\r$\nTrykk på ferdig for å avslutte denne veiviseren."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Datamaskinen må starte på nytt for å fullføre avinstallasjonen av $(^NameDA). Vil du starte datamaskinen på nytt nå?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ja. Start datamaskinen på nytt nå"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Nei. Jeg vil starte datamaskinen på nytt senere"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Kjør $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Vis Readme filen"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Ferdig"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Velg plassering på startmenyen"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Velg hvilken mappe snarveiene til $(^NameDA) skal ligge i."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Velg mappe for snarveiene til programmet. Du kan også skrive inn et nytt navn for å lage en ny mappe."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ikke lag snarveier"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Avinstaller $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Fjern $(^NameDA) fra din datamaskin."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Er du sikker på at du vil avslutte installasjonen av $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Er du sikker på at du vil avbryte avinstallasjonen av $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/NorwegianNynorsk.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/NorwegianNynorsk.nlf
new file mode 100644
index 000000000..ae6a41df3
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/NorwegianNynorsk.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Language ID
+2068
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Vebjørn Sture, vsture gmail com
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) installasjon
+# ^UninstallCaption
+$(^Name) avinstallasjon
+# ^LicenseSubCaption
+: Lisensavtale
+# ^ComponentsSubCaption
+: Installasjonsval
+# ^DirSubCaption
+: Installasjonsmappe
+# ^InstallingSubCaption
+: Installerer
+# ^CompletedSubCaption
+: Ferdig
+# ^UnComponentsSubCaption
+: Avinstallasjonsval
+# ^UnDirSubCaption
+: Avinstallasjonsmappe
+# ^ConfirmSubCaption
+: Stadfest
+# ^UninstallingSubCaption
+: Avinstallerer
+# ^UnCompletedSubCaption
+: Ferdig
+# ^BackBtn
+< &Attende
+# ^NextBtn
+&Neste >
+# ^AgreeBtn
+&Godta
+# ^AcceptBtn
+Eg &godtek vilkåra i lisensavtalen
+# ^DontAcceptBtn
+Eg godtek &ikkje vilkåra i lisensavtalen
+# ^InstallBtn
+&Installer
+# ^UninstallBtn
+&Avinstaller
+# ^CancelBtn
+Avbryt
+# ^CloseBtn
+&Lat att
+# ^BrowseBtn
+Bla &gjennom ...
+# ^ShowDetailsBtn
+Syn &detaljar
+# ^ClickNext
+Trykk Neste for å halda fram.
+# ^ClickInstall
+Trykk Installer for å starta installasjonen.
+# ^ClickUninstall
+Trykk Avinstaller for å starta avinstallasjonen.
+# ^Name
+Namn
+# ^Completed
+Ferdig
+# ^LicenseText
+Ver grei og les gjennom lisensavtalen før du installerer $(^NameDA). Dersom du godtek vilkåra i avtalen, trykk på Godta.
+# ^LicenseTextCB
+Ver grei og les gjennom lisensavtalen før du installerer $(^NameDA). Dersom du godtek vilkåra i avtalen, merk av under. $_CLICK
+# ^LicenseTextRB
+Ver grei og les gjennom lisensavtalen før du installerer $(^NameDA). Dersom du godtek vilkåra i avtalen, vel det fyrste alternativet. $_CLICK
+# ^UnLicenseText
+Ver grei og les gjennom lisensavtalen før du avinstallerer $(^NameDA). Dersom du godtek vilkåra i avtalen, trykk på Godta.
+# ^UnLicenseTextCB
+Ver grei og les gjennom lisensavtalen før du avinstallerer $(^NameDA). Dersom du godtek vilkåra i avtalen, merk av under. $_CLICK
+# ^UnLicenseTextRB
+Ver grei og les gjennom lisensavtalen før du avinstallerer $(^NameDA). Dersom du godtek vilkåra i avtalen, vel det fyrste alternativet. $_CLICK
+# ^Custom
+Eigendefinert
+# ^ComponentsText
+Merk komponentane du vil installera og fjern merkinga for dei du ikkje vil installera. $_CLICK
+# ^ComponentsSubText1
+Vel kva måte du vil installera på:
+# ^ComponentsSubText2_NoInstTypes
+Merk komponentar du vil installera:
+# ^ComponentsSubText2
+Eller merk dei valfrie komponentane du ynskjer å installera:
+# ^UnComponentsText
+Merk komponentane du vil avinstallera og fjern merkinga for dei du vil ta vare på. $_CLICK
+# ^UnComponentsSubText1
+Vel kva måte du vil avinstallera på:
+# ^UnComponentsSubText2_NoInstTypes
+Merk komponentar du vil avinstallera:
+# ^UnComponentsSubText2
+Eller merk dei valfrie komponentane du ynskjer å avinstallera:
+# ^DirText
+$(^NameDA) vil verta installert i fylgjande mappe. For å velja ei anna mappe, trykk Bla gjennom. $_CLICK
+# ^DirSubText
+Målmappe
+# ^DirBrowseText
+Vel mappe du vil installera $(^NameDA) i:
+# ^UnDirText
+$(^NameDA) i fylgjande mappe vil verta avinstallert. For å velja ei anna mappe, trykk Bla gjennom. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Vel mappe du vil avinstallera $(^NameDA) frå:
+# ^SpaceAvailable
+"Ledig plass: "
+# ^SpaceRequired
+"Naudsynt plass: "
+# ^UninstallingText
+Denne vegvisaren vil avinstallera $(^NameDA) frå din datamaskin. $_CLICK
+# ^UninstallingSubText
+Avinstallerer frå:
+# ^FileError
+Feil under opning av fil for skriving: \r\n\t\"$0\"\r\nTrykk Avbryt for å avbryta installasjonen,\r\nPrøv igjen for å prøva igjen, eller\r\nIgnorer for å hoppa over denne fila
+# ^FileError_NoIgnore
+Feil under opning av fil for skriving: \r\n\t\"$0\"\r\nTrykk Prøv igjen for å prøva igjen, or\r\neller Avbryt for å avbryta installasjonen
+# ^CantWrite
+"Kan ikkje skriva: "
+# ^CopyFailed
+Kopiering mislukka
+# ^CopyTo
+"Kopier til "
+# ^Registering
+"Registrerer: "
+# ^Unregistering
+""Avregistrerer: "
+# ^SymbolNotFound
+"Kunne ikkje finna symbol: "
+# ^CouldNotLoad
+"Kunne ikkje lasta: "
+# ^CreateFolder
+"Lag mappe: "
+# ^CreateShortcut
+"Lag snarveg: "
+# ^CreatedUninstaller
+"Avinstallasjon laga: "
+# ^Delete
+"Slett fil: "
+# ^DeleteOnReboot
+"Slett ved omstart: "
+# ^ErrorCreatingShortcut
+"Feil under oppretting av snarveg: "
+# ^ErrorCreating
+"Feil under oppretting av: "
+# ^ErrorDecompressing
+Feil under utpakking av data! Installasjonsprogrammet kan vera skadd.
+# ^ErrorRegistering
+Feil under registrering av DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Køyra: "
+# ^Extract
+"Pakk ut: "
+# ^ErrorWriting
+"Pakk ut: Feil under skriving til fil "
+# ^InvalidOpcode
+Installasjonsprogrammet er skadd: ukjend kode
+# ^NoOLE
+"Ingen OLE for: "
+# ^OutputFolder
+"Ut-mappe: "
+# ^RemoveFolder
+"Fjern mappe: "
+# ^RenameOnReboot
+"Gje nytt namn ved omstart: "
+# ^Rename
+"Gje nytt namn: "
+# ^Skipped
+"Hoppa over: "
+# ^CopyDetails
+Kopier detaljar til utklyppstavla
+# ^LogInstall
+Loggfør installasjonsprosessen
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
+
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/NorwegianNynorsk.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/NorwegianNynorsk.nsh
new file mode 100644
index 000000000..a7a9014d4
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/NorwegianNynorsk.nsh
@@ -0,0 +1,121 @@
+;Language: Norwegian nynorsk (2068)
+;By Vebjoern Sture and Håvard Mork (www.firefox.no)
+
+!insertmacro LANGFILE "NorwegianNynorsk" "Norwegian nynorsk"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Velkommen til $(^NameDA) innstallasjonsvegvisar"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Denne vegvisaren vil leie deg gjennom installeringa av $(^NameDA).$\n$\nDet er tilrådd at du avsluttar alle andre program før du held fram. Dette vil la installeringsprogrammet oppdatera systemfiler utan at du må starta datamaskinen på nytt.$\n$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Velkommen til avinstallering av $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Denne vegvisaren vil leie deg gjennom avinstalleringen av $(^NameDA).$\n$\nFør du fortsetter må du forsikre deg om at $(^NameDA) ikkje er opent.$\n$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisensavtale"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Les gjennom lisensavtalen før du startar installeringa av $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Trykk på «Godta» dersom du godtar betingelsane i avtala. Du må godta avtala for å installere $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Trykk på avkryssingsboksen nedanfor nedanfor dersom du godtar betingelsane i avtala. Du må godta avtala for å installere $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Vel det første alternativet nedanfor dersom du godtek vilkåra i avtala. Du må godta avtala for å installera $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisensavtale"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Les gjennom lisensavtalen før du startar avinstalleringa av $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Trykk på «Godta» dersom du godtar betingelsane i avtala. Du må godta avtala for å avinstallera $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Trykk på avkryssingsboksen nedanfor nedanfor dersom du godtar betingelsane i avtala. Du må godta avtala for å avinstallera $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Vel det første alternativet nedanfor dersom du godtar betingelsane i avtala. Du må godta avtala for å avinstallera $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Trykk Page Down-knappen for å sjå resten av lisensavtala."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Vel komponentar"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Vel kva delar av $(^NameDA) du ynskjer å installera."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskriving"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Vel funksjonar"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Vel kva for funksjonar du vil avinstallera i $(^NameDA)."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beveg musa over komponentene for å sjå beskrivinga."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beveg musa over komponentene for å sjå beskrivinga."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Vel installasjonsmappe"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Vel kva mappe du vil installera $(^NameDA) i."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Vel avinstalleringplassering"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Vel mappa du vil avinstallere $(^NameDA) frå."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installerer"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vent mens $(^NameDA) blir installert."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Installeringa er fullført"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Installeringa vart fullført."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Installeringa vart avbroten"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Installeringa vart ikkje fullført."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Avinstallerer"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vent medan $(^NameDA) vert avinstallert."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Avinstallering ferdig"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Avinstallering ble utført uten feil."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Avinstallering broten"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Avinstallering ble ikkje utført riktig."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Installering fullført"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) er installert og klar til bruk.$\n$\nTrykk på «Fullfør» for å avslutte installeringa."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Du må starta datamaskinen på nytt for å fullføra installeringa av $(^NameDA). Vil du starta på nytt no?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Fullfører avinstalleringa av $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) er no avinstallert frå datamaskina di.$\n$\nTrykk på «Fullfør» for å avslutta denne vegvisaren."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Datamaskinen må starta på nytt for å fullføra avinstalleringa av $(^NameDA). Vil du starta datamaskina på nytt no?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Start på nytt no"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Eg vil starta på nytt seinare"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Køyr $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Syn lesmeg"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Fullfør"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Vel mappe på startmenyen"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Vel kva mappe snarvegane til $(^NameDA) skal liggja i."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vel mappa du vil oppretta snarvegane til programmet i. Du kan òg skriva inn eit nytt namn for å laga ei ny mappe."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ikkje opprett snarvegar"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Avinstaller $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Slett $(^NameDA) frå datamaskinen."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Er du viss på at du vil avslutta installeringa av $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Er du viss på at du vil avbryta avinstalleringa av $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Polish.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Polish.nlf
new file mode 100644
index 000000000..f680d895e
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Polish.nlf
@@ -0,0 +1,195 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1045
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1250
+# RTL - anything else than RTL means LTR
+-
+# Translation by Piotr Murawski & Rafa³ Lampe
+# Updated by cube and SYSTEMsoft Group
+# Corrections by Marek Stepien - http://www.aviary.pl/
+# Updated by Pawe³ Porwisz, http://www.pepesoft.tox.pl
+# Corrected by Mateusz Gola (aka Prozac) - http://www.videopedia.pl/avirecomp
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Instalator programu $(^Name)
+# ^UninstallCaption
+Deinstalator programu $(^Name)
+# ^LicenseSubCaption
+: Umowa licencyjna
+# ^ComponentsSubCaption
+: Opcje instalacji
+# ^DirSubCaption
+: Folder instalacyjny
+# ^InstallingSubCaption
+: Instalowanie plików
+# ^CompletedSubCaption
+: Zakoñczono
+# ^UnComponentsSubCaption
+: Opcje deinstalacji
+# ^UnDirSubCaption
+: Folder deinstalacyjny
+# ^ConfirmSubCaption
+: Potwierdzenie
+# ^UnDirSubCaption
+: Deinstalowanie plików
+# ^UnCompletedSubCaption
+: Zakoñczono
+# ^BackBtn
+< &Wstecz
+# ^NextBtn
+&Dalej >
+# ^AgreeBtn
+&Zgadzam siê
+# ^AcceptBtn
+&Akceptujê warunki umowy licencyjnej
+# ^DontAcceptBtn
+&Nie akceptujê warunków umowy licencyjnej
+# ^InstallBtn
+&Zainstaluj
+# ^UninstallBtn
+&Odinstaluj
+# ^CancelBtn
+Anuluj
+# ^CloseBtn
+&Zamknij
+# ^BrowseBtn
+&Przegl¹daj...
+# ^ShowDetailsBtn
+Poka¿ &szczegó³y
+# ^ClickNext
+Kliknij Dalej, aby kontynuowaæ.
+# ^ClickInstall
+Kliknij Zainstaluj, aby rozpocz¹æ instalacjê.
+# ^ClickUninstall
+Kliknij Odinstaluj, aby rozpocz¹æ deinstalacjê.
+# ^Name
+Nazwa
+# ^Completed
+Zakoñczono
+# ^LicenseText
+Przed zainstalowaniem $(^NameDA) przeczytaj umowê licencyjn¹. Jeœli akceptujesz wszystkie warunki umowy, kliknij Zgadzam siê.
+# ^LicenseTextCB
+Przed zainstalowaniem $(^NameDA) przeczytaj umowê licencyjn¹. Jeœli akceptujesz wszystkie warunki umowy, kliknij pole wyboru poni¿ej. $_CLICK.
+# ^LicenseTextRB
+Przed zainstalowaniem $(^NameDA) przeczytaj umowê licencyjn¹. Jeœli akceptujesz wszystkie warunki umowy, wybierz pierwsz¹ opcjê poni¿ej. $_CLICK.
+# ^UnLicenseText
+Przed odinstalowaniem $(^NameDA) przeczytaj umowê licencyjn¹. Jeœli akceptujesz wszystkie warunki umowy, kliknij Zgadzam siê.
+# ^UnLicenseTextCB
+Przed odinstalowaniem $(^NameDA) przeczytaj umowê licencyjn¹. Jeœli akceptujesz wszystkie warunki umowy, kliknij pole wyboru poni¿ej. $_CLICK.
+# ^UnLicenseTextRB
+Przed odinstalowaniem $(^NameDA) przeczytaj licencjê. Jeœli akceptujesz wszystkie warunki umowy, wybierz pierwsz¹ opcjê poni¿ej. $_CLICK.
+# ^Custom
+U¿ytkownika
+# ^ComponentsText
+Zaznacz komponenty, które chcesz zainstalowaæ i odznacz te, których nie chcesz instalowaæ. $_CLICK
+# ^ComponentsSubText1
+Wybierz typ instalacji:
+# ^ComponentsSubText2_NoInstTypes
+Wybierz komponenty do zainstalowania:
+# ^ComponentsSubText2
+Albo wybierz opcjonalne komponenty, które chcesz zainstalowaæ:
+# ^UnComponentsText
+Zaznacz komponenty, które chcesz odinstalowaæ i odznacz te, które nie zostan¹ odinstalowane. $_CLICK
+# ^UnComponentsSubText1
+Wybierz typ deinstalacji:
+# ^UnComponentsSubText2_NoInstTypes
+Wybierz komponenty do odinstalowania:
+# ^UnComponentsSubText2
+Albo wybierz opcjonalne komponenty, które chcesz odinstalowaæ:
+# ^DirText
+Instalator zainstaluje program $(^NameDA) w nastêpuj¹cym folderze. Aby zainstalowaæ w innym folderze, kliknij Przegl¹daj i wybierz folder. $_CLICK
+# ^DirSubText
+Folder docelowy
+# ^DirBrowseText
+Wybierz folder instalacyjny $(^NameDA):
+# ^UnDirText
+Deinstalator usunie $(^NameDA) z nastêpuj¹cego folderu. Aby odinstalowaæ z innego folderu, kliknij Przegl¹daj i wybierz folder. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Wybierz folder, z którego zostanie odinstalowany program $(^NameDA):
+# ^SpaceAvailable
+"Dostêpne miejsce: "
+# ^SpaceRequired
+"Wymagane miejsce: "
+# ^UninstallingText
+Ten kreator odinstaluje $(^NameDA) z Twojego komputera. $_CLICK
+# ^UninstallingSubText
+Deinstalacja z:
+# ^FileError
+B³¹d otwarcia pliku do zapisu: \r\n\r\n$0\r\n\r\nWybierz Anuluj, aby przerwaæ instalacjê,\r\nPonów, aby ponowiæ zapis do pliku lub\r\nIgnoruj, aby pomin¹æ ten plik.
+# ^FileError_NoIgnore
+B³¹d otwarcia pliku do zapisu: \r\n\r\n$0\r\n\r\nWybierz Ponów, aby ponowiæ zapis do pliku lub\r\nAnuluj, aby przerwaæ instalacjê.
+# ^CantWrite
+"Nie mo¿na zapisaæ: "
+# ^CopyFailed
+B³¹d kopiowania
+# ^CopyTo
+"Kopiuj do "
+# ^Registering
+"Rejestrowanie: "
+# ^Unregistering
+"Odrejestrowywanie: "
+# ^SymbolNotFound
+"Nie mo¿na odnaleŸæ symbolu: "
+# ^CouldNotLoad
+"Nie mo¿na wczytaæ: "
+#^CreateFolder
+"Utwórz folder: "
+# ^CreateShortcut
+"Utwórz skrót: "
+# ^CreatedUninstaller
+"Utworzono deinstalator: "
+# ^Delete
+"Usuñ plik: "
+# ^DeleteOnReboot
+"Usuñ przy ponownym uruchomieniu: "
+# ^ErrorCreatingShortcut
+"B³¹d tworzenia skrótu: "
+# ^ErrorCreating
+"B³¹d tworzenia: "
+# ^ErrorDecompressing
+B³¹d rozpakowywania danych! Uszkodzony instalator?
+# ^ErrorRegistering
+B³¹d rejestracji pliku DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Uruchom: "
+# ^Extract
+"Rozpakuj: "
+# ^ErrorWriting
+"Rozpakuj: b³¹d zapisu do pliku "
+# ^InvalidOpcode
+Instalator uszkodzony: nieprawid³owy kod operacji
+# ^NoOLE
+"Brak OLE dla: "
+# ^OutputFolder
+"Folder wyjœciowy: "
+# ^RemoveFolder
+"Usuñ folder: "
+# ^RenameOnReboot
+"Zmieñ nazwê przy ponownym uruchomieniu: "
+# ^Rename
+"Zmieñ nazwê: "
+# ^Skipped
+"Pominiête: "
+# ^CopyDetails
+Kopiuj szczegó³y do schowka
+# ^LogInstall
+Rejestruj przebieg instalacji
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Polish.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Polish.nsh
new file mode 100644
index 000000000..a836212ae
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Polish.nsh
@@ -0,0 +1,132 @@
+;Language: Polish (1045)
+;By Piotr Murawski & Rafa³ Lampe
+;Updated by cube and SYSTEMsoft Group
+;Updated by Pawe³ Porwisz, http://www.pepesoft.tox.pl
+;Corrected by Mateusz Gola (aka Prozac) - http://www.videopedia.pl/avirecomp
+
+!insertmacro LANGFILE "Polish" "Polski"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Witamy w kreatorze instalacji programu $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Kreator ten pomo¿e Ci zainstalowaæ program $(^NameDA).$\r$\n$\r$\nZalecane jest zamkniêcie wszystkich uruchomionych programów przed rozpoczêciem instalacji. Pozwoli to na uaktualnienie niezbêdnych plików systemowych bez koniecznoœci ponownego uruchamiania komputera.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Witamy w kreatorze deinstalacji $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Kreator poprowadzi Ciê przez proces deinstalacji $(^NameDA).$\r$\n$\r$\nPrzed rozpoczêciem deinstalacji programu, upewnij siê, czy $(^NameDA) NIE jest w³aœnie uruchomiony.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Umowa licencyjna"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Przed instalacj¹ programu $(^NameDA) zapoznaj siê z warunkami licencji."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Je¿eli akceptujesz warunki umowy, wybierz Zgadzam siê, aby kontynuowaæ. Musisz zaakceptowaæ warunki umowy, aby zainstalowaæ $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Je¿eli akceptujesz warunki umowy, zaznacz pole wyboru poni¿ej, aby kontynuowaæ. Musisz zaakceptowaæ warunki umowy, aby zainstalowaæ $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Je¿eli akceptujesz warunki umowy, wybierz pierwsz¹ opcjê poni¿ej, aby kontynuowaæ. Musisz zaakceptowaæ warunki umowy, aby zainstalowaæ $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Umowa licencyjna"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Przed deinstalacj¹ programu $(^NameDA) zapoznaj siê z warunkami licencji."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Je¿eli akceptujesz warunki umowy, wybierz Zgadzam siê, aby kontynuowaæ. Musisz zaakceptowaæ warunki umowy, aby odinstalowaæ $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Je¿eli akceptujesz warunki umowy, zaznacz pole wyboru poni¿ej, aby kontynuowaæ. Musisz zaakceptowaæ warunki umowy, aby odinstalowaæ $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Je¿eli akceptujesz warunki umowy, wybierz pierwsz¹ opcjê poni¿ej, aby kontynuowaæ. Musisz zaakceptowaæ warunki umowy, aby odinstalowaæ $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Naciœnij klawisz Page Down, aby zobaczyæ resztê umowy."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Wybierz komponenty"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Wybierz komponenty programu $(^NameDA), które chcesz zainstalowaæ."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Wybierz komponenty"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Wybierz, które elementy $(^NameDA) chcesz odinstalowaæ."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Przesuñ kursor myszy nad komponent, aby zobaczyæ jego opis."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Przesuñ kursor myszy nad komponent, aby zobaczyæ jego opis."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Wybierz lokalizacjê dla instalacji"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Wybierz folder, w którym ma byæ zainstalowany $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Wybór miejsca deinstalacji"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Wybierz folder, z którego chcesz odinstalowaæ $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalacja"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Proszê czekaæ, podczas gdy $(^NameDA) jest instalowany."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Zakoñczono instalacjê"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalacja zakoñczona pomyœlnie."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalacja przerwana"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalacja nie zosta³a zakoñczona pomyœlnie."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Deinstalacja"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Proszê czekaæ, $(^NameDA) jest odinstalowywany."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Zakoñczono odinstalowanie"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Odinstalowanie zakoñczone pomyœlnie."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Deinstalacja przerwana"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Deinstalacja nie zosta³a zakoñczona pomyœlnie."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Koñczenie pracy kreatora instalacji $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) zosta³ pomyœlnie zainstalowany na Twoim komputerze.$\r$\n$\r$\nKliknij Zakoñcz, aby zakoñczyæ dzia³anie kreatora."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Twój komputer musi zostaæ ponownie uruchomiony, aby zakoñczyæ instalacjê programu $(^NameDA). Czy chcesz zrobiæ to teraz?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Koñczenie pracy kreatora deinstalacji $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) zosta³ odinstalowany z Twojego komputera.$\r$\n$\r$\nKliknij Zakoñcz, aby zakoñczyæ dzia³anie kreatora."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Twój komputer musi zostaæ ponownie uruchomiony w celu zakoñczenia deinstalacji programu $(^NameDA). Czy chcesz zrobiæ to teraz?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Uruchom ponownie teraz"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Sam uruchomiê ponownie komputer póŸniej"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Uruchom program $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Poka¿ plik ReadMe"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Zakoñcz"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Wybierz folder w menu Start"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Wybierz folder menu Start, w którym zostan¹ umieszczone skróty do programu"
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Wybierz folder w menu Start, w którym chcia³byœ umieœciæ skróty do programu. Mo¿esz tak¿e utworzyæ nowy folder wpisuj¹c jego nazwê."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nie twórz skrótów"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Odinstaluj $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Usuñ $(^NameDA) z Twojego komputera."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Czy na pewno chcesz zakoñczyæ dzia³anie instalatora $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Czy na pewno chcesz przerwaæ proces deinstalacji $(^Name)?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Wybierz u¿ytkowników"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Wybierz, dla których u¿ytkowników chcesz zainstalowaæ program $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Wybierz, czy chcesz zainstalowaæ program $(^NameDA) tylko dla siebie, czy dla wszystkich u¿ytkowników tego komputera. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Zainstaluj dla wszystkich u¿ytkowników tego komputera"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Zainstaluj tylko dla mnie"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Portuguese.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Portuguese.nlf
new file mode 100644
index 000000000..8ccf71c90
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Portuguese.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+2070
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation v4.0.3 by DragonSoull with help from Dre` - Updated by Ramon
+# ^Branding
+Sistema de Instalação Nullsoft %s
+# ^SetupCaption
+Instalação de $(^Name)
+# ^UninstallCaption
+Desinstalação de $(^Name)
+# ^LicenseSubCaption
+: Contrato de Licença
+# ^ComponentsSubCaption
+: Opções de instalação
+# ^DirSubCaption
+: Diretório de instalação
+# ^InstallingSubCaption
+: Instalando Ficheiros
+# ^CompletedSubCaption
+: Concluído
+# ^UnComponentsSubCaption
+: Opções de Desinstalação
+# ^UnDirSubCaption
+: Pasta de Desinstalação
+# ^ConfirmSubCaption
+: Confirmação
+# ^UninstallingSubCaption
+: Desinstalando
+# ^UnCompletedSubCaption
+: Concluído
+# ^BackBtn
+< &Anterior
+# ^NextBtn
+&Seguinte >
+# ^AgreeBtn
+&Aceito
+# ^AcceptBtn
+Eu &aceito os termos do Contrato de Licença
+# ^DontAcceptBtn
+Eu &não aceito os termos do Contrato de Licença
+# ^InstallBtn
+&Instalar
+# ^UninstallBtn
+&Desinstalar
+# ^CancelBtn
+Cancelar
+# ^CloseBtn
+&Fechar
+# ^BrowseBtn
+&Procurar...
+# ^ShowDetailsBtn
+Ver &Detalhes
+# ^ClickNext
+Clique em 'Seguinte' para continuar.
+# ^ClickInstall
+Clique em 'Instalar' para iniciar a instalação.
+# ^ClickUninstall
+Clique em 'Desinstalar' para iniciar a desinstalação.
+# ^Name
+Nome
+# ^Completed
+Concluído
+# ^LicenseText
+Por favor reveja o acordo de licensa antes de instalar $(^NameDA). Se concorda com todos os termos da licensa, clique em 'Aceito'.
+# ^LicenseTextCB
+Por favor reveja o acordo de licensa antes de instalar $(^NameDA). Se concorda com todos os termos da licensa, clique na caixa de seleção abaixo. $_CLICK
+# ^LicenseTextRB
+Por favor reveja o acordo de licensa antes de instalar $(^NameDA). Se concorda com todos os termos da licensa, escolha a primeira opção abaixo. $_CLICK
+# ^UnLicenseText
+Por favor reveja o acordo de licensa antes de desinstalar $(^NameDA). Se concorda com todos os termos da licensa, clique em 'Aceito'.
+# ^UnLicenseTextCB
+Por favor reveja o acordo de licensa antes de desinstalar $(^NameDA). Se concorda com todos os termos da licensa, clique na caixa de seleção abaixo. $_CLICK
+# ^UnLicenseTextRB
+Por favor reveja o acordo de licensa antes de desinstalar $(^NameDA). Se concorda com todos os termos da licensa, escolha a primeira opção abaixo. $_CLICK
+# ^Custom
+Personalizado
+# ^ComponentsText
+Marque os componentes que deseja instalar e desmarque os componentes que não deseja instalar. $_CLICK
+# ^ComponentsSubText1
+Escolha o tipo de instalação:
+# ^ComponentsSubText2_NoInstTypes
+Escolha os componentes para instalar:
+# ^ComponentsSubText2
+Ou, escolha os componentes opcionais que deseja instalar:
+# ^UnComponentsText
+Marque os componentes que queira desinstalar e vice versa. $_CLICK
+# ^UnComponentsSubText1
+Escolha o tipo de desinstalação:
+# ^UnComponentsSubText2_NoInstTypes
+Escolha os componentes para desinstalar:
+# ^UnComponentsSubText2
+Ou, escolha os componentes opcionais que queira desinstalar:
+# ^DirText
+O $(^NameDA) será instalado na seguinte pasta. Para instalar numa pasta diferente, clique em 'Procurar...' e escolha outra pasta. $_CLICK
+# ^DirSubText
+Pasta de Destino
+# ^DirBrowseText
+Escolha uma pasta para instalar o $(^NameDA):
+# ^UnDirText
+O $(^NameDA) será desinstalado da seguinte pasta. Para desinstalar de uma pasta diferente, clique em 'Procurar...' e escolha outra pasta. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Escolha uma pasta de onde será desinstalado o $(^NameDA):
+# ^SpaceAvailable
+"Espaço disponível: "
+# ^SpaceRequired
+"Espaço necessário: "
+# ^UninstallingText
+$(^NameDA) será desinstalado da seguinte pasta. $_CLICK
+# ^UninstallingSubText
+Desinstalando de:
+# ^FileError
+Erro ao abrir ficheiro para escrita: \r\n\t"$0"\r\nClique em Abortar para abortar a instalação,\r\nRepetir para tentar novamente a escrita do ficheiro, ou\r\nIgnorar para ignorar este ficheiro.
+# ^FileError_NoIgnore
+Erro ao abrir ficheiro para escrita: \r\n\t"$0"\r\nClique em Repetir para tentar novamente a gravação do ficheiro, ou\r\nCancelar para abortar a instalação.
+# ^CantWrite
+"Não foi possível escrever: "
+# ^CopyFailed
+Falha ao copiar
+# ^CopyTo
+"Copiar para "
+# ^Registering
+"Registando: "
+# ^Unregistering
+"Desregistando: "
+# ^SymbolNotFound
+"Símbolo não encontrado: "
+# ^CouldNotLoad
+"Não foi possível carregar: "
+# ^CreateFolder
+"Criando diretório: "
+# ^CreateShortcut
+"Criando atalho: "
+# ^CreatedUninstaller
+"Criando desinstalador: "
+# ^Delete
+"Apagando ficheiro: "
+# ^DeleteOnReboot
+"Apagar ao reiniciar: "
+# ^ErrorCreatingShortcut
+"Erro ao criar atalho: "
+# ^ErrorCreating
+"Erro ao criar: "
+# ^ErrorDecompressing
+Erro ao descomprimir dados! Instalador corrompido?
+# ^ErrorRegistering
+Erro ao registar DLL
+# ^ExecShell
+"Executando pelo Shell: "
+# ^Exec
+"Executando: "
+# ^Extract
+"Extraindo: "
+# ^ErrorWriting
+"Extraindo: erro ao escrever ficheiro "
+# ^InvalidOpcode
+Instalador corrompido: código de operação inválido
+# ^NoOLE
+"Sem OLE para: "
+# ^OutputFolder
+"Pasta de destino: "
+# ^RemoveFolder
+"Removendo pasta: "
+# ^RenameOnReboot
+"Renomear ao reiniciar: "
+# ^Rename
+"Renomeando: "
+# ^Skipped
+"Ignorado: "
+# ^CopyDetails
+Copiar detalhes para a Área de Transfêrencia
+# ^LogInstall
+Registar processo de instalação
+# ^Byte
+B
+# kilo
+K
+# mega
+M
+# giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Portuguese.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Portuguese.nsh
new file mode 100644
index 000000000..0406f0558
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Portuguese.nsh
@@ -0,0 +1,121 @@
+;Language: Portuguese (2070)
+;By Ramon
+
+!insertmacro LANGFILE "Portuguese" "Português"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bem vindo ao Assistente de Instalação do $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este assistente ajudá-lo-á durante a instalação do $(^NameDA).$\r$\n$\r$\nÉ recomendado que feche todas as outras aplicações antes de iniciar a Instalação. Isto permitirá que o Instalador actualize ficheiros relacionados com o sistema sem necessidade de reiniciar o computador.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bem vindo ao Assistente de desinstalação do $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este assistente ajudá-lo-á durante a desinstalação do $(^NameDA).$\r$\n$\r$\nAntes de iniciar a desinstalação, certifique-se de que o $(^NameDA) não está em execução.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Contrato de Licença"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor, verifique os termos da licença antes de instalar o $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se aceitar os termos da licença, clique em 'Aceito' para continuar. Deverá aceitar o contrato para instalar o $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se aceitar os termos da licença, clique na caixa de seleção abaixo. Deverá aceitar o contrato para instalar o $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se aceitar os termos da licença, selecione a primeira opção abaixo. Você deve aceitar o contrato para instalar o $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Contrato de Licença"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor, verifique os termos da licença antes de desinstalar o $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se aceitar os termos da licença, clique em 'Aceito' para continuar. Deverá aceitar o contrato para desinstalar o $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se aceitar os termos da licença, clique na caixa de seleção abaixo. Deverá aceitar o contrato para desinstalar o $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se aceitar os termos da licença, selecione a primeira opção abaixo. Você deve aceitar o contrato para desinstalar o $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tecle Page Down para ver o restante da licença."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Escolha de Componentes"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Escolha quais as características do $(^NameDA) que deseja instalar."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrição"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Escolher Componentes"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Escolha quais as características do $(^NameDA) que deseja desinstalar."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posicione o rato sobre um componente para ver a sua descrição."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posicione o rato sobre um componente para ver a sua descrição."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Escolha do Local da Instalação"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Escolha a pasta na qual deseja instalar o $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Escolha o Local de desinstalação"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Escolha a pasta de onde pretende desinstalar o $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor, aguarde enquanto o $(^NameDA) está sendo instalado."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalação Completa"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "A instalação foi concluída com sucesso."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalação Abortada"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "A instalação não foi concluída com sucesso."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor, aguarde enquanto o $(^NameDA) está sendo desinstalado."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalação Completa"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "A desinstalação foi concluída com sucesso."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalação Abortada"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "A desinstalação não foi concluída com sucesso"
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Concluindo o Assistente de Instalação do $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) foi instalado no seu computador.$\r$\n$\r$\nClique em Terminar para fechar este assistente."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "O seu computador deve ser reiniciado para concluír a instalação do $(^NameDA). Deseja reiniciar agora?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Concluíndo o assistente de desisntalação do $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) foi removido do seu computador.$\r$\n$\r$\nClique em Terminar para fechar este assistente."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "O seu computador deve ser reiniciado para concluír a desinstalação do $(^NameDA). Deseja reiniciar agora?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar Agora"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Eu quero reiniciar manualmente depois"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Executar $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostrar Leiame"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminar"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Escolha uma Pasta do Menu Iniciar"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Escolha uma pasta do Menu Iniciar para os atalhos do programa."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Selecione uma pasta do Menu Iniciar em que deseja criar os atalhos do programa. Você pode também digitar um nome para criar uma nova pasta. "
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Não criar atalhos"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Remover o $(^NameDA) do seu computador."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Deseja realmente cancelar a instalação do $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Deseja realmente cancelar a desinstalação do $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/PortugueseBR.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/PortugueseBR.nlf
new file mode 100644
index 000000000..810bf8056
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/PortugueseBR.nlf
@@ -0,0 +1,192 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1046
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Diego Marcos
+# Corrections by Felipe
+# ^Branding
+Sistema de Instalação Nullsoft %s
+# ^SetupCaption
+Instalação do $(^Name)
+# ^UninstallCaption
+Desinstalação do $(^Name)
+# ^LicenseSubCaption
+: Acordo da Licença
+# ^ComponentsSubCaption
+: Opções da Instalação
+# ^DirSubCaption
+: Pasta da Instalação
+# ^InstallingSubCaption
+: Instalando
+# ^CompletedSubCaption
+: Completado
+# ^UnComponentsSubCaption
+: Opções da Desinstalação
+# ^UnDirSubCaption
+: Pasta da Desinstalação
+# ^ConfirmSubCaption
+: Confirmação
+# ^UninstallingSubCaption
+: Desinstalando
+# ^UnCompletedSubCaption
+: Completado
+# ^BackBtn
+< &Voltar
+# ^NextBtn
+&Próximo >
+# ^AgreeBtn
+Eu &Concordo
+# ^AcceptBtn
+Eu &aceito os termos no Acordo da Licença
+# ^DontAcceptBtn
+Eu &não aceito os termos no Acordo da Licença
+# ^InstallBtn
+&Instalar
+# ^UninstallBtn
+&Desinstalar
+# ^CancelBtn
+Cancelar
+# ^CloseBtn
+&Fechar
+# ^BrowseBtn
+P&rocurar...
+# ^ShowDetailsBtn
+Mostrar &detalhes
+# ^ClickNext
+Clique em Próximo para continuar.
+# ^ClickInstall
+Clique em Instalar para iniciar a instalação.
+# ^ClickUninstall
+Clique em Desinstalar para iniciar a desinstalação.
+# ^Name
+Nome
+# ^Completed
+Completado
+# ^LicenseText
+Por favor reveja o acordo da licença antes de instalar o $(^NameDA). Se você aceita todos os termos do acordo, clique em Eu Concordo.
+# ^LicenseTextCB
+Por favor reveja o acordo da licença antes de instalar o $(^NameDA). Se você aceita todos os termos do acordo, clique na caixa de seleção abaixo. $_CLICK
+# ^LicenseTextRB
+Por favor reveja o acordo da licença antes de instalar o $(^NameDA). Se você aceita todos os termos do acordo, selecione a primeira opção abaixo. $_CLICK
+# ^UnLicenseText
+Por favor reveja o acordo da licença antes de desinstalar o $(^NameDA). Se você aceita todos os termos do acordo, clique em Eu Concordo.
+# ^UnLicenseTextCB
+Por favor reveja o acordo da licença antes de desinstalar o $(^NameDA). Se você aceita todos os termos do acordo, clique na caixa de seleção abaixo. $_CLICK
+# ^UnLicenseTextRB
+Por favor reveja o acordo da licença antes de desinstalar o $(^NameDA). Se você aceita todos os termos do acordo, selecione a primeira opção abaixo. $_CLICK
+# ^Custom
+Personalizado
+# ^ComponentsText
+Marque os componentes que você quer instalar e desmarque os componentes que você não quer instalar. $_CLICK
+# ^ComponentsSubText1
+Selecione o tipo de instalação:
+# ^ComponentsSubText2_NoInstTypes
+Selecione os componentes a instalar:
+# ^ComponentsSubText2
+Ou, selecione os componentes opcionais que você deseja instalar:
+# ^UnComponentsText
+Marque os componentes que você quer desinstalar e desmarque os componentes que você não quer desinstalar. $_CLICK
+# ^UnComponentsSubText1
+Selecione o tipo de desinstalação:
+# ^UnComponentsSubText2_NoInstTypes
+Selecione os componentes a desinstalar:
+# ^UnComponentsSubText2
+Ou, selecione os componentes opcionais que você deseja desinstalar:
+# ^DirText
+O Instalador instalará o $(^NameDA) na seguinte pasta. Para instalar em uma pasta diferente, clique em Procurar e selecione outra pasta. $_CLICK
+# ^DirSubText
+Pasta Destino
+# ^DirBrowseText
+Selecione a pasta para instalar o $(^NameDA):
+# ^UnDirText
+O Instalador desinstalará o $(^NameDA) da seguinte pasta. Para desinstalar de uma pasta diferente, clique em Procurar e selecione outra pasta. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Selecione a pasta de onde desinstalar o $(^NameDA):
+# ^SpaceAvailable
+"Espaço disponível: "
+# ^SpaceRequired
+"Espaço requerido: "
+# ^UninstallingText
+O $(^NameDA) será desinstalado da seguinte pasta. $_CLICK
+# ^UninstallingSubText
+Desinstalando de:
+# ^FileError
+Erro ao abrir o arquivo para a gravação: \r\n\r\n$0\r\n\r\nClique em Abortar para parar a instalação,\r\nRepetir para tentar de novo, ou\r\nIgnorar para pular este arquivo.
+# ^FileError_NoIgnore
+Erro ao abrir o arquivo para a gravação: \r\n\r\n$0\r\n\r\nClique em Repetir para tentar de novo, ou\r\nCancelar para parar a instalação.
+# ^CantWrite
+"Não pode escrever: "
+# ^CopyFailed
+Falhou em copiar
+# ^CopyTo
+"Copiar para "
+# ^Registering
+"Registrando: "
+# ^Unregistering
+"Desfazendo o registro: "
+# ^SymbolNotFound
+"Não pôde achar o símbolo: "
+# ^CouldNotLoad
+"Não pôde carregar: "
+# ^CreateFolder
+"Criar pasta: "
+# ^CreateShortcut
+"Criar atalho: "
+# ^CreatedUninstaller
+"Desinstalador criado: "
+# ^Delete
+"Apagar o arquivo: "
+# ^DeleteOnReboot
+"Apagar ao reiniciar: "
+# ^ErrorCreatingShortcut
+"Erro ao criar o atalho: "
+# ^ErrorCreating
+"Erro ao criar: "
+# ^ErrorDecompressing
+Erro ao descompactar os dados! Instalador corrompido?
+# ^ErrorRegistering
+Erro ao registar a DLL
+# ^ExecShell
+"Executar pelo Shell: "
+# ^Exec
+"Executar: "
+# ^Extract
+"Extrair: "
+# ^ErrorWriting
+"Extrair: erro ao gravar o arquivo "
+# ^InvalidOpcode
+Instalador corrompido: opcode inválido
+# ^NoOLE
+"Sem OLE para: "
+# ^OutputFolder
+"Pasta de saída: "
+# ^RemoveFolder
+"Remover a pasta: "
+# ^RenameOnReboot
+"Renomear ao reiniciar: "
+# ^Rename
+"Renomear: "
+# ^Skipped
+"Ignorado: "
+# ^CopyDetails
+Copiar os Detalhes para a Área de Transferência
+# ^LogInstall
+Pôr no Log o processo de instalação
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/PortugueseBR.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/PortugueseBR.nsh
new file mode 100644
index 000000000..09b53228d
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/PortugueseBR.nsh
@@ -0,0 +1,129 @@
+;Language: Brazilian Portuguese (1046)
+;By Felipe
+
+!insertmacro LANGFILE "PortugueseBR" "Português Brasileiro"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bem-vindo ao Assistente de Instalação do $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este assistente guiará você através da instalação do $(^NameDA).$\r$\n$\r$\nÉ recomendado que você feche todos os outros aplicativos antes de iniciar o Instalador. Isto tornará possível atualizar os arquivos de sistema relevantes sem ter que reiniciar seu computador.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bem-vindo ao Assistente de Desinstalação do $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este assistente guiará você através da desinstalação do $(^NameDA).$\r$\n$\r$\nAntes de iniciar a desinstalação, tenha certeza de que o $(^NameDA) não está em execução.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acordo da licença"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor, reveja os termos da licença antes de instalar o $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se você aceita os termos do acordo, clique em Eu Concordo para continuar. Você deve aceitar o acordo para instalar o $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se você aceita os termos do acordo, clique na caixa de seleção abaixo. Você deve aceitar o acordo para instalar o $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se você aceita os termos do acordo, selecione a primeira opção abaixo. Você deve aceitar o acordo para instalar o $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acordo da licença"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor, reveja os termos da licença antes de desinstalar o $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se você aceita os termos do acordo, clique em Eu Concordo para continuar. Você deve aceitar o acordo para desinstalar o $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se você aceita os termos do acordo, clique na caixa de seleção abaixo. Você deve aceitar o acordo para desinstalar o $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se você aceita os termos do acordo, selecione a primeira opção abaixo. Você deve aceitar o acordo para desinstalar o $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pressione Page Down para ver o resto do acordo."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Escolher Componentes"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Escolha quais funções do $(^NameDA) você quer instalar."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrição"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Escolher Componentes"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Escolha quais funções do $(^NameDA) você quer desinstalar."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posicione seu mouse sobre um componente para ver sua descrição."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posicione seu mouse sobre um componente para ver sua descrição."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Escolher o Local da Instalação"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Escolha a pasta na qual instalar o $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Escolher o Local da Desinstalação"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Escolha a pasta da qual desinstalar o $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor espere enquanto o $(^NameDA) está sendo instalado."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalação Completa"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "O Instalador completou com sucesso."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalação Abortada"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "O Instalador não completou com sucesso."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor espere enquanto o $(^NameDA) está sendo desinstalado."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalação Completa"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "A desinstalação foi completada com sucesso."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalação Abortada"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "A desinstalação não foi completada com sucesso."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completando o Assistente de Instalação do $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "O $(^NameDA) foi instalado no seu computador.$\r$\n$\r$\nClique em Terminar para fechar este assistente."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Seu computador deve ser reiniciado para completar a instalação do $(^NameDA). Você quer reiniciar agora?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completando o Assistente de Desinstalação do $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) foi desinstalado do seu computador.$\r$\n$\r$\nClique em Terminar para fechar este assistente."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Seu computador tem que ser reiniciado para completar a desinstalação do $(^NameDA). Você quer reiniciar agora?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar agora"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Eu quer reiniciar manualmente depois"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Executar $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostrar o Readme"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminar"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Escolher a Pasta do Menu Iniciar"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Escolher uma pasta do Menu Iniciar para os atalhos do $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Selecione a pasta do Menu Iniciar na qual você gostaria de criar os atalhos do programa. Você pode também inserir um nome para criar uma nova pasta."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Não criar atalhos"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar o $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Remover o $(^NameDA) do seu computador."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Você tem certeza que você quer sair do Instalador do $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Você tem certeza que você quer sair da Desinstalação do $(^Name)?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Escolher Usuários"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Escolher para quais usuários você quer instalar o $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Selecione se você quer instalar o $(^NameDA) para si mesmo ou para todos os usuários deste computador. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instalar para qualquer um usando este computador"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalar apenas para mim"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Romanian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Romanian.nlf
new file mode 100644
index 000000000..74ad4b1e9
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Romanian.nlf
@@ -0,0 +1,202 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1048
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1250
+# RTL - anything else than RTL means LTR
+-
+# Translation by Cristian Pirvu (pcristip@yahoo.com) v6
+# Revision by Sorin Sbarnea (sorin@intersol.ro) v5.1
+# and Sorin Sbarnea INTERSOL SRL (sorin@intersol.ro) v4
+# New revision by George Radu (georadu@hotmail.com)
+# New revision by Iulian Dogariu (iulian@jayomega.net)
+# - Use Romanian letters ãâîºþ
+# - Use imperative forms on buttons
+# - Replace some neologisms
+# New revision by Vlad Rusu (vlad@bitattack.ro)
+# - "Rasfoieºte" replaced with "Alege" - more appropiate
+# - "Eliminã" related terms replaced with more appropiate "Dezinstaleazã"
+# - Fixed: Wrong translation in ^FileError and ^FileError_NoIgnore -> no translation
+# needed Abort/Retry/Ignore, as these are not translated into local language, OS related
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Instalare $(^Name)
+# ^UninstallCaption
+Dezinstalare $(^Name)
+# ^LicenseSubCaption
+: Contract de licenþã
+# ^ComponentsSubCaption
+: Opþiuni instalare
+# ^DirSubCaption
+: Directorul destinaþie
+# ^InstallingSubCaption
+: În curs de instalare
+# ^CompletedSubCaption
+: Instalare terminatã
+# ^UnComponentsSubCaption
+: Opþiuni dezinstalare
+# ^UnDirSubCaption
+: Directorul de dezinstalare
+# ^ConfirmSubCaption
+: Confirmã
+# ^UninstallingSubCaption
+: În curs de dezinstalare
+# ^UnCompletedSubCaption
+: Terminã
+# ^BackBtn
+< Îna&poi
+# ^NextBtn
+Îna&inte >
+# ^AgreeBtn
+&De acord
+# ^AcceptBtn
+&Accept termenii contractului de licenþã
+# ^DontAcceptBtn
+Nu accept termenii contractului de licenþã
+# ^InstallBtn
+&Instaleazã
+# ^UninstallBtn
+&Dezinstaleazã
+# ^CancelBtn
+&Renunþã
+# ^CloseBtn
+În&chide
+# ^BrowseBtn
+&Alege...
+# ^ShowDetailsBtn
+Aratã &detalii
+# ^ClickNext
+Apãsaþi Înainte pentru a continua.
+# ^ClickInstall
+Apãsaþi Instaleazã pentru a începe instalarea.
+# ^ClickUninstall
+Apãsaþi Dezinstaleazã pentru a începe dezinstalarea.
+# ^Name
+Nume
+# ^Completed
+Terminat
+# ^LicenseText
+Citiþi cu atenþie contractul de licenþã înainte de a instala $(^NameDA). Dacã acceptaþi termenii contractului de licenþã, apãsaþi butonul De acord.
+# ^LicenseTextCB
+Citiþi cu atenþie contractul de licenþã înainte de a instala $(^NameDA). Dacã acceptaþi termenii contractului de licenþã, bifaþi cãsuþa de mai jos. $_CLICK
+# ^LicenseTextRB
+Citiþi cu atenþie contractul de licenþã înainte de a instala $(^NameDA). Dacã acceptaþi termenii contractului de licenþã, selectaþi prima opþiune de mai jos. $_CLICK
+# ^UnLicenseText
+Citiþi cu atenþie contractul de licenþã înainte de a dezinstala $(^NameDA). Dacã acceptaþi termenii contractului de licenþã, apãsaþi butonul De acord.
+# ^UnLicenseTextCB
+Citiþi cu atenþie contractul de licenþã înainte de a dezinstala $(^NameDA). Dacã acceptaþi termenii contractului de licenþã, bifaþi cãsuþa de mai jos. $_CLICK
+# ^UnLicenseTextRB
+Citiþi cu atenþie contractul de licenþã înainte de a dezinstala $(^NameDA). Dacã acceptaþi termenii contractului de licenþã, selectaþi prima opþiune de mai jos. $_CLICK
+# ^Custom
+Personalizatã
+# ^ComponentsText
+Alegeþi componentele pe care doriþi sã le instalaþi. $_CLICK
+# ^ComponentsSubText1
+Alegeþi tipul instalãrii:
+# ^ComponentsSubText2_NoInstTypes
+Alegeþi componentele ce urmeazã a fi instalate:
+# ^ComponentsSubText2
+Sau, alegeþi componentele opþionale pe care doriþi sã le instalaþi:
+# ^UnComponentsText
+Alegeþi componentele pe care doriþi sã le dezinstalaþi. $_CLICK
+# ^UnComponentsSubText1
+Alegeþi tipul de dezinstalare:
+# ^UnComponentsSubText2_NoInstTypes
+Alegeþi componentele ce urmeazã a fi dezinstalate:
+# ^UnComponentsSubText2
+Sau, alegeþi componentele opþionale pe care doriþi sã le dezinstalaþi:
+# ^DirText
+$(^NameDA) se va instala în urmãtorul director. Pentru a alege altã destinaþie, apãsaþi Alege ºi alegeþi alt director. $_CLICK
+# ^DirSubText
+Director destinaþie
+# ^DirBrowseText
+Alegeþi directorul în care doriþi sã instalaþi $(^NameDA):
+# ^UnDirText
+$(^NameDA) se va dezinstala din urmãtorul director. Pentru a dezinstala din alt director, apãsaþi Alege ºi alegeþi alt director. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Alegeþi directorul de dezinstalare al $(^NameDA):
+# ^SpaceAvailable
+"Spaþiu disponibil: "
+# ^SpaceRequired
+"Spaþiu necesar: "
+# ^UninstallingText
+Aceastã aplicaþie va dezinstala $(^NameDA) din computerul Dv. $_CLICK
+# ^UninstallingSubText
+Dezinstalare din:
+# ^FileError
+Eroare la scrierea fiºierului: \r\n\t"$0"\r\nApãsaþi Abort pentru oprirea instalãrii,\r\nRetry pentru a mai încerca o datã scrierea fiºierului, \r\nIgnore pentru a trece peste acest fiºier.
+# ^FileError_NoIgnore
+Eroare la scrierea fiºierului: \r\n\t"$0"\r\nApãsaþi Retry pentru a mai încerca o datã, sau\r\nAbort pentru oprirea instalãrii.
+# ^CantWrite
+"Nu am putut scrie: "
+# ^CopyFailed
+Copierea a eºuat
+# ^CopyTo
+"Copiere în "
+# ^Registering
+"Se înregistreazã: "
+# ^Unregistering
+"Se dezînregistreazã din registru: "
+# ^SymbolNotFound
+"Simbolul nu a fost gãsit: "
+# ^CouldNotLoad
+"Nu am putut încãrca: "
+# ^CreateFolder
+"Creare director: "
+# ^CreateShortcut
+"Creare comandã rapidã: "
+# ^CreatedUninstaller
+"S-a creat aplicaþia de dezinstalare: "
+# ^Delete
+"ªtergere fiºier: "
+# ^DeleteOnReboot
+"ªtergere la repornire: "
+# ^ErrorCreatingShortcut
+"Eroare la crearea comenzii rapide: "
+# ^ErrorCreating
+"Eroare la creare: "
+# ^ErrorDecompressing
+Eroare la dezarhivarea datelor! Aplicatia de instalare este defectã?
+# ^ErrorRegistering
+Eroare la Înregistrarea DLL-ului
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Executare: "
+# ^Extract
+"Extragere: "
+# ^ErrorWriting
+"Extragere: eroare la scriere în fiºier "
+# ^InvalidOpcode
+Aplicaþie de instalare defectã: opcode incorect
+# ^NoOLE
+"Nu existã OLE pentru: "
+# ^OutputFolder
+"Directorul destinaþie: "
+# ^RemoveFolder
+"ªtergere destinaþie: "
+# ^RenameOnReboot
+"Redenumire la repornirea computerului: "
+# ^Rename
+"Redenumire: "
+# ^Skipped
+"Sãrite: "
+# ^CopyDetails
+Copiere detalii în clipboard
+# ^LogInstall
+Jurnal proces instalare
+# ^Byte
+O
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Romanian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Romanian.nsh
new file mode 100644
index 000000000..2d218cdd8
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Romanian.nsh
@@ -0,0 +1,130 @@
+;Language: Romanian (1048)
+;Translated by Cristian Pirvu (pcristip@yahoo.com)
+;Updates by Sorin Sbarnea - INTERSOL SRL (sbarneasorin@intersol.ro) - ROBO Design (www.robodesign.ro)
+;New revision by George Radu (georadu@hotmail.com) http://mediatae.3x.ro
+;New revision by Vlad Rusu (vlad@bitattack.ro)
+; - Use Romanian letters ãâîºþ
+; - ".. produsului" removed as unnecessary
+; - "Eliminã" related terms replaced with more appropiate "Dezinstaleazã"
+; - Misc language tweaks
+!insertmacro LANGFILE "Romanian" "Romana"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bine aþi venit la instalarea $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Aceastã aplicaþie va instala $(^NameDA).$\r$\n$\r$\nEste recomandat sã închideþi toate aplicaþiile înainte de începerea procesului de instalare. Acest lucru vã poate asigura un proces de instalare fãrã erori sau situaþii neprevãzute.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bine aþi venit la dezinstalarea $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Aceastã aplicaþie va dezinstala $(^NameDA).$\r$\n$\r$\nEste recomandat sã închideþi toate aplicaþiile înainte de începerea procesului de dezinstalare. Acest lucru vã poate asigura un proces de dezinstalare fãrã erori sau situaþii neprevãzute.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_WELCOMEPAGE | MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminare"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Contract de licenþã"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Citiþi cu atenþie termenii contractului de licenþã înainte de a instala $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Dacã acceptaþi termenii contractului de licenþã, apãsati De Acord. Pentru a instala $(^NameDA) trebuie sã acceptaþi termenii din contractul de licenþã."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Dacã acceptaþi termenii contractului de licenþã, bifaþi cãsuþa de mai jos. Pentru a instala $(^NameDA) trebuie sã acceptaþi termenii din contractul de licenþã. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Dacã acceptaþi termenii contractului de licenþã, selectaþi prima opþiune de mai jos. Pentru a instala $(^NameDA) trebuie sã acceptaþi termenii din contractul de licenþã. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Contract de licenþã"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Citiþi cu atenþie termenii contractului de licenþã înainte de a dezinstala $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Dacã acceptaþi termenii contractului de licenþã, apãsati De Acord. Pentru a dezinstala $(^NameDA) trebuie sã acceptaþi termenii din contractul de licenþã."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Dacã acceptaþi termenii contractului de licenþã, bifaþi cãsuþa de mai jos. Pentru a dezinstala $(^NameDA) trebuie sã acceptaþi termenii din contractul de licenþã. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Dacã acceptaþi termenii contractului de licenþã, selectaþi prima opþiune de mai jos. Pentru a dezinstala $(^NameDA) trebuie sã acceptaþi termenii din contractul de licenþã. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Apãsaþi Page Down pentru a vizualiza restul contractului de licenþã."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selectare componente"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Selectaþi componentele $(^NameDA) pe care doriþi sã le instalaþi."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descriere"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selectare componente"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Selectaþi componentele $(^NameDA) pe care doriþi sã le dezinstalaþi."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Aºezaþi mouse-ul deasupra fiecãrei componente pentru a vizualiza descrierea acesteia."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Aºezaþi mouse-ul deasupra fiecãrei componente pentru a vizualiza descrierea acesteia."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Selectare director destinaþie"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Selectaþi directorul în care doriþi sã instalaþi $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Selectare director de dezinstalat"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Selectaþi directorul din care doriþi sã dezinstalaþi $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "În curs de instalare"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vã rugãm sã aºteptaþi, $(^NameDA) se instaleazã."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalare terminatã"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalarea s-a terminat cu succes."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalare anulatã"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalarea a fost anulatã de utilizator."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "În curs de dezinstalare"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vã rugãm sã aºteptaþi, $(^NameDA) se dezinstaleazã."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Dezinstalare terminatã"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Dezinstalarea s-a terminat cu succes."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Dezinstalare anulatã"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Dezinstalarea fost anulatã de utilizator."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Terminare instalare $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) a fost instalat.$\r$\n$\r$\nApãsaþi Terminare pentru a încheia instalarea."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Trebuie sã reporniþi calculatorul pentru a termina instalarea. Doriþi sã-l reporniþi acum?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Terminare dezinstalare $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) a fost dezinstalat.$\r$\n$\r$\nApãsaþi Terminare pentru a încheia dezinstalarea."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Trebuie sã reporniþi calculatorul pentru a termina dezinstalarea. Doriþi sã-l reporniþi acum?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reporneºte acum"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Repornesc eu mai târziu"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "Executare $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Afiºare fiºier readme (citeºte-mã)."
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Selectare grup Meniul Start"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Selectaþi un grup in Meniul Start pentru a crea comenzi rapide pentru produs."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Selectaþi grupul din Meniul Start în care vor fi create comenzi rapide pentru produs. Puteþi de asemenea sã creaþi un grup nou."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nu doresc comenzi rapide"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Dezinstalare $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Dezinstalare $(^NameDA) din calculatorul dumneavoastrã."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Sunteþi sigur(ã) cã doriþi sã anulaþi instalarea $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Sunteþi sigur(ã) cã doriþi sã anulaþi dezinstalarea $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Russian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Russian.nlf
new file mode 100644
index 000000000..2064bd144
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Russian.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1049
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1251
+# RTL - anything else than RTL means LTR
+-
+# Translation by Timon [ timon@front.ru ] + 20030919
+# Translation updated by Dmitry Yerokhin [erodim@mail.ru] (050424)
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Óñòàíîâêà $(^Name)
+# ^UninstallCaption
+Óäàëåíèå $(^Name)
+# ^LicenseSubCaption
+: Ëèöåíçèîííîå ñîãëàøåíèå
+# ^ComponentsSubCaption
+: Ïàðàìåòðû óñòàíîâêè
+# ^DirSubCaption
+: Ïàïêà óñòàíîâêè
+# ^InstallingSubCaption
+: Êîïèðîâàíèå ôàéëîâ
+# ^CompletedSubCaption
+: Îïåðàöèÿ çàâåðøåíà
+# ^UnComponentsSubCaption
+: Ïàðàìåòðû óäàëåíèÿ
+# ^UnDirSubCaption
+: Ïàïêà óäàëåíèÿ
+# ^ConfirmSubCaption
+: Ïîäòâåðæäåíèå
+# ^UninstallingSubCaption
+: Óäàëåíèå ôàéëîâ
+# ^UnCompletedSubCaption
+: Îïåðàöèÿ çàâåðøåíà
+# ^BackBtn
+< &Íàçàä
+# ^NextBtn
+&Äàëåå >
+# ^AgreeBtn
+Ïðèíèìà&þ
+# ^AcceptBtn
+ß &ïðèíèìàþ óñëîâèÿ ñîãëàøåíèÿ
+# ^DontAcceptBtn
+ß &íå ïðèíèìàþ óñëîâèÿ ñîãëàøåíèÿ
+# ^InstallBtn
+&Óñòàíîâèòü
+# ^UninstallBtn
+Óä&àëèòü
+# ^CancelBtn
+Îòìåíà
+# ^CloseBtn
+&Çàêðûòü
+# ^BrowseBtn
+Î&áçîð ...
+# ^ShowDetailsBtn
+&Äåòàëè...
+# ^ClickNext
+Íàæìèòå êíîïêó 'Äàëåå' äëÿ ïðîäîëæåíèÿ.
+# ^ClickInstall
+Íàæìèòå êíîïêó 'Óñòàíîâèòü', ÷òîáû óñòàíîâèòü ïðîãðàììó.
+# ^ClickUninstall
+Íàæìèòå êíîïêó 'Óäàëèòü', ÷òîáû óäàëèòü ïðîãðàììó.
+# ^Name
+Èìÿ
+# ^Completed
+Ãîòîâî
+# ^LicenseText
+Ïåðåä óñòàíîâêîé $(^NameDA) îçíàêîìüòåñü ñ ëèöåíçèîííûì ñîãëàøåíèåì. Åñëè âû ïðèíèìàåòå óñëîâèÿ ñîãëàøåíèÿ, íàæìèòå êíîïêó 'Ïðèíèìàþ'.
+# ^LicenseTextCB
+Ïåðåä óñòàíîâêîé $(^NameDA) îçíàêîìüòåñü ñ ëèöåíçèîííûì ñîãëàøåíèåì. Åñëè âû ïðèíèìàåòå óñëîâèÿ ñîãëàøåíèÿ, óñòàíîâèòå ôëàæîê íèæå. $_CLICK
+# ^LicenseTextRB
+Ïåðåä óñòàíîâêîé $(^NameDA) îçíàêîìüòåñü ñ ëèöåíçèîííûì ñîãëàøåíèåì. Åñëè âû ïðèíèìàåòå óñëîâèÿ ñîãëàøåíèÿ, âûáåðèòå ïåðâûé âàðèàíò èç ïðåäëîæåííûõ íèæå. $_CLICK
+# ^UnLicenseText
+Ïåðåä óñòàíîâêîé $(^NameDA) îçíàêîìüòåñü ñ ëèöåíçèîííûì ñîãëàøåíèåì. Åñëè âû ïðèíèìàåòå óñëîâèÿ ñîãëàøåíèÿ, íàæìèòå êíîïêó 'Ïðèíèìàþ'.
+# ^UnLicenseTextCB
+Ïåðåä óñòàíîâêîé $(^NameDA) îçíàêîìüòåñü ñ ëèöåíçèîííûì ñîãëàøåíèåì. Åñëè âû ïðèíèìàåòå óñëîâèÿ ñîãëàøåíèÿ, óñòàíîâèòå ôëàæîê íèæå. $_CLICK
+# ^UnLicenseTextRB
+Ïåðåä óñòàíîâêîé $(^NameDA) îçíàêîìüòåñü ñ ëèöåíçèîííûì ñîãëàøåíèåì. Åñëè âû ïðèíèìàåòå óñëîâèÿ ñîãëàøåíèÿ, âûáåðèòå ïåðâûé âàðèàíò èç ïðåäëîæåííûõ íèæå. $_CLICK
+# ^Custom
+Ïî âûáîðó
+# ^ComponentsText
+Âûáåðèòå êîìïîíåíòû ïðîãðàììû, êîòîðûå âû õîòèòå óñòàíîâèòü. $_CLICK
+# ^ComponentsSubText1
+Âûáåðèòå òèï óñòàíîâêè:
+# ^ComponentsSubText2_NoInstTypes
+Âûáåðèòå êîìïîíåíòû ïðîãðàììû äëÿ óñòàíîâêè:
+# ^ComponentsSubText2
+èëè âûáåðèòå äîïîëíèòåëüíûå êîìïîíåíòû äëÿ óñòàíîâêè:
+# ^UnComponentsText
+Âûáåðèòå êîìïîíåíòû, êîòîðûå âû õîòèòå óäàëèòü. $_CLICK
+# ^UnComponentsSubText1
+Âûáåðèòå òèï óäàëåíèÿ:
+# ^UnComponentsSubText2_NoInstTypes
+Âûáåðèòå êîìïîíåíòû äëÿ óäàëåíèÿ:
+# ^UnComponentsSubText2
+èëè âûáåðèòå äîïîëíèòåëüíûå êîìïîíåíòû äëÿ óäàëåíèÿ:
+# ^DirText
+Ïðîãðàììà óñòàíîâèò $(^NameDA) â óêàçàííóþ ïàïêó. ×òîáû óñòàíîâèòü ïðèëîæåíèå â äðóãóþ ïàïêó, íàæìèòå êíîïêó 'Îáçîð' è óêàæèòå åå. $_CLICK
+# ^DirSubText
+Ïàïêà óñòàíîâêè
+# ^DirBrowseText
+Óêàæèòå ïàïêó äëÿ óñòàíîâêè $(^NameDA):
+# ^UnDirText
+Ïðîãðàììà óäàëèò $(^NameDA) èç óêàçàííîé ïàïêè. ×òîáû âûïîëíèòü óäàëåíèå èç äðóãîé ïàïêè, íàæìèòå êíîïêó 'Îáçîð' è óêàæèòå åå. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Óêàæèòå ïàïêó, èç êîòîðîé íóæíî óäàëèòü $(^NameDA):
+# ^SpaceAvailable
+"Äîñòóïíî íà äèñêå: "
+# ^SpaceRequired
+"Òðåáóåòñÿ íà äèñêå: "
+# ^UninstallingText
+Ïðîãðàììà $(^NameDA) áóäåò óäàëåíà èç âàøåãî ÏÊ. $_CLICK
+# ^UninstallingSubText
+Óäàëåíèå èç:
+# ^FileError
+Íåâîçìîæíî îòêðûòü ôàéë äëÿ çàïèñè: \r\n\t"$0"\r\n'Ïðåðâàòü': îñòàíîâèòü óñòàíîâêó;\r\n"Ïîâòîð": ïîâòîðèòü ïîïûòêó;\r\n"Ïðîïóñê": ïðîïóñòèòü ýòî äåéñòâèå.
+# ^FileError_NoIgnore
+Íåâîçìîæíî îòêðûòü ôàéë äëÿ çàïèñè: \r\n\t"$0"\r\n'Ïîâòîð': ïîâòîðèòü ïîïûòêó;\r\n'Îòìåíà': ïðåðâàòü ïðîöåññ óñòàíîâêè.
+# ^CantWrite
+"Íåâîçìîæíî çàïèñàòü: "
+# ^CopyFailed
+Îøèáêà ïðè êîïèðîâàíèè
+# ^CopyTo
+"Êîïèðîâàíèå â "
+# ^Registering
+"Ðåãèñòðàöèÿ: "
+# ^Unregistering
+"Äå-ðåãèñòðàöèÿ: "
+# ^SymbolNotFound
+"Íåâîçìîæíî íàéòè ñèìâîë: "
+# ^CouldNotLoad
+"Íåâîçìîæíî çàãðóçèòü: "
+# ^CreateFolder
+"Ñîçäàíèå ïàïêè: "
+# ^CreateShortcut
+"Ñîçäàíèå ÿðëûêà: "
+# ^CreatedUninstaller
+"Ñîçäàíèå ïðîãðàììû óäàëåíèÿ: "
+# ^Delete
+"Óäàëåíèå ôàéëà: "
+# ^DeleteOnReboot
+"Óäàëåíèå ïðè ïåðåçàãðóçêå ÏÊ: "
+# ^ErrorCreatingShortcut
+"Îøèáêà ñîçäàíèÿ ÿðëûêà: "
+# ^ErrorCreating
+"Îøèáêà ñîçäàíèÿ: "
+# ^ErrorDecompressing
+Îøèáêà ðàñïàêîâêè äàííûõ! Âîçìîæíî, ïîâðåæä¸í äèñòðèáóòèâ.
+# ^ErrorRegistering
+Íåâîçìîæíî çàðåãèñòðèðîâàòü áèáëèîòåêó (DLL)
+# ^ExecShell
+"Âûïîëíåíèå êîìàíäû îáîëî÷êè: "
+# ^Exec
+"Âûïîëíåíèå: "
+# ^Extract
+"Èçâëå÷åíèå: "
+# ^ErrorWriting
+"Èçâëå÷åíèå: îøèáêà çàïèñè ôàéëà "
+# ^InvalidOpcode
+Äèñòðèáóòèâ ïîâðåæäåí: íåäîïóñòèìûé êîä
+# ^NoOLE
+"Íåò OLE äëÿ: "
+# ^OutputFolder
+"Ïàïêà óñòàíîâêè: "
+# ^RemoveFolder
+"Óäàëåíèå ïàïêè: "
+# ^RenameOnReboot
+"Ïåðåèìåíîâàíèå ïðè ïåðåçàãðóçêå ÏÊ: "
+# ^Rename
+"Ïåðåèìåíîâàíèå: "
+# ^Skipped
+"Ïðîïóñê: "
+# ^CopyDetails
+Êîïèðîâàòü ñâåäåíèÿ â áóôåð îáìåíà
+# ^LogInstall
+Âåñòè îò÷åò óñòàíîâêè
+# byte
+áàéò
+# kilo
+ Ê
+# mega
+ Ì
+# giga
+ Ã
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Russian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Russian.nsh
new file mode 100644
index 000000000..9557c8261
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Russian.nsh
@@ -0,0 +1,121 @@
+;Language: Russian (1049)
+;Translation updated by Dmitry Yerokhin [erodim@mail.ru] (050424)
+
+!insertmacro LANGFILE "Russian" "Russian"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Âàñ ïðèâåòñòâóåò ìàñòåð óñòàíîâêè $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ýòà ïðîãðàììà óñòàíîâèò $(^NameDA) íà âàø êîìïüþòåð.$\r$\n$\r$\nÏåðåä íà÷àëîì óñòàíîâêè ðåêîìåíäóåòñÿ çàêðûòü âñå ðàáîòàþùèå ïðèëîæåíèÿ. Ýòî ïîçâîëèò ïðîãðàììå óñòàíîâêè îáíîâèòü ñèñòåìíûå ôàéëû áåç ïåðåçàãðóçêè êîìïüþòåðà.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Âàñ ïðèâåòñòâóåò ìàñòåð óäàëåíèÿ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ýòà ïðîãðàììà óäàëèò $(^NameDA) èç âàøåãî êîìïüþòåðà.$\r$\n$\r$\nÏåðåä íà÷àëîì óäàëåíèÿ óáåäèòåñü, ÷òî ïðîãðàììà $(^NameDA) íå çàïóùåíà.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ëèöåíçèîííîå ñîãëàøåíèå"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ïåðåä óñòàíîâêîé $(^NameDA) îçíàêîìüòåñü ñ ëèöåíçèîííûì ñîãëàøåíèåì."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Åñëè âû ïðèíèìàåòå óñëîâèÿ ñîãëàøåíèÿ, íàæìèòå êíîïêó $\"Ïðèíèìàþ$\". ×òîáû óñòàíîâèòü ïðîãðàììó, íåîáõîäèìî ïðèíÿòü ñîãëàøåíèå."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Åñëè âû ïðèíèìàåòå óñëîâèÿ ñîãëàøåíèÿ, óñòàíîâèòå ôëàæîê íèæå. ×òîáû óñòàíîâèòü ïðîãðàììó, íåîáõîäèìî ïðèíÿòü ñîãëàøåíèå. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Åñëè âû ïðèíèìàåòå óñëîâèÿ ñîãëàøåíèÿ, âûáåðèòå ïåðâûé âàðèàíò èç ïðåäëîæåííûõ íèæå. ×òîáû óñòàíîâèòü ïðîãðàììó, íåîáõîäèìî ïðèíÿòü ñîãëàøåíèå. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ëèöåíçèîííîå ñîãëàøåíèå"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ïåðåä óäàëåíèåì $(^NameDA) îçíàêîìüòåñü ñ ëèöåíçèîííûì ñîãëàøåíèåì."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Åñëè âû ïðèíèìàåòå óñëîâèÿ ñîãëàøåíèÿ, íàæìèòå êíîïêó $\"Ïðèíèìàþ$\". Äëÿ óäàëåíèÿ íåîáõîäèìî ïðèíÿòü ñîãëàøåíèå. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Åñëè âû ïðèíèìàåòå óñëîâèÿ ñîãëàøåíèÿ, óñòàíîâèòå ôëàæîê íèæå. Äëÿ óäàëåíèÿ íåîáõîäèìî ïðèíÿòü ñîãëàøåíèå. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Åñëè âû ïðèíèìàåòå óñëîâèÿ ñîãëàøåíèÿ, âûáåðèòå ïåðâûé âàðèàíò èç ïðåäëîæåííûõ íèæå. Äëÿ óäàëåíèÿ íåîáõîäèìî ïðèíÿòü ñîãëàøåíèå. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Äëÿ ïåðåìåùåíèÿ ïî òåêñòó èñïîëüçóéòå êëàâèøè $\"PageUp$\" è $\"PageDown$\"."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Êîìïîíåíòû óñòàíàâëèâàåìîé ïðîãðàììû"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Âûáåðèòå êîìïîíåíòû $(^NameDA), êîòîðûå âû õîòèòå óñòàíîâèòü."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Îïèñàíèå"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Êîìïîíåíòû ïðîãðàììû"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Âûáåðèòå êîìïîíåíòû $(^NameDA), êîòîðûå âû õîòèòå óäàëèòü."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Íàâåäèòå êóðñîð ìûøè íà íàçâàíèå êîìïîíåíòà, ÷òîáû ïðî÷åñòü åãî îïèñàíèå."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Íàâåäèòå êóðñîð ìûøè íà íàçâàíèå êîìïîíåíòà, ÷òîáû ïðî÷åñòü åãî îïèñàíèå."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Âûáîð ïàïêè óñòàíîâêè"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Âûáåðèòå ïàïêó äëÿ óñòàíîâêè $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Âûáîð ïàïêè äëÿ óäàëåíèÿ"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Óêàæèòå ïàïêó, èç êîòîðîé íóæíî óäàëèòü $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Êîïèðîâàíèå ôàéëîâ"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ïîäîæäèòå, èäåò êîïèðîâàíèå ôàéëîâ $(^NameDA)..."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Óñòàíîâêà çàâåðøåíà"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Óñòàíîâêà óñïåøíî çàâåðøåíà."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Óñòàíîâêà ïðåðâàíà"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Óñòàíîâêà íå çàâåðøåíà."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Óäàëåíèå"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Ïîäîæäèòå, èäåò óäàëåíèå ôàéëîâ $(^NameDA)..."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Óäàëåíèå çàâåðøåíî"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Óäàëåíèå ïðîãðàììû óñïåøíî çàâåðøåíî."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Óäàëåíèå ïðåðâàíî"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Óäàëåíèå ïðîèçâåäåíî íå ïîëíîñòüþ."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Çàâåðøåíèå ðàáîòû ìàñòåðà óñòàíîâêè $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Óñòàíîâêà $(^NameDA) âûïîëíåíà.$\r$\n$\r$\nÍàæìèòå êíîïêó $\"Ãîòîâî$\" äëÿ âûõîäà èç ïðîãðàììû óñòàíîâêè."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Äëÿ çàâåðøåíèÿ óñòàíîâêè $(^NameDA) íåîáõîäèìî ïåðåçàãðóçèòü êîìïüþòåð. Õîòèòå ñäåëàòü ýòî ñåé÷àñ?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Çàâåðøåíèå ðàáîòû ìàñòåðà óäàëåíèÿ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Ïðîãðàììà $(^NameDA) óäàëåíà èç âàøåãî êîìïüþòåðà.$\r$\n$\r$\nÍàæìèòå êíîïêó $\"Ãîòîâî$\"äëÿ âûõîäà èç ïðîãðàììû óäàëåíèÿ."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Äëÿ çàâåðøåíèÿ óäàëåíèÿ $(^NameDA) íóæíî ïåðåçàãðóçèòü êîìïüþòåð. Õîòèòå ñäåëàòü ýòî ñåé÷àñ?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Äà, ïåðåçàãðóçèòü ÏÊ ñåé÷àñ"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Íåò, ÿ ïåðåçàãðóæó ÏÊ ïîçæå"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Çàïóñòèòü $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Ïîêàçàòü ôàéë ReadMe"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Ãîòîâî"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Ïàïêà â ìåíþ $\"Ïóñê$\""
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Âûáåðèòå ïàïêó â ìåíþ $\"Ïóñê$\" äëÿ ðàçìåùåíèÿ ÿðëûêîâ ïðîãðàììû."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Âûáåðèòå ïàïêó â ìåíþ $\"Ïóñê$\", êóäà áóäóò ïîìåùåíû ÿðëûêè ïðîãðàììû. Âû òàêæå ìîæåòå ââåñòè äðóãîå èìÿ ïàïêè."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Íå ñîçäàâàòü ÿðëûêè"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Óäàëåíèå $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Óäàëåíèå $(^NameDA) èç êîìïüþòåðà."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Âû äåéñòâèòåëüíî õîòèòå îòìåíèòü óñòàíîâêó $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Âû äåéñòâèòåëüíî õîòèòå îòìåíèòü óäàëåíèå $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Serbian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Serbian.nlf
new file mode 100644
index 000000000..e8a90a2e6
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Serbian.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+3098
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1251
+# RTL - anything else than RTL means LTR
+-
+# Translation by Ñðàí Îáóžèíà
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Èíñòàëàöè¼à
+# ^UninstallCaption
+$(^Name) Äåèíñòàëàöè¼à
+# ^LicenseSubCaption
+: Äîãîâîð î ïðàâó êîðèøžåœà
+# ^ComponentsSubCaption
+: Îïöè¼å èíñòàëàöè¼å
+# ^DirSubCaption
+: Èçáîð ôîëäåðà çà èíñòàëàöè¼ó
+# ^InstallingSubCaption
+: Èíñòàëàöè¼à
+# ^CompletedSubCaption
+: Çàâðøåíà èíñòàëàöè¼à
+# ^UnComponentsSubCaption
+: Îïöè¼å äåèíñòàëàöè¼å
+# ^UnDirSubCaption
+: Èçáîð ôîëäåðà çà äåèíñòàëàöè¼ó
+# ^ConfirmSubCaption
+: Ïîòâðèâàœå
+# ^UninstallingSubCaption
+: Äåèíñòàëàöè¼à
+# ^UnCompletedSubCaption
+: Çàâðøåíà äåèíñòàëàöè¼à
+# ^BackBtn
+< Íàçàä
+# ^NextBtn
+Íàïðåä >
+# ^AgreeBtn
+Ïðèõâàòàì
+# ^AcceptBtn
+Ïðèõâàòàì óñëîâå äîãîâîðà î ïðàâó êîðèøžåœà
+# ^DontAcceptBtn
+Íå ïðèõâàòàì óñëîâå äîãîâîðà î ïðàâó êîðèøžåœà
+# ^InstallBtn
+Èíñòàëèðà¼
+# ^UninstallBtn
+Äåèíñòàëèðà¼
+# ^CancelBtn
+Îäóñòàíè
+# ^CloseBtn
+Çàòâîðè
+# ^BrowseBtn
+Èçáîð...
+# ^ShowDetailsBtn
+Äåòàšè
+# ^ClickNext
+Ïðèòèñíèòå äóãìå „Íàïðåä“ çà íàñòàâàê.
+# ^ClickInstall
+Ïðèòèñíèòå äóãìå „Èíñòàëèð༓ çà ïî÷åòàê èíñòàëàöè¼å.
+# ^ClickUninstall
+Ïðèòèñíèòå äóãìå „Äåèíñòàëèð༓ çà ïî÷åòàê äåèíñòàëàöè¼å.
+# ^Name
+Èìå
+# ^Completed
+Çàâðøåíî
+# ^LicenseText
+Ïàæšèâî ïðî÷èòà¼òå äîãîâîð î ïðàâó êîðèøžåœà ïðå èíñòàëàöè¼å ïðîãðàìà $(^NameDA). Àêî ïðèõâàòàòå ñâå óñëîâå äîãîâîðà, ïðèòèñíèòå äóãìå „Ïðèõâàòàì“.
+# ^LicenseTextCB
+Ïàæšèâî ïðî÷èòà¼òå äîãîâîð î ïðàâó êîðèøžåœà ïðå èíñòàëàöè¼å ïðîãðàìà $(^NameDA). Àêî ïðèõâàòàòå ñâå óñëîâå äîãîâîðà, îáåëåæèòå êâàäðàòèž èñïîä. $_CLICK
+# ^LicenseTextRB
+Ïàæšèâî ïðî÷èòà¼òå äîãîâîð î ïðàâó êîðèøžåœà ïðå èíñòàëàöè¼å ïðîãðàìà $(^NameDA). Àêî ïðèõâàòàòå ñâå óñëîâå äîãîâîðà, èçàáåðèòå ïðâó îïöè¼ó èñïîä. $_CLICK
+# ^UnLicenseText
+Ïàæšèâî ïðî÷èòà¼òå äîãîâîð î ïðàâó êîðèøžåœà ïðå äåèíñòàëàöè¼å ïðîãðàìà $(^NameDA). Àêî ïðèõâàòàòå ñâå óñëîâå äîãîâîðà, ïðèòèñíèòå äóãìå „Ïðèõâàòàì“.
+# ^UnLicenseTextCB
+Ïàæšèâî ïðî÷èòà¼òå äîãîâîð î ïðàâó êîðèøžåœà ïðå äåèíñòàëàöè¼å ïðîãðàìà $(^NameDA). Àêî ïðèõâàòàòå ñâå óñëîâå äîãîâîðà, îáåëåæèòå êâàäðàòèž èñïîä. $_CLICK
+# ^UnLicenseTextRB
+Ïàæšèâî ïðî÷èòà¼òå äîãîâîð î ïðàâó êîðèøžåœà ïðå äåèíñòàëàöè¼å ïðîãðàìà $(^NameDA). Àêî ïðèõâàòàòå ñâå óñëîâå äîãîâîðà, èçàáåðèòå ïðâó îïöè¼ó èñïîä. $_CLICK
+# ^Custom
+Ïðèëàãîàâàœå
+# ^ComponentsText
+Èçàáåðèòå êîìïîíåíòå çà èíñòàëàöè¼ó. Èíñòàëèðà¼ó ñå ñàìî îçíà÷åíå êîìïîíåíòå. $_CLICK
+# ^ComponentsSubText1
+Èçàáåðèòå òèï èíñòàëàöè¼å:
+# ^ComponentsSubText2_NoInstTypes
+Èçàáåðèòå êîìïîíåíòå çà èíñòàëàöè¼ó:
+# ^ComponentsSubText2
+Èëè, èçàáåðèòå îïöèîíå êîìïîíåíòå êî¼å æåëèòå äà èíñòàëèðàòå:
+# ^UnComponentsText
+Èçàáåðèòå êîìïîíåíòå çà äåèíñòàëàöè¼ó. Äåèíñòàëèðà¼ó ñå ñàìî îçíà÷åíå êîìïîíåíòå. $_CLICK
+# ^UnComponentsSubText1
+Èçàáåðèòå òèï äåèíñòàëàöè¼å:
+# ^UnComponentsSubText2_NoInstTypes
+Èçàáåðèòå êîìïîíåíòå çà äåèíñòàëàöè¼ó:
+# ^UnComponentsSubText2
+Èëè, èçàáåðèòå îïöèîíå êîìïîíåíòå êî¼å æåëèòå äà äåèíñòàëèðàòå:
+# ^DirText
+Ïðîãðàì $(^NameDA) žå áèòè èíñòàëèðàí ó íàâåäåíè ôîëäåð. Çà èíñòàëàöè¼ó ó äðóãè ôîëäåð ïðèòèñíèòå äóãìå „Èçáîð...“ è èçàáåðèòå ôîëäåð. $_CLICK
+# ^DirSubText
+Ôîëäåð
+# ^DirBrowseText
+Èçàáåðèòå ôîëäåð ó êî¼è žåòå èíñòàëèðàòè ïðîãðàì $(^NameDA):
+# ^UnDirText
+Ïðîãðàì $(^NameDA) žå áèòè äåèíñòàëèðàí èç íàâåäåíîã ôîëäåðà. Çà äåèíñòàëàöè¼ó èç äðóãîã ôîëäåðà ïðèòèñíèòå äóãìå „Èçáîð...“ è èçàáåðèòå ôîëäåð. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Èçàáåðèòå ôîëäåð èç êîãà žåòå äåèíñòàëèðàòè ïðîãðàì $(^NameDA):
+# ^SpaceAvailable
+"Ñëîáîäàí ïðîñòîð: "
+# ^SpaceRequired
+"Ïîòðåáàí ïðîñòîð: "
+# ^UninstallingText
+Ïðîãðàì $(^NameDA) žå áèòè äåèíñòàëèðàí èç íàâåäåíîã ôîëäåðà. $_CLICK
+# ^UninstallingSubText
+Äåèíñòàëàöè¼à èç:
+# ^FileError
+Ãðåøêà ïðè îòâàðàœó ôà¼ëà çà ïèñàœå: \r\n\t"$0"\r\nÏðèòèñíèòå äóãìå „Îäóñòàíè“ çà ïðåêèä èíñòàëàöè¼å,\r\n„Ïîíîâè“ çà ïîíîâíè ïîêóøà¼ ïèñàœà ó ôà¼ë, èëè\r\n„Èãíîðèøè“ çà ïðåñêàêàœå îâîã ôà¼ëà.
+# ^FileError_NoIgnore
+Ãðåøêà ïðè îòâàðàœó ôà¼ëà çà ïèñàœå: \r\n\t"$0"\r\nÏðèòèñíèòå äóãìå „Ïîíîâè“ çà ïîíîâíè ïîêóøà¼ ïèñàœà ó ôà¼ë, èëè\r\n„Îäóñòàíè“ çà ïðåêèä èíñòàëèðàœà.
+# ^CantWrite
+"Íåìîãóžå ïèñàœå: "
+# ^CopyFailed
+Íåóñïåøíî êîïèðàœå
+# ^CopyTo
+"Êîïèðàœå ó "
+# ^Registering
+"Ðåãèñòðîâàœå: "
+# ^Unregistering
+"Äåðåãèñòðîâàœå: "
+# ^SymbolNotFound
+"Ñèìáîë íè¼å íàåí: "
+# ^CouldNotLoad
+"Íåìîãóžå ó÷èòàâàœå: "
+# ^CreateFolder
+"Êðåèðàœå ôîëäåðà: "
+# ^CreateShortcut
+"Êðåèðàœå ïðå÷èöå: "
+# ^CreatedUninstaller
+"Êðåèðàœå äåèíñòàëåðà: "
+# ^Delete
+"Áðèñàœå ôà¼ëà: "
+# ^DeleteOnReboot
+"Áðèñàœå ïðè ðåñòàðòó: "
+# ^ErrorCreatingShortcut
+"Ãðåøêà ïðè êðåèðàœó ïðå÷èöå: "
+# ^ErrorCreating
+"Ãðåøêà ïðè êðåèðàœó: "
+# ^ErrorDecompressing
+Ãðåøêà ïðè îòïàêèâàœó ïîäàòàêà! Îøòåžåí èíñòàëàöèîíè ïðîãðàì?
+# ^ErrorRegistering
+Ãðåøêà ïðè ðåãèñòðîâàœó áèáëèîòåêå
+# ^ExecShell
+"Èçâðøàâàœå ó îêðóæåœó: "
+# ^Exec
+"Èçâðøàâàœå: "
+# ^Extract
+"Îòïàêèâàœå: "
+# ^ErrorWriting
+"Îòïàêèâàœå: ãðåøêà ïðè óïèñó ó ôà¼ë "
+# ^InvalidOpcode
+Îøòåžåí èíñòàëàöèîíè ïðîãðàì: íåèñïðàâíà êîìàíäà
+# ^NoOLE
+"Íåìà OLE ïîäðøêå çà: "
+# ^OutputFolder
+"Èçëàçíè ôîëäåð: "
+# ^RemoveFolder
+"Áðèñàœå ôîëäåðà: "
+# ^RenameOnReboot
+"Ïðåèìåíîâàœå ïðè ðåñòàðòîâàœó: "
+# ^Rename
+"Ïðåèìåíîâàí: "
+# ^Skipped
+"Ïðåñêî÷åí: "
+# ^CopyDetails
+Êîïèð༠äåòàšå ó êëèïáîðä
+# ^LogInstall
+Âîäè çàïèñíèê î ïðîöåñó èíñòàëàöè¼å
+# ^Byte
+B
+# ^Kilo
+k
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Serbian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Serbian.nsh
new file mode 100644
index 000000000..2114f93eb
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Serbian.nsh
@@ -0,0 +1,121 @@
+;Language: Serbian (3098)
+;Translation by Ñðàí Îáóžèíà
+
+!insertmacro LANGFILE "Serbian" "Serbian Cyrillic"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Äîáðîäîøëè ó âîäè÷ çà èíñòàëàöè¼ó ïðîãðàìà $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Áèžåòå âîåíè êðîç ïðîöåñ èíñòàëàöè¼å ïðîãðàìà $(^NameDA).$\r$\n$\r$\nÏðåïîðó÷šèâî ¼å äà èñêšó÷èòå ñâå äðóãå ïðîãðàìå ïðå ïî÷åòêà èíñòàëàöè¼å. Îâî ìîæå îìîãóžèòè àæóðèðàœå ñèñòåìñêèõ ôà¼ëîâà áåç ïîòðåáå çà ïîíîâíèì ïîêðåòàœåì ðà÷óíàðà.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Äîáðîäîøëè ó äåèíñòàëàöè¼ó ïðîãðàìà $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Áèžåòå âîåíè êðîç ïðîöåñ äåèíñòàëàöè¼å ïðîãðàìà $(^NameDA).$\r$\n$\r$\nÏðå ïî÷åòêà äåèíñòàëàöè¼å, óâåðèòå ñå äà ¼å ïðîãðàì $(^NameDA) èñêšó÷åí. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Äîãîâîð î ïðàâó êîðèøžåœà"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ïàæšèâî ïðî÷èòà¼òå äîãîâîð î ïðàâó êîðèøžåœà ïðå èíñòàëàöè¼å ïðîãðàìà $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Àêî ïðèõâàòàòå ñâå óñëîâå äîãîâîðà, ïðèòèñíèòå äóãìå „Ïðèõâàòàì“ çà íàñòàâàê. Ìîðàòå ïðèõâàòèòè äîãîâîð äà áèñòå èíñòàëèðàëè ïðîãðàì $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Àêî ïðèõâàòàòå ñâå óñëîâå äîãîâîðà, îáåëåæèòå êâàäðàòèž èñïîä. Ìîðàòå ïðèõâàòèòè äîãîâîð äà áèñòå èíñòàëèðàëè ïðîãðàì $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Àêî ïðèõâàòàòå ñâå óñëîâå äîãîâîðà, èçàáåðèòå ïðâó îïöè¼ó èñïîä. Ìîðàòå ïðèõâàòèòè äîãîâîð äà áèñòå èíñòàëèðàëè ïðîãðàì $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Äîãîâîð î ïðàâó êîðèøžåœà"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ïàæšèâî ïðî÷èòà¼òå äîãîâîð î ïðàâó êîðèøžåœà ïðå äåèíñòàëàöè¼å ïðîãðàìà $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Àêî ïðèõâàòàòå ñâå óñëîâå äîãîâîðà, ïðèòèñíèòå äóãìå „Ïðèõâàòàì“ çà íàñòàâàê. Ìîðàòå ïðèõâàòèòè äîãîâîð äà áèñòå äåèíñòàëèðàëè ïðîãðàì $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Àêî ïðèõâàòàòå ñâå óñëîâå äîãîâîðà, îáåëåæèòå êâàäðàòèž èñïîä. Ìîðàòå ïðèõâàòèòè äîãîâîð äà áèñòå äåèíñòàëèðàëè ïðîãðàì $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Àêî ïðèõâàòàòå ñâå óñëîâå äîãîâîðà, èçàáåðèòå ïðâó îïöè¼ó èñïîä. Ìîðàòå ïðèõâàòèòè äîãîâîð äà áèñòå äåèíñòàëèðàëè ïðîãðàì $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Ïðèòèñíèòå Page Down äà áèñòå âèäåëè îñòàòàê äîãîâîðà."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Èçáîð êîìïîíåíòè çà èíñòàëàöè¼ó"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Èçàáåðèòå êîìïîíåíòå çà èíñòàëàöè¼ó. Èíñòàëèðà¼ó ñå ñàìî îçíà÷åíå êîìïîíåíòå."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Îïèñ"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Èçáîð êîìïîíåíòè çà äåèíñòàëàöè¼ó"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Èçàáåðèòå êîìïîíåíòå çà äåèíñòàëàöè¼ó. Äåèíñòàëèðà¼ó ñå ñàìî îçíà÷åíå êîìïîíåíòå."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ïðåèòå êóðñîðîì ìèøà ïðåêî èìåíà êîìïîíåíòå äà áèñòå âèäåëè œåí îïèñ."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ïðåèòå êóðñîðîì ìèøà ïðåêî èìåíà êîìïîíåíòå äà áèñòå âèäåëè œåí îïèñ."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Èçáîð ôîëäåðà çà èíñòàëàöè¼ó"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Èçàáåðèòå ôîëäåð ó êî¼è žåòå èíñòàëèðàòè ïðîãðàì $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Èçáîð ôîëäåðà çà äåèíñòàëaöè¼ó"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Èçàáåðèòå ôîëäåð èç êîãà žåòå äåèíñòàëèðàòè ïðîãðàì $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Èíñòàëàöè¼à"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ñà÷åêà¼òå äîê ñå ïðîãðàì $(^NameDA) èíñòàëèðà."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Çàâðøåíà èíñòàëàöè¼à"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Èíñòàëàöè¼à ¼å óñïåøíî çàâðøåíà."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Ïðåêèíóòà èíñòàëàöè¼à"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Èíñòàëàöè¼à ¼å ïðåêèíóòà è íè¼å óñïåøíî çàâðøåíà."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Äåèíñòàëàöè¼à"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Ñà÷åêà¼òå äîê ñå ïðîãðàì $(^NameDA) äåèíñòàëèðà."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Çàâðøåíà äåèíñòàëàöè¼à"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Äåèíñòàëàöè¼à ¼å óñïåøíî çàâðøåíà."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ïðåêèíóòà äåèíñòàëàöè¼à"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Äåèíñòàëàöè¼à ¼å ïðåêèíóòà è íè¼å óñïåøíî çàâðøåíà."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Çàâðøåíà èíñòàëàöè¼à ïðîãðàìà $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Ïðîãðàì $(^NameDA) ¼å èíñòàëèðàí íà ðà÷óíàð.$\r$\n$\r$\nÏðèòèñíèòå äóãìå „Êð༓ çà çàòâàðàœå îâîã ïðîçîðà."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Ðà÷óíàð ìîðà áèòè ïîíîâî ïîêðåíóò äà áè ñå ïðîöåñ èíñòàëàöè¼å ïðîãðàìà $(^NameDA) óñïåøíî çàâðøèî. Æåëèòå ëè òî îäìàõ äà óðàäèòå?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Çàâðøåíà äåèíñòàëàöè¼à ïðîãðàìà $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Ïðîãðàì $(^NameDA) ¼å äåèíñòàëèðàí ñà ðà÷óíàðà.$\r$\n$\r$\nÏðèòèñíèòå äóãìå „Êð༓ çà çàòâàðàœå îâîã ïðîçîðà."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Ðà÷óíàð ìîðà áèòè ïîíîâî ïîêðåíóò äà áè ñå ïðîöåñ äåèíñòàëàöè¼å ïðîãðàìà $(^NameDA) óñïåøíî çàâðøèî. Æåëèòå ëè òî äà óðàäèòå îäìàõ?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Îäìàõ ïîíîâî ïîêðåíè ðà÷óíàð"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Áåç ïîíîâíîã ïîêðåòàœà"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "Ïîêðåíè ïðîãðàì $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Ïðèêàæè Ïðî÷èòà¼Ìå ôà¼ë"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "Êðà¼"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Èçáîð ôîëäåðà ó Ñòàðò ìåíè¼ó"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Èçàáåðèòå ôîëäåð ó Ñòàðò ìåíè¼ó ó êîìå žåòå êðåèðàòè ïðå÷èöå."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Èçàáåðèòå ôîëäåð ó Ñòàðò ìåíè¼ó ó êîìå æåëèòå äà áóäó êðåèðàíå ïðå÷èöå ïðîãðàìà. Ìîæåòå óïèñàòè è èìå çà êðåèðàœå íîâîã ôîëäåðà."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Áåç êðåèðàœà ïðå÷èöà"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Äåèíñòàëàöè¼à ïðîãðàìà $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Äåèíñòàëàöè¼à ïðîãðàìà $(^NameDA) ñà ðà÷óíàðà."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Ñèãóðíî æåëèòå äà ïðåêèíåòå èíñòàëàöè¼ó ïðîãðàìà $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ñèãóðíî æåëèòå äà ïðåêèíåòå äåèíñòàëàöè¼ó ïðîãðàìà $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/SerbianLatin.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/SerbianLatin.nlf
new file mode 100644
index 000000000..6abaf58db
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/SerbianLatin.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+2074
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1250
+# RTL - anything else than RTL means LTR
+-
+# Translation by Srðan Obuæina
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Instalacija
+# ^UninstallCaption
+$(^Name) Deinstalacija
+# ^LicenseSubCaption
+: Dogovor o pravu korišæenja
+# ^ComponentsSubCaption
+: Opcije instalacije
+# ^DirSubCaption
+: Izbor foldera za instalaciju
+# ^InstallingSubCaption
+: Instalacija
+# ^CompletedSubCaption
+: Završena instalacija
+# ^UnComponentsSubCaption
+: Opcije deinstalacije
+# ^UnDirSubCaption
+: Izbor foldera za deinstalaciju
+# ^ConfirmSubCaption
+: Potvrðivanje
+# ^UninstallingSubCaption
+: Deinstalacija
+# ^UnCompletedSubCaption
+: Završena deinstalacija
+# ^BackBtn
+< Nazad
+# ^NextBtn
+Napred >
+# ^AgreeBtn
+Prihvatam
+# ^AcceptBtn
+Prihvatam uslove dogovora o pravu korišæenja
+# ^DontAcceptBtn
+Ne prihvatam uslove dogovora o pravu korišæenja
+# ^InstallBtn
+Instaliraj
+# ^UninstallBtn
+Deinstaliraj
+# ^CancelBtn
+Odustani
+# ^CloseBtn
+Zatvori
+# ^BrowseBtn
+Izbor...
+# ^ShowDetailsBtn
+Detalji
+# ^ClickNext
+Pritisnite dugme „Napred“ za nastavak.
+# ^ClickInstall
+Pritisnite dugme „Instaliraj“ za poèetak instalacije.
+# ^ClickUninstall
+Pritisnite dugme „Deinstaliraj“ za poèetak deinstalacije.
+# ^Name
+Ime
+# ^Completed
+Završeno
+# ^LicenseText
+Pažlivo proèitajte dogovor o pravu korišæenja pre instalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, pritisnite dugme „Prihvatam“.
+# ^LicenseTextCB
+Pažlivo proèitajte dogovor o pravu korišæenja pre instalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, obeležite kvadratiæ ispod. $_CLICK
+# ^LicenseTextRB
+Pažlivo proèitajte dogovor o pravu korišæenja pre instalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. $_CLICK
+# ^UnLicenseText
+Pažlivo proèitajte dogovor o pravu korišæenja pre deinstalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, pritisnite dugme „Prihvatam“.
+# ^UnLicenseTextCB
+Pažlivo proèitajte dogovor o pravu korišæenja pre deinstalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, obeležite kvadratiæ ispod. $_CLICK
+# ^UnLicenseTextRB
+Pažlivo proèitajte dogovor o pravu korišæenja pre deinstalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. $_CLICK
+# ^Custom
+Prilagoðavanje
+# ^ComponentsText
+Izaberite komponente za instalaciju. Instaliraju se samo oznaèene komponente. $_CLICK
+# ^ComponentsSubText1
+Izaberite tip instalacije:
+# ^ComponentsSubText2_NoInstTypes
+Izaberite komponente za instalaciju:
+# ^ComponentsSubText2
+Ili, izaberite opcione komponente koje želite da instalirate:
+# ^UnComponentsText
+Izaberite komponente za deinstalaciju. Deinstaliraju se samo oznaèene komponente. $_CLICK
+# ^UnComponentsSubText1
+Izaberite tip deinstalacije:
+# ^UnComponentsSubText2_NoInstTypes
+Izaberite komponente za deinstalaciju:
+# ^UnComponentsSubText2
+Ili, izaberite opcione komponente koje želite da deinstalirate:
+# ^DirText
+Program $(^NameDA) æe biti instaliran u navedeni folder. Za instalaciju u drugi folder pritisnite dugme „Izbor...“ i izaberite folder. $_CLICK
+# ^DirSubText
+Folder
+# ^DirBrowseText
+Izaberite folder u koji æete instalirati program $(^NameDA):
+# ^UnDirText
+Program $(^NameDA) æe biti deinstaliran iz navedenog foldera. Za deinstalaciju iz drugog foldera pritisnite dugme „Izbor...“ i izaberite folder. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Izaberite folder iz koga æete deinstalirati program $(^NameDA):
+# ^SpaceAvailable
+"Slobodan prostor: "
+# ^SpaceRequired
+"Potreban prostor: "
+# ^UninstallingText
+Program $(^NameDA) æe biti deinstaliran iz navedenog foldera. $_CLICK
+# ^UninstallingSubText
+Deinstalacija iz:
+# ^FileError
+Greška pri otvaranju fajla za pisanje: \r\n\t"$0"\r\nPritisnite dugme „Odustani“ za prekid instalacije,\r\n„Ponovi“ za ponovni pokušaj pisanja u fajl, ili\r\n„Ignoriši“ za preskakanje ovog fajla.
+# ^FileError_NoIgnore
+Greška pri otvaranju fajla za pisanje: \r\n\t"$0"\r\nPritisnite dugme „Ponovi“ za ponovni pokušaj pisanja u fajl, ili\r\n„Odustani“ za prekid instaliranja.
+# ^CantWrite
+"Nemoguæe pisanje: "
+# ^CopyFailed
+Neuspešno kopiranje
+# ^CopyTo
+"Kopiranje u "
+# ^Registering
+"Registrovanje: "
+# ^Unregistering
+"Deregistrovanje: "
+# ^SymbolNotFound
+"Simbol nije naðen: "
+# ^CouldNotLoad
+"Nemoguæe uèitavanje: "
+# ^CreateFolder
+"Kreiranje foldera: "
+# ^CreateShortcut
+"Kreiranje preèice: "
+# ^CreatedUninstaller
+"Kreiranje deinstalera: "
+# ^Delete
+"Brisanje fajla: "
+# ^DeleteOnReboot
+"Brisanje pri restartu: "
+# ^ErrorCreatingShortcut
+"Greška pri kreiranju preèice: "
+# ^ErrorCreating
+"Greška pri kreiranju: "
+# ^ErrorDecompressing
+Greška pri otpakivanju podataka! Ošteæen instalacioni program?
+# ^ErrorRegistering
+Greška pri registrovanju biblioteke
+# ^ExecShell
+"Izvršavanje u okruženju: "
+# ^Exec
+"Izvršavanje: "
+# ^Extract
+"Otpakivanje: "
+# ^ErrorWriting
+"Otpakivanje: greška pri upisu u fajl "
+# ^InvalidOpcode
+Ošteæen instalacioni program: neispravna komanda
+# ^NoOLE
+"Nema OLE podrške za: "
+# ^OutputFolder
+"Izlazni folder: "
+# ^RemoveFolder
+"Brisanje foldera: "
+# ^RenameOnReboot
+"Preimenovanje pri restartu: "
+# ^Rename
+"Preimenovan: "
+# ^Skipped
+"Preskoèen: "
+# ^CopyDetails
+Kopiraj detalje u klipbord
+# ^LogInstall
+Vodi zapisnik o procesu instalacije
+# ^Byte
+B
+# ^Kilo
+k
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/SerbianLatin.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/SerbianLatin.nsh
new file mode 100644
index 000000000..257906f18
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/SerbianLatin.nsh
@@ -0,0 +1,121 @@
+;Language: Serbian Latin (2074)
+;Translation by Srðan Obuæina
+
+!insertmacro LANGFILE "SerbianLatin" "Serbian Latin"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Dobrodošli u vodiè za instalaciju programa $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Biæete voðeni kroz proces instalacije programa $(^NameDA).$\r$\n$\r$\nPreporuèljivo je da iskljuèite sve druge programe pre poèetka instalacije. Ovo može omoguæiti ažuriranje sistemskih fajlova bez potrebe za ponovnim pokretanjem raèunara.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Dobrodošli u deinstalaciju programa $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Biæete voðeni kroz proces deinstalacije programa $(^NameDA).$\r$\n$\r$\nPre poèetka deinstalacije, uverite se da je program $(^NameDA) iskljuèen. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Dogovor o pravu korišæenja"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Pažljivo proèitajte dogovor o pravu korišæenja pre instalacije programa $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ako prihvatate sve uslove dogovora, pritisnite dugme „Prihvatam“ za nastavak. Morate prihvatiti dogovor da biste instalirali program $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ako prihvatate sve uslove dogovora, obeležite kvadratiæ ispod. Morate prihvatiti dogovor da biste instalirali program $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. Morate prihvatiti dogovor da biste instalirali program $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Dogovor o pravu korišæenja"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Pažlivo proèitajte dogovor o pravu korišæenja pre deinstalacije programa $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ako prihvatate sve uslove dogovora, pritisnite dugme „Prihvatam“ za nastavak. Morate prihvatiti dogovor da biste deinstalirali program $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ako prihvatate sve uslove dogovora, obeležite kvadratiæ ispod. Morate prihvatiti dogovor da biste deinstalirali program $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. Morate prihvatiti dogovor da biste deinstalirali program $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pritisnite Page Down da biste videli ostatak dogovora."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izbor komponenti za instalaciju"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Izaberite komponente za instalaciju. Instaliraju se samo oznaèene komponente."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izbor komponenti za deinstalaciju"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Izaberite komponente za deinstalaciju. Deinstaliraju se samo oznaèene komponente."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Preðite kursorom miša preko imena komponente da biste videli njen opis."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Preðite kursorom miša preko imena komponente da biste videli njen opis."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Izbor foldera za instalaciju"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Izaberite folder u koji æete instalirati program $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Izbor foldera za deinstalaciju"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Izaberite folder iz koga æete deinstalirati program $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalacija"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Saèekajte dok se program $(^NameDA) instalira."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Završena instalacija"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalacija je uspešno završena."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Prekinuta instalacija"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalacija je prekinuta i nije uspešno završena."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Deinstalacija"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Saèekajte dok se program $(^NameDA) deinstalira."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Završena deinstalacija"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Deinstalacija je uspešno završena."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Prekinuta deinstalacija"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Deinstalacija je prekinuta i nije uspešno završena."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Završena instalacija programa $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) je instaliran na raèunar.$\r$\n$\r$\nPritisnite dugme „Kraj“ za zatvaranje ovog prozora."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Raèunar mora biti ponovo pokrenut da bi se proces instalacije programa $(^NameDA) uspešno završio. Želite li to odmah da uradite?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Završena deinstalacija programa $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) je deinstaliran sa raèunara.$\r$\n$\r$\nPritisnite dugme „Kraj“ za zatvaranje ovog prozora."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Raèunar mora biti ponovo pokrenut da bi se proces deinstalacije programa $(^NameDA) uspešno završio. Želite li to da uradite odmah?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Odmah ponovo pokreni raèunar"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Bez ponovnog pokretanja"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "Pokreni program $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Prikaži ProèitajMe fajl"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "Kraj"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izbor foldera u Start meniju"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Izaberite folder u Start meniju u kome æete kreirati preèice."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Izaberite folder u Start meniju u kome želite da budu kreirane preèice programa. Možete upisati i ime za kreiranje novog foldera."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Bez kreiranja preèica"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Deinstalacija programa $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Deinstalacija programa $(^NameDA) sa raèunara."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Sigurno želite da prekinete instalaciju programa $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Sigurno želite da prekinete deinstalaciju programa $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/SimpChinese.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/SimpChinese.nlf
new file mode 100644
index 000000000..a54504905
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/SimpChinese.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+2052
+# Font and size - dash (-) means default ×ÖÌåÃû³ÆÓë´óС
+ËÎÌå
+9
+# Codepage - dash (-) means ANSI code page ANSI ×ÖÂëÒ³
+936
+# RTL - anything else than RTL means LTR ÓÉÓÒÖÁ×óÊéд
+-
+# Translator: Kii Ali ;Revision date: 2004-12-15
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) °²×°
+# ^UninstallCaption
+$(^Name) Ð¶ÔØ
+# ^LicenseSubCaption
+: Ðí¿ÉÖ¤ÐÒé
+# ^ComponentsSubCaption
+: °²×°Ñ¡Ïî
+# ^DirSubCaption
+: °²×°Îļþ¼Ð
+# ^InstallingSubCaption
+: ÕýÔÚ°²×°
+# ^CompletedSubCaption
+: ÒÑÍê³É
+# ^UnComponentsSubCaption
+: Ð¶ÔØÑ¡Ïî
+# ^UnDirSubCaption
+: Ð¶ÔØÎļþ¼Ð
+# ^ConfirmSubCaption
+: È·ÈÏ
+# ^UninstallingSubCaption
+: ÕýÔÚÐ¶ÔØ
+# ^UnCompletedSubCaption
+: Íê³É
+# ^BackBtn
+< ÉÏÒ»²½(&P)
+# ^NextBtn
+ÏÂÒ»²½(&N) >
+# ^AgreeBtn
+ÎÒ½ÓÊÜ(&I)
+# ^AcceptBtn
+ÎÒ½ÓÊÜ¡°Ðí¿ÉÖ¤ÐÒ顱ÖеÄÌõ¿î(&A)
+# ^DontAcceptBtn
+ÎÒ²»½ÓÊÜ¡°Ðí¿ÉÖ¤ÐÒ顱ÖеÄÌõ¿î(&N)
+# ^InstallBtn
+°²×°(&I)
+# ^UninstallBtn
+Ð¶ÔØ(&U)
+# ^CancelBtn
+È¡Ïû(&C)
+# ^CloseBtn
+¹Ø±Õ(&L)
+# ^BrowseBtn
+ä¯ÀÀ(&B)...
+# ^ShowDetailsBtn
+ÏÔʾϸ½Ú(&D)
+# ^ClickNext
+µ¥»÷ [ÏÂÒ»²½(N)] ¼ÌÐø¡£
+# ^ClickInstall
+µ¥»÷ [°²×°(I)] ¿ªÊ¼°²×°½ø³Ì¡£
+# ^ClickUninstall
+µ¥»÷ [Ð¶ÔØ(U)] ¿ªÊ¼½â³ý°²×°½ø³Ì¡£
+# ^Name
+Ãû³Æ
+# ^Completed
+ÒÑÍê³É
+# ^LicenseText
+ÔÚ°²×° $(^NameDA) ֮ǰÇë¼ìÔÄÐí¿ÉÖ¤ÐÒé¡£Èç¹ûÄã½ÓÊÜÐÒéÖÐËùÓÐÌõ¿î£¬µ¥»÷ [ÎÒ½ÓÊÜ(I)] ¡£
+# ^LicenseTextCB
+ÔÚ°²×° $(^NameDA) ֮ǰÇë¼ìÔÄÐí¿ÉÖ¤ÐÒé¡£Èç¹ûÄã½ÓÊÜÐÒéÖÐËùÓÐÌõ¿î£¬µ¥»÷Ï·½µÄ¹´Ñ¡¿ò¡£ $_CLICK
+# ^LicenseTextRB
+ÔÚ°²×° $(^NameDA) ֮ǰÇë¼ìÔÄÐí¿ÉÖ¤ÐÒé¡£Èç¹ûÄã½ÓÊÜÐÒéÖÐËùÓÐÌõ¿î£¬Ñ¡ÔñÏ·½µÄµÚÒ»¸öÑ¡Ïî¡£ $_CLICK
+# ^UnLicenseText
+ÔÚÐ¶ÔØ $(^NameDA) ֮ǰÇë¼ìÔÄÐí¿ÉÖ¤ÐÒé¡£Èç¹ûÄã½ÓÊÜÐÒéÖÐËùÓÐÌõ¿î£¬µ¥»÷ [ÎÒ½ÓÊÜ(I)] ¡£
+# ^UnLicenseTextCB
+ÔÚÐ¶ÔØ $(^NameDA) ֮ǰÇë¼ìÔÄÐí¿ÉÖ¤ÐÒé¡£Èç¹ûÄã½ÓÊÜÐÒéÖÐËùÓÐÌõ¿î£¬µ¥»÷Ï·½µÄ¹´Ñ¡¿ò¡£ $_CLICK
+# ^UnLicenseTextRB
+ÔÚÐ¶ÔØ $(^NameDA) ֮ǰÇë¼ìÔÄÐí¿ÉÖ¤ÐÒé¡£Èç¹ûÄã½ÓÊÜÐÒéÖÐËùÓÐÌõ¿î£¬Ñ¡ÔñÏ·½µÄµÚÒ»¸öÑ¡Ïî¡£ $_CLICK
+# ^Custom
+×Ô¶¨Òå
+# ^ComponentsText
+¹´Ñ¡ÄãÏëÒª°²×°µÄ×é¼þ£¬²¢½â³ý¹´Ñ¡Ä㲻ϣÍû°²×°µÄ×é¼þ¡£ $_CLICK
+# ^ComponentsSubText1
+Ñ¡¶¨°²×°µÄÀàÐÍ:
+# ^ComponentsSubText2_NoInstTypes
+Ñ¡¶¨°²×°µÄ×é¼þ:
+# ^ComponentsSubText2
+»òÕߣ¬×Ô¶¨ÒåÑ¡¶¨Ïë°²×°µÄ×é¼þ:
+# ^UnComponentsText
+¹´Ñ¡ÄãÏëÒªÐ¶ÔØµÄ×é¼þ£¬²¢½â³ý¹´Ñ¡Ä㲻ϣÍûÐ¶ÔØµÄ×é¼þ¡£ $_CLICK
+# ^UnComponentsSubText1
+Ñ¡ÔñÐ¶ÔØµÄÀàÐÍ:
+# ^UnComponentsSubText2_NoInstTypes
+Ñ¡ÔñÒªÐ¶ÔØµÄ×é¼þ:
+# ^UnComponentsSubText2
+»òÊÇ£¬Ñ¡ÔñÏëÒªÐ¶ÔØµÄ¿ÉÑ¡Ïî×é¼þ:
+# ^DirText
+Setup ½«°²×° $(^NameDA) ÔÚÏÂÁÐÎļþ¼Ð¡£Òª°²×°µ½²»Í¬Îļþ¼Ð£¬µ¥»÷ [ä¯ÀÀ(B)] ²¢Ñ¡ÔñÆäËûµÄÎļþ¼Ð¡£ $_CLICK
+# ^DirSubText
+Ä¿±êÎļþ¼Ð
+# ^DirBrowseText
+Ñ¡ÔñÒª°²×° $(^NameDA) µÄÎļþ¼ÐλÖÃ:
+# ^UnDirText
+Setup ½«Ð¶ÔØ $(^NameDA) ÔÚÏÂÁÐÎļþ¼Ð¡£ÒªÐ¶Ôص½²»Í¬Îļþ¼Ð£¬µ¥»÷ [ä¯ÀÀ(B)] ²¢Ñ¡ÔñÆäËûµÄÎļþ¼Ð¡£ $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Ñ¡ÔñÒªÐ¶ÔØ $(^NameDA) µÄÎļþ¼ÐλÖÃ:
+# ^SpaceAvailable
+"¿ÉÓÿռä: "
+# ^SpaceRequired
+"ËùÐè¿Õ¼ä: "
+# ^UninstallingText
+Õâ¸öÏòµ¼½«´ÓÄãµÄ¼ÆËã»úÐ¶ÔØ $(^NameDA) ¡£ $_CLICK
+# ^UninstallingSubText
+Ð¶ÔØÄ¿Â¼:
+# ^FileError
+²»ÄÜ´ò¿ªÒªÐ´ÈëµÄÎļþ: \r\n\t"$0"\r\nµ¥»÷ [Abort] ·ÅÆú°²×°£¬\r\n [Retry] ÖØÐ³¢ÊÔдÈëÎļþ£¬»ò\r\n [Ignore] ºöÂÔÕâ¸öÎļþ¡£
+# ^FileError_NoIgnore
+²»ÄÜ´ò¿ªÒªÐ´ÈëµÄÎļþ: \r\n\t"$0"\r\nµ¥»÷ [Retry] ÖØÐ³¢ÊÔдÈëÎļþ£¬»ò\r\n [Cancel] È¡Ïû°²×°¡£
+# ^CantWrite
+"ÎÞ·¨Ð´Èë: "
+# ^CopyFailed
+"¸´ÖÆÊ§°Ü "
+# ^CopyTo
+"¸´ÖƵ½: "
+# ^Registering
+"ÕýÔÚ×¢²á: "
+# ^Unregistering
+"ÕýÔÚ½â³ý×¢²á: "
+# ^SymbolNotFound
+"ÎÞ·¨ÕÒµ½·ûºÅ: "
+# ^CouldNotLoad
+"ÎÞ·¨¼ÓÔØ: "
+# ^CreateFolder
+"´´½¨Îļþ¼Ð: "
+# ^CreateShortcut
+"´´½¨¿ì½Ý·½Ê½: "
+# ^CreatedUninstaller
+"´´½¨Ð¶ÔسÌÐò: "
+# ^Delete
+"ɾ³ýÎļþ: "
+# ^DeleteOnReboot
+"ÖØÐÂÆô¶¯ºóɾ³ý: "
+# ^ErrorCreatingShortcut
+"ÕýÔÚ´´½¨¿ì½Ý·½Ê½Ê±·¢Éú´íÎó: "
+# ^ErrorCreating
+"ÕýÔÚ´´½¨Ê±·¢Éú´íÎó: "
+# ^ErrorDecompressing
+"ÕýÔÚ½âѹËõÊý¾Ý·¢Éú´íÎó£¡ÒÑË𻵵ݲװ³ÌÐò£¿"
+# ^ErrorRegistering
+"ÕýÔÚ×¢²á DLL ʱ·¢Éú´íÎó"
+# ^ExecShell
+"ÔËÐÐÍⲿ³ÌÐò: "
+# ^Exec
+"ÔËÐÐ: "
+# ^Extract
+"³éÈ¡: "
+# ^ErrorWriting
+"³éÈ¡: ÎÞ·¨Ð´ÈëÎļþ "
+# ^InvalidOpcode
+"°²×°Ëð»Ù: ÎÞЧµÄ²Ù×÷´úÂë "
+# ^NoOLE
+"ûÓÐ OLE ÓÃÓÚ: "
+# ^OutputFolder
+"Êä³öĿ¼: "
+# ^RemoveFolder
+"ÒÆ³ýĿ¼: "
+# ^RenameOnReboot
+"ÖØÐÂÆô¶¯ºóÖØÃüÃû: "
+# ^Rename
+"ÖØÃüÃû: "
+# ^Skipped
+"ÒÑÌø¹ý: "
+# ^CopyDetails
+"¸´ÖÆÏ¸½Úµ½¼ôÌù°å "
+# ^LogInstall
+"ÈÕÖ¾°²×°½ø³Ì"
+# byte
+B
+# kilo
+K
+# mega
+M
+# giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/SimpChinese.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/SimpChinese.nsh
new file mode 100644
index 000000000..b3f92c8bf
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/SimpChinese.nsh
@@ -0,0 +1,123 @@
+;Language: 'Chinese (Simplified)' (2052)
+;Translator: Kii Ali
+;Revision date: 2004-12-15
+;Verified by: QFox
+
+!insertmacro LANGFILE "SimpChinese" "Chinese (Simplified)"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "»¶ÓʹÓá°$(^NameDA)¡±°²×°Ïòµ¼"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Õâ¸öÏòµ¼½«Ö¸ÒýÄãÍê³É¡°$(^NameDA)¡±µÄ°²×°½ø³Ì¡£$\r$\n$\r$\nÔÚ¿ªÊ¼°²×°Ö®Ç°£¬½¨ÒéÏÈ¹Ø±ÕÆäËûËùÓÐÓ¦ÓóÌÐò¡£Õ⽫ÔÊÐí¡°°²×°³ÌÐò¡±¸üÐÂÖ¸¶¨µÄϵͳÎļþ£¬¶ø²»ÐèÒªÖØÐÂÆô¶¯ÄãµÄ¼ÆËã»ú¡£$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "»¶ÓʹÓá°$(^NameDA)¡±Ð¶ÔØÏòµ¼"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Õâ¸öÏòµ¼½«È«³ÌÖ¸ÒýÄã¡°$(^NameDA)¡±µÄÐ¶ÔØ½ø³Ì¡£$\r$\n$\r$\nÔÚ¿ªÊ¼Ð¶ÔØÖ®Ç°£¬È·ÈÏ¡°$(^NameDA)¡±²¢Î´ÔËÐе±ÖС£$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ðí¿ÉÖ¤ÐÒé"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "ÔÚ°²×°¡°$(^NameDA)¡±Ö®Ç°£¬ÇëÔĶÁÊÚȨÐÒé¡£"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Èç¹ûÄã½ÓÊÜÐÒéÖеÄÌõ¿î£¬µ¥»÷ [ÎÒ½ÓÊÜ(I)] ¼ÌÐø°²×°¡£Èç¹ûÄãÑ¡¶¨ [È¡Ïû(C)] £¬°²×°³ÌÐò½«»á¹Ø±Õ¡£±ØÐë½ÓÊÜÐÒé²ÅÄܰ²×°¡°$(^NameDA)¡±¡£"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Èç¹ûÄã½ÓÊÜÐÒéÖеÄÌõ¿î£¬µ¥»÷Ï·½µÄ¹´Ñ¡¿ò¡£±ØÐëÒª½ÓÊÜÐÒé²ÅÄܰ²×° $(^NameDA)¡£$_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Èç¹ûÄã½ÓÊÜÐÒéÖеÄÌõ¿î£¬Ñ¡ÔñÏ·½µÚÒ»¸öÑ¡Ïî¡£±ØÐëÒª½ÓÊÜÐÒé²ÅÄܰ²×° $(^NameDA)¡£$_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ðí¿ÉÖ¤ÐÒé"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "ÔÚÐ¶ÔØ¡°$(^NameDA)¡±Ö®Ç°£¬Çë¼ìÔÄÊÚȨÌõ¿î¡£"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Èç¹ûÄã½ÓÊÜÐÒéÖеÄÌõ¿î£¬µ¥»÷ [ÎÒ½ÓÊÜ(I)] ¼ÌÐøÐ¶ÔØ¡£Èç¹ûÄãÑ¡¶¨ [È¡Ïû(C)] £¬°²×°³ÌÐò½«»á¹Ø±Õ¡£±ØÐëÒª½ÓÊÜÐÒé²ÅÄÜÐ¶ÔØ¡°$(^NameDA)¡±¡£"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Èç¹ûÄã½ÓÊÜÐÒéÖеÄÌõ¿î£¬µ¥»÷Ï·½µÄ¹´Ñ¡¿ò¡£±ØÐëÒª½ÓÊÜÐÒé²ÅÄÜÐ¶ÔØ $(^NameDA)¡£$_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Èç¹ûÄã½ÓÊÜÐÒéÖеÄÌõ¿î£¬Ñ¡ÔñÏ·½µÚÒ»¸öÑ¡Ïî¡£±ØÐëÒª½ÓÊÜÐÒé²ÅÄÜÐ¶ÔØ $(^NameDA)¡£$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "°´ [PgDn] ÔĶÁ¡°ÊÚȨÐÒ顱µÄÆäÓಿ·Ö¡£"
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Ñ¡Ôñ×é¼þ"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Ñ¡ÔñÄãÏëÒª°²×°¡°$(^NameDA)¡±µÄÄÇЩ¹¦ÄÜ¡£"
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ÃèÊö"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Ñ¡¶¨×é¼þ"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Ñ¡¶¨¡°$(^NameDA)¡±µ±ÖÐÄãÏëÒªÐ¶ÔØµÄ¹¦ÄÜ¡£"
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ÒÆ¶¯ÄãµÄÊó±êÖ¸Õëµ½×é¼þÖ®ÉÏ£¬±ã¿É¼ûµ½ËüµÄÃèÊö¡£"
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ÒÆ¶¯ÄãµÄÊó±êÖ¸Õëµ½×é¼þÖ®ÉÏ£¬±ã¿É¼ûµ½ËüµÄÃèÊö¡£"
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Ñ¡Ôñ°²×°Î»ÖÃ"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Ñ¡Ôñ¡°$(^NameDA)¡±µÄ°²×°Îļþ¼Ð¡£"
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Ñ¡¶¨Ð¶ÔØÎ»ÖÃ"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Ñ¡¶¨¡°$(^NameDA)¡±ÒªÐ¶ÔصÄÎļþ¼Ð¡£"
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "ÕýÔÚ°²×°"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "¡°$(^NameDA)¡±ÕýÔÚ°²×°£¬ÇëµÈºò..."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "°²×°Íê³É"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "°²×°Òѳɹ¦Íê³É¡£"
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "°²×°¼ºÖÐÖ¹"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "°²×°Ã»Óгɹ¦¡£"
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "ÕýÔÚÐ¶ÔØ"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "¡°$(^NameDA)¡±ÕýÔÚÐ¶ÔØ£¬ÇëµÈºò..."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Ð¶ÔØÒÑÍê³É"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Ð¶ÔØÒѳɹ¦µØÍê³É¡£"
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ð¶ÔØÒÑÖÐÖ¹"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Ð¶ÔØ³ÌÐò²¢Î´³É¹¦µØÍê³É¡£"
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "ÕýÔÚÍê³É¡°$(^NameDA)¡±°²×°Ïòµ¼"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "¡°$(^NameDA)¡±ÒѰ²×°ÔÚÄãµÄϵͳ¡£$\r$\nµ¥»÷ [Íê³É(F)] ¹Ø±Õ´ËÏòµ¼¡£"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "ÄãµÄϵͳÐèÒªÖØÐÂÆô¶¯£¬ÒÔ±ãÍê³É¡°$(^NameDA)¡±µÄ°²×°¡£ÏÖÔÚÒªÖØÐÂÆô¶¯Âð£¿"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "ÕýÔÚÍê³É¡°$(^NameDA)¡±Ð¶ÔØÏòµ¼"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "¡°$(^NameDA)¡±ÒÑ´ÓÄãµÄ¼ÆËã»úÐ¶ÔØ¡£$\r$\n$\r$\nµ¥»÷ [Íê³É] ¹Ø±ÕÕâ¸öÏòµ¼¡£"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "¼ÆËã»úÐèÒªÖØÐÂÆô¶¯£¬ÒÔ±ãÍê³É¡°$(^NameDA)¡±µÄÐ¶ÔØ¡£ÏÖÔÚÏëÒªÖØÐÂÆô¶¯Âð£¿"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "ÊÇ£¬ÏÖÔÚÖØÐÂÆô¶¯(&Y)"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "·ñ£¬ÎÒÉÔºóÔÙ×ÔÐÐÖØÐÂÆô¶¯(&N)"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "ÔËÐÐ $(^NameDA)(&R)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "ÏÔʾ¡°×ÔÊöÎļþ¡±(&M)"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "Íê³É(&F)"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Ñ¡Ôñ¡°¿ªÊ¼²Ëµ¥¡±Îļþ¼Ð"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Ñ¡Ôñ¡°¿ªÊ¼²Ëµ¥¡±Îļþ¼Ð£¬ÓÃÓÚ³ÌÐòµÄ¿ì½Ý·½Ê½¡£"
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Ñ¡Ôñ¡°¿ªÊ¼²Ëµ¥¡±Îļþ¼Ð£¬ÒԱ㴴½¨³ÌÐòµÄ¿ì½Ý·½Ê½¡£ÄãÒ²¿ÉÒÔÊäÈëÃû³Æ£¬´´½¨ÐÂÎļþ¼Ð¡£"
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "²»Òª´´½¨¿ì½Ý·½Ê½(&N)"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Ð¶ÔØ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "´ÓÄãµÄ¼ÆËã»úÐ¶ÔØ¡°$(^NameDA)¡±"
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "ÄãȷʵҪÍ˳ö¡°$(^Name)¡±°²×°³ÌÐò£¿"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "ÄãȷʵҪÍ˳ö¡°$(^Name)¡±Ð¶ÔØÂð£¿"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Slovak.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Slovak.nlf
new file mode 100644
index 000000000..5cccc3192
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Slovak.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1051
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1250
+# RTL - anything else than RTL means LTR
+-
+#Translated by: Kypec (peter.dzugas@mahe.sk); edited by: Marián Hikaník (podnety@mojepreklady.net), Ivan Masár , 2008.
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Inštalácia programu $(^Name)
+# ^UninstallCaption
+Odinštalovanie programu $(^Name)
+# ^LicenseSubCaption
+: Licenèná zmluva
+# ^ComponentsSubCaption
+: Možnosti inštalácie
+# ^DirSubCaption
+: Inštalaèný prieèinok
+# ^InstallingSubCaption
+: Prebieha inštalácia
+# ^CompletedSubCaption
+: Hotovo
+# ^UnComponentsSubCaption
+: Možnosti odinštalovania
+# ^UnDirSubCaption
+: Prieèinok s informáciami pre odinštalovanie
+# ^ConfirmSubCaption
+: Potvrdenie
+# ^UninstallingSubCaption
+: Prebieha odinštalácia
+# ^UnCompletedSubCaption
+: Hotovo
+# ^BackBtn
+< &Spä
+# ^NextBtn
+Ï&alej >
+# ^AgreeBtn
+&Súhlasím
+# ^AcceptBtn
+&Súhlasím s podmienkami licenènej zmluvy
+# ^DontAcceptBtn
+N&esúhlasím s podmienkami licenènej zmluvy
+# ^InstallBtn
+&Nainštalova
+# ^UninstallBtn
+&Odinštalova
+# ^CancelBtn
+Zruši
+# ^CloseBtn
+&Zatvori
+# ^BrowseBtn
+&Preh¾adáva...
+# ^ShowDetailsBtn
+&Podrobnosti
+# ^ClickNext
+V inštalácii pokraèujte kliknutím na tlaèidlo Ïalej.
+# ^ClickInstall
+Pre spustenie inštalácie kliknite na tlaèidlo Nainštalova.
+# ^ClickUninstall
+Pre spustenie procesu odinštalovania kliknite na tlaèidlo Odinštalova.
+# ^Name
+Názov
+# ^Completed
+Hotovo
+# ^LicenseText
+Pred inštaláciou programu si prosím dôkladne preèítajte licenènú zmluvu $(^NameDA). Ak súhlasíte so všetkými jej podmienkami, kliknite na tlaèidlo Súhlasím.
+# ^LicenseTextCB
+Pred inštaláciou programu si prosím dôkladne preèítajte licenènú zmluvu $(^NameDA). Ak súhlasíte so všetkými jej podmienkami, zaškrtnite nasledujúce políèko. $_CLICK
+# ^LicenseTextRB
+Pred inštaláciou programu si prosím dôkladne preèítajte licenènú zmluvu $(^NameDA). Ak súhlasíte so všetkými jej podmienkami, oznaète prvú z nasledujúcich možností. $_CLICK
+# ^UnLicenseText
+Pred odinštalovaním programu si prosím dôkladne preèítajte licenènú zmluvu $(^NameDA). Ak súhlasíte so všetkými jej podmienkami, kliknite na tlaèidlo Súhlasím.
+# ^UnLicenseTextCB
+Pred odinštalovaním programu si prosím dôkladne preèítajte licenènú zmluvu $(^NameDA). Ak súhlasíte so všetkými jej podmienkami, zaškrtnite nasledujúce políèko. $_CLICK
+# ^UnLicenseTextRB
+Pred odinštalovaním programu si prosím dôkladne preèítajte licenènú zmluvu $(^NameDA). Ak súhlasíte so všetkými jej podmienkami, oznaète prvú z nasledujúcich možností. $_CLICK
+# ^Custom
+Volite¾ná
+# ^ComponentsText
+Oznaète súèasti programu, ktoré chcete nainštalova a odznaète tie, ktoré nainštalova nechcete. $_CLICK
+# ^ComponentsSubText1
+Vyberte si typ inštalácie:
+# ^ComponentsSubText2_NoInstTypes
+Vyberte si tie súèasti programu, ktoré chcete nainštalova:
+# ^ComponentsSubText2
+Alebo oznaète volite¾né doplnky, ktoré chcete nainštalova:
+# ^UnComponentsText
+Oznaète súèasti programu, ktoré chcete odinštalova a odznaète tie, ktoré chcete ponecha nainštalované. $_CLICK
+# ^UnComponentsSubText1
+Zvo¾te typ deinštalácie:
+# ^UnComponentsSubText2_NoInstTypes
+Vyberte súèasti, ktoré chcete odinštalova:
+# ^UnComponentsSubText2
+Alebo oznaète volite¾né súèasti, ktoré chcete odinštalova:
+# ^DirText
+$(^NameDA) bude nainštalovaný do nasledujúceho prieèinka. Inštalova do iného prieèinka môžete po kliknutí na tlaèidlo Preh¾adáva a vybraní iného prieèinka. $_CLICK
+# ^DirSubText
+Cie¾ový prieèinok
+# ^DirBrowseText
+Zvo¾te prieèinok, do ktorého sa nainštaluje program $(^NameDA):
+# ^UnDirText
+Inštalátor odinštaluje program $(^NameDA) z nasledovného prieèinka. Ak ho chcete odinštalova z iného prieèinka, kliknite na tlaèidlo Preh¾adáva a vyberte iný prieèinok. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Zvo¾te prieèinok, z ktorého sa odinštaluje program $(^NameDA):
+# ^SpaceAvailable
+"Vo¾né miesto na disku: "
+# ^SpaceRequired
+"Potrebné miesto na disku: "
+# ^UninstallingText
+Program $(^NameDA) sa odinštaluje z nasledovného prieèinka. $_CLICK
+# ^UninstallingSubText
+Prebieha odinštalovanie z:
+# ^FileError
+Chyba pri otváraní súboru na zápis: \r\n\r\n$0\r\n\r\n. Ak chcete inštaláciu ukonèi, kliknite na tlaèidlo Ukonèi,\r\ ak chcete zápis súboru zopakova, kliknite na tlaèidlo Opakova alebo kliknite na tlaèidlo \r\nIgnorova, ak chcete inštaláciu tohto súboru vynecha.
+# ^FileError_NoIgnore
+Chyba pri otváraní súboru na zápis: \r\n\r\n$0\r\n\r\n. Ak chcete zopakova zápis súboru, kliknite na tlaèidlo Opakova, alebo kliknite na tlaèidlo \r\nZruši, v prípade, že chcete inštaláciu ukonèi.
+# ^CantWrite
+"Nemožno zapísa súbor: "
+# ^CopyFailed
+Kopírovanie zlyhalo.
+# ^CopyTo
+"Kopírova do "
+# ^Registering
+"Registruje sa: "
+# ^Unregistering
+"Vymazáva sa z registra: "
+# ^SymbolNotFound
+"Nemožno nájs symbol: "
+# ^CouldNotLoad
+"Nemožno naèíta: "
+# ^CreateFolder
+"Vytvorený prieèinok: "
+# ^CreateShortcut
+"Vytvorený odkaz: "
+# ^CreatedUninstaller
+"Program pre odinštalovanie: "
+# ^Delete
+"Vymazaný súbor: "
+# ^DeleteOnReboot
+"Vymaza po reštartovaní systému: "
+# ^ErrorCreatingShortcut
+"Chyba pri vytváraní odkazu: "
+# ^ErrorCreating
+"Chyba pri vytváraní: "
+# ^ErrorDecompressing
+Chyba pri dekomprimovaní dát! Inštalátor je pravdepodobne poškodený...
+# ^ErrorRegistering
+Chyba pri registrácii súèasti
+# ^ExecShell
+"Vykona príkaz: "
+# ^Exec
+"Spusti: "
+# ^Extract
+"Extrahuje sa: "
+# ^ErrorWriting
+"Chyba pri zápise do súboru "
+# ^InvalidOpcode
+Inštalátor je pravdepodobne poškodený, pretože obsahuje neplatný operaèný kód.
+# ^NoOLE
+"Žiadny zápis OLE pre: "
+# ^OutputFolder
+"Výstupný prieèinok: "
+# ^RemoveFolder
+"Odstráni prieèinok: "
+# ^RenameOnReboot
+"Premenova po reštartovaní systému: "
+# ^Rename
+"Premenova: "
+# ^Skipped
+"Vynechané: "
+# ^CopyDetails
+Skopírova podrobnosti do schránky
+# ^LogInstall
+Zaznamena priebeh inštalácie
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Slovak.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Slovak.nsh
new file mode 100644
index 000000000..bb334cba0
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Slovak.nsh
@@ -0,0 +1,133 @@
+;Language: Slovak (1051)
+;Translated by:
+; Kypec (peter.dzugas@mahe.sk)
+;edited by:
+; Marián Hikaník (podnety@mojepreklady.net)
+; Ivan Masár , 2008.
+
+!insertmacro LANGFILE "Slovak" "Slovensky"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Vitajte v sprievodcovi inštaláciou programu $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Tento sprievodca vás prevedie inštaláciou $(^NameDA).$\r$\n$\r$\nPred zaèiatkom inštalácie sa odporúèa ukonèi všetky ostatné programy. Tým umožníte aktualizovanie systémových súborov bez potreby reštartovania vášho poèítaèa.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Vitajte v sprievodcovi odinštalovaním programu $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Tento sprievodca vás prevedie procesom odinštalovania programu $(^NameDA).$\r$\n$\r$\nPred spustením procesu odinštalovania sa uistite, že program $(^NameDA) nie je práve aktívny.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licenèná zmluva"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Pred inštaláciou $(^NameDA) si prosím preštudujte licenèné podmienky."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ak súhlasíte s podmienkami zmluvy, kliknite na tlaèidlo Súhlasím a môžete pokraèova v inštalácii. Ak chcete v inštalácii pokraèova, musíte odsúhlasi podmienky licenènej zmluvy $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ak súhlasíte s podmienkami zmluvy, zaškrtnite nižšie uvedené políèko. Ak chcete v inštalácii pokraèova, musíte odsúhlasi podmienky licenènej zmluvy $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ak súhlasíte s podmienkami zmluvy, oznaète prvú z nižšie uvedených možností. Ak chcete v inštalácii pokraèova, musíte odsúhlasi podmienky licenènej zmluvy $(^NameDA)."
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licenèná zmluva"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Pred odinštalovaním programu $(^NameDA) si prosím preèítajte licenèné podmienky."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ak súhlasíte s podmienkami zmluvy, zvo¾te Súhlasím. Licenènú zmluvu musíte odsúhlasi, ak chcete v odinštalovaní programu $(^NameDA) pokraèova."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ak súhlasíte s podmienkami zmluvy, zaškrtnite nižšie uvedené políèko. Licenènú zmluvu musíte odsúhlasi, ak chcete pokraèova v odinštalovaní programu $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ak súhlasíte s podmienkami licenènej zmluvy, oznaète prvú z nižšie uvedených možností. Licenènú zmluvu musíte odsúhlasi, ak chcete pokraèova v odinštalovaní programu $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Stlaèením klávesu Page Down posuniete text licenènej zmluvy."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Vo¾ba súèastí programu"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Zvo¾te si tie súèasti programu $(^NameDA), ktoré chcete nainštalova."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Popis"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Vo¾ba súèastí"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Zvo¾te súèasti programu $(^NameDA), ktoré chcete odinštalova."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Pri prejdení kurzorom myši nad názvom súèasti sa zobrazí jej popis."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Pri prejdení kurzorom myši nad názvom súèasti sa zobrazí jej popis."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Vo¾ba umiestnenia programu"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Vyberte si prieèinok, do ktorého chcete nainštalova program $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Umiestenie programu pre odinštalovanie"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Vyberte si prieèinok, z ktorého chcete odinštalova program $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Inštalácia"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Poèkajte prosím, kým prebehne inštalácia programu $(^NameDA)."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Ukonèenie inštalácie"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Inštalácia bola dokonèená úspešne."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Prerušenie inštalácie"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Inštaláciu sa nepodarilo dokonèi."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Odinštalovanie"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Èakajte prosím, kým prebehne odinštalovanie programu $(^NameDA)."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Ukonèenie odinštalovania"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Odinštalovanie bolo úspešne dokonèené."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Prerušenie odinštalovania"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Odinštalovanie sa neukonèilo úspešne."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Dokonèenie inštalácie programu $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) bol nainštalovaný do vášho poèítaèa.$\r$\nKliknite na tlaèidlo Dokonèi a tento sprievodca sa ukonèí."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Pre úplné dokonèenie inštalácie programu $(^NameDA) je potrebné reštartova váš poèítaè. Chcete ho reštartova ihneï?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Dokonèenie sprievodcu odinštalovaním"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) bol odinštalovaný z vášho poèítaèa.$\r$\n$\r$\nKliknite na tlaèidlo Dokonèi a tento sprievodca sa ukonèí."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Pre úplné dokonèenie odinštalovania programu $(^NameDA) je nutné reštartova váš poèítaè. Chcete ho reštartova ihneï?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reštartova teraz"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Reštartova neskôr (manuálne)"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Spusti program $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Zobrazi súbor s informáciami"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Dokonèi"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Vo¾ba umiestnenia v ponuke Štart"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Vyberte si prieèinok v ponuke Štart, kam sa umiestnia odkazy na program $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vyberte si prieèinok v ponuke Štart, v ktorom chcete vytvori odkazy na program. Takisto môžete napísa názov nového prieèinka."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nevytvára odkazy"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Odinštalovanie programu $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Odstránenie programu $(^NameDA) z vášho poèítaèa."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Naozaj chcete ukonèi inštaláciu programu $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Naozaj chcete ukonèi proces odinštalovania programu $(^Name)?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Vybra používate¾ov"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Vyberte pre ktorých používate¾ov chcete nainštalova $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Vyberte, èi chcete nainštalova program $(^NameDA) iba pre seba alebo pre všetkých používate¾ov tohto poèítaèa. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Nainštalova pre všetkých používate¾ov tohto poèítaèa"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Nainštalova iba pre mòa"
+!endif
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Slovenian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Slovenian.nlf
new file mode 100644
index 000000000..3a3719757
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Slovenian.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1060
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1250
+# RTL - anything else than RTL means LTR
+-
+# Translation by Janez Dolinar, edited by Martin Srebotnjak - Lugos.si
+# ^Branding
+Namestitveni sistem Nullsoft %s
+# ^SetupCaption
+Namestitev $(^Name)
+# ^UninstallCaption
+Odstranitev $(^Name)
+# ^LicenseSubCaption
+: Licenèna pogodba
+# ^ComponentsSubCaption
+: Možnosti namestitve
+# ^DirSubCaption
+: Mapa namestitve
+# ^InstallingSubCaption
+: Namešèanje poteka
+# ^CompletedSubCaption
+: Dokonèano
+# ^UnComponentsSubCaption
+: Možnosti odstranitve
+# ^UnDirSubCaption
+: Mapa odstranitve
+# ^ConfirmSubCaption
+: Potrditev
+# ^UninstallingSubCaption
+: Odstranjevanje poteka
+# ^UnCompletedSubCaption
+: Dokonèano
+# ^BackBtn
+< &Nazaj
+# ^NextBtn
+N&aprej >
+# ^AgreeBtn
+Se &strinjam
+# ^AcceptBtn
+&Sprejmem pogoje licenène pogodbe
+# ^DontAcceptBtn
+&Ne sprejmem pogojev licenène pogodbe
+# ^InstallBtn
+&Namesti
+# ^UninstallBtn
+&Odstrani
+# ^CancelBtn
+Preklièi
+# ^CloseBtn
+&Zapri
+# ^BrowseBtn
+Prebrsk&aj ...
+# ^ShowDetailsBtn
+&Podrobnosti
+# ^ClickNext
+Kliknite Naprej za nadaljevanje.
+# ^ClickInstall
+Kliknite Namesti za zaèetek namestitve.
+# ^ClickUninstall
+Kliknite Odstrani za odstranitev.
+# ^NameIme
+Ime
+# ^Completed
+Dokonèano
+# ^LicenseText
+Prosimo, da pred namestitvijo $(^NameDA) pregledate licenèno pogodbo. Èe se z njo strinjate, pritisnite Se strinjam.
+# ^LicenseTextCB
+Prosimo, da pred namestitvijo $(^NameDA) pregledate licenèno pogodbo. Èe sprejmete vse naštete pogoje, potrdite spodnje polje. $_CLICK
+# ^LicenseTextRB
+Prosimo, da pred namestitvijo $(^NameDA) pregledate licenèno pogodbo. Èe sprejmete vse naštete pogoje, izberite prvo spodaj podano možnost. $_CLICK
+# ^UnLicenseText
+Prosimo, da pred odstranitvijo $(^NameDA) pregledate licenèno pogodbo. Èe se z njo strinjate, pritisnite Se strinjam.
+# ^UnLicenseTextCB
+Prosimo, da pred odstranitvijo $(^NameDA) pregledate licenèno pogodbo. Èe sprejmete vse naštete pogoje, potrdite spodnje polje. $_CLICK
+# ^UnLicenseTextRB
+Prosimo, da pred odstranitvijo $(^NameDA) pregledate licenèno pogodbo. Èe sprejmete vse naštete pogoje, izberite prvo spodaj podano možnost. $_CLICK
+# ^Custom
+Po meri ...
+# ^ComponentsText
+Oznaèite komponente, ki jih želite namestiti, in pustite neoznaèene tiste, katerih ne želite namestiti. $_CLICK
+# ^ComponentsSubText1
+Izberite vrsto namestitve:
+# ^ComponentsSubText2_NoInstTypes
+Izberite komponente namestitve:
+# ^ComponentsSubText2
+Ali pa izberite komponente, ki jih želite namestiti:
+# ^UnComponentsText
+Oznaèite komponente, ki jih želite odstraniti, in pustite neoznaèene tiste, ki jih ne želite odstraniti. $_CLICK
+# ^UnComponentsSubText1
+Izberite vrsto odstranitve:
+# ^UnComponentsSubText2_NoInstTypes
+Izberite komponente za odstranitev:
+# ^UnComponentsSubText2
+Ali pa izberite komponente namestitve, ki jih želite odstraniti:
+# ^DirText
+$(^NameDA) boste namestili v sledeèo mapo. Za izbiro druge mape kliknite tipko Prebrskaj in izberite drugo mapo. $_CLICK
+# ^DirSubText
+Ciljna mapa
+# ^DirBrowseText
+Izberite mapo, kamor želite namestiti $(^NameDA):
+# ^UnDirText
+Odstranili boste $(^NameDA) iz sledeèe mape. Za izbiro druge mape kliknite tipko Prebrskaj in izberite drugo mapo. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Izberite mapo, od koder želite odstraniti $(^NameDA):
+# ^SpaceAvailable
+"Prostor na disku: "
+# ^SpaceRequired
+"Potreben prostor: "
+# ^UninstallingText
+$(^NameDA) bo odstranjen iz naslednje mape. $_CLICK
+# ^UninstallingSubText
+Odstranjevanje iz:
+# ^FileError
+Napaka pri odpiranju datoteke za pisanje: \r\n\r\n$0\r\n\r\nPritisnite Prekini za prekinitev namestitve,\r\nPonovi za ponoven poskus ali\r\nPrezri za izpust te datoteke.
+# ^FileError_NoIgnore
+Napaka pri odpiranju datoteke za pisanje: \r\n\r\n$0\r\n\r\nPritisnite Ponovi za ponoven poskus pisanja ali\r\Preklièi za prekinitev namestitve.
+# ^CantWrite
+"Ni mogoèe pisati: "
+# ^CopyFailed
+Kopiranje neuspešno
+# ^CopyTo
+"Kopiranje v "
+# ^Registering
+"Registracija: "
+# ^Unregistering
+"Preklic registracije: "
+# ^SymbolNotFound
+"Ni mogoèe najti simbola: "
+# ^CouldNotLoad
+"Ni mogoèe naložiti: "
+# ^CreateFolder
+"Ustvarjanje mape: "
+# ^CreateShortcut
+"Ustvarjanje bližnjice: "
+# ^CreatedUninstaller
+"Ustvarjena odstranitev: "
+# ^Delete
+"Brisanje datoteke: "
+# ^DeleteOnReboot
+"Brisanje ob ponovnem zagonu: "
+# ^ErrorCreatingShortcut
+"Napaka ustvarjanja bližnjice: "
+# ^ErrorCreating
+"Napaka ustvarjanja: "
+# ^ErrorDecompressing
+Napaka pri razširjanju podatkov! Je namestitvena datoteka okvarjena?
+# ^ErrorRegistering
+Napaka registracije DLL
+# ^ExecShell
+"Izvajanje v lupini: "
+# ^Exec
+"Izvajanje: "
+# ^Extract
+"Razširjanje: "
+# ^ErrorWriting
+"Razširjanje: napaka pri pisanju v datoteko "
+# ^InvalidOpcode
+Namestitev neveljavna: napaèen ukaz
+# ^NoOLE
+"Neobstojeèi OLE za: "
+# ^OutputFolder
+"Ciljna mapa: "
+# ^RemoveFolder
+"Odstranjevanje mape: "
+# ^RenameOnReboot
+"Preimenovanje ob zagonu: "
+# ^Rename
+"Preimenovanje: "
+# ^Skipped
+"Izpušèeno: "
+# ^CopyDetails
+Kopiraj podrobnosti v odložišèe
+# ^LogInstall
+Shrani potek namestitve
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Slovenian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Slovenian.nsh
new file mode 100644
index 000000000..250c4624e
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Slovenian.nsh
@@ -0,0 +1,129 @@
+;Language: Slovenian (1060)
+;By Janez Dolinar, edited by Martin Srebotnjak - Lugos.si
+
+!insertmacro LANGFILE "Slovenian" "Slovenski jezik"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Dobrodošli v èarovniku namestitve $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ta èarovnik vas vodi skozi namestitev programa $(^NameDA).$\r$\n$\r$\nPred namestitvijo je priporoèeno zapreti vsa ostala okna in programe. S tem omogoèite nemoteno namestitev programa in potrebnih sistemskih datotek brez ponovnega zagona raèunalnika.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Dobrodošli v èarovniku za odstranitev $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ta èarovnik vas bo vodil skozi odstranitev $(^NameDA).$\r$\n$\r$\nPreden priènete z odstranitvijo, se preprièajte, da program $(^NameDA) ni zagnan.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licenèna pogodba"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Prosimo, da si ogledate pogoje licenène pogodbe pred namestitvijo $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Èe se strinjate s pogoji, pritisnite Se strinjam. Da bi lahko namestili $(^NameDA), se morate s pogodbo strinjati."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Èe se strinjate z licenènimi pogoji pogodbe, spodaj izberite ustrezno okence. Za namestitev $(^NameDA) se morate strinjati s pogoji pogodbe. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Èe se strinjate z licenènimi pogoji pogodbe, spodaj izberite prvo možnost. Za namestitev $(^NameDA) se morate strinjati s pogoji pogodbe. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licenèna pogodba"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Prosimo, da pred odstranitvijo $(^NameDA) pregledate pogoje licenène pogodbe."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Èe se strinjate s pogoji licenène pogodbe, izberite Se strinjam. Za odstranitev $(^NameDA) se morate strinjati s pogoji."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Èe se strinjate s pogoji licenène pogodbe, kliknite na okence spodaj. Za odstranitev $(^NameDA) se morate strinjati s pogoji. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Èe se strinjate s pogoji licenène pogodbe, spodaj izberite prvo podano možnost. Za odstranitev $(^NameDA) se morate strinjati s pogoji. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Za preostali del pogodbe pritisnite tipko 'Page Down'."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izbor komponent"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Izberite, katere komponente izdelka $(^NameDA) želite namestiti."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izbor komponent"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Izberite komponente $(^NameDA), ki jih želite odstraniti."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Povlecite miško nad komponento, da vidite njen opis."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Povlecite miško nad komponento, da vidite njen opis."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Izberite pot namestive"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Izberite mapo, v katero želite namestiti $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Izbor mape"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Izberite mapo, iz katere želite odstraniti $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Namešèanje poteka"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Prosimo, poèakajte, $(^NameDA) se namešèa."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Dokonèana namestitev"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Namestitev je uspešno zakljuèena."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Prekinjena namestitev"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Namestitev ni bila uspešno zakljuèena."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Odstranjevanje poteka"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Prosimo, poèakajte, dokler se program $(^NameDA) odstranjuje."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Odstranitev konèana"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Odstranitev je uspešno konèana."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Odstranitev prekinjena"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Odstranitev ni bila konèana uspešno."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Zakljuèevanje namestitve $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) je bil namešèen na vaš raèunalnik.$\r$\n$\r$\nPritisnite Dokonèaj za zaprtje èarovnika."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Za dokonèanje namestitve $(^NameDA) morate ponovno zagnati raèunalnik. Želite zdaj ponovno zagnati raèunalnik?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Èarovnik za odstranitev $(^NameDA) se zakljuèuje"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) je odstranjen z vašega raèunalnika.$\r$\n$\r$\nKliknite Dokonèaj, da zaprete èarovnika."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Da bi se namestitev $(^NameDA) dokonèala, morate ponovno zagnati raèunalnik. Želite zdaj znova zagnati raèunalnik?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ponovni zagon"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Raèunalnik želim znova zagnati kasneje"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Zaženi $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Pokaži BeriMe"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "Do&konèaj"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izberite mapo menija Start"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Izberite mapo menija Start za bližnjice do $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Izberite mapo menija Start, kjer želite ustvariti bližnjico do programa. Èe vpišete novo ime, boste ustvarili istoimensko mapo."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ne ustvari bližnjic"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Odstranitev $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Odstrani $(^NameDA) z vašega raèunalnika."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Ste preprièani, da želite prekiniti namestitev $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ste preprièani, da želite zapustiti odstranitev $(^Name)?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Izberite uporabnike"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Izberite uporabnike, za katere želite namestiti $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Izberite, ali želite namestiti $(^NameDA) le zase ali za vse uporabnike tega raèunalnika. $(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Namesti za vse uporabnike tega raèunalnika"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Namesti le zame"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Spanish.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Spanish.nlf
new file mode 100644
index 000000000..4324eaecf
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Spanish.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit ;Español - España (Alfabetización Tradicional)
+NLF v6
+# Language ID
+1034
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by MoNKi & Joel
+# Review and minor corrections Darwin Rodrigo Toledo Cáceres (niwrad777@gmail.com) www.winamp-es.com
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Instalación de $(^Name)
+# ^UninstallCaption
+Desinstalación de $(^Name)
+# ^LicenseSubCaption
+: Acuerdo de Licencia
+# ^ComponentsSubCaption
+: Opciones de Instalación
+# ^DirSubCaption
+: Directorio de Instalación
+# ^InstallingSubCaption
+: Instalando
+# ^CompletedSubCaption
+: Completado
+# ^UnComponentsSubCaption
+: Opciones de Desinstalación
+# ^UnDirSubCaption
+: Directorio de Desinstalación
+# ^ConfirmSubCaption
+: Confirmación
+# ^UninstallingSubCaption
+: Desinstalando
+# ^UnCompletedSubCaption
+: Completado
+# ^BackBtn
+< &Atrás
+# ^NextBtn
+&Siguiente >
+# ^AgreeBtn
+A&cepto
+# ^AcceptBtn
+A&cepto los términos de la licencia
+# ^DontAcceptBtn
+&No acepto los términos de la licencia
+# ^InstallBtn
+&Instalar
+# ^UninstallBtn
+&Desinstalar
+# ^CancelBtn
+Cancelar
+# ^CloseBtn
+&Cerrar
+# ^BrowseBtn
+&Examinar...
+# ^ShowDetailsBtn
+Ver &detalles
+# ^ClickNext
+Presione Siguiente para continuar.
+# ^ClickInstall
+Presione Instalar para comenzar la instalación.
+# ^ClickUninstall
+Presione Desinstalar para comenzar la desinstalación.
+# ^Name
+Nombre
+# ^Completed
+Completado
+# ^LicenseText
+Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si acepta todos los términos del acuerdo, presione Acepto.
+# ^LicenseTextCB
+Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si acepta todos los términos del acuerdo, marque abajo la casilla. $_CLICK
+# ^LicenseTextRB
+Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si acepta todos los términos del acuerdo, seleccione abajo la primera opción. $_CLICK
+# ^UnLicenseText
+Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si acepta todos los términos del acuerdo, presione Acepto.
+# ^UnLicenseTextCB
+Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si acepta todos los términos del acuerdo, marque abajo la casilla. $_CLICK.
+# ^UnLicenseTextRB
+Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si acepta todos los términos del acuerdo, seleccione abajo la primera opción. $_CLICK
+# ^Custom
+Personalizada
+# ^ComponentsText
+Marque los componentes que desee instalar y desmarque los componentes que no desee instalar. $_CLICK
+# ^ComponentsSubText1
+Tipos de instalación:
+# ^ComponentsSubText2_NoInstTypes
+Seleccione los componentes a instalar:
+# ^ComponentsSubText2
+O seleccione los componentes opcionales que desee instalar:
+# ^UnComponentsText
+Marque los componentes que desee desinstalar y desmarque los componentes que no desee desinstalar. $_CLICK
+# ^UnComponentsSubText1
+Tipos de desinstalación:
+# ^UnComponentsSubText2_NoInstTypes
+Seleccione los componentes a desinstalar:
+# ^UnComponentsSubText2
+O seleccione los componentes opcionales que desee desinstalar:
+# ^DirText
+El programa de instalación instalará $(^NameDA) en el siguiente directorio. Para instalar en un directorio diferente, presione Examinar y seleccione otro directorio. $_CLICK
+# ^DirSubText
+Directorio de Destino
+# ^DirBrowseText
+Seleccione el directorio en el que instalará $(^NameDA):
+# ^UnDirText
+El programa de instalación desinstalará $(^NameDA) del siguiente directorio. Para desinstalar de un directorio diferente, presione Examinar y seleccione otro directorio. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Seleccione el directorio desde el cual desinstalará $(^NameDA):
+# ^SpaceAvailable
+Espacio disponible:
+# ^SpaceRequired
+Espacio requerido:
+# ^UninstallingText
+$(^NameDA) será desinstalado del siguiente directorio. $_CLICK
+# ^UninstallingSubText
+Desinstalando desde:
+# ^FileError
+Error abriendo archivo para escritura: \r\n\t"$0"\r\nPresione abortar para anular la instalación,\r\nreintentar para volver a intentar escribir el archivo, u\r\nomitir para ignorar este archivo
+# ^FileError_NoIgnore
+Error abriendo archivo para escritura: \r\n\t"$0"\r\nPresione reintentar para volver a intentar escribir el archivo, o\r\ncancelar para anular la instalación
+# ^CantWrite
+"No pudo escribirse: "
+# ^CopyFailed
+Falló la copia
+# ^CopyTo
+"Copiar a "
+# ^Registering
+"Registrando: "
+# ^Unregistering
+"Eliminando registro: "
+# ^SymbolNotFound
+"No pudo encontrarse símbolo: "
+# ^CouldNotLoad
+"No pudo cargarse: "
+# ^CreateFolder
+"Crear directorio: "
+# ^CreateShortcut
+"Crear acceso directo: "
+# ^CreatedUninstaller
+"Crear desinstalador: "
+# ^Delete
+"Borrar archivo: "
+# ^DeleteOnReboot
+"Borrar al reinicio: "
+# ^ErrorCreatingShortcut
+"Error creando acceso directo: "
+# ^ErrorCreating
+"Error creando: "
+# ^ErrorDecompressing
+¡Error descomprimiendo datos! ¿Instalador corrupto?
+# ^ErrorRegistering
+Error registrando DLL
+# ^ExecShell
+"Ejecutar comando: "
+# ^Exec
+"Ejecutar: "
+# ^Extract
+"Extraer: "
+# ^ErrorWriting
+"Extraer: error escribiendo al archivo "
+# ^InvalidOpcode
+Instalador corrupto: código de operación no válido
+# ^NoOLE
+"Sin OLE para: "
+# ^OutputFolder
+"Directorio de salida: "
+# ^RemoveFolder
+"Eliminar directorio: "
+# ^RenameOnReboot
+"Renombrar al reinicio: "
+# ^Rename
+"Renombrar: "
+# ^Skipped
+"Omitido: "
+# ^CopyDetails
+Copiar Detalles al Portapapeles
+# ^LogInstall
+Registrar proceso de instalación
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Spanish.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Spanish.nsh
new file mode 100644
index 000000000..ddc8265dc
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Spanish.nsh
@@ -0,0 +1,130 @@
+;Language: Spanish (1034)
+;By MoNKi & Joel
+;Updates & Review Darwin Rodrigo Toledo Cáceres - www.winamp-es.com - niwrad777@gmail.com
+
+!insertmacro LANGFILE "Spanish" "Español"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bienvenido al Asistente de Instalación de $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este programa instalará $(^NameDA) en su ordenador.$\r$\n$\r$\nSe recomienda que cierre todas las demás aplicaciones antes de iniciar la instalación. Esto hará posible actualizar archivos relacionados con el sistema sin tener que reiniciar su ordenador.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bienvenido al Asistente de Desinstalación de $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este asistente le guiará durante la desinstalación de $(^NameDA).$\r$\n$\r$\nAntes de comenzar la desinstalación, asegúrese de que $(^NameDA) no se está ejecutando.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acuerdo de licencia"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor revise los términos de la licencia antes de instalar $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si acepta todos los términos del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para instalar $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si acepta los términos del acuerdo, marque abajo la casilla. Debe aceptar los términos para instalar $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si acepta los términos del acuerdo, seleccione abajo la primera opción. Debe aceptar los términos para instalar $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acuerdo de licencia"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor revise los términos de la licencia antes de desinstalar $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si acepta todos los términos del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para desinstalar $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si acepta los términos del acuerdo, marque abajo la casilla. Debe aceptar los términos para desinstalar $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si acepta los términos del acuerdo, seleccione abajo la primera opción. Debe aceptar los términos para desinstalar $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Presione Avanzar Página para ver el resto del acuerdo."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selección de componentes"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleccione qué características de $(^NameDA) desea instalar."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descripción"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selección de componentes"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleccione qué características de $(^NameDA) desea desinstalar."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sitúe el ratón encima de un componente para ver su descripción."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sitúe el ratón encima de un componente para ver su descripción."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Elegir lugar de instalación"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Elija el directorio para instalar $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Elegir lugar de desinstalación"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Elija el directorio desde el cual se desinstalará $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor espere mientras $(^NameDA) se instala."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalación Completada"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instalación se ha completado correctamente."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalación Anulada"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instalación no se completó correctamente."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor espere mientras $(^NameDA) se desinstala."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalación Completada"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La desinstalación se ha completado correctamente."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalación Anulada"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La desinstalación no se completó correctamente."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completando el Asistente de Instalación de $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ha sido instalado en su sistema.$\r$\n$\r$\nPresione Terminar para cerrar este asistente."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Su sistema debe ser reiniciado para que pueda completarse la instalación de $(^NameDA). ¿Desea reiniciar ahora?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completando el Asistente de Desinstalación de $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ha sido desinstalado de su sistema.$\r$\n$\r$\nPresione Terminar para cerrar este asistente."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Su ordenador debe ser reiniciado para completar la desinstalación de $(^NameDA). ¿Desea reiniciar ahora?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar ahora"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Deseo reiniciar manualmente más tarde"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Ejecutar $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Ver Léame"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminar"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Elegir Carpeta del Menú Inicio"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Elija una Carpeta del Menú Inicio para los accesos directos de $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccione una carpeta del Menú Inicio en la que quiera crear los accesos directos del programa. También puede introducir un nombre para crear una nueva carpeta."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "No crear accesos directos"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Elimina $(^NameDA) de su sistema."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "¿Está seguro de que desea salir de la instalación de $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "¿Está seguro de que desea salir de la desinstalación de $(^Name)?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Elegir Usuarios"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Elija los usuarios para los cuales Ud. desea instalar $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Seleccione si desea instalar $(^NameDA) sólo para Ud. o para todos los usuarios de este Ordenador.$(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instación para cualquier usuario de este ordenador"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalación solo para mí"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/SpanishInternational.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/SpanishInternational.nlf
new file mode 100644
index 000000000..827dd48cf
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/SpanishInternational.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit ;Español (Alfabetización Internacional)
+NLF v6
+# Language ID
+3082
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Darwin Rodrigo Toledo Cáceres - www.winamp-es.com - nwrad777@gmail.com
+# Base traslation by MoNKi & Joel
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Instalación de $(^Name)
+# ^UninstallCaption
+Desinstalación de $(^Name)
+# ^LicenseSubCaption
+: Acuerdo de Licencia
+# ^ComponentsSubCaption
+: Opciones de Instalación
+# ^DirSubCaption
+: Carpeta de Instalación
+# ^InstallingSubCaption
+: Instalando
+# ^CompletedSubCaption
+: Finalizado
+# ^UnComponentsSubCaption
+: Opciones de Desinstalación
+# ^UnDirSubCaption
+: Carpeta de Desinstalación
+# ^ConfirmSubCaption
+: Confirmación
+# ^UninstallingSubCaption
+: Desinstalando
+# ^UnCompletedSubCaption
+: Finalizado
+# ^BackBtn
+< &Atrás
+# ^NextBtn
+&Siguiente >
+# ^AgreeBtn
+&Acepto
+# ^AcceptBtn
+&Acepto las condiciones del Acuerdo de Licencia
+# ^DontAcceptBtn
+No &acepto las condiciones del Acuerdo de Licencia
+# ^InstallBtn
+&Instalar
+# ^UninstallBtn
+&Desinstalar
+# ^CancelBtn
+Cancelar
+# ^CloseBtn
+&Cerrar
+# ^BrowseBtn
+&Examinar...
+# ^ShowDetailsBtn
+Mostrar &detalles
+# ^ClickNext
+Presione Siguiente para continuar.
+# ^ClickInstall
+Presione Instalar para iniciar la instalación.
+# ^ClickUninstall
+Presione Desinstalar para iniciar la desinstalación.
+# ^Name
+Nombre
+# ^Completed
+Finalizado
+# ^LicenseText
+Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, presione Acepto.
+# ^LicenseTextCB
+Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, marque abajo la casilla. $_CLICK
+# ^LicenseTextRB
+Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, seleccione abajo la primera opción. $_CLICK
+# ^UnLicenseText
+Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, presione Acepto.
+# ^UnLicenseTextCB
+Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, marque abajo la casilla. $_CLICK
+# ^UnLicenseTextRB
+Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, seleccione abajo la primera opción. $_CLICK
+# ^Custom
+Personalizada
+# ^ComponentsText
+Marque los componentes que desee instalar y desmarque los componentes que no desee instalar. $_CLICK
+# ^ComponentsSubText1
+Seleccione el tipo de instalación:
+# ^ComponentsSubText2_NoInstTypes
+Seleccione los componentes a instalar:
+# ^ComponentsSubText2
+O seleccione los componentes opcionales que desee instalar:
+# ^UnComponentsText
+Marque los componentes que desee desinstalar y desmarque los componentes que no desee desinstalar. $_CLICK
+# ^UnComponentsSubText1
+Seleccione el tipo de desinstalación:
+# ^UnComponentsSubText2_NoInstTypes
+Seleccione los componentes a desinstalar:
+# ^UnComponentsSubText2
+O seleccione los componentes opcionales que desee desinstalar:
+# ^DirText
+El programa de instalación instalará $(^NameDA) en la siguiente carpeta. Para instalar en una carpeta diferente, presione Examinar y seleccione otra carpeta. $_CLICK
+# ^DirSubText
+Carpeta de Destino
+# ^DirBrowseText
+Seleccione la carpeta en la que instalará $(^NameDA):
+# ^UnDirText
+El programa de instalación desinstalará $(^NameDA) de la siguiente carpeta. Para desinstalar de una carpeta diferente, presione Examinar y seleccione otra carpeta. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Seleccione la carpeta desde la que desinstalará $(^NameDA):
+# ^SpaceAvailable
+Espacio disponible:
+# ^SpaceRequired
+Espacio requerido:
+# ^UninstallingText
+$(^NameDA) será desinstalado de la siguiente carpeta. $_CLICK
+# ^UninstallingSubText
+Desinstalando desde:
+# ^FileError
+Error abriendo archivo para escribir: \r\n\r\n$0\r\n\r\nPresione Abortar para detener la instalación,\r\nReintentar para probar otra vez, o\r\nOmitir para ignorar este archivo.
+# ^FileError_NoIgnore
+Error abriendo archivo para escribir: \r\n\r\n$0\r\n\r\nPresione Reintentar para probar otra vez, o\r\nCancelar para detener la instalación.
+# ^CantWrite
+"No pudo escribirse: "
+# ^CopyFailed
+Copia fallida
+# ^CopyTo
+"Copiar a "
+# ^Registering
+"Registrando: "
+# ^Unregistering
+"Eliminando registro: "
+# ^SymbolNotFound
+"No se encontró simbolo: "
+# ^CouldNotLoad
+"No pudo cargarse: "
+# ^CreateFolder
+"Crear carpeta: "
+# ^CreateShortcut
+"Crear acceso directo: "
+# ^CreatedUninstaller
+"Crear desinstalador: "
+# ^Delete
+"Borrar archivo: "
+# ^DeleteOnReboot
+"Borrar al reinicio: "
+# ^ErrorCreatingShortcut
+"Error creando acceso directo: "
+# ^ErrorCreating
+"Error creando: "
+# ^ErrorDecompressing
+¡Error descomprimiendo datos! ¿Instalador corrupto?
+# ^ErrorRegistering
+Error registrando DLL
+# ^ExecShell
+"Ejecutar comando: "
+# ^Exec
+"Ejecutar: "
+# ^Extract
+"Extraer: "
+# ^ErrorWriting
+"Extraer: error escribiendo al archivo "
+# ^InvalidOpcode
+Instalador corrupto: código de operación no válido
+# ^NoOLE
+"Sin OLE para: "
+# ^OutputFolder
+"Carpeta de salida: "
+# ^RemoveFolder
+"Eliminar carpeta: "
+# ^RenameOnReboot
+"Renombrar al reinicio: "
+# ^Rename
+"Renombrar: "
+# ^Skipped
+"Omitido: "
+# ^CopyDetails
+Copiar Detalles al Portapapeles
+# ^LogInstall
+Registrar proceso de instalación
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/SpanishInternational.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/SpanishInternational.nsh
new file mode 100644
index 000000000..ad0288a99
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/SpanishInternational.nsh
@@ -0,0 +1,130 @@
+;Language: Spanish International (3082)
+;By Darwin Rodrigo Toledo Cáceres - www.winamp-es.com - niwrad777@gmail.com
+;Base by Monki y Joel
+
+!insertmacro LANGFILE "SpanishInternational" "Español (Alfabetización Internacional)"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bienvenido al Asistente de Instalación de $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este asistente le guiará a través de la instalación de $(^NameDA).$\r$\n$\r$\nSe recomienda que cierre todas la demás aplicaciones antes de iniciar la instalación. Esto hará posible actualizar archivos de sistema sin tener que reiniciar su computadora.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bienvenido al Asistente de Desinstalación de $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este asistente le guiará durante la desinstalación de $(^NameDA).$\r$\n$\r$\nAntes de iniciar la desinstalación, asegúrese de que $(^NameDA) no se está ejecutando.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acuerdo de licencia"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor revise el acuerdo de licencia antes de instalar $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si acepta todas las condiciones del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para instalar $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si acepta las condiciones del acuerdo, marque abajo la casilla. Debe aceptar las condiciones para instalar $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si acepta las condiciones del acuerdo, seleccione abajo la primera opción. Debe aceptar las condiciones para instalar $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acuerdo de licencia"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor revise el acuerdo de licencia antes de desinstalar $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si acepta todas las condiciones del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para desinstalar $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si acepta los términos del acuerdo, marque abajo la casilla. Debe aceptar los términos para desinstalar $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si acepta los términos del acuerdo, seleccione abajo la primera opción. Debe aceptar los términos para desinstalar $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Presione Avanzar Página para ver el resto del acuerdo."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selección de componentes"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleccione qué características de $(^NameDA) desea instalar."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descripción"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selección de componentes"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleccione qué características de $(^NameDA) desea desinstalar."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sitúe el ratón encima de un componente para ver su descripción."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sitúe el ratón encima de un componente para ver su descripción."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Elegir lugar de instalación"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Elija la carpeta para instalar $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Elegir lugar de desinstalación"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Elija la carpeta desde la cual desinstalará $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor espere mientras $(^NameDA) se instala."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalación Finalizada"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instalación se ha finalizado correctamente."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalación Abortada"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instalación no se terminó correctamente."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor espere mientras $(^NameDA) se desinstala."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalación Finalizada"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La desinstalación se ha finalizado correctamente."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalación Abortada"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La desinstalación no se terminó correctamente."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Finalizando el Asistente de Instalación de $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ha sido instalado en su sistema.$\r$\n$\r$\nPresione Terminar para cerrar este asistente."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Su sistema debe ser reiniciado para poder finalizar la instalación de $(^NameDA). ¿Desea reiniciar ahora?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completando el Asistente de Desinstalación de $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ha sido desinstalado de su sistema.$\r$\n$\r$\nPresione Terminar para cerrar este asistente."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Su computadora debe ser reiniciada para finalizar la desinstalación de $(^NameDA). ¿Desea reiniciar ahora?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar ahora"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Deseo reiniciar manualmente más tarde"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Ejecutar $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostrar Léame"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminar"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Elegir Carpeta del Menú Inicio"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Elija una Carpeta del Menú Inicio para los accesos directos de $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccione una carpeta del Menú Inicio en la que quiera crear los accesos directos del programa. También puede introducir un nombre para crear una nueva carpeta."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "No crear accesos directos"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Elimina $(^NameDA) de su sistema."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "¿Está seguro de que desea salir de la instalación de $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "¿Está seguro de que desea salir de la desinstalación de $(^Name)?"
+!endif
+
+!ifdef MULTIUSER_INSTALLMODEPAGE
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Elegir Usuarios"
+ ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Elija los usuarios para los cuales Ud. desea instalar $(^NameDA)."
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Elija una opción si desea instalar $(^NameDA) para sólo para Ud., o para todos los usuarios de esta computadora.$(^ClickNext)"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instación para cualquier usuario de esta computadora"
+ ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalación solo para mí"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Swedish.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Swedish.nlf
new file mode 100644
index 000000000..d1f2f33b9
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Swedish.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1053
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Magnus Bonnevier (magnus.bonnevier@telia.com)
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Installation
+# ^UninstallCaption
+$(^Name) Avinstallation
+# ^LicenseSubCaption
+: Licensavtal
+# ^ComponentsSubCaption
+: Installationsval
+# ^DirSubCaption
+: Installationskatalog
+# ^InstallingSubCaption
+: Installerar
+# ^CompletedSubCaption
+: Slutförd
+# ^UnComponentsSubCaption
+: Avinstallationsval
+# ^UnDirSubCaption
+: Avinstallationskatalog
+# ^ConfirmSubCaption
+: Bekräftelse
+# ^UninstallingSubCaption
+: Avinstallerar
+# ^UnCompletedSubCaption
+: Slutförd
+# ^BackBtn
+< &Tillbaka
+# ^NextBtn
+&Nästa >
+# ^AgreeBtn
+Jag &Godkänner
+# ^AcceptBtn
+Jag &Godkänner villkoren i licensavtalet
+# ^DontAcceptBtn
+Jag &Godkänner inte villkoren i licensavtalet
+# ^InstallBtn
+&Installera
+# ^UninstallBtn
+&Avinstallera
+# ^CancelBtn
+Avbryt
+# ^CloseBtn
+&Stäng
+# ^BrowseBtn
+B&läddra...
+# ^ShowDetailsBtn
+Visa &detaljer
+# ^ClickNext
+Klicka på Nästa för att fortsätta.
+# ^ClickInstall
+Klicka på Installera för att starta installationen.
+# ^ClickUninstall
+Klicka på Avinstallera för att starta avinstallationen.
+# ^Name
+Namn
+# ^Completed
+Slutförd
+# ^LicenseText
+Var vänlig läs igenom licensvillkoren innan du installerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka Jag Godkänner.
+# ^LicenseTextCB
+Var vänlig läs igenom licensvillkoren innan du installerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. $_CLICK
+# ^LicenseTextRB
+Var vänlig läs igenom licensvillkoren innan du installerar $(^NameDA). Om du accepterar villkoren i avtalet, välj det första alternativet nedan. $_CLICK
+# ^UnLicenseText
+Var vänlig läs igenom licensvillkoren innan du avinstallerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka Jag Godkänner.
+# ^UnLicenseTextCB
+Var vänlig läs igenom licensvillkoren innan du avinstallerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. $_CLICK
+# ^UnLicenseTextRB
+Var vänlig läs igenom licensvillkoren innan du avinstallerar $(^NameDA). Om du accepterar villkoren i avtalet, välj det första alternativet nedan. $_CLICK
+# ^Custom
+Valfri
+# ^ComponentsText
+Markera de komponenter du vill installera och avmarkera de komponenter du inte vill installera. $_CLICK
+# ^ComponentsSubText1
+Välj typ av installation:
+# ^ComponentsSubText2_NoInstTypes
+Välj komponenter att installera:
+# ^ComponentsSubText2
+Eller, välj de alternativa komponenter du önskar installera:
+# ^UnComponentsText
+Markera de komponenter du vill avinstallera och avmarkera de komponenter du inte vill avinstallera. $_CLICK
+# ^UnComponentsSubText1
+Välj typ av avinstallation:
+# ^UnComponentsSubText2_NoInstTypes
+Välj komponenter att avinstallera:
+# ^UnComponentsSubText2
+Eller, välj de alternativa komponenter du önskar avinstallera:
+# ^DirText
+Guiden kommer att installera $(^NameDA) i följande katalog. För att installera i en annan katalog, klicka Bläddra och välj en alternativ katalog. $_CLICK
+# ^DirSubText
+Målkatalog
+# ^DirBrowseText
+Välj katalog att installera $(^NameDA) i:
+# ^UnDirText
+Installationsguiden kommer att avinstallera $(^NameDA) från följande katalog. För att avinstallera från en annan katalog, klicka Bläddra och välj en annan katalog. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Välj katalog att avinstallera $(^NameDA) från:
+# ^SpaceAvailable
+"Utrymme tillgängligt: "
+# ^SpaceRequired
+"Utrymme som behövs: "
+# ^UninstallingText
+$(^NameDA) kommer att avinstalleras från följande katalog. $_CLICK
+# ^UninstallingSubText
+Avinstallerar från:
+# ^FileError
+Fel vid Öppning av fil för skrivning: \r\n\t"$0"\r\nKlicka på avbryt för att avbryta installationen,\r\nförsök igen för att försöka skriva till filen igen, eller\r\nIgnorera för att skippa denna fil
+# ^FileError_NoIgnore
+Fel vid Öppning av fil för skrivning: \r\n\t"$0"\r\nKlicka på försök igen för att skriva till filen igen, eller\r\navbryt för att avbryta installationen
+# ^CantWrite
+"Kan inte skriva: "
+# ^CopyFailed
+Kopiering misslyckades
+# ^CopyTo
+"Kopiera till "
+# ^Registering
+"Registrerar: "
+# ^Unregistering
+"Avregistrerar: "
+# ^SymbolNotFound
+"Kunde inte hitta symbol: "
+# ^CouldNotLoad
+"Kunde inte ladda: "
+# ^CreateFolder
+"Skapa katalog: "
+# ^CreateShortcut
+"Skapa genväg: "
+# ^CreatedUninstaller
+"Skapade avinstallationsprogram: "
+# ^Delete
+"Radera fil: "
+# ^DeleteOnReboot
+"Radera vid omstart: "
+# ^ErrorCreatingShortcut
+"Fel vid skapande av genväg: "
+# ^ErrorCreating
+"Fel vid skapande: "
+# ^ErrorDecompressing
+Fel vid uppackning av data! Skadat installationspaket?
+# ^ErrorRegistering
+Fel vid registrering av DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Kör: "
+# ^Extract
+"Extrahera: "
+# ^ErrorWriting
+"Extrahera: fel vid skrivning till fil "
+# ^InvalidOpcode
+Installationspaket skadat: ogiltig opcode
+# ^NoOLE
+"Ingen OLE för: "
+# ^OutputFolder
+"Målkatalog: "
+# ^RemoveFolder
+"Ta bort katalog: "
+# ^RenameOnReboot
+"Döp om vid omstart: "
+# ^Rename
+"Döp om: "
+# ^Skipped
+"Ignorerad: "
+# ^CopyDetails
+Kopiera detaljinformation till klippbordet
+# ^LogInstall
+Logga installationsförfarandet
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Swedish.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Swedish.nsh
new file mode 100644
index 000000000..a28ffe827
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Swedish.nsh
@@ -0,0 +1,122 @@
+;Compatible with Modern UI 1.72
+;Language: Swedish (1053)
+;By Magnus Bonnevier (magnus.bonnevier@telia.com), updated by Rickard Angbratt (r.angbratt@home.se), updated by Ulf Axelsson (ulf.axelsson@gmail.com)
+
+!insertmacro LANGFILE "Swedish" "Svenska"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Välkommen till installationsguiden för $(^NameDA)."
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Denna guide tar dig igenom installationen av $(^NameDA).$\r$\n$\r$\nDet rekommenderas att du avslutar alla andra program innan du fortsätter installationen. Detta tillåter att installationen uppdaterar nödvändiga systemfiler utan att behöva starta om din dator.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Välkommen till avinstallationsguiden för $(^NameDA)."
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Denna guide tar dig igenom avinstallationen av $(^NameDA).$\r$\n$\r$\nInnan du startar avinstallationen, försäkra dig om att $(^NameDA) inte körs.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licensavtal"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Var vänlig läs igenom licensvillkoren innan du installerar $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Om du accepterar villkoren i avtalet, klicka Jag Godkänner för att fortsätta. Du måste acceptera avtalet för att installera $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. Du måste acceptera avtalet för att installera $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Om du accepterar villkoren i avtalet, välj det första alternativet nedan. Du måste acceptera avtalet för att installera $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licensavtal"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Var vänlig läs igenom licensvillkoren innan du avinstallerar $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Om du accepterar villkoren i avtalet, klicka Jag Godkänner för att fortsätta. Du måste acceptera avtalet för att avinstallera $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. Du måste acceptera avtalet för att avinstallera $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Om du accepterar villkoren i avtalet, välj det första alternativet nedan. Du måste acceptera avtalet för att avinstallera $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tryck Page Down för att se resten av licensavtalet."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Välj komponenter"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Välj vilka alternativ av $(^NameDA) som du vill installera."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskrivning"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Välj komponenter"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Välj vilka alternativ av $(^NameDA) som du vill avinstallera."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Håll muspekaren över ett alternativ för att se dess beskrivning."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Håll muspekaren över ett alternativ för att se dess beskrivning."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Välj installationsväg"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Välj katalog att installera $(^NameDA) i."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Välj avinstallationsväg"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Välj katalog att avinstallera $(^NameDA) från."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installerar"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Var vänlig vänta medan $(^NameDA) installeras."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Installationen är klar"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Guiden avslutades korrekt."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Installationen avbröts"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Guiden genomfördes inte korrekt."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Avinstallerar"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Var vänlig vänta medan $(^NameDA) avinstalleras."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Avinstallationen genomförd"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Avinstallationen genomfördes korrekt."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Avinstallationen avbruten"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Avinstallationen genomfördes inte korrekt."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Avslutar installationsguiden för $(^NameDA)."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) har installerats på din dator.$\r$\n$\r$\nKlicka på Slutför för att avsluta guiden."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Din dator måste startas om för att fullborda installationen av $(^NameDA). Vill du starta om nu?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Avslutar avinstallationsguiden för $(^NameDA)."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) komponenter har avinstallerats från din dator.$\r$\n$\r$\nKlicka på Slutför för att avsluta guiden."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Din dator måste startas om för att fullborda avinstallationen av $(^NameDA). Vill du starta om nu?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Starta om nu"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Jag vill starta om själv senare"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Kör $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Visa Readme-filen"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Slutför"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Välj Startmenykatalog"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Välj en Startmenykatalog för programmets genvägar."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Välj startmenykatalog i vilken du vill skapa programmets genvägar. Du kan ange ett eget namn för att skapa en ny katalog."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Skapa ej genvägar"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Avinstallera $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Ta bort $(^NameDA) från din dator."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Är du säker på att du vill avbryta installationen av $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Är du säker på att du vill avbryta avinstallationen av $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Thai.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Thai.nlf
new file mode 100644
index 000000000..d47409a1a
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Thai.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1054
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+874
+# RTL - anything else than RTL means LTR
+-
+# Translation by SoKoOLz, TuW@nNu (asdfuae)
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) µÔ´µÑé§
+# ^UninstallCaption
+$(^Name) ¡àÅÔ¡¡ÒõԴµÑé§
+# ^LicenseSubCaption
+: ¢é͵¡Å§àÃ×èͧÅÔ¢ÊÔ·¸Ôì
+# ^ComponentsSubCaption
+: µÑÇàÅ×Í¡¡ÒõԴµÑé§
+# ^DirSubCaption
+: á¿éÁ·ÕèµÔ´µÑé§
+# ^InstallingSubCaption
+: ¡ÓÅѧµÔ´µÑé§
+# ^CompletedSubCaption
+: àÊÃç¨ÊÔé¹
+# ^UnComponentsSubCaption
+: µÑÇàÅ×͡¡àÅÔ¡¡ÒõԴµÑé§
+# ^UnDirSubCaption
+: á¿éÁ·Õè¡àÅÔ¡¡ÒõԴµÑé§
+# ^ConfirmSubCaption
+: Â×¹Âѹ
+# ^UninstallingSubCaption
+: ¡ÓÅѧ¡àÅÔ¡¡ÒõԴµÑé§
+# ^UnCompletedSubCaption
+: àÊÃç¨ÊÔé¹
+# ^BackBtn
+< &¡ÅѺä»
+# ^NextBtn
+&µèÍä» >
+# ^AgreeBtn
+&µ¡Å§
+# ^AcceptBtn
+&µ¡Å§ÂÍÁÃѺ¢é͵èÒ§æã¹ËÑÇ¢éÍÅÔ¢ÊÔ·¸Ôì
+# ^DontAcceptBtn
+&äÁèÂÍÁÃѺ¢é͵èÒ§æã¹ËÑÇ¢éÍÅÔ¢ÊÔ·¸Ôì
+# ^InstallBtn
+&µÔ´µÑé§
+# ^UninstallBtn
+&¡àÅÔ¡¡ÒõԴµÑé§
+# ^CancelBtn
+¡àÅÔ¡
+# ^CloseBtn
+&»Ô´
+# ^BrowseBtn
+à&ÃÕ¡´Ù...
+# ^ShowDetailsBtn
+&ÃÒÂÅÐàÍÕ´
+# ^ClickNext
+¡´ µèÍä» à¾×èÍàÃÔèÁÃкºÍѵÔâ¹ÁѵÔ
+# ^ClickInstall
+¡´ µÔ´µÑé§ à¾×èÍ·Ó¡ÒõԴµÑé§
+# ^ClickUninstall
+¡´ ¡àÅÔ¡¡ÒõԴµÑé§ à¾×èÍ¡àÅÔ¡¡ÒõԴµÑé§
+# ^Name
+ª×èÍ
+# ^Completed
+àÊÃç¨ÊÔé¹áÅéÇ
+# ^LicenseText
+â»Ã´ÍèÒ¹·Ç¹àÃ×èͧ¡ÒÃÂÍÁÃѺã¹ÅÔ¢ÊÔ·¸Ôì¡è͹·Õè¤Ø³¨Ð·Ó¡ÒõԴµÑé§ $(^NameDA). ¶éҤسÂÍÁÃѺ¢é͵¡Å§ã¹·Ø¡æ´éÒ¹, ¡´ ©Ñ¹ÂÍÁÃѺ
+# ^LicenseTextCB
+â»Ã´ÍèÒ¹·Ç¹àÃ×èͧ¡ÒÃÂÍÁÃѺã¹ÅÔ¢ÊÔ·¸Ôì¡è͹·Õè¤Ø³¨Ð·Ó¡ÒõԴµÑé§ $(^NameDA). ¶éҤسÂÍÁÃѺ¢é͵¡Å§ã¹·Ø¡æ´éÒ¹, ¡´àÅ×Í¡·Õè¡Åèͧ´éÒ¹ÅèÒ§. $_CLICK
+# ^LicenseTextRB
+â»Ã´ÍèÒ¹·Ç¹àÃ×èͧ¡ÒÃÂÍÁÃѺã¹ÅÔ¢ÊÔ·¸Ôì¡è͹·Õè¤Ø³¨Ð·Ó¡ÒõԴµÑé§ $(^NameDA). ¶éҤسÂÍÁÃѺ¢é͵¡Å§ã¹·Ø¡æ´éÒ¹, àÅ×Í¡µÑÇàÅ×Í¡áá¢éÒ§ÅèÒ§. $_CLICK
+# ^UnLicenseText
+â»Ã´ÍèÒ¹·Ç¹àÃ×èͧ¡ÒÃÂÍÁÃѺã¹ÅÔ¢ÊÔ·¸Ôì¡è͹·Õè¤Ø³¨Ð·Ó¡ÒáàÅÔ¡µÔ´µÑé§ $(^NameDA). ¶éҤسÂÍÁÃѺ¢é͵¡Å§ã¹·Ø¡æ´éÒ¹, ¡´ ©Ñ¹ÂÍÁÃѺ
+# ^UnLicenseTextCB
+â»Ã´ÍèÒ¹·Ç¹àÃ×èͧ¡ÒÃÂÍÁÃѺã¹ÅÔ¢ÊÔ·¸Ôì¡è͹·Õè¤Ø³¨Ð·Ó¡ÒáàÅÔ¡µÔ´µÑé§ $(^NameDA). ¶éҤسÂÍÁÃѺ¢é͵¡Å§ã¹·Ø¡æ´éÒ¹, ¡´àÅ×Í¡·Õè¡Åèͧ´éÒ¹ÅèÒ§. $_CLICK
+# ^UnLicenseTextRB
+â»Ã´ÍèÒ¹·Ç¹àÃ×èͧ¡ÒÃÂÍÁÃѺã¹ÅÔ¢ÊÔ·¸Ôì¡è͹·Õè¤Ø³¨Ð·Ó¡ÒáàÅÔ¡µÔ´µÑé§ $(^NameDA). ¶éҤسÂÍÁÃѺ¢é͵¡Å§ã¹·Ø¡æ´éÒ¹, àÅ×Í¡µÑÇàÅ×Í¡áá¢éÒ§ÅèÒ§. $_CLICK
+# ^Custom
+¡Ó˹´àͧ
+# ^ComponentsText
+àÅ×èÍ¡ÊÔè§·Õè¤Ø³µéͧ¡ÒõԴµÑé§áÅÐäÁèàÅ×Í¡ÊÔè§·Õè¤Ø³äÁèµéͧ¡ÒõԴµÑé§ $_CLICK
+# ^ComponentsSubText1
+àÅ×Í¡ÇÔ¸Õ¡ÒáÒõԴµÑé§:
+# ^ComponentsSubText2_NoInstTypes
+àÅ×Í¡ÊÔè§·Õè¤Ø³µéͧ¡ÒõԴµÑé§:
+# ^ComponentsSubText2
+ËÃ×Í, àÅ×Í¡µÑÇàÅ×Í¡·Õè¤Ø³µéͧ¡ÒõԴµÑé§:
+# ^UnComponentsText
+àÅ×Í¡µÑÇàÅ×Í¡·Õè¤Ø³µéͧ¡ÒèСàÅÔ¡¡ÒõԴµÑé§áÅÐäÁèàÅ×Í¡ÊÔè§·Õè¤Ø³äÁèµéͧ¡ÒèСàÅÔ¡¡ÒõԴµÑé§ $_CLICK
+# ^UnComponentsSubText1
+àÅ×Í¡ÇÔ¸Õ¡ÒáàÅÔ¡¡ÒõԴµÑé§:
+# ^UnComponentsSubText2_NoInstTypes
+àÅ×Í¡µÑÇàÅ×Í¡·Õèµéͧ¡ÒèСàÅÔ¡¡ÒõԴµÑé§:
+# ^UnComponentsSubText2
+ËÃ×Í, àÅ×Í¡¨Ò¡µÑÇàÅ×Í¡Í×è¹æ·Õè¤Ø³µéͧ¡ÒèСàÅÔ¡¡ÒõԴµÑé§:
+# ^DirText
+µÑǵԴµÑ駨зӡÒõԴµÑé§ $(^NameDA) ŧã¹á¿éÁ´Ñ§µèÍ仹Õé, ¶éÒµéͧ¡ÒõԴµÑé§Å§ã¹á¿éÁÍ×è¹, ¡´ àÃÕ¡´ÙáÅÐàÅ×Í¡á¿éÁÍ×è¹ $_CLICK
+# ^DirSubText
+á¿éÁ·Õèµéͧ¡ÒõԴµÑé§
+# ^DirBrowseText
+àÅ×Í¡á¿éÁ·Õèµéͧ¡ÒõԴµÑé§ $(^NameDA) ã¹:
+# ^UnDirText
+µÑǵԴµÑ駨зӡÒáàÅÔ¡¡ÒõԴµÑé§ $(^NameDA) ¨Ò¡á¿éÁ´Ñ§µèÍ仹Õé, ¶éÒµéͧ¡ÒáàÅÔ¡¡ÒõԴµÑ駨ҡá¿éÁÍ×è¹, ¡´ àÃÕ¡´Ù áÅÐàÅ×Í¡á¿éÁÍ×è¹ $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+àÅ×Í¡á¿éÁ·Õèµéͧ¡ÒáàÅÔ¡¡ÒõԴµÑé§ $(^NameDA) ¨Ò¡:
+# ^SpaceAvailable
+"ÁÕ¾×é¹·ÕèàËÅ×Í: "
+# ^SpaceRequired
+"µéͧ¡Òþ×é¹·Õè: "
+# ^UninstallingText
+$(^NameDA) ¨Ð¶Ù¡Â¡àÅÔ¡¡ÒõԴµÑ駨ҡá¿éÁµèÍ仹Õé. $_CLICK
+# ^UninstallingSubText
+¡àÅÔ¡¡ÒõԴµÑ駨ҡ:
+# ^FileError
+äÁèÊÒÁÒöà»Ô´ä¿ÅìÊÓËÃѺà¢Õ¹ä´é: \r\n\r\n$0\r\n\r\n¡´ ¡àÅÔ¡ à¾×èÍËÂØ´¡ÒõԴµÑé§,\r\nÅͧÍÕ¡¤ÃÑé§ à¾×èÍÅͧÍÕ¡¤ÃÑé§, ËÃ×Í\r\nà¾Ô¡à©Â à¾×èÍ¢éÒÁä¿Åì¹Õé.
+# ^FileError_NoIgnore
+äÁèÊÒÁÒöà»Ô´ä¿ÅìÊÓËÃѺà¢Õ¹ä´é: \r\n\r\n$0\r\n\r\n¡´ ÅͧÍÕ¡¤ÃÑé§ à¾×èÍÅͧÍÕ¡¤ÃÑé§, ËÃ×Í\r\n¡àÅÔ¡à¾×èÍËÂØ´¡ÒõԴµÑé§
+# ^CantWrite
+"äÁèÊÒÁÒöà¢Õ¹: "
+# ^CopyFailed
+¤Ñ´ÅÍ¡¼Ô´¾ÅÒ´
+# ^CopyTo
+"¤Ñ´ÅÍ¡ä»Âѧ "
+# ^Registering
+"¡ÓÅѧŧ·ÐàºÕ¹: "
+# ^Unregistering
+"¡àÅÔ¡¡ÒÃŧ·ÐàºÕ¹: "
+# ^SymbolNotFound
+"äÁèÊÒÁÒöËÒÊÑÅѡɳìä´é: "
+# ^CouldNotLoad
+"äÁèÊÒÁÒöâËÅ´ä´é: "
+# ^CreateFolder
+"ÊÃéÒ§á¿éÁ: "
+# ^CreateShortcut
+"ÊÃéÒ§ªÍÃ쵤ѷ: "
+# ^CreatedUninstaller
+"ÊÃéÒ§µÑÇ¡àÅÔ¡¡ÒõԴµÑé§: "
+# ^Delete
+"źä¿Åì: "
+# ^DeleteOnReboot
+"źµÍ¹ÃÕºÙ·: "
+# ^ErrorCreatingShortcut
+"ÁÕ»ÑËÒÊÃéÒ§ä¿ÅìªÍÃ쵤ѷ: "
+# ^ErrorCreating
+"ÁÕ»ÑËÒ㹡ÒÃÊÃéÒ§ä¿Åì: "
+# ^ErrorDecompressing
+ÁÕ»ÑËÒ㹡ÒäÅÒ¢éÍÁÙÅ! à¡Ô´¢éͼԴ¾ÅÒ´¨Ò¡µÑǵԴµÑé§?
+# ^ErrorRegistering
+ÁÕ»ÑËÒ㹡ÒÃŧ·ÐàºÕ¹ DLL
+# ^ExecShell
+"ÃѹàªÅÅìä¿Åì: "
+# ^Exec
+"Ãѹä¿Åì: "
+# ^Extract
+"ᵡä¿Åì: "
+# ^ErrorWriting
+"ᵡä¿Åì: à¡Ô´»ÑËÒ㹡ÒÃà¢Õ¹ä¿Åì"
+# ^InvalidOpcode
+µÑǵԴµÑé§ÁÕ»ÑËÒ: ÃËÑÊ opcode ¼Ô´¾ÅÒ´
+# ^NoOLE
+"äÁèÁÕ OLE ÊÓËÃѺ: "
+# ^OutputFolder
+"á¿éÁ·ÕµÔ´µÑé§: "
+# ^RemoveFolder
+"źá¿éÁ: "
+# ^RenameOnReboot
+"à»ÅÕ蹪×è͵͹ÃÕºÙ·: "
+# ^Rename
+"à»ÅÕ蹪×èÍ: "
+# ^Skipped
+"¢éÒÁ: "
+# ^CopyDetails
+¤Ñ´ÅÍ¡ÃÒÂÅÐàÍÕ´ŧ¤ÅÔ»ºÍÃì´
+# ^LogInstall
+ºÑ¹·Ö¡¡ÒõԴµÑé§
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Thai.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Thai.nsh
new file mode 100644
index 000000000..748ceeb85
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Thai.nsh
@@ -0,0 +1,121 @@
+;Language: Thai (1054)
+;By SoKoOLz, TuW@nNu (asdfuae)
+
+!insertmacro LANGFILE "Thai" "Thai"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "ÂÔ¹´Õµé͹ÃѺà¢éÒÊÙè¡ÒõԴµÑé§â»Ãá¡ÃÁ $(^NameDA) "
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "µÑǵԴµÑé§ÍѵÔâ¹ÁѵԨйӤسä»ÊÙè¡ÒõԴµÑ駢ͧ $(^NameDA).$\r$\n$\r$\nàÃÒ¢Íá¹Ð¹ÓãËé»Ô´â»Ãá¡ÃÁÍ×è¹æãËéËÁ´¡è͹·Õè¨ÐàÃÔèÁµÔ´µÑé§, ¹Õè¨Ðà»ç¹¡ÒÃÍѻഷä¿Åìä´é§èÒ¢Öé¹â´Â¤Ø³äÁè¨Óà»ç¹µéͧ·Ó¡ÒÃÃÕºÙ·¤ÍÁ¾ÔÇàµÍÃì¢Í§¤Ø³$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "ÂÔ¹´Õµé͹ÃѺÊÙè¡ÒáàÅÔ¡¡ÒõԴµÑé§ÍѵÔâ¹ÁѵԢͧ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "µÑǵԴµÑé§ÍѵÔâ¹ÁѵԹÕé¨Ð¹Ó¤Ø³ä»ÊÙè¡ÒáàÅÔ¡¡ÒõԴµÑ駢ͧ $(^NameDA).$\r$\n$\r$\n¡ÒèÐàÃÔèÁ¡ÒáàÅÔ¡¡ÒõԴµÑé§¹Õé, â»Ã´µÃǨÊͺÇèÒ $(^NameDA) äÁèä´éãªéÍÂÙè$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "¢é͵¡Å§àÃ×èͧÅÔ¢ÊÔ·¸Ôì"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "â»Ã´ÍèÒ¹·Ç¹ÅÔ¢ÊÔ·¸Ôìã¹ËÑÇ¢é͵èÒ§æÍÕ¡¤ÃÑé§¡è͹·Õè¤Ø³¨Ð·Ó¡ÒõԴµÑé§ $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "¶éҤسÂÍÁÃѺ¢é͵¡Å§àÃ×èͧÅÔ¢ÊÔ·¸Ôì, ¡´ ©Ñ¹ÂÍÁÃѺ à¾×èÍ·ÓµèÍä», ¤Ø³µéͧÂÍÁÃѺ㹢é͵¡Å§ÅÔ¢ÊÔ·¸Ôìà¾×èÍ·Õè¨Ð·Ó¡ÒõԴµÑé§ $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "¶éҤسÂÍÁÃѺ¢é͵¡Å§àÃ×èͧÅÔ¢ÊÔ·¸, ¡´àÅ×͡㹡Åèͧ¢éÒ§ÅèÒ§¹Õé ¤Ø³µéͧÂÍÁÃѺ㹢é͵¡Å§ÅÔ¢ÊÔ·¸Ôìà¾×èÍ·Õè¨Ð·Ó¡ÒõԴµÑé§ $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "¶éҤسÂÍÁÃѺ¢é͵¡Å§àÃ×èͧÅÔ¢ÊÔ·¸, àÅ×Í¡µÑÇàÅ×Í¡áá´éÒ¹ÅèÒ§¹Õé ¤Ø³µéͧÂÍÁÃѺ㹢é͵¡Å§ÅÔ¢ÊÔ·¸Ôìà¾×èÍ·Õè¨Ð·Ó¡ÒõԴµÑé§ $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "¢é͵¡Å§àÃ×èͧÅÔ¢ÊÔ·¸Ôì"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "¡ÃسÒÍèÒ¹¢é͵¡Å§´éÒ¹ÅÔ¢ÊÔ·¸Ôì¡è͹µÔ´µÑé§â»Ãá¡ÃÁ $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "¶éҤسÂÍÁÃѺ㹢é͵¡Å§¹Õé ¡ÃØ³Ò¡´»ØèÁ ©Ñ¹ÂÍÁÃѺ áÅФس¨Ðµéͧµ¡Å§¡è͹·Õè¨ÐàÃÔèÁ¡ÒáàÅÔ¡µÔ´µÑé§â»Ãá¡ÃÁ $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "¶éҤسÂÍÁÃѺ¢é͵¡Å§àÃ×èͧÅÔ¢ÊÔ·¸Ôì, ¡´àÅ×͡㹡Åèͧ¢éÒ§ÅèÒ§¹Õé ¤Ø³µéͧÂÍÁÃѺ㹢é͵¡Å§ÅÔ¢ÊÔ·¸Ôìà¾×èÍ·Õè¨Ð·Ó¡ÒõԴµÑé§ $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "¶éҤسÂÍÁÃѺ¢é͵¡Å§àÃ×èͧÅÔ¢ÊÔ·¸Ôì, àÅ×Í¡µÑÇàÅ×Í¡áá´éÒ¹ÅèÒ§¹Õé ¤Ø³µéͧÂÍÁÃѺ㹢é͵¡Å§ÅÔ¢ÊÔ·¸Ôìà¾×èÍ·Õè¨Ð·Ó¡ÒõԴµÑé§ $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "¡´ Page Down à¾×èÍÍèÒ¹¢é͵¡Å§·Ñé§ËÁ´"
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "àÅ×Í¡Êèǹ»ÃСͺ"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "àÅ×Í¡ÊÔè§·Õè¤Ø³µéͧ¡ÒÃãªé§Ò¹¨Ò¡ $(^NameDA) ·Õè¤Ø³µéͧ¡ÒõԴµÑé§"
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "ÃÒÂÅÐàÍÕ´"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "àÅ×Í¡Êèǹ»ÃСͺ"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "àÅ×Í¡ÊÔè§·Õè¤Ø³µéͧ¡ÒÃãªé§Ò¹¨Ò¡ $(^NameDA) ·Õè¤Ø³µéͧ¡àÅÔ¡¡ÒõԴµÑé§"
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "¢ÂѺàÁÒÊì¢Í§¤Ø³à˹×ÍÊèǹ»ÃСͺà¾×èÍ´ÙÃÒÂÅÐàÍÕ´"
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "¢ÂѺàÁÒÊì¢Í§¤Ø³à˹×ÍÊèǹ»ÃСͺà¾×èÍ´ÙÃÒÂÅÐàÍÕ´"
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "àÅ×Í¡·Õè·Õèµéͧ¡ÒõԴµÑé§"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "àÅ×Í¡á¼éÁ·Õèµéͧ¡ÒõԴµÑé§ $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "àÅ×Í¡á¿éÁ·Õèµéͧ¡ÒáàÅÔ¡¡ÒõԴµÑé§"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "àÅ×Í¡á¿éÁ·Õè¤Ø³µéͧ¡ÒáàÅÔ¡¡ÒõԴµÑ駢ͧ $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "¡ÓÅѧµÔ´µÑé§"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "â»Ã´ÃÍã¹¢³Ð·Õè $(^NameDA) ¡ÓÅѧ¶Ù¡µÔ´µÑé§"
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "¡ÒõԴµÑé§àÊÃç¨ÊÔé¹"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "¡ÒõԴµÑé§àÊÃç¨ÊÁºÙóì"
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "¡ÒõԴµÑ駶١¡àÅÔ¡"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "¡ÒõԴµÑé§äÁèàÊÃç¨ÊÁºÙóì"
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "¡ÓÅѧ¡àÅÔ¡¡ÒõԴµÑé§"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "â»Ã´ÃÍã¹¢³Ð·Õè $(^NameDA) ¡ÓÅѧ¶Ù¡Â¡àÅÔ¡¡ÒõԴµÑé§."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "¡ÒáàÅÔ¡¡ÒõԴµÑé§àÊÃç¨ÊÔé¹"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "¡ÒáàÅÔ¡¡ÒõԴµÑé§àÊÃç¨ÊÔé¹â´ÂÊÁºÙóì"
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "¡ÒáàÅÔ¡¡ÒõԴµÑ駶١¡àÅÔ¡"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "¡ÒáàÅÔ¡¡ÒõԴµÑé§äÁèÊÓàÃç¨"
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "¡ÒõԴµÑé§ÍѵÔâ¹ÁѵԢͧ $(^NameDA) ¡ÓÅѧàÊÃç¨ÊÔé¹"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ä´é¶Ù¡µÔ´µÑé§Å§ã¹à¤Ã×èͧ¤ÍÁ¾ÔÇàµÍÃì¢Í§¤Ø³áÅéÇ$\r$\n$\r$\n¡´ àÊÃç¨ÊÔé¹à¾×èͻԴµÑǵԴµÑé§ÍѵÔâ¹ÁѵÔ"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "à¤Ã×èͧ¤ÍÁ¾ÔÇàµÍÃì¢Í§¤Ø³¨Óà»ç¹µéͧÃÕʵÒ÷ìà¾×èÍ¡ÒõԴµÑ駢ͧ $(^NameDA) ¨ÐàÃÕºÃéÍÂ, ¤Ø³µéͧ¡ÒèРÃÕºÙ· à´ÕëÂǹÕéäËÁ?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "¡ÒáàÅÔ¡¡ÒõԴµÑé§ÍѵÔâ¹ÁѵԢͧ $(^NameDA) ¡ÓÅѧàÊÃç¨ÊÁºÙóì"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ä´é¶Ù¡Â¡àÅÔ¡ÍÍ¡¨Ò¡à¤Ã×èͧ¤ÍÁ¾ÔÇàµÍÃì¢Í§¤Ø³áÅéÇ $\r$\n$\r$\n¡´ àÊÃç¨ÊÔé¹ à¾×èͻԴ˹éҨ͵ԴµÑé§ÍѵÔâ¹ÁѵÔ"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "à¤Ã×èͧ¤ÍÁ¾ÔÇàµÍÃì¢Í§¤Ø³¨Óà»ç¹µéͧÃÕʵÒÃì·ã¹¡Ò÷Õè¨Ð·Ó¡ÒáàÅÔ¡¡ÒõԴµÑ駢ͧ $(^NameDA) àÊÃç¨ÊÔé¹, ¤Ø³µéͧ¡ÒèÐÃÕºÙ·à´ÕëÂǹÕéäËÁ?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "ÃÕºÙ· à´ÕëÂǹÕé"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "©Ñ¹µéͧ¡Òà ÃÕºÙ·´éǵ¹àͧ ·ÕËÅѧ"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Ãѹ $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&áÊ´§ÃÒÂÅÐàÍÕ´"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&àÊÃç¨ÊÔé¹"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "àÅ×Í¡á¿éÁ Start Menu"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "àÅ×Í¡á¿éÁ Start Menu à¾×èÍÊÃéÒ§ªÍÃ쵤ѷ¢Í§ $(^NameDA). "
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "àÅ×Í¡á¼éÁ Start Menu ·Õè¤Ø³µéͧ¡ÒèÐÊÃéÒ§ªÍÃ쵤ѷ¢Í§â»Ãá¡ÃÁ, ¤Ø³ÂѧÊÒÁÒö¡Ó˹´ª×èÍà¾×èÍÊÃéÒ§á¿éÁãËÁèä´éÍÕ¡´éÇÂ"
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "äÁèµéͧÊÃéÒ§ ªÍÃ쵤ѷ"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "¡àÅÔ¡¡ÒõԴµÑé§ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "¡àÅÔ¡¡ÒõԴµÑé§ $(^NameDA) ¨Ò¡à¤Ã×èͧ¤ÍÁ¾ÔÇàµÍÃì¢Í§¤Ø³"
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "¤Ø³á¹èã¨ËÃ×ÍÇèҤسµéͧ¡ÒèÐÍÍ¡¨Ò¡¡ÒõԴµÑ駢ͧ $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "¤Ø³á¹èã¨ËÃ×ÍÇèҤسµéͧ¡ÒÃÍÍ¡¨Ò¡¡ÒáàÅÔ¡¡ÒõԴµÑ駢ͧ $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/TradChinese.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/TradChinese.nlf
new file mode 100644
index 000000000..a335319eb
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/TradChinese.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1028
+# Font and size - dash (-) means default ¦r«¬¦WºÙ»P¤j¤p
+·s²Ó©úÅé
+9
+# Codepage - dash (-) means ANSI code page ANSI ¦r½X¶
+950
+# RTL - anything else than RTL means LTR ¥Ñ¥k¦Ü¥ª®Ñ¼g
+-
+# Translator: Kii Ali ;Revision date: 2004-12-14
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) ¦w¸Ë
+# ^UninstallCaption
+$(^Name) ¸Ñ°£¦w¸Ë
+# ^LicenseSubCaption
+: ±ÂÅv¨óij
+# ^ComponentsSubCaption
+: ¦w¸Ë¿ï¶µ
+# ^DirSubCaption
+: ¦w¸Ë¸ê®Æ§¨
+# ^InstallingSubCaption
+: ¥¿¦b¦w¸Ë
+# ^CompletedSubCaption
+: ¤w§¹¦¨
+# ^UnComponentsSubCaption
+: ¸Ñ°£¦w¸Ë¿ï¶µ
+# ^UnDirSubCaption
+: ¸Ñ°£¦w¸Ë¸ê®Æ§¨
+# ^ConfirmSubCaption
+: ½T»{
+# ^UninstallingSubCaption
+: ¥¿¦b¸Ñ°£¦w¸Ë
+# ^UnCompletedSubCaption
+: §¹¦¨
+# ^BackBtn
+< ¤W¤@¨B(&P)
+# ^NextBtn
+¤U¤@¨B(&N) >
+# ^AgreeBtn
+§Ú±µ¨ü(&I)
+# ^AcceptBtn
+§Ú±µ¨ü¡u±ÂÅv¨óij¡v¤¤ªº±ø´Ú(&A)
+# ^DontAcceptBtn
+§Ú¤£±µ¨ü¡u±ÂÅv¨óij¡v¤¤ªº±ø´Ú(&N)
+# ^InstallBtn
+¦w¸Ë(&I)
+# ^UninstallBtn
+²¾°£(&U)
+# ^CancelBtn
+¨ú®ø(&C)
+# ^CloseBtn
+Ãö³¬(&L)
+# ^BrowseBtn
+ÂsÄý(&B)...
+# ^ShowDetailsBtn
+Åã¥Ü²Ó¸`(&D)
+# ^ClickNext
+«ö¤@¤U [¤U¤@¨B(N)] Ä~Äò¡C
+# ^ClickInstall
+«ö¤@¤U [¦w¸Ë(I)] ¶}©l¦w¸Ë¶iµ{¡C
+# ^ClickUninstall
+«ö¤@¤U [¸Ñ°£¦w¸Ë(U)] ¶}©l¸Ñ°£¦w¸Ë¶iµ{¡C
+# ^Name
+¦WºÙ
+# ^Completed
+¤w§¹¦¨
+# ^LicenseText
+¦b¦w¸Ë $(^NameDA) ¤§«e½ÐÀ˾\±ÂÅv¨óij¡C¦pªG§A±µ¨ü¨óij¤¤©Ò¦³±ø´Ú¡A«ö¤@¤U [§Ú¦P·N(I)] ¡C
+# ^LicenseTextCB
+¦b¦w¸Ë $(^NameDA) ¤§«e½ÐÀ˾\±ÂÅv¨óij¡C¦pªG§A±µ¨ü¨óij¤¤©Ò¦³±ø´Ú¡A«ö¤@¤U¤U¤èªº¤Ä¿ï®Ø¡C $_CLICK
+# ^LicenseTextRB
+¦b¦w¸Ë $(^NameDA) ¤§«e½ÐÀ˾\±ÂÅv¨óij¡C¦pªG§A±µ¨ü¨óij¤¤©Ò¦³±ø´Ú¡A¿ï¾Ü¤U¤èªº²Ä¤@Ó¿ï¶µ¡C $_CLICK
+# ^UnLicenseText
+¦b¸Ñ°£¦w¸Ë $(^NameDA) ¤§«e½ÐÀ˾\±ÂÅv¨óij¡C¦pªG§A±µ¨ü¨óij¤¤©Ò¦³±ø´Ú¡A«ö¤@¤U [§Ú¦P·N(I)] ¡C
+# ^UnLicenseTextCB
+¦b¸Ñ°£¦w¸Ë $(^NameDA) ¤§«e½ÐÀ˾\±ÂÅv¨óij¡C¦pªG§A±µ¨ü¨óij¤¤©Ò¦³±ø´Ú¡A«ö¤@¤U¤U¤èªº¤Ä¿ï®Ø¡C $_CLICK
+# ^UnLicenseTextRB
+¦b¸Ñ°£¦w¸Ë $(^NameDA) ¤§«e½ÐÀ˾\±ÂÅv¨óij¡C¦pªG§A±µ¨ü¨óij¤¤©Ò¦³±ø´Ú¡A¿ï¾Ü¤U¤èªº²Ä¤@Ó¿ï¶µ¡C $_CLICK
+# ^Custom
+¦Ûq
+# ^ComponentsText
+¤Ä¿ï§A·Qn¦w¸Ëªº¤¸¥ó¡A¨Ã¸Ñ°£¤Ä¿ï§A¤£§Æ±æ¦w¸Ëªº¤¸¥ó¡C $_CLICK
+# ^ComponentsSubText1
+¿ï¨ú¦w¸ËªºÃþ«¬:
+# ^ComponentsSubText2_NoInstTypes
+¿ï¨ú¦w¸Ëªº¤¸¥ó:
+# ^ComponentsSubText2
+©ÎªÌ¡A¦Ûq¿ï¨ú·Q¦w¸Ëªº¤¸¥ó:
+# ^UnComponentsText
+¤Ä¿ï§A·Qn¸Ñ°£¦w¸Ëªº¤¸¥ó¡A¨Ã¸Ñ°£¤Ä¿ï§A¤£§Æ±æ¸Ñ°£¦w¸Ëªº¤¸¥ó¡C $_CLICK
+# ^UnComponentsSubText1
+¿ï¾Ü¸Ñ°£¦w¸ËªºÃþ«¬:
+# ^UnComponentsSubText2_NoInstTypes
+¿ï¾Ün¸Ñ°£¦w¸Ëªº¤¸¥ó:
+# ^UnComponentsSubText2
+©Î¬O¡A¿ï¾Ü·Qn¸Ñ°£¦w¸Ëªº¥i¿ï¶µ¤¸¥ó:
+# ^DirText
+Setup ±N¦w¸Ë $(^NameDA) ¦b¤U¦C¸ê®Æ§¨¡Cn¦w¸Ë¨ì¤£¦P¸ê®Æ§¨¡A«ö¤@¤U [ÂsÄý(B)] ¨Ã¿ï¾Ü¨ä¥Lªº¸ê®Æ§¨¡C $_CLICK
+# ^DirSubText
+¥Ø¼Ð¸ê®Æ§¨
+# ^DirBrowseText
+¿ï¾Ün¦w¸Ë $(^NameDA) ªº¸ê®Æ§¨¦ì¸m:
+# ^UnDirText
+Setup ±N¸Ñ°£¦w¸Ë $(^NameDA) ¦b¤U¦C¸ê®Æ§¨¡Cn¸Ñ°£¦w¸Ë¨ì¤£¦P¸ê®Æ§¨¡A«ö¤@¤U [ÂsÄý(B)] ¨Ã¿ï¾Ü¨ä¥Lªº¸ê®Æ§¨¡C $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+¿ï¾Ün¸Ñ°£¦w¸Ë $(^NameDA) ªº¸ê®Æ§¨¦ì¸m:
+# ^SpaceAvailable
+"¥i¥ÎªÅ¶¡: "
+# ^SpaceRequired
+"©Ò»ÝªÅ¶¡: "
+# ^UninstallingText
+³oÓºëÆF±N±q§Aªº¹q¸£¸Ñ°£¦w¸Ë $(^NameDA) ¡C $_CLICK
+# ^UninstallingSubText
+¸Ñ°£¦w¸Ë¥Ø¿ý:
+# ^FileError
+µLªk¶}±Òn¼g¤JªºÀÉ®×: \r\n\t"$0"\r\n«ö¤@¤U [Abort] ©ñ±ó¦w¸Ë¡A\r\n [Retry] «·s¹Á¸Õ¼g¤JÀɮסA©Î\r\n [Ignore] ©¿²¤³oÓÀɮסC
+# ^FileError_NoIgnore
+µLªk¶}±Òn¼g¤JªºÀÉ®×: \r\n\t"$0"\r\n«ö¤@¤U [Retry] «·s¹Á¸Õ¼g¤JÀɮסA©Î\r\n [Cancel] ¨ú®ø¦w¸Ë¡C
+# ^CantWrite
+"µLªk¼g¤J: "
+# ^CopyFailed
+"½Æ»s¥¢±Ñ "
+# ^CopyTo
+"½Æ»s¨ì: "
+# ^Registering
+"¥¿¦bµù¥U: "
+# ^Unregistering
+"¥¿¦b¸Ñ°£µù¥U: "
+# ^SymbolNotFound
+"µLªk§ä¨ì²Å¸¹: "
+# ^CouldNotLoad
+"µLªk¸ü¤J: "
+# ^CreateFolder
+"«Ø¥ß¸ê®Æ§¨: "
+# ^CreateShortcut
+"«Ø¥ß±¶®|: "
+# ^CreatedUninstaller
+"«Ø¥ß¸Ñ°£¦w¸Ëµ{¦¡: "
+# ^Delete
+"§R°£ÀÉ®×: "
+# ^DeleteOnReboot
+"«·s±Ò°Ê«á§R°£: "
+# ^ErrorCreatingShortcut
+"¥¿¦b«Ø¥ß±¶®|®Éµo¥Í¿ù»~: "
+# ^ErrorCreating
+"¥¿¦b«Ø¥ß®Éµo¥Í¿ù»~: "
+# ^ErrorDecompressing
+"¥¿¦b¸ÑÀ£ÁY¸ê®Æµo¥Í¿ù»~¡I¤w·lÃaªº¦w¸Ëµ{¦¡¡H"
+# ^ErrorRegistering
+"¥¿¦bµù¥U DLL ®Éµo¥Í¿ù»~"
+# ^ExecShell
+"°õ¦æ¥~³¡µ{¦¡: "
+# ^Exec
+"°õ¦æ: "
+# ^Extract
+"©â¨ú: "
+# ^ErrorWriting
+"©â¨ú: µLªk¼g¤JÀÉ®× "
+# ^InvalidOpcode
+"¦w¸Ë·l·´: µL®Äªº§@·~¥N½X "
+# ^NoOLE
+"¨S¦³ OLE ¥Î©ó: "
+# ^OutputFolder
+"¿é¥X¥Ø¿ý: "
+# ^RemoveFolder
+"²¾°£¥Ø¿ý: "
+# ^RenameOnReboot
+"«·s±Ò°Ê«á«·s©R¦W: "
+# ^Rename
+"«·s©R¦W: "
+# ^Skipped
+"¤w²¤¹L: "
+# ^CopyDetails
+"½Æ»s²Ó¸`¨ì°Å¶Kï "
+# ^LogInstall
+"¤é»x¦w¸Ë¶iµ{"
+# byte
+B
+# kilo
+K
+# mega
+M
+# giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/TradChinese.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/TradChinese.nsh
new file mode 100644
index 000000000..df6ae58bf
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/TradChinese.nsh
@@ -0,0 +1,122 @@
+;Language: 'Chinese (Traditional)' (1028)
+;Translator: Kii Ali
+;Revision date: 2004-12-15
+
+!insertmacro LANGFILE "TradChinese" "Chinese (Traditional)"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Åwªï¨Ï¥Î $(^NameDA) ¦w¸ËºëÆF"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "³oÓºëÆF±N«ü¤Þ§A§¹¦¨ $(^NameDA) ªº¦w¸Ë¶iµ{¡C$\r$\n$\r$\n¦b¶}©l¦w¸Ë¤§«e¡A«ØÄ³¥ýÃö³¬¨ä¥L©Ò¦³À³¥Îµ{¦¡¡C³o±N¤¹³\\¡u¦w¸Ëµ{¦¡¡v§ó·s«ü©wªº¨t²ÎÀɮסA¦Ó¤£»Ýn«·s±Ò°Ê§Aªº¹q¸£¡C$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Åwªï¨Ï¥Î $(^NameDA) ¸Ñ°£¦w¸ËºëÆF"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "³oÓºëÆF±N¥þµ{«ü¤Þ§A $(^NameDA) ªº¸Ñ°£¦w¸Ë¶iµ{¡C$\r$\n$\r$\n¦b¶}©l¸Ñ°£¦w¸Ë¤§«e¡A½T»{ $(^NameDA) ¨Ã¥¼°õ¦æ·í¤¤¡C$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "±ÂÅv¨óij"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "¦b¦w¸Ë $(^NameDA) ¤§«e¡A½ÐÀ˾\±ÂÅv±ø´Ú¡C"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "¦pªG§A±µ¨ü¨óij¤¤ªº±ø´Ú¡A«ö¤@¤U [§Ú¦P·N(I)] Ä~Äò¦w¸Ë¡C¦pªG§A¿ï¨ú [¨ú®ø(C)] ¡A¦w¸Ëµ{¦¡±N·|Ãö³¬¡C¥²¶·n±µ¨ü¨óij¤~¯à¦w¸Ë $(^NameDA) ¡C"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "¦pªG§A±µ¨ü¨óij¤¤ªº±ø´Ú¡A«ö¤@¤U¤U¤èªº¤Ä¿ï®Ø¡C¥²¶·n±µ¨ü¨óij¤~¯à¦w¸Ë $(^NameDA)¡C$_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "¦pªG§A±µ¨ü¨óij¤¤ªº±ø´Ú¡A¿ï¾Ü¤U¤è²Ä¤@Ó¿ï¶µ¡C¥²¶·n±µ¨ü¨óij¤~¯à¦w¸Ë $(^NameDA)¡C$_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "±ÂÅv¨óij"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "¦b¸Ñ°£¦w¸Ë $(^NameDA) ¤§«e¡A½ÐÀ˾\±ÂÅv±ø´Ú¡C"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "¦pªG§A±µ¨ü¨óij¤¤ªº±ø´Ú¡A«ö¤@¤U [§Ú¦P·N(I)] Ä~Äò¸Ñ°£¦w¸Ë¡C¦pªG§A¿ï¨ú [¨ú®ø(C)] ¡A¦w¸Ëµ{¦¡±N·|Ãö³¬¡C¥²¶·n±µ¨ü¨óij¤~¯à¸Ñ°£¦w¸Ë $(^NameDA) ¡C"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "¦pªG§A±µ¨ü¨óij¤¤ªº±ø´Ú¡A«ö¤@¤U¤U¤èªº¤Ä¿ï®Ø¡C¥²¶·n±µ¨ü¨óij¤~¯à¸Ñ°£¦w¸Ë $(^NameDA)¡C$_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "¦pªG§A±µ¨ü¨óij¤¤ªº±ø´Ú¡A¿ï¾Ü¤U¤è²Ä¤@Ó¿ï¶µ¡C¥²¶·n±µ¨ü¨óij¤~¯à¸Ñ°£¦w¸Ë $(^NameDA)¡C$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "À˾\¨óijªº¨ä¾l³¡¤À¡A½Ð«ö [PgDn] ©¹¤U±²°Ê¶±¡C"
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "¿ï¾Ü¤¸¥ó"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "¿ï¾Ü§A·Qn¦w¸Ë $(^NameDA) ªº¨º¨Ç¥\¯à¡C"
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "´yz"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "¿ï¨ú¤¸¥ó"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "¿ï¨ú $(^NameDA) ·í¤¤§A·Qn¸Ñ°£¦w¸Ëªº¥\¯à¡C"
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "²¾°Ê§Aªº·Æ¹««ü¼Ð¨ì¤¸¥ó¤§¤W¡A«K¥i¨£¨ì¥¦ªº´yz¡C"
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "²¾°Ê§Aªº·Æ¹««ü¼Ð¨ì¤¸¥ó¤§¤W¡A«K¥i¨£¨ì¥¦ªº´yz¡C"
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "¿ï¨ú¦w¸Ë¦ì¸m"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "¿ï¨ú $(^NameDA) n¦w¸Ëªº¸ê®Æ§¨¡C"
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "¿ï¨ú¸Ñ°£¦w¸Ë¦ì¸m"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "¿ï¨ú $(^NameDA) n¸Ñ°£¦w¸Ëªº¸ê®Æ§¨¡C"
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "¥¿¦b¦w¸Ë"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA) ¥¿¦b¦w¸Ë¡A½Ðµ¥Ô¡C"
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "¦w¸Ë§¹¦¨"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "¦w¸Ëµ{¦¡¤w¦¨¥\¦a°õ¦æ§¹¦¨¡C"
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "¦w¸Ë¤v¤¤¤î"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "¦w¸Ëµ{¦¡¨Ã¥¼¦¨¥\¦a°õ¦æ§¹¦¨¡C"
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "¥¿¦b¸Ñ°£¦w¸Ë"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) ¥¿¦b¸Ñ°£¦w¸Ë¡A½Ðµ¥Ô¡C"
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "¸Ñ°£¦w¸Ë¤w§¹¦¨"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "¸Ñ°£¦w¸Ëµ{¦¡¤w¦¨¥\¦a°õ¦æ§¹¦¨¡C"
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "¸Ñ°£¦w¸Ë¤w¤¤¤î"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "¸Ñ°£¦w¸Ëµ{¦¡¨Ã¥¼¦¨¥\¦a°õ¦æ§¹¦¨¡C"
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "¥¿¦b§¹¦¨ $(^NameDA) ¦w¸ËºëÆF"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ¤w¦w¸Ë¦b§Aªº¨t²Î¡C$\r$\n«ö¤@¤U [§¹¦¨(F)] Ãö³¬¦¹ºëÆF¡C"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "§Aªº¨t²Î»Ýn«·s±Ò°Ê¡A¥H«K§¹¦¨ $(^NameDA) ªº¦w¸Ë¡C²{¦bn«·s±Ò°Ê¶Ü¡H"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "¥¿¦b§¹¦¨ $(^NameDA) ¸Ñ°£¦w¸ËºëÆF"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ¤w±q§Aªº¹q¸£¸Ñ°£¦w¸Ë¡C$\r$\n$\r$\n«ö¤@¤U [§¹¦¨] Ãö³¬³oÓºëÆF¡C"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "¹q¸£»Ýn«·s±Ò°Ê¡A¥H«K§¹¦¨ $(^NameDA) ªº¸Ñ°£¦w¸Ë¡C²{¦b·Qn«·s±Ò°Ê¶Ü¡H"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "¬O¡A²{¦b«·s±Ò°Ê(&Y)"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "§_¡A§Úµy«á¦A¦Û¦æ«·s±Ò°Ê(&N)"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "°õ¦æ $(^NameDA)(&R)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Åã¥Ü¡uŪ§ÚÀɮסv(&M)"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "§¹¦¨(&F)"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "¿ï¾Ü¡u¶}©l¥\¯àªí¡v¸ê®Æ§¨"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "¿ï¾Ü¡u¶}©l¥\¯àªí¡v¸ê®Æ§¨¡A¥Î©óµ{¦¡ªº±¶®|¡C"
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "¿ï¾Ü¡u¶}©l¥\¯àªí¡v¸ê®Æ§¨¡A¥H«K«Ø¥ßµ{¦¡ªº±¶®|¡C§A¤]¥i¥H¿é¤J¦WºÙ¡A«Ø¥ß·s¸ê®Æ§¨¡C"
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "¤£n«Ø¥ß±¶®|(&N)"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "¸Ñ°£¦w¸Ë $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "±q§Aªº¹q¸£¸Ñ°£¦w¸Ë $(^NameDA) ¡C"
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "§A½T©wnÂ÷¶} $(^Name) ¦w¸Ëµ{¦¡¡H"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "§A½T©wnÂ÷¶} $(^Name) ¸Ñ°£¦w¸Ë¶Ü¡H"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Turkish.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Turkish.nlf
new file mode 100644
index 000000000..964ef20c2
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Turkish.nlf
@@ -0,0 +1,192 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1055
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1254
+# RTL - anything else than RTL means LTR
+-
+# Translation by ?atay Dilsiz(chagy) (amigos_cagi@hotmail.com)
+# Corrections by Mozilla Türkiye Yerelleþtirme Topluluðu tarafýndan çevrilmiþtir. http://mozilla.org.tr
+# ^Branding
+Nullsoft Kurulum Sistemi %s
+# ^SetupCaption
+$(^Name) Kurulumu
+# ^UninstallCaption
+$(^Name) Kaldýrma
+# ^LicenseSubCaption
+: Lisans Sözleþmesi
+# ^ComponentsSubCaption
+: Kurulum Seçenekleri
+# ^DirSubCaption
+: Kurulum Dizini
+# ^InstallingSubCaption
+: Kuruluyor
+# ^CompletedSubCaption
+: Tamamlandý
+# ^UnComponentsSubCaption
+: Kaldýrma Seçenekleri
+# ^UnDirSubCaption
+: Kaldýrýlacak Dizin
+# ^ConfirmSubCaption
+: Onay
+# ^UninstallingSubCaption
+: Kaldýrýlýyor
+# ^UnCompletedSubCaption
+: Tamamlandý
+# ^BackBtn
+< &Geri
+# ^NextBtn
+Ý&leri >
+# ^AgreeBtn
+&Kabul Ediyorum
+# ^AcceptBtn
+Lisans Sözleþmesi'nin koþullarýný &kabul ediyorum
+# ^DontAcceptBtn
+Lisans Sözleþmesi'nin koþullarýný kabul et&miyorum
+# ^InstallBtn
+&Kur
+# ^UninstallBtn
+&Kaldýr
+# ^CancelBtn
+Vazgeç
+# ^CloseBtn
+&Kapat
+# ^BrowseBtn
+&Gözat...
+# ^ShowDetailsBtn
+&Ayrýntýlarý göster
+# ^ClickNext
+Devam etmek için Ýleri düðmesine basýn.
+# ^ClickInstall
+Kurulumu baþlatmak için Kur düðmesine basýn.
+# ^ClickUninstall
+Kaldýrmayý baþlatmak için Kaldýr düðmesine basýn.
+# ^Name
+Ad
+# ^Completed
+Tamamlandý
+# ^LicenseText
+Lütfen $(^NameDA) uygulamasýný kurmadan önce lisans sözleþmesini gözden geçirin. Sözleþmedeki bütün koþullarý kabul ediyorsanýz Kabul Ediyorum düðmesine basýn.
+# ^LicenseTextCB
+Lütfen $(^NameDA) uygulamasýný kurmadan önce lisans sözleþmesini gözden geçirin. Sözleþmedeki bütün koþullarý kabul ediyorsanýz aþaðýdaki kutuya iþaret koyun. $_CLICK
+# ^LicenseTextRB
+Lütfen $(^NameDA) uygulamasýný kurmadan önce lisans sözleþmesini gözden geçirin. Sözleþmedeki bütün koþullarý kabul ediyorsanýz aþaðýdaki ilk seçeneði seçin. $_CLICK
+# ^UnLicenseText
+Lütfen $(^NameDA) uygulamasýný kaldýrmadan önce lisans sözleþmesini gözden geçirin. Sözleþmedeki bütün koþullarý kabul ediyorsanýz Kabul Ediyorum düðmesine basýn.
+# ^UnLicenseTextCB
+Lütfen $(^NameDA) uygulamasýný kaldýrmadan önce lisans sözleþmesini gözden geçirin. Sözleþmedeki bütün koþullarý kabul ediyorsanýz aþaðýdaki kutuya iþaret koyun. $_CLICK
+# ^UnLicenseTextRB
+Lütfen $(^NameDA) uygulamasýný kaldýrmadan önce lisans sözleþmesini gözden geçirin. Sözleþmedeki bütün koþullarý kabul ediyorsanýz aþaðýdaki ilk seçeneði seçin. $_CLICK
+# ^Custom
+Özel
+# ^ComponentsText
+Kurmak istediðiniz bileþenleri iþaretleyip kurmak istemediklerinizi iþaretlemeden býrakýn. $_CLICK
+# ^ComponentsSubText1
+Kurulum türünü seçin:
+# ^ComponentsSubText2_NoInstTypes
+Kurulacak bileþenleri seçin:
+# ^ComponentsSubText2
+ya da isteðe baðlý olarak kurmak istediðiniz bileþenleri seçin:
+# ^UnComponentsText
+Kaldýrmak istediðiniz bileþenleri iþaretleyip kaldýrmak istemediklerinizi iþaretlemeden býrakýn. $_CLICK
+# ^UnComponentsSubText1
+Kaldýrma türünü seçin:
+# ^UnComponentsSubText2_NoInstTypes
+Kaldýrýlacak bileþenleri seçin:
+# ^UnComponentsSubText2
+ya da isteðe baðlý olarak kaldýrmak istediðiniz bileþenleri seçin:
+# ^DirText
+$(^NameDA) aþaðýdaki dizinde kurulacak. Farklý bir dizinde kurmak için Gözat düðmesine basýp baþka bir dizin seçin. $_CLICK
+# ^DirSubText
+Hedef Dizin
+# ^DirBrowseText
+$(^NameDA) uygulamasýnýn kurulacaðý dizini seçin:
+# ^UnDirText
+$(^NameDA) aþaðýdaki dizinden kaldýrýlacak. Farklý bir dizinden kaldýrmak için Gözat düðmesine basýp baþka bir dizin seçin. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+$(^NameDA) uygulamasýnýn kaldýrýlacaðý dizini seçin:
+# ^SpaceAvailable
+"Kullanýlabilir boþ alan: "
+# ^SpaceRequired
+"Gereken boþ alan: "
+# ^UninstallingText
+$(^NameDA) aþaðýdaki dizinden kaldýrýlacak. $_CLICK
+# ^UninstallingSubText
+Kaldýrýlan yer:
+# ^FileError
+Dosya yazmak için açýlýrken hata meydana geldi: \r\n\r\n$0\r\n\r\nKurulumu durdurmak için Dur düðmesine,\r\nyeniden denemek için Yeniden Dene düðmesine,\r\nbu dosyayý atlamak için Yoksay düðmesine basýn.
+# ^FileError_NoIgnore
+Dosya yazmak için açýlýrken hata meydana geldi: \r\n\r\n$0\r\n\r\nYeniden denemek için Yeniden Dene düðmesine,\r\nkurulumu durdurmak için Vazgeç düðmesine basýn.
+# ^CantWrite
+"Yazýlamadý: "
+# ^CopyFailed
+Kopyalama baþarýsýz oldu
+# ^CopyTo
+"Kayýt: "
+# ^Registering
+"Kaydediliyor: "
+# ^Unregistering
+"Kayýt siliniyor: "
+# ^SymbolNotFound
+"Simge bulunamadý: "
+# ^CouldNotLoad
+"Yüklenemedi: "
+# ^CreateFolder
+"Dizin oluþtur: "
+# ^CreateShortcut
+"Kýsayol oluþtur: "
+# ^CreatedUninstaller
+"Kaldýrma uygulamasý oluþtur: "
+# ^Delete
+"Dosya sil: "
+# ^DeleteOnReboot
+"Açýlýþta sil: "
+# ^ErrorCreatingShortcut
+"Kýsayol oluþturulurken hata meydana geldi: "
+# ^ErrorCreating
+"Oluþturma hatasý: "
+# ^ErrorDecompressing
+Veriyi açarken hata meydana geldi! Acaba kurulum uygulamasý mý bozuk?
+# ^ErrorRegistering
+DLL kaydedilirken hata meydana geldi
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Çalýþtýr: "
+# ^Extract
+"Aç: "
+# ^ErrorWriting
+"Açma: Dosyaya yazarken hata meydana geldi "
+# ^InvalidOpcode
+Kurulum bozuk: Geçersiz kod
+# ^NoOLE
+"OLE yok: "
+# ^OutputFolder
+"Çýktý dizini: "
+# ^RemoveFolder
+"Dizini sil: "
+# ^RenameOnReboot
+"Açýlýþta adýný deðiþtir: "
+# ^Rename
+"Ad deðiþtir: "
+# ^Skipped
+"Atlandý: "
+# ^CopyDetails
+Ayrýntýlarý panoya kopyala
+# ^LogInstall
+Kurulum sürecinin kaydýný tut
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Turkish.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Turkish.nsh
new file mode 100644
index 000000000..e699c6644
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Turkish.nsh
@@ -0,0 +1,122 @@
+;Language: Turkish (1055)
+;By Çagatay Dilsiz(Chagy)
+;Updated by Fatih BOY (fatih_boy@yahoo.com)
+
+!insertmacro LANGFILE "Turkish" "Türkçe"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) Kurulum sihirbazýna hoþ geldiniz"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Bu sihirbaz size $(^NameDA) kurulumu boyunca rehberlik edecektir.$\r$\n$\r$\nKurulumu baþlatmadan önce çalýþan diðer programlari kapatmanýzý öneririz. Böylece bilgisayarýnýzý yeniden baþlatmadan bazý sistem dosyalarý sorunsuz kurulabilir.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) Programýný Kaldýrma Sihirbazýna Hoþ Geldiniz"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Bu sihirbaz size $(^NameDA) programýnýn kadýrýlýmý boyunca rehberlik edecektir.$\r$\n$\r$\nKaldýrým iþlemeni baþlatmadan önce çalýþan diðer programlari kapatmanýzý öneririz. Böylece bilgisayarýnýzý yeniden baþlatmadan bazý sistem dosyalarý sorunsuz kaldýrýlabilir.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisans Sözleþmesi"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lütfen $(^NameDA) programýný kurmadan önce sözleþmeyi okuyunuz."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Sözleþme koþullarýný kabul ediyorsanýz, 'Kabul Ediyorum'a basýnýz. $(^NameDA) programýný kurmak için sözleþme koþullarýný kabul etmelisiniz."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Sözleþme koþullarýný kabul ediyorsanýz, aþaðýdaki onay kutusunu doldurunuz. $(^NameDA) programýný kurmak için sözleþme koþullarýný kabul etmelisiniz. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Sözleþme koþullarýný kabul ediyorsanýz, asagidaki onay düðmesini seçiniz. $(^NameDA) programýný kurmak için sözleþme koþullarýný kabul etmelisiniz. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisans Sözleþmesi"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lütfen $(^NameDA) programýný sisteminizden kaldýrmadan önce sözleþmeyi okuyunuz."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Sözleþme koþullarýný kabul ediyorsanýz, 'Kabul Ediyorum'a basýnýz. $(^NameDA) programýný sisteminizden kaldýrmak için sözleþme koþullarýný kabul etmelisiniz."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Sözleþme koþullarýný kabul ediyorsanýz, aþaðýdaki onay kutusunu doldurunuz. $(^NameDA) programýný sisteminizden kaldýrmak için sözleþme koþullarýný kabul etmelisiniz. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Sözleþme koþullarýný kabul ediyorsanýz, asagidaki onay düðmesini seçiniz. $(^NameDA) programýný sisteminizden kaldýrmak için sözleþme koþullarýný kabul etmelisiniz. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Sözleþmenin geri kalanýný okumak için 'page down' tuþuna basabilirsiniz."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Bileþen seçimi"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Lütfen $(^NameDA) için kurmak istediginiz bileþenleri seçiniz."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Açýklama"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Bileþen Þeçimi"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Lütfen kaldýrmak istediðiniz $(^NameDA) program bileþenini seçiniz."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Bileþenlerin açýklamalarýný görmek için imleci bileþen üzerine götürün."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Bileþenlerin açýklamalarýný görmek için imleci bileþen üzerine götürün."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Hedef dizini seçimi"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA) programýný kurmak istediðiniz dizini þeçiniz."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Kaldýrýlýcak Dizin Seçimi"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA) programýný kaldýrmak istediginiz dizini seçiniz."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Kuruluyor"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Lütfen $(^NameDA) kurulurken bekleyiniz."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Kurulum Tamamlandý"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Kurulum baþarýyla tamamlandý."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Kurulum Ýptal Edildi"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Kurulum tam olarak tamamlanmadý."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Kaldýrýlýyor"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Litfen $(^NameDA) programý sisteminizden kaldýrýlýrken bekleyiniz."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Kaldýrma Ýþlemi Tamamlandýr"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Kaldýrma iþlemi baþarýyla tamamlandý."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Kaldýrma Ýþlemi Ýptal Edildi"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Kaldýrma Ýþlemi tamamlanamadý."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) Kurulum sihirbazý tamamlanýyor."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) bilgisayariniza yüklendi.$\r$\n$\r$\nLütfen 'Bitir'e basarak kurulumu sonlandýrýn."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) kurulumunun tamamlanmasý için bilgisayarýnýzý yeniden baþlatmanýz gerekiyor.Bilgisayarýnýzý yeniden baþlatmak istiyor musunuz?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) Programý Kaldýrma Sihirbazý Tamamlanýyor"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) programý sisteminizden kaldýrýldý.$\r$\n$\r$\nSihirbazý kapatmak için 'bitir'e basýnýz."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) programýný kaldýrma iþleminin tamamlanmasý için bilgisayarýnýzýn yeniden baþlatýlmasý gerekiyor. Bilgisayarýnýzýn þimdi yeniden baþlatýlmasýný ister misiniz?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Yeniden baþlat"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Bilgisayarýmý daha sonra baþlatacaðým."
+ ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) programýný çalýþtýr"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "beni oku/readme dosyasýný &göster"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Bitir"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Baþlat Menüsü Klasör Seçimi"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "$(^NameDA) kýsayollarýnýn konulacagý baþlat menüsü klasörünü seçiniz."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Programýn kýsayollarýnýn konulacaðý baþlat menüsü klasörünü seçiniz. Farklý bir isim girerek yeni bir klasör yaratabilirsiniz."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Kýsayollarý oluþturmadan devam et"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) Programýný Kaldýr"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) programýný sisteminizden kaldýrma."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "$(^Name) kurulumundan çýkmak istediðinize emin misiniz?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name) Programi Kaldýrma iþleminden çýkmak istediðinize emin misiniz?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Ukrainian.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Ukrainian.nlf
new file mode 100644
index 000000000..5a6b4a936
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Ukrainian.nlf
@@ -0,0 +1,192 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1058
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1251
+# RTL - anything else than RTL means LTR
+-
+# Translation by Yuri Holubow, Nash-Soft.com
+# Corrections by Dmitriy Kononchuk [http://gri3ly.kiev.ua]
+# New corrections by Osidach Vitaly
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+$(^Name) Âñòàíîâëåííÿ
+# ^UninstallCaption
+$(^Name) Âèäàëåííÿ
+# ^LicenseSubCaption
+: ˳öåíç³éíà óãîäà
+# ^ComponentsSubCaption
+: Îïö³¿ âñòàíîâëåííÿ
+# ^DirSubCaption
+: Òåêà âñòàíîâëåííÿ
+# ^InstallingSubCaption
+: Êîï³þâàííÿ ôàéë³â
+# ^CompletedSubCaption
+: Çàâåðøåíî
+# ^UnComponentsSubCaption
+: Îïö³¿ âèäàëåííÿ
+# ^UnDirSubCaption
+: Òåêà âèäàëåííÿ
+# ^ConfirmSubCaption
+: ϳäòâåðæäåííÿ
+# ^UninstallingSubCaption
+: Âèäàëåííÿ ôàéë³â
+# ^UnCompletedSubCaption
+: Çàâåðøåíî
+# ^BackBtn
+< &Íàçàä
+# ^NextBtn
+&Äàë³ >
+# ^AgreeBtn
+&Çãîäåí
+# ^AcceptBtn
+ß &ïðèéìàþ óìîâè ˳öåíç³éíî¿ óãîäè
+# ^DontAcceptBtn
+ß &íå ïðèéìàþ óìîâè ˳öåíç³éíî¿ óãîäè
+# ^InstallBtn
+&Âñòàíîâèòè
+# ^UninstallBtn
+Âèäàëèòè
+# ^CancelBtn
+Ñêàñóâàòè
+# ^CloseBtn
+&Çàêðèòè
+# ^BrowseBtn
+Î&ãëÿä...
+# ^ShowDetailsBtn
+Ïîäðîáèö³
+# ^ClickNext
+Íàòèñí³òü Äàë³ ùîá ïðîäîâæèòè
+# ^ClickInstall
+Íàòèñí³òü Âñòàíîâèòè äëÿ ïî÷àòêó ïðîöåññó âñòàíîâëåííÿ
+# ^ClickUninstall
+Íàòèñí³òü Âèäàëèòü äëÿ ïî÷àòêó ïðîöåññó âèäàëåííÿ
+# ^Name
+²ì'ÿ
+# ^Completed
+Çàâåðøåíî
+# ^LicenseText
+Ïðî÷èòàéòå óìîâè ë³öåíç³éíî¿ óãîäè ïåðåä âñòàíîâëåííÿì $(^NameDA). ßêùî Âè ïðèéìàºòå óìîâè óãîäè, íàòèñí³òü íà êíîïêó Çãîäåí.
+# ^LicenseTextCB
+Ïðî÷èòàéòå óìîâè ë³öåíç³éíî¿ óãîäè ïåðåä âñòàíîâëåííÿì $(^NameDA). ßêùî Âè ïðèéìàºòå óìîâè óãîäè, âñòàíîâ³òü â³äì³òêó ó êâàäðàòèêó íèæ÷å. $_CLICK
+# ^LicenseTextRB
+Ïðî÷èòàéòå óìîâè ë³öåíç³éíî¿ óãîäè ïåðåä âñòàíîâëåííÿì $(^NameDA). ßêùî Âè ïðèéìàºòå óìîâè óãîäè, âèáåð³òü ïåðøèé âàð³àíò. $_CLICK
+# ^UnLicenseText
+Ïðî÷èòàéòå óìîâè ë³öåíç³éíî¿ óãîäè ïåðåä âñòàíîâëåííÿì $(^NameDA). ßêùî Âè ïðèéìàºòå óìîâè ë³öåíç³éíî¿ óãîäè, íàòèñí³òü íà êíîïêó Çãîäåí.
+# ^UnLicenseTextCB
+Ïðî÷èòàéòå óìîâè ë³öåíç³éíî¿ óãîäè ïåðåä âñòàíîâëåííÿì $(^NameDA). ßêùî Âè ïðèéìàºòå óìîâè óãîäè, âñòàíîâ³òü â³äì³òêó ó êâàäðàòèêó íèæ÷å. $_CLICK
+# ^UnLicenseTextRB
+Ïðî÷èòàéòå óìîâè ë³öåíç³éíî¿ óãîäè ïåðåä âèäàëåííÿì $(^NameDA). ßêùî Âè ïðèéìàºòå óìîâè óãîäè, âèáåð³òü ïåðøèé âàð³àíò. $_CLICK
+# ^Custom
+Ïî âèáîðó
+# ^ComponentsText
+Âèáåð³òü ÿê³ êîìïîíåíòè ïðîãðàìè Âè áàæàºòå âñòàíîâèòè. $_CLICK
+# ^ComponentsSubText1
+Âèáåð³òü òèï âñòàíîâëåííÿ:
+# ^ComponentsSubText2_NoInstTypes
+Âèáåð³òü êîìïîíåíòè äëÿ âñòàíîâëåííÿ:
+# ^ComponentsSubText2
+×è, âèáåð³òü âðó÷íó êîìïîíåíòè, ÿê³ Âè õî÷åòå âñòàíîâèòè:
+# ^UnComponentsText
+Âèáåð³òü ÿê³ êîìïîíåíòè Âè áàæàºòå âèäàëèòè. ³äì³òüòå êîìïîíåíòè äëÿ âèäàëåííÿ ³ çí³ì³òü â³äì³òêó ç òèõ, ÿê³ Âè âèäàëÿòè íå áàæàºòå. $_CLICK
+# ^UnComponentsSubText1
+Âèáåð³òü òèï âèäàëåííÿ:
+# ^UnComponentsSubText2_NoInstTypes
+Âèá³ð êîìïîíåíò³â äëÿ âèäàëåííÿ:
+# ^UnComponentsSubText2
+×è âèáåð³òü êîìïîíåíòè ïðîãðàìè äëÿ âèäàëåííÿ ïî ñâîºìó áàæàíí³:
+# ^DirText
+Ïðîãðàììà âñòàíîâèòü $(^NameDA) ó âêàçàíó òåêó. Äëÿ òîãî, ùîá âñòàíîâèòè ïðîãðàììó â ³íøó òåêó, íàòèñí³òü Îãëÿä ³ âêàæ³òü ïîòð³áíó òåêó. $_CLICK
+# ^DirSubText
+Òåêà ïðèçíà÷åííÿ
+# ^DirBrowseText
+Âèáåð³òü òåêó äëÿ âñòàíîâëåííÿ $(^NameDA):
+# ^UnDirText
+Ïðîãðàììà âñòàíîâëåííÿ âèäàëèòü $(^NameDA) ³ç âêàçàííî¿ òåêè. Äëÿ òîãî, ùîá ïðîâåñòè âèäàëåííÿ ç ³íøî¿ òåêè, íàòèñí³òü Îãëÿä ³ âêàæ³òü ïîòð³áíó òåêó. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Âèáåð³òü òåêó, ç ÿêî¿ Âè áàæàºòå âèäàëèòè $(^NameDA):
+# ^SpaceAvailable
+"Äîñòóïíî ì³ñöÿ: "
+# ^SpaceRequired
+"Íåîáõ³äíî ì³ñöÿ: "
+# ^UninstallingText
+Ìàéñòåð âñòàíîâëåííÿ äîïîìîæå Âàì âèäàëèòè $(^NameDA) ç Âàøîãî êîìï'þòåðà. $_CLICK
+# ^UninstallingSubText
+Âèäàëåííÿ ç:
+# ^FileError
+Íåìîæëèâî â³äêðèòè ôàéë äëÿ çàïèñó: \r\n\t"$0"\r\nÍàòèñí³òü Ïåðåðâàòè äëÿ òîãî, ùîá ïåðåðâàòè âñòàíîâëåííÿ,\r\nÏîâòîðèòè äëÿ òîãî, ùîá ïîâòîðèòè ñïðîáó çàïèñó ó ôàéë, ÷è\r\n²ãíîðóâàòè äëÿ òîãî, ùîá ïðîïóñòèòè öþ ä³þ
+# ^FileError_NoIgnore
+Íåìîæëèâî â³äêðèòè ôàéë äëÿ çàïèñó: \r\n\t"$0"\r\nÍàòèñí³òü Ïîâòîðèòè äëÿ òîãî, ùîá ïîâòîðèòè ñïðîáó çàïèñó ó ôàéë, ÷è\r\nÑêàñóâàòè äëÿ òîãî, ùîá ïåðåðâàòè âñòàíîâëåííÿ
+# ^CantWrite
+"Íåìîæëèâî çàïèñàòè: "
+# ^CopyFailed
+Êîï³þâàííÿ íåâä³ëå
+# ^CopyTo
+"Êîï³þâàííÿ â "
+# ^Registering
+"Ðåºñòðàö³ÿ: "
+# ^Unregistering
+"Âèäàëåííÿ ðåºñòðàö³¿: "
+# ^SymbolNotFound
+"Íåìîæëèâî çíàéòè ñèìâîë: "
+# ^CouldNotLoad
+"Íåìîæëèâî çàâàíòàæèòè: "
+# ^CreateFolder
+"Ñòâîðåííÿ òåêè: "
+# ^CreateShortcut
+"Ñòâîðåííÿ ÿðëèêà: "
+# ^CreatedUninstaller
+"Ñòâîðåííÿ ïðîãðàìè âèäàëåííÿ: "
+# ^Delete
+"Âèäàëåííÿ ôàéëó: "
+# ^DeleteOnReboot
+"Âèäàëåííÿ ï³ñëÿ ïåðåçàâàíòàæåííÿ: "
+# ^ErrorCreatingShortcut
+"Ïîìèëêà ñòâîðåííÿ ÿðëèêà: "
+# ^ErrorCreating
+"Ïîìèëêà ñòâîðåííÿ: "
+# ^ErrorDecompressing
+Íåìîæëèâî âèòÿãíóòè äàí³. Ìîæëèâî ïîøêîäæåíèé äèñòðèáóòèâ.
+# ^ErrorRegistering
+Íåìîæëèâî çàðåºñòðóâàòè á³áë³îòåêó (DLL)
+# ^ExecShell
+"Âèêîíàííÿ êîìàíäè îáîëîíêè: "
+# ^Exec
+"Âèêîíàííÿ: "
+# ^Extract
+"Âèòÿãíåííÿ: "
+# ^ErrorWriting
+"Âèòÿãíåííÿ: ïîìèëêà çàïèñó ôàéëà"
+# ^InvalidOpcode
+Äèñòðèáóòèâ ïîøêîäæåíèé: ïîìèëêîâèé êîä â³äïîâ³ä³
+# ^NoOLE
+"ÍåìຠOLE äëÿ: "
+# ^OutputFolder
+"Òåêà ïðèçíà÷åííÿ: "
+# ^RemoveFolder
+"Âèäàëåííÿ òåêè: "
+# ^RenameOnReboot
+"Ïåðå³ìåíóâàííÿ ï³ñëÿ ïåðåçàâàíàæåííÿ: "
+# ^Rename
+"Ïåðåéìåíóâàííÿ: "
+# ^Skipped
+"Ïðîïóùåíî: "
+# ^CopyDetails
+Êîï³þâàòè äåòàë³ ó áóôåð îáì³íó
+# ^LogInstall
+Çàïèñóâàòè â ëîã ïðîöåñ âñòíîâëåííÿ
+# byte
+á
+# kilo
+Ê
+# mega
+Ì
+# giga
+Ã
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Ukrainian.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Ukrainian.nsh
new file mode 100644
index 000000000..add5f8f3b
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Ukrainian.nsh
@@ -0,0 +1,122 @@
+;Language: Ukrainian (1058)
+;By Yuri Holubow, http://www.Nash-Soft.com
+;Correct by Osidach Vitaly (Vit_Os2)
+
+!insertmacro LANGFILE "Ukrainian" "Ukrainian"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Ëàñêàâî ïðîñèìî äî Ìàéñòðà Âñòàíîâëåííÿ $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Äàíà ïðîãðàìà âñòàíîâèòü $(^NameDA) íà Âàø êîìï'þòåð.$\r$\n$\r$\nÐåêîìåíäîâàíî çàêðèòè âñ³ ïðîãðàìè ïåðåä ïî÷àòêîì ³íñòàëÿö³¿. Öå äîçâîëèòü ïðîãðàì³ âñòàíîâëåííÿ îíîâèòè ñèñòåìí³ ôàéëè áåç ïåðåçàâàíòàæåííÿ ñèñòåìè.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Ëàñêàâî ïðîñèìî äî Ìàéñòðà Âèäàëåííÿ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Äàíèé ìàéñòåð äîìîæå âèäàëèòè $(^NameDA).$\r$\n$\r$\nÏåðåä ïî÷àòêîì âèäàëåííÿ, ïåðåâ³ðòå, ÷è íå çàïóùåíî $(^NameDA).$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "˳öåíç³éíà Óãîäà"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Áóäü-ëàñêà ïåðåãëÿíüòå ë³öåíç³þ ïåðåä âñòàíîâëåííÿì $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "ßêùî Âè ïðèéìàºòå âñi óìîâè Óãîäè, íàòèñíiòü íà êíîïêó Çãîäåí. Âè ïîâèííi ïðèéíÿòè óìîâè Óãîäè äëÿ âñòàíîâëåííÿ $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "ßêùî Âè ïðèéìàºòå âñ³ óìîâè Óãîäè, âñòàíîâ³òü â³äì³òêó ó êâàäðàòèêó íèæ÷å. Âè ïîâèíí³ ïðèéíÿòè óìîâè Óãîäè äëÿ âñòàíîâëåííÿ $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ßêùî Âè ïðèéìàºòå âñ³ óìîâè Óãîäè, âèáåð³òü ïåðøèé âàð³àíò ç òèõ ùî íèæ÷å. Âè ïîâèíí³ ïðèéíÿòè óìîâè Óãîäè äëÿ âñòàíîâëåííÿ $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "˳öåíç³éíà óãîäà"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ïðî÷èòàéòå óìîâè ë³öåíç³éíî¿ óãîäè ïåðåä âèäàëåííÿì $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "ßêùî Âè ïðèéìàºòå âñi óìîâè Óãîäè, íàòèñíiòü íà êíîïêó Çãîäåí. Âè ïîâèííi ïðèéíÿòè óìîâè Óãîäè äëÿ âèäàëåííÿ $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "ßêùî Âè ïðèéìàºòå âñ³ óìîâè Óãîäè, âñòàíîâ³òü â³äì³òêó ó êâàäðàòèêó íèæ÷å. Âè ïîâèíí³ ïðèéíÿòè óìîâè Óãîäè äëÿ âèäàëåííÿ $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ßêùî Âè ïðèéìàºòå âñ³ óìîâè Óãîäè, âèáåð³òü ïåðøèé âàð³àíò ç òèõ, ùî íèæ÷å. Âè ïîâèíí³ ïðèéíÿòè óìîâè Óãîäè äëÿ âèäàëåííÿ $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Íàòèñíiòü PageDown ùîá ïåðåì³ñòèòèñü âíèç óãîäè."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Îáåð³òü êîìïîíåíòè"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Îáåð³òü êîìïîíåíòè $(^NameDA) ÿêi Âè áàæàºòå âñòàíîâèòè."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Îïèñ"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Êîìïîíåíòè ïðîãðàìè"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Îáåð³òü ÿê³ êîìïîíåíòè $(^NameDA) Âè áàæàºòå âèäàëèòè."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ïiäâåäiòü âàøó ìèøêó äî êîìïîíåíòà, ùîá ïîáà÷èòè éîãî îïèñ."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ïiäâåäiòü âàøó ìèøêó äî êîìïîíåíòà, ùîá ïîáà÷èòè éîãî îïèñ."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Îáåðiòü òåêó âñòàíîâëåííÿ"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Îáåðiòü òåêó äëÿ âñòàíîâëåííÿ $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Âèá³ð òåêè äëÿ âèäàëåííÿ"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Îáåð³òü òåêó, ç ÿêî¿ Âè áàæàºòå âèäàëèòè $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Êîï³þâàííÿ ôàéë³â"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Áóäü-ëàñêà çà÷åêàéòå, äîêè ïðîãðàìà âñòàíîâëåííÿ ñêîï³þº âñ³ íåîáõ³äí³ ôàéëè $(^NameDA)."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Âñòàíîâëåííÿ çàâåðøåíî"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Âñòàíîâëåííÿ óñïiøíî çàâåðøåíî."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Âñòàíîâëåííÿ ïåðåðâàíà"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Âñòàíîâëåííÿ íå áóëî óñïiøíî çàâåðøåíî."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Âèäàëåííÿ"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Áóäü-ëàñêà çà÷åêàéòå, éäå âèäàëåííÿ ôàéë³â $(^NameDA)."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Âèäàëåííÿ çàâåðøåíî"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Âèäàëåííÿ ïðîãðàìè áóëî óñï³øíî çàâåðøåíî."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Âèäàëåííÿ ïåðåðâàíî"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Âèäàëåííÿ íå áóëî âèêîíàíî ïîâí³ñòþ."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Çàâåðøåííÿ ìàéñòðà âñòàíîâëåííÿ $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) âñòàíîâëåíî íà âàø êîìï'þòåð.$\r$\n$\r$\nÍàòèñí³òü ʳíåöü äëÿ âèõîäó."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Äëÿ òîãî, ùîá çàâåðøèòè âñòàíîâëåííÿ $(^NameDA) Âàø êîìï'þòåð ïîâèíåí ïåðåçàâàíòàæèòèñÿ. Çðîáèòè öå çàðàç?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Çàâåðøåííÿ Ìàéñòðà Âèäàëåííÿ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) âèäàëåíèé ç âàøîãî êîìï'þòåðà.$\r$\n$\r$\nÍàòèñí³òü Âèõ³ä, ùîá çàêðèòè Ìàéñòðà."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Äëÿ òîãî, ùîá çàê³í÷èòè âèäàëåííÿ $(^NameDA) âàø êîìï'þòåð ïîâèíåí ïåðåçàâàíòàæèòèñÿ. Âè áàæàºòå çðîáèòè öå çàðàç?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ïåðåçàâàíòàæèòèñÿ çàðàç"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "ß õî÷ó ïåðåçàâàíòàæèòèñÿ âëàñíîðó÷ ï³çí³øå"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Çàïóñòèòè $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Ïîêàçàòè ³íôîðìàö³þ ïðî ïðîãðàìó"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&ʳíåöü"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Òåêà â ìåíþ Ïóñê"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Îáåð³òü òåêó â ìåíþ Ïóñê äëÿ ÿðëèê³â ïðîãðàìè."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Îáåð³òü òåêó â ìåíþ Ïóñê â ÿêó áóäóòü ïîì³ùåí³ ÿðëèêè äëÿ âñòàíîâëåíî¿ ïðîãðàìè. Âè òàêîæ ìîæåòå ââåñòè ³íøå ³ì'ÿ äëÿ ñòâîðåííÿ íîâî¿ òåêè."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Íå ñòâîðþâàòè ÿðëèêè"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Âèäàëåííÿ $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Âèäàëåííÿ $(^NameDA) ç âàøîãî êîìï'þòåðà."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Âè âïåâíåííi, ùî áàæàºòå ïîêèíóòè âñòàíîâëåííÿ $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Âè âïåâíåíí³ ùî áàæàºòå ïîêèíóòè Ìàéñòð Âèäàëåííÿ $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Uzbek.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Uzbek.nlf
new file mode 100644
index 000000000..a64ad9767
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Uzbek.nlf
@@ -0,0 +1,190 @@
+# Header, don't edit
+NLF v6
+# Language ID
+1091
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+1252
+# RTL - anything else than RTL means LTR
+-
+# Translation by Emil Garipov [emil.garipov@gmail.com]
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+O'rnatish $(^Name)
+# ^UninstallCaption
+O'chirish $(^Name)
+# ^LicenseSubCaption
+: Lisenzion kelishuv
+# ^ComponentsSubCaption
+: O'rnatish parametrlari
+# ^DirSubCaption
+: O'rnatish papkasi
+# ^InstallingSubCaption
+: Fayllarni kopiya qilish
+# ^CompletedSubCaption
+: Operatsiya yakunlandi
+# ^UnComponentsSubCaption
+: O'chirish parametrlari
+# ^UnDirSubCaption
+: O'chirsh papkasi
+# ^ConfirmSubCaption
+: Tasdiqlash
+# ^UninstallingSubCaption
+: Fayllarni o'chirish
+# ^UnCompletedSubCaption
+: Operatsiya yakunlandi
+# ^BackBtn
+< &Orqaga
+# ^NextBtn
+&Oldinga >
+# ^AgreeBtn
+&Qabul qilaman
+# ^AcceptBtn
+Men &kelishuv shartlarini qabul qilaman
+# ^DontAcceptBtn
+Men &kelishuv shartlarini qabul qilmayman
+# ^InstallBtn
+&O'rnatish
+# ^UninstallBtn
+&O'chirish
+# ^CancelBtn
+Bekor qilish
+# ^CloseBtn
+&Yopish
+# ^BrowseBtn
+&Ko'rish ...
+# ^ShowDetailsBtn
+&Äåòàëè...
+# ^ClickNext
+Davom etish uchun 'Oldinga'tugmachasini bosing.
+# ^ClickInstall
+Dasturni o'rnatish uchun'O'rnatish' tugmachasini bosing.
+# ^ClickUninstall
+Dasturni o'chirish uchun 'O'chirsh' tugmachasini bosing.
+# ^Name
+Ism
+# ^Completed
+Tayor
+# ^LicenseText
+$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz 'Qabul qilaman' tugmachasini bosing.
+# ^LicenseTextCB
+$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz bayroqchani joylashtiring. $_CLICK
+# ^LicenseTextRB
+$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz quyida taklif etilganlardan birinchi variantni tanlang. $_CLICK
+# ^UnLicenseText
+$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz 'Qabul qilaman' tugmachasini bosing.
+# ^UnLicenseTextCB
+$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz bayroqchani joylashtiring. $_CLICK
+# ^UnLicenseTextRB
+$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz quyida taklif etilganlardan birinchi variantni tanlang. $_CLICK
+# ^Custom
+Tanlash bo'icha
+# ^ComponentsText
+O'rnatish ucun dastur komponentlarini tanlang. $_CLICK
+# ^ComponentsSubText1
+O'rnatish jarayonini tanlang:
+# ^ComponentsSubText2_NoInstTypes
+O'rnatish uchun dastur komponentlarini tanlang:
+# ^ComponentsSubText2
+Yoki o'rnatish uchun qushimcha komponentlarini tanlang:
+# ^UnComponentsText
+O'chirish uchun dastur komponentlarini tanlang. $_CLICK
+# ^UnComponentsSubText1
+O'chirish jarayonini tanlang:
+# ^UnComponentsSubText2_NoInstTypes
+O'chirish uchun dastur komponentlarini tanlang:
+# ^UnComponentsSubText2
+Yoki o'chirish uchun qushimcha komponentlarini tanlang:
+# ^DirText
+Dastur $(^NameDA)ni ko'rsatilgan papkaga o'rnatadi. Boshqa papkaga o'rnatish uchun, 'Ko'rish'tugmachasini bosing va uni ko'rsatib bering. $_CLICK
+# ^DirSubText
+O'rnatish papkasi
+# ^DirBrowseText
+O'rnatish papkasini ko'rsating $(^NameDA):
+# ^UnDirText
+Dastur $(^NameDA)ni ko'rsatilgan papkadan o'chiradi. Boshqa papkaga o'rnatish uchun, 'Ko'rish'tugmachasini bosing va uni ko'rsatib bering. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+$(^NameDA)ni o'chirish uchun papkani ko'rsating:
+# ^SpaceAvailable
+"Diskda joriy qilingan: "
+# ^SpaceRequired
+"Diskda talab qilinadigan: "
+# ^UninstallingText
+$(^NameDA) dasturi kompyuterizdan uchiriladi. $_CLICK
+# ^UninstallingSubText
+O'chirilish:
+# ^FileError
+Yozish uchun faylni ochish imkoniyati yuq: \r\n\t"$0"\r\n'Tuxtashish': O'rnatishni tuxtatish;\r\n"Takrorlash":yana bir o'rinib ko'rish;\r\n"Taylab ketish": shu xarakatni taylab ketish.
+# ^FileError_NoIgnore
+Yozish uchun faylni ochish imkoniyati yuq: \r\n\t"$0"\r\n'Takrorlash': yana bir o'rinib ko'rish;\r\n'Bekor qilish': o'rnatish protsessini bekor qilish.
+# ^CantWrite
+"Yozish uchun imkoniyat yuq: "
+# ^CopyFailed
+Kopiya qilganda xato bor
+# ^CopyTo
+"Kopiya qilish "
+# ^Registering
+"Ro'yxatga olish: "
+# ^Unregistering
+"Ro'xatdan chiqish: "
+# ^SymbolNotFound
+"Simvolni topish imkoniyati yuq: "
+# ^CouldNotLoad
+"Zagruzka qilish imkoniyati yuq: "
+# ^CreateFolder
+"Papkani yaratish: "
+# ^CreateShortcut
+"Belgini yaratish: "
+# ^CreatedUninstaller
+"O'chirish dasturini yaratish: "
+# ^Delete
+"Faylni o'chirish: "
+# ^DeleteOnReboot
+"Kompyuter qayta yuklash jaraonida o'chirish: "
+# ^ErrorCreatingShortcut
+"Belgini yaratish jarayonida xato: "
+# ^ErrorCreating
+"Yaratish xatosi: "
+# ^ErrorDecompressing
+Ma'lumotlarni asilga qaytarish xatosi! Distributiv ziyonlangan bulishi mumkin.
+# ^ErrorRegistering
+Kutubxonani ro'xatga olish imkoniyati yuq (DLL)
+# ^ExecShell
+"Qoplang'ich komandasini bajarish: "
+# ^Exec
+"Bajarish: "
+# ^Extract
+"Ichidan olish: "
+# ^ErrorWriting
+"Ichidan olish: fayl yozish xatosi "
+# ^InvalidOpcode
+Distributiv ziyonlangan: ruxsatlanmangan kod
+# ^NoOLE
+"Quydagilarga OLE yuq: "
+# ^OutputFolder
+"Papkani o'rnatish: "
+# ^RemoveFolder
+"Papkani o'chirish: "
+# ^RenameOnReboot
+"Kompyuter qayta yuklanish jarayonida ismni qaita quyish: "
+# ^Rename
+"Ismni qayta quyish: "
+# ^Skipped
+"O'tkazib yuborish: "
+# ^CopyDetails
+Bufer obmenaga ma'lumotlarni kopiya qilish
+# ^LogInstall
+O'rnatish xisobotini chiqorish
+# byte
+áàéò
+# kilo
+ Ê
+# mega
+ Ì
+# giga
+ Ã
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Uzbek.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Uzbek.nsh
new file mode 100644
index 000000000..97737d2bf
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Uzbek.nsh
@@ -0,0 +1,121 @@
+;Language: Uzbek (1091)
+;Translation updated by Emil Garipov [emil.garipov@gmail.com]
+
+!insertmacro LANGFILE "Uzbek" "Uzbek"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Sizni o'rnatish dastur tabriklaydi $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Bu dastur sizning komputeringizga $(^NameDA) dasturni o'rnatadi.$\r$\n$\r$\nO'rnatishdan oldin ishlayotgan barcha ilovalarni yopish tavsiya etiladi. Bu o'rnatuvchi dasturga kompyuterni qayta yuklamasdan sistemali fayllarni yangilash imkonini beradi.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Sizni $(^NameDA)ni o'chirish dasturi tabriklaydi"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Bu dastur $(^NameDA)ni sizning kompyuteringizdan o'chiradi.$\r$\n$\r$\nO'chirishdan oldin $(^NameDA) dasturni ishlamayotganligini aniqlang.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisenzion kelishuv"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA) dasturini o'rnatishdan oldin lisenzion kelishuv bilan tanishib chiking."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Agar kelishuv shartlariga rozi bo'lsangiz $\"Qabul kilaman$\" tugmasini bosing.Dasturni o'rnatish uchun,kelishuv shartlarini qabul qilish kerak."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Agar siz kelishuv shartlarini qabul kilsangiz,bayroqchani joylashtiring. Dasturni o'rnatish uchun kelisuv shartlarini qabul qilish kerak. $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kelishuv shartlarini qabul qilsangiz quida taklif etilganlardan birinchi variantni tanlang. Dasturni o'rnatish uchun kelisuv shartlarini qabul qilish kerak. $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisenzion kelishuv"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA)ni o'chirishdan oldin lesinzion kelishuv bilan tanishing."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Agar siz kelishuv shartlariniqabul qilsangiz $\"Qabul qilaman$\" tugmasini bosing. O'chirish uchun kelishuv shartlarini qabul qilishingiz kerak. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Agar shartlarni qabul qilsangiz, bayroqchani o'rnating.O'chirish uchun kelishuv shartlarini qabul qilishingiz kerak. $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kelishuv shartlarini qabul qilsangiz, taklif etilganlardan birinchi variantni tanlang.O'chirish uchun kelishuv shartlarini qabul qilishingiz kerak. $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Matn bo'icha silgish uchun $\"PageUp$\" va $\"PageDown$\" tugmasidan foydalaning."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "O'rnatilayotgan dastur komponentlari"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "$(^NameDA) dasturning o'zingizga kerak bo'lgan komponentasini tanlang."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Tasvir"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Dastur komponentlari"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "$(^NameDA)ning o'chirish kerak bo'lgan komponentlarini tanlang."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sichqonchaning kursorini komponent tasvirini o'qish uchun ustiga quying."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sichqonchaning kursorini komponent tasvirini o'qish uchun ustiga quying."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "O'rnatish papkasini tanlash"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA)ni o'rnatish uchun papka tanlang."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "O'chiriladigan papkani tanlash"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA) o'chiriladigan papkasini ko'rsating."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Fayllarni ko'chirish"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Biror kuting, $(^NameDA) fayllari ko'chirilmoqda..."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "O'rnatish jarayoni tugadi"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "O'rnatish jarayoni muvaffaqiyat bilan tugadi."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "O'rnatish jarayoni uzildi"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "O'rnatish jarayoni tugamadi."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "O'chirish"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Biror kutib turing, $(^NameDA) fayllarini o'chirish bajarilmoqda..."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "O'chirish tuganlandi"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Dasturni o'chirish muvaffaqiyatli yakunlandi."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "O'chirish jarayoni uzildi"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "O'chirish to'la bajarilmadi."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA)ni o'rnatuvci dasturi o'z ishini tugatmoqda"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA)ni o'rnatish bajarildi.$\r$\n$\r$\nO'rnatuvchi dasturdan chiqish uchun $\"Tayor$\" tugmasini bosing."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) dasturini o'rnatish jarayonini tugatish uchun Kompyuterni qayta yuklash kerak.Shu ishni bajarishni xoziroq istaysizmi?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA)ni o'chirish dasturi o'z ishini tugatdi."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) dasturi kompyuteringizdan o'chirildi.$\r$\n$\r$\nO'chirish dasturidan chiqish uchun $\"Tayor$\"tugmasini bosing."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) dasturini o'chirishni tugatish uchun kompyuterni qayta yuklash kerak.shu ishni xozir bajarasizmi?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ha, kompyuter hozir qayta yuklansin"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Yo'q, bu ishni keyinroq bajaraman"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) &Ishga tushirilsin"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Readme fayli ko'rsatilsin"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Tayor"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Papka $\"Ïóñê$\" menyusida"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Dastur belgilarini joylashtirish uchun $\"Ïóñê$\" menyusidan papka tanlang."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "$\"Ïóñê$\" menyusidan dastur belgilari joylashadigan papka tanlang. Siz papkaning boshqa ismini kiritishingiz mumkin"
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Belgilar yaratilmasin"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA)ni o'chirish"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA)ni kompyuterdan o'chirish."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Haqiqatdan ham siz $(^Name)ni o'rnatishni bekor qilmoqchimisiz?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name)ni o'chirish jarayonini bekor qilmoqchisizmi?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Welsh.nlf b/Engine/bin/tools/nsis/app/Contrib/Language files/Welsh.nlf
new file mode 100644
index 000000000..85520e2bc
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Welsh.nlf
@@ -0,0 +1,191 @@
+# Header, don't edit
+NLF v6
+# Start editing here
+# Language ID
+1160
+# Font and size - dash (-) means default
+-
+-
+# Codepage - dash (-) means ANSI code page
+-
+# RTL - anything else than RTL means LTR
+-
+# Translation by Rhoslyn Prys, Meddal.com
+# ^Branding
+Nullsoft Install System %s
+# ^SetupCaption
+Rhaglen Osod $(^Name)
+# ^UninstallCaption
+Rhaglen Dadosod $(^Name)
+# ^LicenseSubCaption
+: Cytundeb Trwyddedu
+# ^ComponentsSubCaption
+: Dewisiadau Gosod
+# ^DirSubCaption
+: Ffolder Gosod
+# ^InstallingSubCaption
+: Gosod
+# ^CompletedSubCaption
+: Cwblhawyd
+# ^UnComponentsSubCaption
+: Dewisiadau Dadosod
+# ^UnDirSubCaption
+: Ffolder Dadosod
+# ^ConfirmSubCaption
+: Cadarnhad
+# ^UninstallingSubCaption
+: Dadosod
+# ^UnCompletedSubCaption
+: Cwblhawyd
+# ^BackBtn
+< &Nôl
+# ^NextBtn
+&Nesaf >
+# ^AgreeBtn
+&Cytuno
+# ^AcceptBtn
+Rwy'n &derbyn Amodau'r Drwydded
+# ^DontAcceptBtn
+Rwy'n &gwrthod Amodau'r Drwydded
+# ^InstallBtn
+&Gosod
+# ^UninstallBtn
+&Dadosod
+# ^CancelBtn
+Diddymu
+# ^CloseBtn
+C&au
+# ^BrowseBtn
+&Pori...
+# ^ShowDetailsBtn
+&Dangos manylion
+# ^ClickNext
+Cliciwch Nesaf i barhau.
+# ^ClickInstall
+Cliciwch Gosod i gychwyn gosod.
+# ^ClickUninstall
+Cliciwch Dadosod i gychwyn dadosod.
+# ^Name
+Enw
+# ^Completed
+Cwblhawyd
+# ^LicenseText
+Darllenwch y cytundeb trwyddedu cyn gosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch Cytuno.
+# ^LicenseTextCB
+Darllenwch y cytundeb trwyddedu cyn gosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch y blwch ticio isod. $_CLICK
+# ^LicenseTextRB
+Darllenwch y cytundeb trwyddedu cyn gosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, ticiwch y dewis cyntaf isod. $_CLICK
+# ^UnLicenseText
+Darllenwch y cytundeb trwyddedu cyn dadosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch Cytuno.
+# ^UnLicenseTextCB
+Darllenwch y cytundeb trwyddedu cyn dadosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch y blwch ticio isod. $_CLICK
+# ^UnLicenseTextRB
+Darllenwch y cytundeb trwyddedu cyn dadosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, ticiwch y dewis cyntaf isod. $_CLICK
+# ^Custom
+Addasu
+# ^ComponentsText
+Ticiwch y cydrannau rydych am eu gosod a dad-dicio'r cydrannau nad ydych am eu gosod. $_CLICK
+# ^ComponentsSubText1
+Dewis y math o osod:
+# ^ComponentsSubText2_NoInstTypes
+Dewis cydrannau i'w gosod:
+# ^ComponentsSubText2
+Neu, ddewis y cydrannau ychwanegol i'w gosod:
+# ^UnComponentsText
+Ticiwch y cydrannau rydych am eu dadosod a dad-dicio'r cydrannau nad ydych am eu dadosod. $_CLICK
+# ^UnComponentsSubText1
+Dewis y math o ddadosod:
+# ^UnComponentsSubText2_NoInstTypes
+Dewis cydrannau i'w dadosod:
+# ^UnComponentsSubText2
+Neu, ddewis y cydrannau ychwanegol i'w dadosod:
+# ^DirText
+Bydd y Rhaglen Osod yn gosod $(^NameDA) yn y ffolder canlynol. I'w osod mewn ffolder gwahanol, cliciwch Pori a dewis ffolder arall. $_CLICK
+# ^DirSubText
+Ffolder Cyrchfan
+# ^DirBrowseText
+Dewis y ffolder i osod $(^NameDA) ynddo:
+# ^UnDirText
+Bydd y Rhegen Osod yn dadosod $(^NameDA) o'r ffolder canlynol. I ddadosod o ffolder gwahanol, cliciwch Pori a dewis ffolder arall. $_CLICK
+# ^UnDirSubText
+""
+# ^UnDirBrowseText
+Dewis ffolder i ddadosod $(^NameDA) ohono:
+# ^SpaceAvailable
+"Lle ar gael: "
+# ^SpaceRequired
+"Lle angenrheidiol: "
+# ^UninstallingText
+Bydd $(^NameDA) yn cael ei ddadosod o'r ffolder canlynol. $_CLICK
+# ^UninstallingSubText
+Dadosod o:
+# ^FileError
+Gwall agor ffeil i'w hysgrifennu: \r\n\r\n$0\r\n\r\nCliciwch Atal i atal y gosod,\r\nEto i geisio eto, neu\r\nAnwybyddu i hepgor y ffeil.
+# ^FileError_NoIgnore
+Gwall agor ffeil i'w hysgrifennu: \r\n\r\n$0\r\n\r\nCliciwch Eto i geisio eto, neu\r\nDiddymu i atal y gosod.
+# ^CantWrite
+"Methu ysgrifennu: "
+# ^CopyFailed
+Methu Copïo
+# ^CopyTo
+"Copïo i "
+# ^Registering
+"Cofrestru: "
+# ^Unregistering
+"Dadgofrestru: "
+# ^SymbolNotFound
+"Methu canfod symbol: "
+# ^CouldNotLoad
+"Methu llwytho: "
+# ^CreateFolder
+"Creu ffolder: "
+# ^CreateShortcut
+"Creu llwybr byr: "
+# ^CreatedUninstaller
+"Creu dadosodwr: "
+# ^Delete
+"Dileu ffeil: "
+# ^DeleteOnReboot
+"Dileu wrth ailgychwyn: "
+# ^ErrorCreatingShortcut
+"Gwall wrth greu llwybr byr: "
+# ^ErrorCreating
+"Gwall wrth greu: "
+# ^ErrorDecompressing
+Gwall wrth ddatgywasgu data! Gosodwr llwgr?
+# ^ErrorRegistering
+Gwall cofrestru DLL
+# ^ExecShell
+"ExecShell: "
+# ^Exec
+"Gweithredu: "
+# ^Extract
+"Echdynnu: "
+# ^ErrorWriting
+"Echdynnu: gwall ysgrifennu i ffeil "
+# ^InvalidOpcode
+Gosodwr llwgr: opcode annilys
+# ^NoOLE
+"Dim OLE ar gyfer: "
+# ^OutputFolder
+"Ffolder allbwn: "
+# ^RemoveFolder
+"Tynnu ffolder: "
+# ^RenameOnReboot
+"Ailenwi wrth ailgychwyn: "
+# ^Rename
+"Ailenwi: "
+# ^Skipped
+"Hepgor: "
+# ^CopyDetails
+Copïo Manylion i'r Clipfwrdd
+# ^LogInstall
+Cofnodi'r brosed gosod
+# ^Byte
+B
+# ^Kilo
+K
+# ^Mega
+M
+# ^Giga
+G
diff --git a/Engine/bin/tools/nsis/app/Contrib/Language files/Welsh.nsh b/Engine/bin/tools/nsis/app/Contrib/Language files/Welsh.nsh
new file mode 100644
index 000000000..228ef1a41
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Language files/Welsh.nsh
@@ -0,0 +1,121 @@
+;Language: Welsh (1106)
+;By Rhoslyn Prys, Meddal.com
+
+!insertmacro LANGFILE "Welsh" "Welsh"
+
+!ifdef MUI_WELCOMEPAGE
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Croeso i Ddewin Gosod $(^NameDA)"
+ ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Bydd y dewin yn eich arwain drwy osodiad $(^NameDA).$\r$\n$\r$\nCaewch pob rhaglen cyn cychwyn y rhaglen osod. Bydd hyn yn ei gwneud yn bosibl i ddiweddaru'r ffeiliau system berthnasol heb fod angen ailgychwyn eich cyfrifiadur.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_UNWELCOMEPAGE
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Croeso i Ddewin Dadosod $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Bydd y dewin yn eich arwain drwy ddadosod $(^NameDA).$\r$\n$\r$\nCyn cychwyn dadosod, gwnewch yn siwr nad yw $(^NameDA) yn rhedeg.$\r$\n$\r$\n$_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE
+ ${LangFileString} MUI_TEXT_LICENSE_TITLE "Cytundeb Trwyddedu"
+ ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Darllenwch amodau'r drwydded cyn gosod $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Os ydych yn derbyn amodau'r cytundeb, cliciwch Cytuno i barhau. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn gosod $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Os ydych yn derbyn amodau'r cytundeb, cliciwch y blwch ticio isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn gosod $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Os ydych yn derbyn amodau'r cytundeb, cliciwch y dewis cyntaf isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn gosod $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Cytundeb Trwyddedu"
+ ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Darllenwch amodau'r drwydded cyn dadosod $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Os ydych yn derbyn amodau'r cytundeb, cliciwch Cytuno i barhau. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn dadosod $(^NameDA)."
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Os ydych yn derbyn amodau'r cytundeb, cliciwch y blwch ticio isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn dadosod $(^NameDA). $_CLICK"
+ ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Os ydych yn derbyn amodau'r cytundeb, cliciwch y dewis cyntaf isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn dadosod $(^NameDA). $_CLICK"
+!endif
+
+!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE
+ ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pwyswch Page Down i ddarllen gweddill y cytundeb."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE
+ ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Dewis Cydrannau"
+ ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Dewis pa nodweddion o $(^NameDA) rydych am eu gosod."
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Disgrifiad"
+!endif
+
+!ifdef MUI_UNCOMPONENTSPAGE
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Dewis Cydrannau"
+ ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Dewis pa nodweddion o $(^NameDA) i'w dadoso."
+!endif
+
+!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Gosod eich llygoden dros gydran i weld ei ddisgrifiad."
+ !else
+ ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Gosod eich llygoden dros gydran i weld ei ddisgrifiad."
+ !endif
+!endif
+
+!ifdef MUI_DIRECTORYPAGE
+ ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Dewis Lleoliad Gosod"
+ ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Dewis y ffolder i osod $(^NameDA)."
+!endif
+
+!ifdef MUI_UNDIRECTORYSPAGE
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Dewis Lleoliad Dadosod"
+ ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Dewis y ffolder i ddadosod $(^NameDA)."
+!endif
+
+!ifdef MUI_INSTFILESPAGE
+ ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Gosod"
+ ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Arhoswch tra fo $(^NameDA) yn cael ei osod."
+ ${LangFileString} MUI_TEXT_FINISH_TITLE "Cwblhawyd y Gosod"
+ ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Mae'r Gosod wedi ei gwblhau'n llwyddiannus."
+ ${LangFileString} MUI_TEXT_ABORT_TITLE "Ataliwyd y Gosod"
+ ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Methwyd â chwblhau'r gosod yn llwyddiannus."
+!endif
+
+!ifdef MUI_UNINSTFILESPAGE
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Dadosod"
+ ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Arhoswch tra bo $(^NameDA) yn cael ei ddadosod."
+ ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Cwblhawyd y Dadosod"
+ ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Mae'r Dadosod wedi ei gwblhau'n llwyddiannus."
+ ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ataliwyd y Dadosod"
+ ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Methwyd â chwblhau'r dadosod yn llwyddiannus."
+!endif
+
+!ifdef MUI_FINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Cwblhau Dewin Gosod $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Mae $(^NameDA) wedi cael ei osod ar eich cyfrifiadur.$\r$\n$\r$\nCliciwch Gorffen i gau'r dewin."
+ ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Rhaid ailgychwyn eich cyfrifiadur i gwblhau gosod $(^NameDA). Hoffech chi ailgychwyn?"
+!endif
+
+!ifdef MUI_UNFINISHPAGE
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Cwblhau Dewin Dadosod $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Mae $(^NameDA) wedi ei ddadosod oddi ar eich cyfrifiadur.$\r$\n$\r$\nCliciwch Gorffen i gau'r dewin."
+ ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Rhaid ailgychwyn eich cyfrifiadur i gwblhau gosod $(^NameDA). Hoffech chi ailgychwyn?"
+!endif
+
+!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ailgychwyn"
+ ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Rwyf am ailgychwyn yn hwyrach"
+ ${LangFileString} MUI_TEXT_FINISH_RUN "&Rhedeg $(^NameDA)"
+ ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Dangos Darllenfi"
+ ${LangFileString} MUI_BUTTONTEXT_FINISH "&Gorffen"
+!endif
+
+!ifdef MUI_STARTMENUPAGE
+ ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Dewis Ffolder Dewislen Cychwyn"
+ ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Dewis ffolder Dewislen Cychwyn ar gyfer llwybrau byr $(^NameDA)."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Dewis ffolder Dewislen Cychwyn i greu llwybrau byr y rhaglen. Gallwch roi enw i greu ffolder newydd."
+ ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Peidio creu llwybrau byr"
+!endif
+
+!ifdef MUI_UNCONFIRMPAGE
+ ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Dadosod $(^NameDA)"
+ ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Tynnu $(^NameDA) oddiar eich cyfrifiadur."
+!endif
+
+!ifdef MUI_ABORTWARNING
+ ${LangFileString} MUI_TEXT_ABORTWARNING "Ydych chi'n si?r eich bod am adael Rhaglen Osod $(^Name)?"
+!endif
+
+!ifdef MUI_UNABORTWARNING
+ ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ydych chi'n siwr eich bod am adael Rhaglen Dadosod $(^Name)?"
+!endif
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Deprecated.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Deprecated.nsh
new file mode 100644
index 000000000..754fd4d59
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Deprecated.nsh
@@ -0,0 +1,72 @@
+/*
+
+NSIS Modern User Interface
+Deprecated code - display warnings
+
+*/
+
+;--------------------------------
+;InstallOptions
+
+!define INSTALLOPTIONS_ERROR "MUI_INSTALLOPTIONS_* macros are no longer a part of MUI2. Include InstallOptions.nsh and use INSTALLOPTIONS_* macros instead. It is also recommended to upgrade to nsDialogs."
+
+!macro MUI_INSTALLOPTIONS_EXTRACT FILE
+
+ !error "${INSTALLOPTIONS_ERROR}"
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_EXTRACT_AS FILE FILENAME
+
+ !error "${INSTALLOPTIONS_ERROR}"
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_DISPLAY FILE
+
+ !error "${INSTALLOPTIONS_ERROR}"
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_DISPLAY_RETURN FILE
+
+ !error "${INSTALLOPTIONS_ERROR}"
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_INITDIALOG FILE
+
+ !error "${INSTALLOPTIONS_ERROR}"
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_SHOW
+
+ !error "${INSTALLOPTIONS_ERROR}"
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_SHOW_RETURN
+
+ !error "${INSTALLOPTIONS_ERROR}"
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_READ VAR FILE SECTION KEY
+
+ !error "${INSTALLOPTIONS_ERROR}"
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_WRITE FILE SECTION KEY VALUE
+
+ !error "${INSTALLOPTIONS_ERROR}"
+
+!macroend
+
+!macro MUI_RESERVEFILE_INSTALLOPTIONS
+
+ !define MUI_DOLLAR "$"
+ !error "MUI_RESERVEFILE_INSTALLOPTIONS is no longer supported as InstallOptions is no longer used by MUI2. Instead, use ReserveFile '${MUI_DOLLAR}{NSISDIR}\Plugins\InstallOptions.dll'. It is also recommended to upgrade to nsDialogs."
+
+!macroend
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Interface.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Interface.nsh
new file mode 100644
index 000000000..e7f89d6fe
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Interface.nsh
@@ -0,0 +1,304 @@
+/*
+
+NSIS Modern User Interface
+Interface code for all pages
+
+*/
+
+;--------------------------------
+;Variables
+
+Var mui.Header.Text
+Var mui.Header.Text.Font
+Var mui.Header.SubText
+Var mui.Header.Background
+Var mui.Header.Image
+
+Var mui.Branding.Text
+Var mui.Branding.Background
+
+Var mui.Line.Standard
+Var mui.Line.FullWindow
+
+Var mui.Button.Next
+Var mui.Button.Cancel
+Var mui.Button.Back
+
+
+;--------------------------------
+;General interface settings
+
+!macro MUI_INTERFACE
+
+ !ifndef MUI_INTERFACE
+
+ !define MUI_INTERFACE
+
+ ;These values are set after the interface settings in the script,
+ ;so the script itself can override all values.
+
+ ;Default interface settings in nsisconf.nsh
+ !ifdef MUI_INSERT_NSISCONF
+ !insertmacro MUI_NSISCONF
+ !endif
+
+ ;Default interface settings
+ !insertmacro MUI_DEFAULT MUI_UI "${NSISDIR}\Contrib\UIs\modern.exe"
+ !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE "${NSISDIR}\Contrib\UIs\modern_headerbmp.exe"
+ !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE_RIGHT "${NSISDIR}\Contrib\UIs\modern_headerbmpr.exe"
+ !insertmacro MUI_DEFAULT MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
+ !insertmacro MUI_DEFAULT MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
+ !insertmacro MUI_DEFAULT MUI_BGCOLOR "FFFFFF"
+
+ ;Default header images
+ !ifdef MUI_HEADERIMAGE
+
+ !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp"
+
+ !ifndef MUI_HEADERIMAGE_UNBITMAP
+ !define MUI_HEADERIMAGE_UNBITMAP "${MUI_HEADERIMAGE_BITMAP}"
+ !ifdef MUI_HEADERIMAGE_BITMAP_NOSTRETCH
+ !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH ""
+ !endif
+ !endif
+
+ !ifdef MUI_HEADERIMAGE_BITMAP_RTL
+ !ifndef MUI_HEADERIMAGE_UNBITMAP_RTL
+ !define MUI_HEADERIMAGE_UNBITMAP_RTL "${MUI_HEADERIMAGE_BITMAP_RTL}"
+ !ifdef MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH
+ !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH ""
+ !endif
+ !endif
+ !endif
+
+ !endif
+
+ ;Default texts
+ !insertmacro MUI_DEFAULT MUI_ABORTWARNING_TEXT "$(MUI_TEXT_ABORTWARNING)"
+ !insertmacro MUI_DEFAULT MUI_UNABORTWARNING_TEXT "$(MUI_UNTEXT_ABORTWARNING)"
+
+ ;Apply settings
+
+ XPStyle On ;XP style setting in manifest resource
+
+ ;Dialog resources
+ ChangeUI all "${MUI_UI}"
+ !ifdef MUI_HEADERIMAGE
+ !ifndef MUI_HEADERIMAGE_RIGHT
+ ChangeUI IDD_INST "${MUI_UI_HEADERIMAGE}"
+ !else
+ ChangeUI IDD_INST "${MUI_UI_HEADERIMAGE_RIGHT}"
+ !endif
+ !endif
+
+ ;Icons
+ Icon "${MUI_ICON}"
+ UninstallIcon "${MUI_UNICON}"
+
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;Abort warning message box
+
+!macro MUI_ABORTWARNING
+
+ !ifdef MUI_ABORTWARNING_CANCEL_DEFAULT
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 "${MUI_ABORTWARNING_TEXT}" IDYES mui.Quit
+ !else
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION "${MUI_ABORTWARNING_TEXT}" IDYES mui.Quit
+ !endif
+
+ Abort
+ mui.Quit:
+
+!macroend
+
+!macro MUI_UNABORTWARNING
+
+ !ifdef MUI_UNABORTWARNING_CANCEL_DEFAULT
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 "${MUI_UNABORTWARNING_TEXT}" IDYES mui.Quit
+ !else
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION "${MUI_UNABORTWARNING_TEXT}" IDYES mui.Quit
+ !endif
+
+ Abort
+ mui.Quit:
+
+!macroend
+
+
+;--------------------------------
+;Initialization of GUI
+
+!macro MUI_HEADERIMAGE_INIT UNINSTALLER
+
+ ;Load and display header image
+
+ !ifdef MUI_HEADERIMAGE
+
+ InitPluginsDir
+
+ !ifdef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL
+
+ ${if} $(^RTL) == 1
+
+ File "/oname=$PLUGINSDIR\modern-header.bmp" "${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL}"
+
+ !ifndef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL_NOSTRETCH
+ SetBrandingImage /IMGID=1046 /RESIZETOFIT "$PLUGINSDIR\modern-header.bmp"
+ !else
+ SetBrandingImage /IMGID=1046 "$PLUGINSDIR\modern-header.bmp"
+ !endif
+
+ ${else}
+
+ !endif
+
+ File "/oname=$PLUGINSDIR\modern-header.bmp" "${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP}"
+
+ !ifndef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_NOSTRETCH
+ SetBrandingImage /IMGID=1046 /RESIZETOFIT "$PLUGINSDIR\modern-header.bmp"
+ !else
+ SetBrandingImage /IMGID=1046 "$PLUGINSDIR\modern-header.bmp"
+ !endif
+
+ !ifdef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL
+
+ ${endif}
+
+ !endif
+
+ !endif
+
+!macroend
+
+!macro MUI_GUIINIT_OUTERDIALOG UNINSTALLER
+
+ ;Initialize outer dialog (fonts & colors)
+
+ ;Header
+ GetDlgItem $mui.Header.Text $HWNDPARENT 1037
+ CreateFont $mui.Header.Text.Font "$(^Font)" "$(^FontSize)" "700"
+ SendMessage $mui.Header.Text ${WM_SETFONT} $mui.Header.Text.Font 0
+
+ GetDlgItem $mui.Header.SubText $HWNDPARENT 1038
+
+ !ifndef MUI_HEADER_TRANSPARENT_TEXT
+ SetCtlColors $mui.Header.Text "" "${MUI_BGCOLOR}"
+ SetCtlColors $mui.Header.SubText "" "${MUI_BGCOLOR}"
+ !else
+ SetCtlColors $mui.Header.Text "" "transparent"
+ SetCtlColors $mui.Header.SubText "" "transparent"
+ !endif
+
+ ;Header image
+ !insertmacro MUI_HEADERIMAGE_INIT "${UNINSTALLER}"
+
+ ;Header background
+ GetDlgItem $mui.Header.Background $HWNDPARENT 1034
+ SetCtlColors $mui.Header.Background "" "${MUI_BGCOLOR}"
+
+ ;Header image background
+ GetDlgItem $mui.Header.Image $HWNDPARENT 1039
+ SetCtlColors $mui.Header.Image "" "${MUI_BGCOLOR}"
+
+ ;Branding text
+ GetDlgItem $mui.Branding.Background $HWNDPARENT 1028
+ SetCtlColors $mui.Branding.Background /BRANDING
+ GetDlgItem $mui.Branding.Text $HWNDPARENT 1256
+ SetCtlColors $mui.Branding.Text /BRANDING
+ SendMessage $mui.Branding.Text ${WM_SETTEXT} 0 "STR:$(^Branding) "
+
+ ;Lines
+ GetDlgItem $mui.Line.Standard $HWNDPARENT 1035
+ GetDlgItem $mui.Line.FullWindow $HWNDPARENT 1045
+
+ ;Buttons
+ GetDlgItem $mui.Button.Next $HWNDPARENT 1
+ GetDlgItem $mui.Button.Cancel $HWNDPARENT 2
+ GetDlgItem $mui.Button.Back $HWNDPARENT 3
+
+!macroend
+
+
+;--------------------------------
+;Interface functions
+
+!macro MUI_FUNCTION_GUIINIT
+
+ Function .onGUIInit
+
+ !insertmacro MUI_GUIINIT_OUTERDIALOG ""
+
+ !ifdef MUI_PAGE_FUNCTION_GUIINIT
+ Call "${MUI_PAGE_FUNCTION_GUIINIT}"
+ !endif
+
+ !ifdef MUI_CUSTOMFUNCTION_GUIINIT
+ Call "${MUI_CUSTOMFUNCTION_GUIINIT}"
+ !endif
+
+ FunctionEnd
+
+!macroend
+
+!macro MUI_UNFUNCTION_GUIINIT
+
+ Function un.onGUIInit
+
+ !insertmacro MUI_GUIINIT_OUTERDIALOG UN
+
+ !ifdef MUI_UNPAGE_FUNCTION_GUIINIT
+ Call "${MUI_UNPAGE_FUNCTION_GUIINIT}"
+ !endif
+
+ !ifdef MUI_CUSTOMFUNCTION_UNGUIINIT
+ Call "${MUI_CUSTOMFUNCTION_UNGUIINIT}"
+ !endif
+
+ FunctionEnd
+
+!macroend
+
+!macro MUI_FUNCTION_ABORTWARNING
+
+ Function .onUserAbort
+
+ !ifdef MUI_PAGE_FUNCTION_ABORTWARNING
+ Call ${MUI_PAGE_FUNCTION_ABORTWARNING}
+ !endif
+
+ !ifdef MUI_ABORTWARNING
+ !insertmacro MUI_ABORTWARNING
+ !endif
+
+ !ifdef MUI_CUSTOMFUNCTION_ABORT
+ Call "${MUI_CUSTOMFUNCTION_ABORT}"
+ !endif
+
+ FunctionEnd
+
+!macroend
+
+!macro MUI_FUNCTION_UNABORTWARNING
+
+ Function un.onUserAbort
+
+ !ifdef MUI_UNPAGE_FUNCTION_ABORTWARNING
+ Call ${MUI_UNPAGE_FUNCTION_ABORTWARNING}
+ !endif
+
+ !ifdef MUI_UNABORTWARNING
+ !insertmacro MUI_UNABORTWARNING
+ !endif
+
+ !ifdef MUI_CUSTOMFUNCTION_UNABORT
+ Call "${MUI_CUSTOMFUNCTION_UNABORT}"
+ !endif
+
+ FunctionEnd
+
+!macroend
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Localization.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Localization.nsh
new file mode 100644
index 000000000..e40ff547e
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Localization.nsh
@@ -0,0 +1,192 @@
+/*
+
+NSIS Modern User Interface
+Localization
+
+*/
+
+;--------------------------------
+;Variables
+
+!macro MUI_LANGDLL_VARIABLES
+
+ !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME
+ !ifndef MUI_LANGDLL_REGISTRY_VARAIBLES
+ !define MUI_LANGDLL_REGISTRY_VARAIBLES
+
+ ;/GLOBAL because the macros are included in a function
+ Var /GLOBAL mui.LangDLL.RegistryLanguage
+
+ !endif
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;Include langauge files
+
+!macro MUI_LANGUAGE LANGUAGE
+
+ ;Include a language
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_INSERT
+
+ LoadLanguageFile "${NSISDIR}\Contrib\Language files\${LANGUAGE}.nlf"
+
+ ;Include language file
+ !insertmacro LANGFILE_INCLUDE_WITHDEFAULT "${NSISDIR}\Contrib\Language files\${LANGUAGE}.nsh" "${NSISDIR}\Contrib\Language files\English.nsh"
+
+ ;Add language to list of languages for selection dialog
+ !ifndef MUI_LANGDLL_LANGUAGES
+ !define MUI_LANGDLL_LANGUAGES "'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' "
+ !define MUI_LANGDLL_LANGUAGES_CP "'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' '${LANG_${LANGUAGE}_CP}' "
+ !else
+ !ifdef MUI_LANGDLL_LANGUAGES_TEMP
+ !undef MUI_LANGDLL_LANGUAGES_TEMP
+ !endif
+ !define MUI_LANGDLL_LANGUAGES_TEMP "${MUI_LANGDLL_LANGUAGES}"
+ !undef MUI_LANGDLL_LANGUAGES
+
+ !ifdef MUI_LANGDLL_LANGUAGES_CP_TEMP
+ !undef MUI_LANGDLL_LANGUAGES_CP_TEMP
+ !endif
+ !define MUI_LANGDLL_LANGUAGES_CP_TEMP "${MUI_LANGDLL_LANGUAGES_CP}"
+ !undef MUI_LANGDLL_LANGUAGES_CP
+
+ !define MUI_LANGDLL_LANGUAGES "'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' ${MUI_LANGDLL_LANGUAGES_TEMP}"
+ !define MUI_LANGDLL_LANGUAGES_CP "'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' '${LANG_${LANGUAGE}_CP}' ${MUI_LANGDLL_LANGUAGES_CP_TEMP}"
+ !endif
+
+ !verbose pop
+
+!macroend
+
+
+;--------------------------------
+;Language selection
+
+!macro MUI_LANGDLL_DISPLAY
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_LANGDLL_VARIABLES
+
+ !insertmacro MUI_DEFAULT MUI_LANGDLL_WINDOWTITLE "Installer Language"
+ !insertmacro MUI_DEFAULT MUI_LANGDLL_INFO "Please select a language."
+
+ !ifdef MUI_LANGDLL_REGISTRY_VARAIBLES
+
+ ReadRegStr $mui.LangDLL.RegistryLanguage "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}"
+
+ ${if} $mui.LangDLL.RegistryLanguage != ""
+ ;Set default langauge to registry language
+ StrCpy $LANGUAGE $mui.LangDLL.RegistryLanguage
+ ${endif}
+
+ !endif
+
+ !ifdef NSIS_CONFIG_SILENT_SUPPORT
+ ${unless} ${Silent}
+ !endif
+
+ !ifndef MUI_LANGDLL_ALWAYSSHOW
+ !ifdef MUI_LANGDLL_REGISTRY_VARAIBLES
+ ${if} $mui.LangDLL.RegistryLanguage == ""
+ !endif
+ !endif
+
+ ;Show langauge selection dialog
+ !ifdef MUI_LANGDLL_ALLLANGUAGES
+ LangDLL::LangDialog "${MUI_LANGDLL_WINDOWTITLE}" "${MUI_LANGDLL_INFO}" A ${MUI_LANGDLL_LANGUAGES} ""
+ !else
+ LangDLL::LangDialog "${MUI_LANGDLL_WINDOWTITLE}" "${MUI_LANGDLL_INFO}" AC ${MUI_LANGDLL_LANGUAGES_CP} ""
+ !endif
+
+ Pop $LANGUAGE
+ ${if} $LANGUAGE == "cancel"
+ Abort
+ ${endif}
+
+ !ifndef MUI_LANGDLL_ALWAYSSHOW
+ !ifdef MUI_LANGDLL_REGISTRY_VARAIBLES
+ ${endif}
+ !endif
+ !endif
+
+
+ !ifdef NSIS_CONFIG_SILENT_SUPPORT
+ ${endif}
+ !endif
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_LANGDLL_SAVELANGUAGE
+
+ ;Save language in registry
+
+ !ifndef MUI_PAGE_UNINSTALLER
+
+ IfAbort mui.langdllsavelanguage_abort
+
+ !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME
+ WriteRegStr "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" $LANGUAGE
+ !endif
+
+ mui.langdllsavelanguage_abort:
+
+ !endif
+
+!macroend
+
+!macro MUI_UNGETLANGUAGE
+
+ ;Get language from registry in uninstaller
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_LANGDLL_VARIABLES
+
+ !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME
+
+ ReadRegStr $mui.LangDLL.RegistryLanguage "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}"
+
+ ${if} $mui.LangDLL.RegistryLanguage = ""
+
+ !endif
+
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+ !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME
+
+ ${else}
+ StrCpy $LANGUAGE $mui.LangDLL.RegistryLanguage
+ ${endif}
+
+ !endif
+
+ !verbose pop
+
+!macroend
+
+
+;--------------------------------
+;Rerserve LangDLL file
+
+!macro MUI_RESERVEFILE_LANGDLL
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ ReserveFile "${NSISDIR}\Plugins\LangDLL.dll"
+
+ !verbose pop
+
+!macroend
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/MUI2.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/MUI2.nsh
new file mode 100644
index 000000000..3e95815f4
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/MUI2.nsh
@@ -0,0 +1,122 @@
+/*
+
+NSIS Modern User Interface - Version 2.0
+Copyright 2002-2009 Joost Verburg
+
+*/
+
+!echo "NSIS Modern User Interface version 2.0 - Copyright 2002-2009 Joost Verburg"
+
+;--------------------------------
+
+!ifndef MUI_INCLUDED
+!define MUI_INCLUDED
+
+!define MUI_SYSVERSION "2.0"
+
+!verbose push
+
+!ifndef MUI_VERBOSE
+ !define MUI_VERBOSE 3
+!endif
+
+!verbose ${MUI_VERBOSE}
+
+!addincludedir "${NSISDIR}\Contrib\Modern UI 2"
+
+;--------------------------------
+;Header files required by MUI
+
+!include WinMessages.nsh
+!include LogicLib.nsh
+!include nsDialogs.nsh
+!include LangFile.nsh
+
+
+;--------------------------------
+;Macros for compile-time defines
+
+!macro MUI_DEFAULT SYMBOL CONTENT
+
+ ;Define symbol if not yet defined
+ ;For setting default values
+
+ !ifndef "${SYMBOL}"
+ !define "${SYMBOL}" "${CONTENT}"
+ !endif
+
+!macroend
+
+!macro MUI_SET SYMBOL CONTENT
+
+ ;Define symbol and undefine if neccesary
+
+ !insertmacro MUI_UNSET "${SYMBOL}"
+ !define "${SYMBOL}" "${CONTENT}"
+
+!macroend
+
+!macro MUI_UNSET SYMBOL
+
+ ;Undefine symbol if defined
+
+ !ifdef "${SYMBOL}"
+ !undef "${SYMBOL}"
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;MUI interface
+
+!include "Deprecated.nsh"
+!include "Interface.nsh"
+!include "Localization.nsh"
+!include "Pages.nsh"
+
+
+;--------------------------------
+;Pages
+
+!include "Pages\Components.nsh"
+!include "Pages\Directory.nsh"
+!include "Pages\Finish.nsh"
+!include "Pages\InstallFiles.nsh"
+!include "Pages\License.nsh"
+!include "Pages\StartMenu.nsh"
+!include "Pages\UninstallConfirm.nsh"
+!include "Pages\Welcome.nsh"
+
+
+;--------------------------------
+;Insert MUI code in script
+
+!macro MUI_INSERT
+
+ !ifndef MUI_INSERT
+ !define MUI_INSERT
+
+ ;This macro is included when the first language file is included,
+ ;after the pages.
+
+ ;Interface settings
+ !insertmacro MUI_INTERFACE
+
+ ;Interface functions - Installer
+ !insertmacro MUI_FUNCTION_GUIINIT
+ !insertmacro MUI_FUNCTION_ABORTWARNING
+
+ ;Interface functions - Uninstaller
+ !ifdef MUI_UNINSTALLER
+ !insertmacro MUI_UNFUNCTION_GUIINIT
+ !insertmacro MUI_FUNCTION_UNABORTWARNING
+ !endif
+
+ !endif
+
+!macroend
+
+!endif
+
+!verbose pop
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages.nsh
new file mode 100644
index 000000000..cf0cb5108
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages.nsh
@@ -0,0 +1,160 @@
+/*
+
+NSIS Modern User Interface
+Support code for all pages
+
+*/
+
+;--------------------------------
+;Page initialization
+
+!macro MUI_PAGE_INIT
+
+ ;Include interface settings in neccesary
+ !insertmacro MUI_INTERFACE
+
+ ;Define settings for installer page
+ !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER
+ !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_PREFIX
+ !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_FUNCPREFIX
+
+ !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_PREFIX ""
+ !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_FUNCPREFIX ""
+
+ ;Generate unique ID
+ !insertmacro MUI_UNSET MUI_UNIQUEID
+ !define MUI_UNIQUEID ${__LINE__}
+
+!macroend
+
+!macro MUI_UNPAGE_INIT
+
+ ;Include interface settings
+ !insertmacro MUI_INTERFACE
+
+ ;Define prefixes for uninstaller page
+ !insertmacro MUI_SET MUI_UNINSTALLER ""
+
+ !insertmacro MUI_SET MUI_PAGE_UNINSTALLER ""
+ !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_PREFIX "UN"
+ !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_FUNCPREFIX "un."
+
+ ;Generate unique ID
+ !insertmacro MUI_UNSET MUI_UNIQUEID
+ !define MUI_UNIQUEID ${__LINE__}
+
+!macroend
+
+
+;--------------------------------
+;Header text for standard MUI page
+
+!macro MUI_HEADER_TEXT_PAGE TEXT SUBTEXT
+
+ !ifdef MUI_PAGE_HEADER_TEXT & MUI_PAGE_HEADER_SUBTEXT
+ !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}"
+ !else ifdef MUI_PAGE_HEADER_TEXT
+ !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${SUBTEXT}"
+ !else ifdef MUI_PAGE_HEADER_SUBTEXT
+ !insertmacro MUI_HEADER_TEXT "${TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}"
+ !else
+ !insertmacro MUI_HEADER_TEXT "${TEXT}" "${SUBTEXT}"
+ !endif
+
+ !insertmacro MUI_UNSET MUI_PAGE_HEADER_TEXT
+ !insertmacro MUI_UNSET MUI_PAGE_HEADER_SUBTEXT
+
+!macroend
+
+
+;--------------------------------
+;Header text for custom page
+
+!macro MUI_HEADER_TEXT TEXT SUBTEXT ;Called from script
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !ifdef MUI_HEADER_TRANSPARENT_TEXT
+ LockWindow on
+ !endif
+
+ SendMessage $mui.Header.Text ${WM_SETTEXT} 0 "STR:${TEXT}"
+ SendMessage $mui.Header.SubText ${WM_SETTEXT} 0 "STR:${SUBTEXT}"
+
+ !ifdef MUI_HEADER_TRANSPARENT_TEXT
+ LockWindow off
+ !endif
+
+ !verbose pop
+
+!macroend
+
+
+;--------------------------------
+;Custom page functions
+
+!macro MUI_PAGE_FUNCTION_CUSTOM TYPE
+
+ !ifdef MUI_PAGE_CUSTOMFUNCTION_${TYPE}
+ Call "${MUI_PAGE_CUSTOMFUNCTION_${TYPE}}"
+ !undef MUI_PAGE_CUSTOMFUNCTION_${TYPE}
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;Support for full window pages (like welcome/finish page)
+
+!macro MUI_PAGE_FUNCTION_FULLWINDOW
+
+ !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_FULLWINDOW
+ !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_FULLWINDOW
+
+ Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow
+
+ LockWindow on
+
+ ;The branding text needs to be hidden because the full windows page
+ ;overlaps with it.
+ ShowWindow $mui.Branding.Background ${SW_HIDE}
+ ShowWindow $mui.Branding.Text ${SW_HIDE}
+
+ ;The texts need to be hidden because otherwise they may show through
+ ;the page above when the Alt key is pressed.
+ ShowWindow $mui.Header.Text ${SW_HIDE}
+ ShowWindow $mui.Header.SubText ${SW_HIDE}
+ ShowWindow $mui.Header.Image ${SW_HIDE}
+
+ ;Show line below full width of page
+ ShowWindow $mui.Line.Standard ${SW_HIDE}
+ ShowWindow $mui.Line.FullWindow ${SW_NORMAL}
+
+ LockWindow off
+
+ FunctionEnd
+
+ Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow
+
+ ;Set everything back to normal again
+
+ LockWindow on
+
+ ShowWindow $mui.Branding.Background ${SW_NORMAL}
+ ShowWindow $mui.Branding.Text ${SW_NORMAL}
+
+ ShowWindow $mui.Header.Text ${SW_NORMAL}
+ ShowWindow $mui.Header.SubText ${SW_NORMAL}
+ ShowWindow $mui.Header.Image ${SW_NORMAL}
+
+ ShowWindow $mui.Line.Standard ${SW_NORMAL}
+ ShowWindow $mui.Line.FullWindow ${SW_HIDE}
+
+ LockWindow off
+
+ FunctionEnd
+
+ !endif
+
+!macroend
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/Components.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/Components.nsh
new file mode 100644
index 000000000..71387cc62
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/Components.nsh
@@ -0,0 +1,242 @@
+/*
+
+NSIS Modern User Interface
+Components page
+
+*/
+
+;--------------------------------
+;Page interface settings and variables
+
+!macro MUI_COMPONENTSPAGE_INTERFACE
+
+ !ifndef MUI_COMPONENTSPAGE_INTERFACE
+ !define MUI_COMPONENTSPAGE_INTERFACE
+ Var mui.ComponentsPage
+
+ Var mui.ComponentsPage.Text
+ Var mui.ComponentsPage.InstTypesText
+ Var mui.ComponentsPage.ComponentsText
+
+ Var mui.ComponentsPage.InstTypes
+ Var mui.ComponentsPage.Components
+
+ Var mui.ComponentsPage.DescriptionTitle
+ Var mui.ComponentsPage.DescriptionText.Info
+ Var mui.ComponentsPage.DescriptionText
+
+ Var mui.ComponentsPage.SpaceRequired
+
+ !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_CHECKBITMAP "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp"
+
+ !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_SMALLDESC "${NSISDIR}\Contrib\UIs\modern_smalldesc.exe"
+ !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_NODESC "${NSISDIR}\Contrib\UIs\modern_nodesc.exe"
+
+ ;Apply settings
+
+ !ifdef MUI_COMPONENTSPAGE_SMALLDESC
+ ChangeUI IDD_SELCOM "${MUI_UI_COMPONENTSPAGE_SMALLDESC}"
+ !else ifdef MUI_COMPONENTSPAGE_NODESC
+ ChangeUI IDD_SELCOM "${MUI_UI_COMPONENTSPAGE_NODESC}"
+ !endif
+
+ CheckBitmap "${MUI_COMPONENTSPAGE_CHECKBITMAP}"
+
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;Page declaration
+
+!macro MUI_PAGEDECLARATION_COMPONENTS
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}COMPONENTSPAGE ""
+ !insertmacro MUI_COMPONENTSPAGE_INTERFACE
+
+ !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_TOP ""
+ !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_COMPLIST ""
+ !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_INSTTYPE ""
+ !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE "$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE)"
+ !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO "$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)"
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}components
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ ComponentText "${MUI_COMPONENTSPAGE_TEXT_TOP}" "${MUI_COMPONENTSPAGE_TEXT_INSTTYPE}" "${MUI_COMPONENTSPAGE_TEXT_COMPLIST}"
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_COMPONENTSPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID}
+
+ !undef MUI_COMPONENTSPAGE_TEXT_TOP
+ !undef MUI_COMPONENTSPAGE_TEXT_COMPLIST
+ !undef MUI_COMPONENTSPAGE_TEXT_INSTTYPE
+ !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE
+ !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO
+
+!macroend
+
+!macro MUI_PAGE_COMPONENTS
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_COMPONENTS
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_COMPONENTS
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_COMPONENTS
+
+ !verbose pop
+
+!macroend
+
+
+;--------------------------------
+;Page functions
+
+!macro MUI_FUNCTION_COMPONENTSPAGE PRE SHOW LEAVE
+
+ Function "${PRE}"
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_SUBTITLE)
+ FunctionEnd
+
+ Function "${SHOW}"
+
+ ;Get control hanldes
+ FindWindow $mui.ComponentsPage "#32770" "" $HWNDPARENT
+ GetDlgItem $mui.ComponentsPage.Text $mui.ComponentsPage 1006
+ GetDlgItem $mui.ComponentsPage.InstTypesText $mui.ComponentsPage 1021
+ GetDlgItem $mui.ComponentsPage.ComponentsText $mui.ComponentsPage 1022
+ GetDlgItem $mui.ComponentsPage.InstTypes $mui.ComponentsPage 1017
+ GetDlgItem $mui.ComponentsPage.Components $mui.ComponentsPage 1032
+ GetDlgItem $mui.ComponentsPage.DescriptionTitle $mui.ComponentsPage 1042
+ GetDlgItem $mui.ComponentsPage.DescriptionText $mui.ComponentsPage 1043
+ GetDlgItem $mui.ComponentsPage.SpaceRequired $mui.ComponentsPage 1023
+
+ ;Default text in description textbox
+ SendMessage $mui.ComponentsPage.DescriptionTitle ${WM_SETTEXT} 0 "STR:${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}"
+ EnableWindow $mui.ComponentsPage.DescriptionText 0
+ SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
+
+ StrCpy $mui.ComponentsPage.DescriptionText.Info "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}" ;Text for current components page
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ FunctionEnd
+
+!macroend
+
+
+;--------------------------------
+;Script functions for components descriptions
+
+!macro MUI_DESCRIPTION_BEGIN
+
+ ${if} $0 == -1
+ ;No mouse hover over component in list
+ SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:"
+ EnableWindow $mui.ComponentsPage.DescriptionText 0
+ SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:$mui.ComponentsPage.DescriptionText.Info"
+
+!macroend
+
+!macro MUI_DESCRIPTION_TEXT VAR TEXT
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ ${elseif} $0 == ${VAR}
+ SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:"
+ EnableWindow $mui.ComponentsPage.DescriptionText 1
+ SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:${TEXT}"
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_DESCRIPTION_END
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ ${endif}
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_FUNCTION_DESCRIPTION_BEGIN
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ Function .onMouseOverSection
+ !insertmacro MUI_DESCRIPTION_BEGIN
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_FUNCTION_DESCRIPTION_END
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_DESCRIPTION_END
+ !ifdef MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION
+ Call "${MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION}"
+ !endif
+ FunctionEnd
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNFUNCTION_DESCRIPTION_BEGIN
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ Function un.onMouseOverSection
+ !insertmacro MUI_DESCRIPTION_BEGIN
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNFUNCTION_DESCRIPTION_END
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_DESCRIPTION_END
+ !ifdef MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION
+ Call "${MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION}"
+ !endif
+ FunctionEnd
+
+ !verbose pop
+
+!macroend
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/Directory.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/Directory.nsh
new file mode 100644
index 000000000..2e05653f9
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/Directory.nsh
@@ -0,0 +1,125 @@
+/*
+
+NSIS Modern User Interface
+Directory page
+
+*/
+
+;--------------------------------
+;Page interface settings and variables
+
+!macro MUI_DIRECTORYPAGE_INTERFACE
+
+ !ifndef MUI_DIRECTORYPAGE_INTERFACE
+ !define MUI_DIRECTORYPAGE_INTERFACE
+ Var mui.DirectoryPage
+
+ Var mui.DirectoryPage.Text
+
+ Var mui.DirectoryPage.DirectoryBox
+ Var mui.DirectoryPage.Directory
+ Var mui.DirectoryPage.BrowseButton
+
+ Var mui.DirectoryPage.SpaceRequired
+ Var mui.DirectoryPage.SpaceAvailable
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;Page declaration
+
+!macro MUI_PAGEDECLARATION_DIRECTORY
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}DIRECTORYPAGE ""
+ !insertmacro MUI_DIRECTORYPAGE_INTERFACE
+
+ !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_TOP ""
+ !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_DESTINATION ""
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}directory
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ DirText "${MUI_DIRECTORYPAGE_TEXT_TOP}" "${MUI_DIRECTORYPAGE_TEXT_DESTINATION}"
+
+ !ifdef MUI_DIRECTORYPAGE_VARIABLE
+ DirVar "${MUI_DIRECTORYPAGE_VARIABLE}"
+ !endif
+
+ !ifdef MUI_DIRECTORYPAGE_VERIFYONLEAVE
+ DirVerify leave
+ !endif
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_DIRECTORYPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID}
+
+ !undef MUI_DIRECTORYPAGE_TEXT_TOP
+ !undef MUI_DIRECTORYPAGE_TEXT_DESTINATION
+ !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VARIABLE
+ !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VERIFYONLEAVE
+
+!macroend
+
+!macro MUI_PAGE_DIRECTORY
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_DIRECTORY
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_DIRECTORY
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_DIRECTORY
+
+ !verbose pop
+
+!macroend
+
+
+;--------------------------------
+;Page functions
+
+!macro MUI_FUNCTION_DIRECTORYPAGE PRE SHOW LEAVE
+
+ Function "${PRE}"
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_SUBTITLE)
+ FunctionEnd
+
+ Function "${SHOW}"
+
+ ;Get control handles
+ FindWindow $mui.DirectoryPage "#32770" "" $HWNDPARENT
+ GetDlgItem $mui.DirectoryPage.Text $mui.DirectoryPage 1006
+ GetDlgItem $mui.DirectoryPage.DirectoryBox $mui.DirectoryPage 1020
+ GetDlgItem $mui.DirectoryPage.Directory $mui.DirectoryPage 1019
+ GetDlgItem $mui.DirectoryPage.BrowseButton $mui.DirectoryPage 1001
+ GetDlgItem $mui.DirectoryPage.SpaceRequired $mui.DirectoryPage 1023
+ GetDlgItem $mui.DirectoryPage.SpaceAvailable $mui.DirectoryPage 1024
+
+ !ifdef MUI_DIRECTORYPAGE_BGCOLOR
+ SetCtlColors $mui.DirectoryPage.Directory "" "${MUI_DIRECTORYPAGE_BGCOLOR}"
+ !endif
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+ FunctionEnd
+
+ Function "${LEAVE}"
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+ FunctionEnd
+
+!macroend
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/Finish.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/Finish.nsh
new file mode 100644
index 000000000..54eac08de
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/Finish.nsh
@@ -0,0 +1,493 @@
+ /*
+
+NSIS Modern User Interface
+Finish page (implemented using nsDialogs)
+
+*/
+
+;--------------------------------
+;Page interface settings and variables
+
+!macro MUI_FINISHPAGE_INTERFACE
+
+ !ifndef MUI_FINISHPAGE_INTERFACE
+ !define MUI_FINISHPAGE_INTERFACE
+ Var mui.FinishPage
+
+ Var mui.FinishPage.Image
+ Var mui.FinishPage.Image.Bitmap
+
+ Var mui.FinishPage.Title
+ Var mui.FinishPage.Title.Font
+
+ Var mui.FinishPage.Text
+ !endif
+
+ !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT
+ !ifndef MUI_FINISHPAGE_RETURNVALUE_VARIABLES
+ !define MUI_FINISHPAGE_RETURNVALUE_VARIABLES
+ Var mui.FinishPage.ReturnValue
+ !endif
+ !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME
+ !ifndef MUI_FINISHPAGE_RETURNVALUE_VARIABLES
+ !define MUI_FINISHPAGE_RETURNVALUE_VARIABLES
+ Var mui.FinishPage.ReturnValue
+ !endif
+ !endif
+
+ !ifdef MUI_FINISHPAGE_CANCEL_ENABLED
+ !ifndef MUI_FINISHPAGE_CANCEL_ENABLED_VARIABLES
+ !define MUI_FINISHPAGE_CANCEL_ENABLED_VARIABLES
+ Var mui.FinishPage.DisableAbortWarning
+ !endif
+ !endif
+
+ !ifdef MUI_FINISHPAGE_RUN
+ !ifndef MUI_FINISHPAGE_RUN_VARIABLES
+ !define MUI_FINISHPAGE_RUN_VARIABLES
+ Var mui.FinishPage.Run
+ !endif
+ !endif
+
+ !ifdef MUI_FINISHPAGE_SHOWREADME
+ !ifndef MUI_FINISHPAGE_SHOREADME_VARAIBLES
+ !define MUI_FINISHPAGE_SHOREADME_VARAIBLES
+ Var mui.FinishPage.ShowReadme
+ !endif
+ !endif
+
+ !ifdef MUI_FINISHPAGE_LINK
+ !ifndef MUI_FINISHPAGE_LINK_VARIABLES
+ !define MUI_FINISHPAGE_LINK_VARIABLES
+ Var mui.FinishPage.Link
+ !endif
+ !endif
+
+ !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT
+ !ifndef MUI_FINISHPAGE_REBOOT_VARIABLES
+ !define MUI_FINISHPAGE_REBOOT_VARIABLES
+ Var mui.FinishPage.RebootNow
+ Var mui.FinishPage.RebootLater
+ !endif
+ !endif
+
+ !insertmacro MUI_DEFAULT MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\win.bmp"
+
+!macroend
+
+
+;--------------------------------
+;Interface initialization
+
+!macro MUI_FINISHPAGE_GUIINIT
+
+ !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_GUINIT
+ !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_GUINIT
+
+ Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.GUIInit
+
+ InitPluginsDir
+ File "/oname=$PLUGINSDIR\modern-wizard.bmp" "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}"
+
+ !ifdef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT
+ Call "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT}"
+ !endif
+
+ !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE_NOAUTOCLOSE
+ SetAutoClose true
+ !endif
+
+ FunctionEnd
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.GUIInit
+
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;Abort warning
+
+!macro MUI_FINISHPAGE_ABORTWARNING
+
+ !ifdef MUI_FINISHPAGE_CANCEL_ENABLED
+
+ !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE_ABORTWARNING
+ !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE_ABORTWARNING
+
+ Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.AbortWarning
+
+ ${if} $mui.FinishPage.DisableAbortWarning == "1"
+ Quit
+ ${endif}
+
+ !ifdef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_ABORTWARNING
+ Call ${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_ABORTWARNING}
+ !endif
+
+ FunctionEnd
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_ABORTWARNING ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.AbortWarning
+
+ !endif
+
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;Page declaration
+
+!macro MUI_PAGEDECLARATION_FINISH
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE ""
+ !insertmacro MUI_FINISHPAGE_INTERFACE
+
+ !insertmacro MUI_FINISHPAGE_GUIINIT
+ !insertmacro MUI_FINISHPAGE_ABORTWARNING
+
+ !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TITLE "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TITLE)"
+ !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TEXT)"
+ !insertmacro MUI_DEFAULT MUI_FINISHPAGE_BUTTON "$(MUI_BUTTONTEXT_FINISH)"
+ !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT_REBOOT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_REBOOT)"
+ !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT_REBOOTNOW "$(MUI_TEXT_FINISH_REBOOTNOW)"
+ !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT_REBOOTLATER "$(MUI_TEXT_FINISH_REBOOTLATER)"
+ !insertmacro MUI_DEFAULT MUI_FINISHPAGE_RUN_TEXT "$(MUI_TEXT_FINISH_RUN)"
+ !insertmacro MUI_DEFAULT MUI_FINISHPAGE_SHOWREADME_TEXT "$(MUI_TEXT_FINISH_SHOWREADME)"
+ !insertmacro MUI_DEFAULT MUI_FINISHPAGE_LINK_COLOR "000080"
+
+ !insertmacro MUI_PAGE_FUNCTION_FULLWINDOW
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Pre_${MUI_UNIQUEID} \
+ ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Leave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_FINISHPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Pre_${MUI_UNIQUEID} \
+ ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Leave_${MUI_UNIQUEID} \
+ ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Link_${MUI_UNIQUEID}
+
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE_3LINES
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_LARGE
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_BUTTON
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_CANCEL_ENABLED
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOT
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTNOW
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTLATER
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTLATER_DEFAULT
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_TEXT
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_PARAMETERS
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_NOTCHECKED
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_FUNCTION
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_TEXT
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_FUNCTION
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_LOCATION
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_COLOR
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_NOREBOOTSUPPORT
+
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_ABORTWARNINGCHECK
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_TOP
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_BOTTOM
+
+!macroend
+
+!macro MUI_PAGE_FINISH
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_FINISH
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_FINISH
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_FINISH
+
+ !verbose pop
+
+!macroend
+
+
+;--------------------------------
+;Page functions
+
+!macro MUI_FUNCTION_FINISHPAGE PRE LEAVE LINK
+
+ !ifdef MUI_FINISHPAGE_LINK
+
+ Function "${LINK}"
+
+ ExecShell open "${MUI_FINISHPAGE_LINK_LOCATION}"
+
+ FunctionEnd
+
+ !endif
+
+ Function "${PRE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+
+ ;Set text on Next button
+ SendMessage $mui.Button.Next ${WM_SETTEXT} 0 "STR:${MUI_FINISHPAGE_BUTTON}"
+
+ ;Enable cancel button if set in script
+ !ifdef MUI_FINISHPAGE_CANCEL_ENABLED
+ EnableWindow $mui.Button.Cancel 1
+ !endif
+
+ ;Create dialog
+ nsDialogs::Create 1044
+ Pop $mui.FinishPage
+ nsDialogs::SetRTL $(^RTL)
+ SetCtlColors $mui.FinishPage "" "${MUI_BGCOLOR}"
+
+ ;Image control
+ ${NSD_CreateBitmap} 0u 0u 109u 193u ""
+ Pop $mui.FinishPage.Image
+ !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
+ ${NSD_SetStretchedImage} $mui.FinishPage.Image $PLUGINSDIR\modern-wizard.bmp $mui.FinishPage.Image.Bitmap
+ !else
+ ${NSD_SetImage} $mui.FinishPage.Image $PLUGINSDIR\modern-wizard.bmp $mui.FinishPage.Image.Bitmap
+ !endif
+
+ ;Positiong of controls
+
+ ;Title
+ !ifndef MUI_FINISHPAGE_TITLE_3LINES
+ !define MUI_FINISHPAGE_TITLE_HEIGHT 28
+ !else
+ !define MUI_FINISHPAGE_TITLE_HEIGHT 38
+ !endif
+
+ ;Text
+ ;17 = 10 (top margin) + 7 (distance between texts)
+ !define /math MUI_FINISHPAGE_TEXT_TOP 17 + ${MUI_FINISHPAGE_TITLE_HEIGHT}
+
+ ;Height if space required for radio buttons or check boxes
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !define MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS 40
+ !else
+ !define MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS 60
+ !endif
+
+ !define /math MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS ${MUI_FINISHPAGE_TEXT_TOP} + ${MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS}
+
+ ;Positioning of radio buttons to ask for a reboot
+ !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT
+ !define /math MUI_FINISHPAGE_REBOOTNOW_TOP ${MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS} + 5 ;Distance between text and options
+ ;25 = 10 (height of first radio button) + 15 (distance between buttons)
+ !define /math MUI_FINISHPAGE_REBOOTLATER_TOP ${MUI_FINISHPAGE_REBOOTNOW_TOP} + 25
+ !endif
+
+ ;Positioning of checkboxes
+ !ifdef MUI_FINISHPAGE_RUN
+ !define /math MUI_FINISHPAGE_RUN_TOP ${MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS} + 5 ;Distance between text and options
+ !endif
+ !ifdef MUI_FINISHPAGE_SHOWREADME
+ !ifdef MUI_FINISHPAGE_RUN
+ ;25 = 10 (height of run checkbox) + 10 (distance between checkboxes)
+ !define /math MUI_FINISHPAGE_SHOWREADME_TOP ${MUI_FINISHPAGE_RUN_TOP} + 20
+ !else
+ !define /math MUI_FINISHPAGE_SHOWREADME_TOP ${MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS} + 5 ;Distance between text and options
+ !endif
+ !endif
+
+ !ifndef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME
+ ;Height if full space is available for text and link
+ !ifndef MUI_FINISHPAGE_LINK
+ !define MUI_FINISHPAGE_TEXT_HEIGHT 130
+ !else
+ !define MUI_FINISHPAGE_TEXT_HEIGHT 120
+ !endif
+ !endif
+
+ !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT
+
+ ${if} ${RebootFlag}
+
+ ;Title text
+ ${NSD_CreateLabel} 120u 10u 195u ${MUI_FINISHPAGE_TITLE_HEIGHT}u "${MUI_FINISHPAGE_TITLE}"
+ Pop $mui.FinishPage.Title
+ SetCtlColors $mui.FinishPage.Title "" "${MUI_BGCOLOR}"
+ CreateFont $mui.FinishPage.Title.Font "$(^Font)" "12" "700"
+ SendMessage $mui.FinishPage.Title ${WM_SETFONT} $mui.FinishPage.Title.Font 0
+
+ ;Finish text
+ ${NSD_CreateLabel} 120u 45u 195u ${MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS}u "${MUI_FINISHPAGE_TEXT_REBOOT}"
+ Pop $mui.FinishPage.Text
+ SetCtlColors $mui.FinishPage.Text "" "${MUI_BGCOLOR}"
+
+ ;Radio buttons for reboot page
+ ${NSD_CreateRadioButton} 120u ${MUI_FINISHPAGE_REBOOTNOW_TOP}u 195u 10u "${MUI_FINISHPAGE_TEXT_REBOOTNOW}"
+ Pop $mui.FinishPage.RebootNow
+ SetCtlColors $mui.FinishPage.RebootNow "" "${MUI_BGCOLOR}"
+ ${NSD_CreateRadioButton} 120u ${MUI_FINISHPAGE_REBOOTLATER_TOP}u 195u 10u "${MUI_FINISHPAGE_TEXT_REBOOTLATER}"
+ Pop $mui.FinishPage.RebootLater
+ SetCtlColors $mui.FinishPage.RebootLater "" "${MUI_BGCOLOR}"
+ !ifndef MUI_FINISHPAGE_REBOOTLATER_DEFAULT
+ SendMessage $mui.FinishPage.RebootNow ${BM_SETCHECK} ${BST_CHECKED} 0
+ !else
+ SendMessage $mui.FinishPage.RebootLater ${BM_SETCHECK} ${BST_CHECKED} 0
+ !endif
+ ${NSD_SetFocus} $mui.FinishPage.RebootNow
+
+ ${else}
+
+ !endif
+
+ ;Title text
+ ${NSD_CreateLabel} 120u 10u 195u ${MUI_FINISHPAGE_TITLE_HEIGHT}u "${MUI_FINISHPAGE_TITLE}"
+ Pop $mui.FinishPage.Title
+ SetCtlColors $mui.FinishPage.Title "" "${MUI_BGCOLOR}"
+ CreateFont $mui.FinishPage.Title.Font "$(^Font)" "12" "700"
+ SendMessage $mui.FinishPage.Title ${WM_SETFONT} $mui.FinishPage.Title.Font 0
+
+ ;Finish text
+ !ifndef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME
+ ${NSD_CreateLabel} 120u ${MUI_FINISHPAGE_TEXT_TOP}u 195u ${MUI_FINISHPAGE_TEXT_HEIGHT}u "${MUI_FINISHPAGE_TEXT}"
+ !else
+ ${NSD_CreateLabel} 120u ${MUI_FINISHPAGE_TEXT_TOP}u 195u ${MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS}u "${MUI_FINISHPAGE_TEXT}"
+ !endif
+ Pop $mui.FinishPage.Text
+ SetCtlColors $mui.FinishPage.Text "" "${MUI_BGCOLOR}"
+
+ ;Checkboxes
+ !ifdef MUI_FINISHPAGE_RUN
+ ${NSD_CreateCheckbox} 120u ${MUI_FINISHPAGE_RUN_TOP}u 195u 10u "${MUI_FINISHPAGE_RUN_TEXT}"
+ Pop $mui.FinishPage.Run
+ SetCtlColors $mui.FinishPage.Run "" "${MUI_BGCOLOR}"
+ !ifndef MUI_FINISHPAGE_RUN_NOTCHECKED
+ SendMessage $mui.FinishPage.Run ${BM_SETCHECK} ${BST_CHECKED} 0
+ !endif
+ ${NSD_SetFocus} $mui.FinishPage.Run
+ !endif
+ !ifdef MUI_FINISHPAGE_SHOWREADME
+ ${NSD_CreateCheckbox} 120u ${MUI_FINISHPAGE_SHOWREADME_TOP}u 195u 10u "${MUI_FINISHPAGE_SHOWREADME_TEXT}"
+ Pop $mui.FinishPage.ShowReadme
+ SetCtlColors $mui.FinishPage.ShowReadme "" "${MUI_BGCOLOR}"
+ !ifndef MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
+ SendMessage $mui.FinishPage.ShowReadme ${BM_SETCHECK} ${BST_CHECKED} 0
+ !endif
+ !ifndef MUI_FINISHPAGE_RUN
+ ${NSD_SetFocus} $mui.FinishPage.ShowReadme
+ !endif
+ !endif
+
+ ;Link
+ !ifdef MUI_FINISHPAGE_LINK
+ ${NSD_CreateLink} 120u 175u 195u 10u "${MUI_FINISHPAGE_LINK}"
+ Pop $mui.FinishPage.Link
+ SetCtlColors $mui.FinishPage.Link "${MUI_FINISHPAGE_LINK_COLOR}" "${MUI_BGCOLOR}"
+ ${NSD_OnClick} $mui.FinishPage.Link "${LINK}"
+ !endif
+
+ !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT
+ ${endif}
+ !endif
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ !ifdef MUI_FINISHPAGE_CANCEL_ENABLED
+ StrCpy $mui.FinishPage.DisableAbortWarning "1"
+ !endif
+
+ ;Show page
+ Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+ nsDialogs::Show
+ Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow
+
+ !ifdef MUI_FINISHPAGE_CANCEL_ENABLED
+ StrCpy $mui.FinishPage.DisableAbortWarning ""
+ !endif
+
+ ;Delete image from memory
+ ${NSD_FreeImage} $mui.FinishPage.Image.Bitmap
+
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE_HEIGHT
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_TOP
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_HEIGHT
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTNOW_TOP
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTLATER_TOP
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_TOP
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_TOP
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT
+
+ ;Check whether the user has chosen to reboot the computer
+ ${if} ${RebootFlag}
+ SendMessage $mui.FinishPage.RebootNow ${BM_GETCHECK} 0 0 $mui.FinishPage.ReturnValue
+ ${if} $mui.FinishPage.ReturnValue = ${BST_CHECKED}
+ Reboot
+ ${else}
+ Return
+ ${endif}
+ ${endif}
+
+ !endif
+
+ ;Run functions depending on checkbox state
+
+ !ifdef MUI_FINISHPAGE_RUN
+
+ SendMessage $mui.FinishPage.Run ${BM_GETCHECK} 0 0 $mui.FinishPage.ReturnValue
+
+ ${if} $mui.FinishPage.ReturnValue = ${BST_CHECKED}
+ !ifndef MUI_FINISHPAGE_RUN_FUNCTION
+ !ifndef MUI_FINISHPAGE_RUN_PARAMETERS
+ Exec "$\"${MUI_FINISHPAGE_RUN}$\""
+ !else
+ Exec "$\"${MUI_FINISHPAGE_RUN}$\" ${MUI_FINISHPAGE_RUN_PARAMETERS}"
+ !endif
+ !else
+ Call "${MUI_FINISHPAGE_RUN_FUNCTION}"
+ !endif
+ ${endif}
+
+ !endif
+
+ !ifdef MUI_FINISHPAGE_SHOWREADME
+
+ SendMessage $mui.FinishPage.ShowReadme ${BM_GETCHECK} 0 0 $mui.FinishPage.ReturnValue
+
+ ${if} $mui.FinishPage.ReturnValue = ${BST_CHECKED}
+ !ifndef MUI_FINISHPAGE_SHOWREADME_FUNCTION
+ ExecShell open "${MUI_FINISHPAGE_SHOWREADME}"
+ !else
+ Call "${MUI_FINISHPAGE_SHOWREADME_FUNCTION}"
+ !endif
+ ${endif}
+
+ !endif
+
+ FunctionEnd
+
+!macroend
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/InstallFiles.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/InstallFiles.nsh
new file mode 100644
index 000000000..868ae17c2
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/InstallFiles.nsh
@@ -0,0 +1,149 @@
+/*
+
+NSIS Modern User Interface
+InstallFiles page
+
+*/
+
+;--------------------------------
+;Page interface settings and variables
+
+!macro MUI_INSTFILESPAGE_INTERFACE
+
+ !ifndef MUI_INSTFILESYPAGE_INTERFACE
+ !define MUI_INSTFILESYPAGE_INTERFACE
+
+ !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_COLORS "/windows"
+ !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_PROGRESSBAR "smooth"
+
+ Var mui.InstFilesPage
+
+ Var mui.InstFilesPage.Text
+ Var mui.InstFilesPage.ProgressBar
+ Var mui.InstFilesPage.ShowLogButton
+ Var mui.InstFilesPage.Log
+
+ ;Apply settings
+ InstallColors ${MUI_INSTFILESPAGE_COLORS}
+ InstProgressFlags ${MUI_INSTFILESPAGE_PROGRESSBAR}
+ SubCaption 4 " "
+ UninstallSubCaption 2 " "
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;Page declaration
+
+!macro MUI_PAGEDECLARATION_INSTFILES
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INSTFILESPAGE ""
+ !insertmacro MUI_INSTFILESPAGE_INTERFACE
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}instfiles
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_INSTFILESPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID}
+
+ !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_TEXT
+ !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT
+ !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_TEXT
+ !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_SUBTEXT
+
+!macroend
+
+!macro MUI_PAGE_INSTFILES
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_INSTFILES
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_INSTFILES
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_INSTFILES
+
+ !verbose pop
+
+!macroend
+
+
+;--------------------------------
+;Page functions
+
+!macro MUI_FUNCTION_INSTFILESPAGE PRE SHOW LEAVE
+
+ Function "${PRE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_SUBTITLE)
+
+ FunctionEnd
+
+ Function "${SHOW}"
+
+ ;Get controls handles
+ FindWindow $mui.InstFilesPage "#32770" "" $HWNDPARENT
+ GetDlgItem $mui.InstFilesPage.Text $mui.InstFilesPage 1006
+ GetDlgItem $mui.InstFilesPage.ProgressBar $mui.InstFilesPage 1004
+ GetDlgItem $mui.InstFilesPage.ShowLogButton $mui.InstFilesPage 1027
+ GetDlgItem $mui.InstFilesPage.Log $mui.InstFilesPage 1016
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ ;Set text on completed page header
+
+ IfAbort mui.endheader_abort
+
+ !ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT & MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT
+ !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}" "${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}"
+ !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT
+ !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)"
+ !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT
+ !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)" "${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}"
+ !else
+ !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)"
+ !endif
+
+ Goto mui.endheader_done
+
+ mui.endheader_abort:
+
+ !ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT & MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT
+ !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}" "${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}"
+ !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT
+ !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)"
+ !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT
+ !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)" "${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}"
+ !else
+ !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)"
+ !endif
+
+ mui.endheader_done:
+
+ !insertmacro MUI_LANGDLL_SAVELANGUAGE
+
+ FunctionEnd
+
+!macroend
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/License.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/License.nsh
new file mode 100644
index 000000000..2bcbee548
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/License.nsh
@@ -0,0 +1,145 @@
+/*
+
+NSIS Modern User Interface
+License page
+
+*/
+
+;--------------------------------
+;Page interface settings and variables
+
+!macro MUI_LICENSEPAGE_INTERFACE
+
+ !ifndef MUI_LICENSEPAGE_INTERFACE
+ !define MUI_LICENSEPAGE_INTERFACE
+ Var mui.LicensePage
+
+ Var mui.Licensepage.TopText
+ Var mui.Licensepage.Text
+ Var mui.Licensepage.LicenseText
+
+ !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BGCOLOR "/windows"
+
+ ;Apply settings
+ LicenseBkColor "${MUI_LICENSEPAGE_BGCOLOR}"
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;Page declaration
+
+!macro MUI_PAGEDECLARATION_LICENSE LICENSEDATA
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}LICENSEPAGE ""
+ !insertmacro MUI_LICENSEPAGE_INTERFACE
+
+ !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_TEXT_TOP "$(MUI_INNERTEXT_LICENSE_TOP)"
+ !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BUTTON ""
+ !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_CHECKBOX_TEXT ""
+ !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT ""
+ !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE ""
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}license
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ LicenseData "${LICENSEDATA}"
+
+ !ifndef MUI_LICENSEPAGE_TEXT_BOTTOM
+ !ifndef MUI_LICENSEPAGE_CHECKBOX & MUI_LICENSEPAGE_RADIOBUTTONS
+ LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM)" "${MUI_LICENSEPAGE_BUTTON}"
+ !else ifdef MUI_LICENSEPAGE_CHECKBOX
+ LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_CHECKBOX)" "${MUI_LICENSEPAGE_BUTTON}"
+ !else
+ LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS)" "${MUI_LICENSEPAGE_BUTTON}"
+ !endif
+ !else
+ LicenseText "${MUI_LICENSEPAGE_TEXT_BOTTOM}" "${MUI_LICENSEPAGE_BUTTON}"
+ !endif
+
+ !ifdef MUI_LICENSEPAGE_CHECKBOX
+ LicenseForceSelection checkbox "${MUI_LICENSEPAGE_CHECKBOX_TEXT}"
+ !else ifdef MUI_LICENSEPAGE_RADIOBUTTONS
+ LicenseForceSelection radiobuttons "${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT}" "${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE}"
+ !endif
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_LICENSEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID}
+
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_TOP
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_BOTTOM
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_BUTTON
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_RADIOBUTTONS
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_ACCEPT
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_DECLINE
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_PAGE_LICENSE LICENSEDATA
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_LICENSE "${LICENSEDATA}"
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_LICENSE LICENSEDATA
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_LICENSE "${LICENSEDATA}"
+
+ !verbose pop
+
+!macroend
+
+
+;--------------------------------
+;Page functions
+
+!macro MUI_FUNCTION_LICENSEPAGE PRE SHOW LEAVE
+
+ Function "${PRE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_SUBTITLE)
+
+ FunctionEnd
+
+ Function "${SHOW}"
+
+ ;Get conrol handles
+ FindWindow $mui.LicensePage "#32770" "" $HWNDPARENT
+ GetDlgItem $mui.LicensePage.TopText $mui.LicensePage 1040
+ GetDlgItem $mui.LicensePage.Text $mui.LicensePage 1006
+ GetDlgItem $mui.LicensePage.LicenseText $mui.LicensePage 1000
+
+ ;Top text
+ SendMessage $mui.LicensePage.TopText ${WM_SETTEXT} 0 "STR:${MUI_LICENSEPAGE_TEXT_TOP}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ FunctionEnd
+
+!macroend
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/StartMenu.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/StartMenu.nsh
new file mode 100644
index 000000000..dd660ac4c
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/StartMenu.nsh
@@ -0,0 +1,235 @@
+/*
+
+NSIS Modern User Interface
+Start Menu folder page
+
+*/
+
+;--------------------------------
+;Page interface settings and variables
+
+!macro MUI_STARTMENUPAGE_INTERFACE
+
+ !ifndef MUI_STARTMENUPAGE_INTERFACE
+ !define MUI_STARTMENUPAGE_INTERFACE
+ Var mui.StartMenuPage
+ Var mui.StartMenuPage.Location
+ Var mui.StartMenuPage.FolderList
+
+ Var mui.StartMenuPage.Temp
+ !endif
+
+ !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT & MUI_STARTMENUPAGE_REGISTRY_KEY & MUI_STARTMENUPAGE_REGISTRY_VALUENAME
+ !ifndef MUI_STARTMENUPAGE_REGISTRY_VARIABLES
+ !define MUI_STARTMENUPAGE_REGISTRY_VARIABLES
+ Var mui.StartMenuPage.RegistryLocation
+ !endif
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;Page declaration
+
+!macro MUI_PAGEDECLARATION_STARTMENU ID VAR
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}STARTMENUPAGE ""
+ !insertmacro MUI_STARTMENUPAGE_INTERFACE
+
+ !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_DEFAULTFOLDER "$(^Name)"
+ !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_TOP "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_TOP)"
+ !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_CHECKBOX "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_CHECKBOX)"
+
+ !define MUI_STARTMENUPAGE_VARIABLE "${VAR}"
+ !define "MUI_STARTMENUPAGE_${ID}_VARIABLE" "${MUI_STARTMENUPAGE_VARIABLE}"
+ !define "MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}"
+ !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT
+ !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT" "${MUI_STARTMENUPAGE_REGISTRY_ROOT}"
+ !endif
+ !ifdef MUI_STARTMENUPAGE_REGISTRY_KEY
+ !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY" "${MUI_STARTMENUPAGE_REGISTRY_KEY}"
+ !endif
+ !ifdef MUI_STARTMENUPAGE_REGISTRY_VALUENAME
+ !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME" "${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}"
+ !endif
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_STARTMENUPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID}
+
+ !undef MUI_STARTMENUPAGE_VARIABLE
+ !undef MUI_STARTMENUPAGE_TEXT_TOP
+ !undef MUI_STARTMENUPAGE_TEXT_CHECKBOX
+ !undef MUI_STARTMENUPAGE_DEFAULTFOLDER
+ !insertmacro MUI_UNSET MUI_STARTMENUPAGE_NODISABLE
+ !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_ROOT
+ !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_KEY
+ !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_VALUENAME
+
+!macroend
+
+!macro MUI_PAGE_STARTMENU ID VAR
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_STARTMENU "${ID}" "${VAR}"
+
+ !verbose pop
+
+!macroend
+
+;--------------------------------
+;Page functions
+
+!macro MUI_FUNCTION_STARTMENUPAGE PRE LEAVE
+
+ Function "${PRE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+
+ !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT & MUI_STARTMENUPAGE_REGISTRY_KEY & MUI_STARTMENUPAGE_REGISTRY_VALUENAME
+
+ ;Get Start Menu location from registry
+
+ ${if} "${MUI_STARTMENUPAGE_VARIABLE}" == ""
+
+ ReadRegStr $mui.StartMenuPage.RegistryLocation "${MUI_STARTMENUPAGE_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}"
+ ${if} $mui.StartMenuPage.RegistryLocation != ""
+ StrCpy "${MUI_STARTMENUPAGE_VARIABLE}" $mui.StartMenuPage.RegistryLocation
+ ${endif}
+
+ ClearErrors
+
+ ${endif}
+
+ !endif
+
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_TEXT_STARTMENU_TITLE) $(MUI_TEXT_STARTMENU_SUBTITLE)
+
+ ${if} $(^RTL) == "0"
+ !ifndef MUI_STARTMENUPAGE_NODISABLE
+ StartMenu::Init /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" /checknoshortcuts "${MUI_STARTMENUPAGE_TEXT_CHECKBOX}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}"
+ !else
+ StartMenu::Init /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}"
+ !endif
+ ${else}
+ !ifndef MUI_STARTMENUPAGE_NODISABLE
+ StartMenu::Init /rtl /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" /checknoshortcuts "${MUI_STARTMENUPAGE_TEXT_CHECKBOX}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}"
+ !else
+ StartMenu::Init /rtl /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}"
+ !endif
+ ${endif}
+
+ Pop $mui.StartMenuPage
+
+ ;Get control handles
+ GetDlgItem $mui.StartMenuPage.Location $mui.StartMenuPage 1002
+ GetDlgItem $mui.StartMenuPage.FolderList $mui.StartMenuPage 1004
+
+ !ifdef MUI_STARTMENUPAGE_BGCOLOR
+ SetCtlColors $mui.StartMenuPage.Location "" "${MUI_STARTMENUPAGE_BGCOLOR}"
+ SetCtlColors $mui.StartMenuMenu.FolderList "" "${MUI_STARTMENUPAGE_BGCOLOR}"
+ !endif
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ StartMenu::Show
+
+ Pop $mui.StartMenuPage.Temp
+ ${if} $mui.StartMenuPage.Temp == "success"
+ Pop "${MUI_STARTMENUPAGE_VARIABLE}"
+ ${endif}
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ FunctionEnd
+
+!macroend
+
+
+;--------------------------------
+;Script macros to get Start Menu folder
+
+!macro MUI_STARTMENU_GETFOLDER ID VAR
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ ;Get Start Menu folder from registry
+ ;Can be called from the script in the uninstaller
+
+ !ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME
+
+ ReadRegStr $mui.StartMenuPage.RegistryLocation "${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}"
+
+ ${if} $mui.StartMenuPage.RegistryLocation != ""
+ StrCpy "${VAR}" $mui.StartMenuPage.RegistryLocation
+ ${else}
+ StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}"
+ ${endif}
+
+ !else
+
+ StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}"
+
+ !endif
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_STARTMENU_WRITE_BEGIN ID
+
+ ;The code in the script to write the shortcuts should be put between the
+ ;MUI_STARTMENU_WRITE_BEGIN and MUI_STARTMENU_WRITE_END macros
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !define MUI_STARTMENUPAGE_CURRENT_ID "${ID}"
+
+ StrCpy $mui.StartMenuPage.Temp "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" 1
+
+ ;If the folder start with >, the user has chosen not to create a shortcut
+ ${if} $mui.StartMenuPage.Temp != ">"
+
+ ${if} "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" == ""
+ ;Get folder from registry if the variable doesn't contain anything
+ !insertmacro MUI_STARTMENU_GETFOLDER "${MUI_STARTMENUPAGE_CURRENT_ID}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}"
+ ${endif}
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_STARTMENU_WRITE_END
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !ifdef MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME
+ ;Write folder to registry
+ WriteRegStr "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}"
+ !endif
+
+ ${endif}
+
+ !undef MUI_STARTMENUPAGE_CURRENT_ID
+
+ !verbose pop
+
+!macroend
+
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh
new file mode 100644
index 000000000..a9323ee38
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh
@@ -0,0 +1,96 @@
+/*
+
+NSIS Modern User Interface
+Uninstall confirmation page
+
+*/
+
+;--------------------------------
+;Page interface settings and variables
+
+!macro MUI_UNCONFIRMPAGE_INTERFACE
+
+ !ifndef MUI_UNCONFIRMPAGE_INTERFACE
+ !define MUI_UNCONFIRMPAGE_INTERFACE
+ Var mui.UnConfirmPage
+
+ Var mui.UnConfirmPage.Text
+ Var mui.UnConfirmPage.DirectoryText
+ Var mui.UnConfirmPage.Directory
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;Page declaration
+
+!macro MUI_PAGEDECLARATION_CONFIRM
+
+ !insertmacro MUI_SET MUI_UNCONFIRMPAGE ""
+ !insertmacro MUI_UNCONFIRMPAGE_INTERFACE
+
+ !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_TOP ""
+ !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_LOCATION ""
+
+ PageEx un.uninstConfirm
+
+ PageCallbacks un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ UninstallText "${MUI_UNCONFIRMPAGE_TEXT_TOP}" "${MUI_UNCONFIRMPAGE_TEXT_LOCATION}"
+
+ PageExEnd
+
+ !insertmacro MUI_UNFUNCTION_CONFIRMPAGE un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID}
+
+ !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_TOP
+ !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_LOCATION
+
+!macroend
+
+!macro MUI_UNPAGE_CONFIRM
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_CONFIRM
+
+ !verbose pop
+
+!macroend
+
+
+;--------------------------------
+;Page functions
+
+!macro MUI_UNFUNCTION_CONFIRMPAGE PRE SHOW LEAVE
+
+ Function "${PRE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_UNTEXT_CONFIRM_TITLE) $(MUI_UNTEXT_CONFIRM_SUBTITLE)
+
+ FunctionEnd
+
+ Function "${SHOW}"
+
+ ;Get controls handles
+ FindWindow $mui.UnConfirmPage "#32770" "" $HWNDPARENT
+ GetDlgItem $mui.UnConfirmPage.Text $mui.UnConfirmPage 1006
+ GetDlgItem $mui.UnConfirmPage.DirectoryText $mui.UnConfirmPage 1029
+ GetDlgItem $mui.UnConfirmPage.Directory $mui.UnConfirmPage 1000
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ FunctionEnd
+
+!macroend
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/Welcome.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/Welcome.nsh
new file mode 100644
index 000000000..5e7ebdd81
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI 2/Pages/Welcome.nsh
@@ -0,0 +1,180 @@
+/*
+
+NSIS Modern User Interface
+Welcome page (implemented using nsDialogs)
+
+*/
+
+;--------------------------------
+;Page interface settings and variables
+
+!macro MUI_WELCOMEPAGE_INTERFACE
+
+ !ifndef MUI_WELCOMEPAGE_INTERFACE
+ !define MUI_WELCOMEPAGE_INTERFACE
+ Var mui.WelcomePage
+
+ Var mui.WelcomePage.Image
+ Var mui.WelcomePage.Image.Bitmap
+
+ Var mui.WelcomePage.Title
+ Var mui.WelcomePage.Title.Font
+
+ Var mui.WelcomePage.Text
+ !endif
+
+ !insertmacro MUI_DEFAULT MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\win.bmp"
+
+!macroend
+
+
+;--------------------------------
+;Interface initialization
+
+!macro MUI_WELCOMEPAGE_GUIINIT
+
+ !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEWELCOMEPAGE_GUINIT
+ !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEWELCOMEPAGE_GUINIT
+
+ Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePage.GUIInit
+
+ InitPluginsDir
+ File "/oname=$PLUGINSDIR\modern-wizard.bmp" "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}"
+
+ !ifdef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT
+ Call "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT}"
+ !endif
+
+ FunctionEnd
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePage.GUIInit
+
+ !endif
+
+!macroend
+
+
+;--------------------------------
+;Page declaration
+
+!macro MUI_PAGEDECLARATION_WELCOME
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEPAGE ""
+ !insertmacro MUI_WELCOMEPAGE_INTERFACE
+
+ !insertmacro MUI_WELCOMEPAGE_GUIINIT
+
+ !insertmacro MUI_DEFAULT MUI_WELCOMEPAGE_TITLE "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TITLE)"
+ !insertmacro MUI_DEFAULT MUI_WELCOMEPAGE_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TEXT)"
+
+ !insertmacro MUI_PAGE_FUNCTION_FULLWINDOW
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID}
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_WELCOMEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID}
+
+ !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE
+ !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_3LINES
+ !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT
+
+!macroend
+
+!macro MUI_PAGE_WELCOME
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_WELCOME
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_WELCOME
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+ !insertmacro MUI_PAGEDECLARATION_WELCOME
+
+ !verbose pop
+
+!macroend
+
+
+;--------------------------------
+;Page functions
+
+!macro MUI_FUNCTION_WELCOMEPAGE PRE LEAVE
+
+ Function "${PRE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+
+ ;Create dialog
+ nsDialogs::Create 1044
+ Pop $mui.WelcomePage
+ nsDialogs::SetRTL $(^RTL)
+ SetCtlColors $mui.WelcomePage "" "${MUI_BGCOLOR}"
+
+ ;Image control
+ ${NSD_CreateBitmap} 0u 0u 109u 193u ""
+ Pop $mui.WelcomePage.Image
+ !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
+ ${NSD_SetStretchedImage} $mui.WelcomePage.Image $PLUGINSDIR\modern-wizard.bmp $mui.WelcomePage.Image.Bitmap
+ !else
+ ${NSD_SetImage} $mui.WelcomePage.Image $PLUGINSDIR\modern-wizard.bmp $mui.WelcomePage.Image.Bitmap
+ !endif
+
+ ;Positiong of controls
+
+ ;Title
+ !ifndef MUI_WELCOMEPAGE_TITLE_3LINES
+ !define MUI_WELCOMEPAGE_TITLE_HEIGHT 28
+ !else
+ !define MUI_WELCOMEPAGE_TITLE_HEIGHT 38
+ !endif
+
+ ;Text
+ ;17 = 10 (top margin) + 7 (distance between texts)
+ !define /math MUI_WELCOMEPAGE_TEXT_TOP 17 + ${MUI_WELCOMEPAGE_TITLE_HEIGHT}
+
+ ;Title
+ ${NSD_CreateLabel} 120u 10u 195u ${MUI_WELCOMEPAGE_TITLE_HEIGHT}u "${MUI_WELCOMEPAGE_TITLE}"
+ Pop $mui.WelcomePage.Title
+ SetCtlColors $mui.WelcomePage.Title "" "${MUI_BGCOLOR}"
+ CreateFont $mui.WelcomePage.Title.Font "$(^Font)" "12" "700"
+ SendMessage $mui.WelcomePage.Title ${WM_SETFONT} $mui.WelcomePage.Title.Font 0
+
+ ;Welcome text
+ ${NSD_CreateLabel} 120u ${MUI_WELCOMEPAGE_TEXT_TOP}u 195u 130u "${MUI_WELCOMEPAGE_TEXT}"
+ Pop $mui.WelcomePage.Text
+ SetCtlColors $mui.WelcomePage.Text "" "${MUI_BGCOLOR}"
+
+ ;Show page
+ Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+ nsDialogs::Show
+ Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow
+
+ ;Delete image from memory
+ ${NSD_FreeImage} $mui.WelcomePage.Image.Bitmap
+
+ !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_HEIGHT
+ !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT_TOP
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ FunctionEnd
+
+!macroend
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI/System.nsh b/Engine/bin/tools/nsis/app/Contrib/Modern UI/System.nsh
new file mode 100644
index 000000000..e4b9d9486
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI/System.nsh
@@ -0,0 +1,2206 @@
+/*
+
+NSIS Modern User Interface - Version 1.8
+Copyright 2002-2009 Joost Verburg
+
+*/
+
+!echo "NSIS Modern User Interface version 1.8 - Copyright 2002-2009 Joost Verburg"
+
+;--------------------------------
+
+!ifndef MUI_INCLUDED
+!define MUI_INCLUDED
+
+!define MUI_SYSVERSION "1.8"
+
+!verbose push
+
+!ifndef MUI_VERBOSE
+ !define MUI_VERBOSE 3
+!endif
+
+!verbose ${MUI_VERBOSE}
+
+;--------------------------------
+;HEADER FILES, DECLARATIONS
+
+!include InstallOptions.nsh
+!include LangFile.nsh
+!include WinMessages.nsh
+
+Var MUI_TEMP1
+Var MUI_TEMP2
+
+;--------------------------------
+;INSERT CODE
+
+!macro MUI_INSERT
+
+ !ifndef MUI_INSERT
+ !define MUI_INSERT
+
+ !ifdef MUI_PRODUCT | MUI_VERSION
+ !warning "The MUI_PRODUCT and MUI_VERSION defines have been removed. Use a normal Name command now."
+ !endif
+
+ !insertmacro MUI_INTERFACE
+
+ !insertmacro MUI_FUNCTION_GUIINIT
+ !insertmacro MUI_FUNCTION_ABORTWARNING
+
+ !ifdef MUI_IOCONVERT_USED
+ !insertmacro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT
+ !endif
+
+ !ifdef MUI_UNINSTALLER
+ !insertmacro MUI_UNFUNCTION_GUIINIT
+ !insertmacro MUI_FUNCTION_UNABORTWARNING
+
+ !ifdef MUI_UNIOCONVERT_USED
+ !insertmacro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT
+ !endif
+ !endif
+
+ !endif
+
+!macroend
+
+;--------------------------------
+;GENERAL
+
+!macro MUI_DEFAULT SYMBOL CONTENT
+
+ !ifndef "${SYMBOL}"
+ !define "${SYMBOL}" "${CONTENT}"
+ !endif
+
+!macroend
+
+!macro MUI_DEFAULT_IOCONVERT SYMBOL CONTENT
+
+ !ifndef "${SYMBOL}"
+ !define "${SYMBOL}" "${CONTENT}"
+ !insertmacro MUI_SET "${SYMBOL}_DEFAULTSET"
+ !insertmacro MUI_SET "MUI_${MUI_PAGE_UNINSTALLER_PREFIX}IOCONVERT_USED"
+ !else
+ !insertmacro MUI_UNSET "${SYMBOL}_DEFAULTSET"
+ !endif
+
+!macroend
+
+!macro MUI_SET SYMBOL
+
+ !ifndef "${SYMBOL}"
+ !define "${SYMBOL}"
+ !endif
+
+!macroend
+
+!macro MUI_UNSET SYMBOL
+
+ !ifdef "${SYMBOL}"
+ !undef "${SYMBOL}"
+ !endif
+
+!macroend
+
+;--------------------------------
+;INTERFACE - COMPILE TIME SETTINGS
+
+!macro MUI_INTERFACE
+
+ !ifndef MUI_INTERFACE
+ !define MUI_INTERFACE
+
+ !ifdef MUI_INSERT_NSISCONF
+ !insertmacro MUI_NSISCONF
+ !endif
+
+ !insertmacro MUI_DEFAULT MUI_UI "${NSISDIR}\Contrib\UIs\modern.exe"
+ !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE "${NSISDIR}\Contrib\UIs\modern_headerbmp.exe"
+ !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE_RIGHT "${NSISDIR}\Contrib\UIs\modern_headerbmpr.exe"
+ !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_SMALLDESC "${NSISDIR}\Contrib\UIs\modern_smalldesc.exe"
+ !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_NODESC "${NSISDIR}\Contrib\UIs\modern_nodesc.exe"
+ !insertmacro MUI_DEFAULT MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
+ !insertmacro MUI_DEFAULT MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
+ !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_CHECKBITMAP "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp"
+ !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BGCOLOR "/windows"
+ !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_COLORS "/windows"
+ !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_PROGRESSBAR "smooth"
+ !insertmacro MUI_DEFAULT MUI_BGCOLOR "FFFFFF"
+ !insertmacro MUI_DEFAULT MUI_WELCOMEFINISHPAGE_INI "${NSISDIR}\Contrib\Modern UI\ioSpecial.ini"
+ !insertmacro MUI_DEFAULT MUI_UNWELCOMEFINISHPAGE_INI "${NSISDIR}\Contrib\Modern UI\ioSpecial.ini"
+ !insertmacro MUI_DEFAULT MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\win.bmp"
+ !insertmacro MUI_DEFAULT MUI_UNWELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\win.bmp"
+
+ !ifdef MUI_HEADERIMAGE
+
+ !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp"
+
+ !ifndef MUI_HEADERIMAGE_UNBITMAP
+ !define MUI_HEADERIMAGE_UNBITMAP "${MUI_HEADERIMAGE_BITMAP}"
+ !ifdef MUI_HEADERIMAGE_BITMAP_NOSTRETCH
+ !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH
+ !endif
+ !endif
+
+ !ifdef MUI_HEADERIMAGE_BITMAP_RTL
+ !ifndef MUI_HEADERIMAGE_UNBITMAP_RTL
+ !define MUI_HEADERIMAGE_UNBITMAP_RTL "${MUI_HEADERIMAGE_BITMAP_RTL}"
+ !ifdef MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH
+ !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH
+ !endif
+ !endif
+ !endif
+
+ !endif
+
+ XPStyle On
+
+ ChangeUI all "${MUI_UI}"
+ !ifdef MUI_HEADERIMAGE
+ !ifndef MUI_HEADERIMAGE_RIGHT
+ ChangeUI IDD_INST "${MUI_UI_HEADERIMAGE}"
+ !else
+ ChangeUI IDD_INST "${MUI_UI_HEADERIMAGE_RIGHT}"
+ !endif
+ !endif
+ !ifdef MUI_COMPONENTSPAGE_SMALLDESC
+ ChangeUI IDD_SELCOM "${MUI_UI_COMPONENTSPAGE_SMALLDESC}"
+ !else ifdef MUI_COMPONENTSPAGE_NODESC
+ ChangeUI IDD_SELCOM "${MUI_UI_COMPONENTSPAGE_NODESC}"
+ !endif
+
+ Icon "${MUI_ICON}"
+ UninstallIcon "${MUI_UNICON}"
+
+ CheckBitmap "${MUI_COMPONENTSPAGE_CHECKBITMAP}"
+ LicenseBkColor "${MUI_LICENSEPAGE_BGCOLOR}"
+ InstallColors ${MUI_INSTFILESPAGE_COLORS}
+ InstProgressFlags ${MUI_INSTFILESPAGE_PROGRESSBAR}
+
+ SubCaption 4 " "
+ UninstallSubCaption 2 " "
+
+ !insertmacro MUI_DEFAULT MUI_ABORTWARNING_TEXT "$(MUI_TEXT_ABORTWARNING)"
+ !insertmacro MUI_DEFAULT MUI_UNABORTWARNING_TEXT "$(MUI_UNTEXT_ABORTWARNING)"
+
+ !endif
+
+!macroend
+
+;--------------------------------
+;INTERFACE - RUN-TIME
+
+!macro MUI_INNERDIALOG_TEXT CONTROL TEXT
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
+ GetDlgItem $MUI_TEMP1 $MUI_TEMP1 ${CONTROL}
+ SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:${TEXT}"
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_HEADER_TEXT_INTERNAL ID TEXT
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT "${ID}"
+
+ !ifdef MUI_HEADER_TRANSPARENT_TEXT
+
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ !endif
+
+ SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:${TEXT}"
+
+ !ifdef MUI_HEADER_TRANSPARENT_TEXT
+
+ ShowWindow $MUI_TEMP1 ${SW_SHOWNA}
+
+ !endif
+
+!macroend
+
+!macro MUI_HEADER_TEXT TEXT SUBTEXT
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !ifdef MUI_HEADER_TRANSPARENT_TEXT
+
+ LockWindow on
+
+ !endif
+
+ !insertmacro MUI_HEADER_TEXT_INTERNAL 1037 "${TEXT}"
+ !insertmacro MUI_HEADER_TEXT_INTERNAL 1038 "${SUBTEXT}"
+
+ !ifdef MUI_HEADER_TRANSPARENT_TEXT
+
+ LockWindow off
+
+ !endif
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_HEADER_TEXT_PAGE TEXT SUBTEXT
+
+ !ifdef MUI_PAGE_HEADER_TEXT & MUI_PAGE_HEADER_SUBTEXT
+ !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}"
+ !else ifdef MUI_PAGE_HEADER_TEXT
+ !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${SUBTEXT}"
+ !else ifdef MUI_PAGE_HEADER_SUBTEXT
+ !insertmacro MUI_HEADER_TEXT "${TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}"
+ !else
+ !insertmacro MUI_HEADER_TEXT "${TEXT}" "${SUBTEXT}"
+ !endif
+
+ !insertmacro MUI_UNSET MUI_PAGE_HEADER_TEXT
+ !insertmacro MUI_UNSET MUI_PAGE_HEADER_SUBTEXT
+
+!macroend
+
+!macro MUI_DESCRIPTION_BEGIN
+
+ FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
+ GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043
+
+ StrCmp $0 -1 0 mui.description_begin_done
+ SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:"
+ EnableWindow $MUI_TEMP1 0
+ SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:$MUI_TEXT"
+ Goto mui.description_done
+ mui.description_begin_done:
+
+!macroend
+
+!macro MUI_DESCRIPTION_TEXT VAR TEXT
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ StrCmp $0 ${VAR} 0 mui.description_${VAR}_done
+ SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:"
+ EnableWindow $MUI_TEMP1 1
+ SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:${TEXT}"
+ Goto mui.description_done
+ mui.description_${VAR}_done:
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_DESCRIPTION_END
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ mui.description_done:
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_ENDHEADER
+
+ IfAbort mui.endheader_abort
+
+ !ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT & MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT
+ !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}" "${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}"
+ !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT
+ !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)"
+ !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT
+ !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)" "${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}"
+ !else
+ !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)"
+ !endif
+
+ Goto mui.endheader_done
+
+ mui.endheader_abort:
+
+ !ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT & MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT
+ !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}" "${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}"
+ !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT
+ !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)"
+ !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT
+ !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)" "${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}"
+ !else
+ !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)"
+ !endif
+
+ mui.endheader_done:
+
+!macroend
+
+!macro MUI_ABORTWARNING
+
+ !ifdef MUI_FINISHPAGE_ABORTWARNINGCHECK
+ StrCmp $MUI_NOABORTWARNING "1" mui.quit
+ !endif
+
+ !ifdef MUI_ABORTWARNING_CANCEL_DEFAULT
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 "${MUI_ABORTWARNING_TEXT}" IDYES mui.quit
+ !else
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION "${MUI_ABORTWARNING_TEXT}" IDYES mui.quit
+ !endif
+
+ Abort
+ mui.quit:
+
+!macroend
+
+!macro MUI_UNABORTWARNING
+
+ !ifdef MUI_UNABORTWARNING_CANCEL_DEFAULT
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 "${MUI_UNABORTWARNING_TEXT}" IDYES mui.quit
+ !else
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION "${MUI_UNABORTWARNING_TEXT}" IDYES mui.quit
+ !endif
+
+ Abort
+ mui.quit:
+
+!macroend
+
+!macro MUI_GUIINIT
+
+ !insertmacro MUI_WELCOMEFINISHPAGE_INIT ""
+ !insertmacro MUI_HEADERIMAGE_INIT ""
+
+ !insertmacro MUI_GUIINIT_BASIC
+
+!macroend
+
+!macro MUI_UNGUIINIT
+
+ !insertmacro MUI_WELCOMEFINISHPAGE_INIT "UN"
+ !insertmacro MUI_HEADERIMAGE_INIT "UN"
+
+ !insertmacro MUI_GUIINIT_BASIC
+
+ !ifdef MUI_UNFINISHPAGE
+ !ifndef MUI_UNFINISHPAGE_NOAUTOCLOSE
+ SetAutoClose true
+ !endif
+ !endif
+
+!macroend
+
+!macro MUI_GUIINIT_BASIC
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037
+ CreateFont $MUI_TEMP2 "$(^Font)" "$(^FontSize)" "700"
+ SendMessage $MUI_TEMP1 ${WM_SETFONT} $MUI_TEMP2 0
+
+ !ifndef MUI_HEADER_TRANSPARENT_TEXT
+
+ SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}"
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038
+ SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}"
+
+ !else
+
+ SetCtlColors $MUI_TEMP1 "" "transparent"
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038
+ SetCtlColors $MUI_TEMP1 "" "transparent"
+
+ !endif
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1034
+ SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}"
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039
+ SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}"
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028
+ SetCtlColors $MUI_TEMP1 /BRANDING
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256
+ SetCtlColors $MUI_TEMP1 /BRANDING
+ SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:$(^Branding) "
+
+!macroend
+
+!macro MUI_WELCOMEFINISHPAGE_INIT UNINSTALLER
+
+ !ifdef MUI_${UNINSTALLER}WELCOMEPAGE | MUI_${UNINSTALLER}FINISHPAGE
+
+ !insertmacro INSTALLOPTIONS_EXTRACT_AS "${MUI_${UNINSTALLER}WELCOMEFINISHPAGE_INI}" "ioSpecial.ini"
+ File "/oname=$PLUGINSDIR\modern-wizard.bmp" "${MUI_${UNINSTALLER}WELCOMEFINISHPAGE_BITMAP}"
+
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 1" "Text" "$PLUGINSDIR\modern-wizard.bmp"
+
+ !ifdef MUI_${UNINSTALLER}WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 1" "Flags" ""
+ !endif
+
+ !endif
+
+!macroend
+
+!macro MUI_HEADERIMAGE_INIT UNINSTALLER
+
+ !ifdef MUI_HEADERIMAGE
+
+ InitPluginsDir
+
+ !ifdef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL
+
+ StrCmp $(^RTL) 0 mui.headerimageinit_nortl
+
+ File "/oname=$PLUGINSDIR\modern-header.bmp" "${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL}"
+
+ !ifndef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL_NOSTRETCH
+ SetBrandingImage /IMGID=1046 /RESIZETOFIT "$PLUGINSDIR\modern-header.bmp"
+ !else
+ SetBrandingImage /IMGID=1046 "$PLUGINSDIR\modern-header.bmp"
+ !endif
+
+ Goto mui.headerimageinit_done
+
+ mui.headerimageinit_nortl:
+
+ !endif
+
+ File "/oname=$PLUGINSDIR\modern-header.bmp" "${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP}"
+
+ !ifndef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_NOSTRETCH
+ SetBrandingImage /IMGID=1046 /RESIZETOFIT "$PLUGINSDIR\modern-header.bmp"
+ !else
+ SetBrandingImage /IMGID=1046 "$PLUGINSDIR\modern-header.bmp"
+ !endif
+
+ !ifdef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL
+
+ mui.headerimageinit_done:
+
+ !endif
+
+ !endif
+
+!macroend
+
+;--------------------------------
+;INTERFACE - FUNCTIONS
+
+!macro MUI_FUNCTION_GUIINIT
+
+ Function .onGUIInit
+
+ !insertmacro MUI_GUIINIT
+
+ !ifdef MUI_CUSTOMFUNCTION_GUIINIT
+ Call "${MUI_CUSTOMFUNCTION_GUIINIT}"
+ !endif
+
+ FunctionEnd
+
+!macroend
+
+!macro MUI_FUNCTION_DESCRIPTION_BEGIN
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !ifndef MUI_VAR_TEXT
+ Var MUI_TEXT
+ !define MUI_VAR_TEXT
+ !endif
+
+ Function .onMouseOverSection
+ !insertmacro MUI_DESCRIPTION_BEGIN
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_FUNCTION_DESCRIPTION_END
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_DESCRIPTION_END
+ !ifdef MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION
+ Call "${MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION}"
+ !endif
+ FunctionEnd
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNFUNCTION_DESCRIPTION_BEGIN
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ Function un.onMouseOverSection
+ !insertmacro MUI_DESCRIPTION_BEGIN
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNFUNCTION_DESCRIPTION_END
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_DESCRIPTION_END
+ !ifdef MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION
+ Call "${MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION}"
+ !endif
+ FunctionEnd
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_FUNCTION_ABORTWARNING
+
+ Function .onUserAbort
+ !ifdef MUI_ABORTWARNING
+ !insertmacro MUI_ABORTWARNING
+ !endif
+ !ifdef MUI_CUSTOMFUNCTION_ABORT
+ Call "${MUI_CUSTOMFUNCTION_ABORT}"
+ !endif
+ FunctionEnd
+
+!macroend
+
+!macro MUI_FUNCTION_UNABORTWARNING
+
+ Function un.onUserAbort
+ !ifdef MUI_UNABORTWARNING
+ !insertmacro MUI_UNABORTWARNING
+ !endif
+ !ifdef MUI_CUSTOMFUNCTION_UNABORT
+ Call "${MUI_CUSTOMFUNCTION_UNABORT}"
+ !endif
+ FunctionEnd
+
+!macroend
+
+!macro MUI_UNFUNCTION_GUIINIT
+
+ Function un.onGUIInit
+
+ !insertmacro MUI_UNGUIINIT
+
+ !ifdef MUI_CUSTOMFUNCTION_UNGUIINIT
+ Call "${MUI_CUSTOMFUNCTION_UNGUIINIT}"
+ !endif
+
+ FunctionEnd
+
+!macroend
+
+!macro MUI_FUNCTIONS_DESCRIPTION_BEGIN
+
+ ;1.65 compatibility
+
+ !warning "Modern UI macro name has changed. Please change MUI_FUNCTIONS_DESCRIPTION_BEGIN to MUI_FUNCTION_DESCRIPTION_BEGIN."
+
+ !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+
+!macroend
+
+!macro MUI_FUNCTIONS_DESCRIPTION_END
+
+ ;1.65 compatibility
+
+ !warning "Modern UI macro name has changed. Please change MUI_FUNCTIONS_DESCRIPTION_END to MUI_FUNCTION_DESCRIPTION_END."
+
+ !insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+!macroend
+
+;--------------------------------
+;START MENU FOLDER
+
+!macro MUI_STARTMENU_GETFOLDER ID VAR
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME
+
+ ReadRegStr $MUI_TEMP1 "${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}"
+ StrCmp $MUI_TEMP1 "" +3
+ StrCpy "${VAR}" $MUI_TEMP1
+ Goto +2
+
+ StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}"
+
+ !else
+
+ StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}"
+
+ !endif
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_STARTMENU_WRITE_BEGIN ID
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !define MUI_STARTMENUPAGE_CURRENT_ID "${ID}"
+
+ StrCpy $MUI_TEMP1 "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" 1
+ StrCmp $MUI_TEMP1 ">" mui.startmenu_write_${MUI_STARTMENUPAGE_CURRENT_ID}_done
+
+ StrCmp "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" "" 0 mui.startmenu_writebegin_${MUI_STARTMENUPAGE_CURRENT_ID}_notempty
+
+ !insertmacro MUI_STARTMENU_GETFOLDER "${MUI_STARTMENUPAGE_CURRENT_ID}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}"
+
+ mui.startmenu_writebegin_${MUI_STARTMENUPAGE_CURRENT_ID}_notempty:
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_STARTMENU_WRITE_END
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !ifdef MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME
+ WriteRegStr "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}"
+ !endif
+
+ mui.startmenu_write_${MUI_STARTMENUPAGE_CURRENT_ID}_done:
+
+ !undef MUI_STARTMENUPAGE_CURRENT_ID
+
+ !verbose pop
+
+!macroend
+
+;--------------------------------
+;PAGES
+
+!macro MUI_PAGE_INIT
+
+ !insertmacro MUI_INTERFACE
+
+ !insertmacro MUI_DEFAULT MUI_PAGE_UNINSTALLER_PREFIX ""
+ !insertmacro MUI_DEFAULT MUI_PAGE_UNINSTALLER_FUNCPREFIX ""
+
+ !insertmacro MUI_UNSET MUI_UNIQUEID
+
+ !define MUI_UNIQUEID ${__LINE__}
+
+!macroend
+
+!macro MUI_UNPAGE_INIT
+
+ !ifndef MUI_UNINSTALLER
+ !define MUI_UNINSTALLER
+ !endif
+
+ !define MUI_PAGE_UNINSTALLER
+
+ !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_PREFIX
+ !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_FUNCPREFIX
+
+ !define MUI_PAGE_UNINSTALLER_PREFIX "UN"
+ !define MUI_PAGE_UNINSTALLER_FUNCPREFIX "un."
+
+!macroend
+
+!macro MUI_UNPAGE_END
+
+ !undef MUI_PAGE_UNINSTALLER
+ !undef MUI_PAGE_UNINSTALLER_PREFIX
+ !undef MUI_PAGE_UNINSTALLER_FUNCPREFIX
+
+!macroend
+
+!macro MUI_PAGE_WELCOME
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEPAGE
+
+ !insertmacro MUI_DEFAULT_IOCONVERT MUI_WELCOMEPAGE_TITLE "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TITLE)"
+ !insertmacro MUI_DEFAULT_IOCONVERT MUI_WELCOMEPAGE_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TEXT)"
+
+ !ifndef MUI_VAR_HWND
+ Var MUI_HWND
+ !define MUI_VAR_HWND
+ !endif
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID}
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_WELCOMEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID}
+
+ !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE
+ !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_3LINES
+ !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_PAGE_LICENSE LICENSEDATA
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}LICENSEPAGE
+
+ !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_TEXT_TOP "$(MUI_INNERTEXT_LICENSE_TOP)"
+ !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BUTTON ""
+ !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_CHECKBOX_TEXT ""
+ !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT ""
+ !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE ""
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}license
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ LicenseData "${LICENSEDATA}"
+
+ !ifndef MUI_LICENSEPAGE_TEXT_BOTTOM
+ !ifndef MUI_LICENSEPAGE_CHECKBOX & MUI_LICENSEPAGE_RADIOBUTTONS
+ LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM)" "${MUI_LICENSEPAGE_BUTTON}"
+ !else ifdef MUI_LICENSEPAGE_CHECKBOX
+ LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_CHECKBOX)" "${MUI_LICENSEPAGE_BUTTON}"
+ !else
+ LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS)" "${MUI_LICENSEPAGE_BUTTON}"
+ !endif
+ !else
+ LicenseText "${MUI_LICENSEPAGE_TEXT_BOTTOM}" "${MUI_LICENSEPAGE_BUTTON}"
+ !endif
+
+ !ifdef MUI_LICENSEPAGE_CHECKBOX
+ LicenseForceSelection checkbox "${MUI_LICENSEPAGE_CHECKBOX_TEXT}"
+ !else ifdef MUI_LICENSEPAGE_RADIOBUTTONS
+ LicenseForceSelection radiobuttons "${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT}" "${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE}"
+ !endif
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_LICENSEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID}
+
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_TOP
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_BOTTOM
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_BUTTON
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_RADIOBUTTONS
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_ACCEPT
+ !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_DECLINE
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_PAGE_COMPONENTS
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}COMPONENTSPAGE
+
+ !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_TOP ""
+ !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_COMPLIST ""
+ !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_INSTTYPE ""
+ !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE "$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE)"
+ !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO "$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)"
+
+ !ifndef MUI_VAR_TEXT
+ Var MUI_TEXT
+ !define MUI_VAR_TEXT
+ !endif
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}components
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ ComponentText "${MUI_COMPONENTSPAGE_TEXT_TOP}" "${MUI_COMPONENTSPAGE_TEXT_INSTTYPE}" "${MUI_COMPONENTSPAGE_TEXT_COMPLIST}"
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_COMPONENTSPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID}
+
+ !undef MUI_COMPONENTSPAGE_TEXT_TOP
+ !undef MUI_COMPONENTSPAGE_TEXT_COMPLIST
+ !undef MUI_COMPONENTSPAGE_TEXT_INSTTYPE
+ !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE
+ !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_PAGE_DIRECTORY
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}DIRECTORYPAGE
+
+ !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_TOP ""
+ !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_DESTINATION ""
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}directory
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ DirText "${MUI_DIRECTORYPAGE_TEXT_TOP}" "${MUI_DIRECTORYPAGE_TEXT_DESTINATION}"
+
+ !ifdef MUI_DIRECTORYPAGE_VARIABLE
+ DirVar "${MUI_DIRECTORYPAGE_VARIABLE}"
+ !endif
+
+ !ifdef MUI_DIRECTORYPAGE_VERIFYONLEAVE
+ DirVerify leave
+ !endif
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_DIRECTORYPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID}
+
+ !undef MUI_DIRECTORYPAGE_TEXT_TOP
+ !undef MUI_DIRECTORYPAGE_TEXT_DESTINATION
+ !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_BGCOLOR
+ !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VARIABLE
+ !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VERIFYONLEAVE
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_PAGE_STARTMENU ID VAR
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}STARTMENUPAGE
+
+ !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_DEFAULTFOLDER "$(^Name)"
+ !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_TOP "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_TOP)"
+ !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_CHECKBOX "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_CHECKBOX)"
+
+ !define MUI_STARTMENUPAGE_VARIABLE "${VAR}"
+ !define "MUI_STARTMENUPAGE_${ID}_VARIABLE" "${MUI_STARTMENUPAGE_VARIABLE}"
+ !define "MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}"
+ !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT
+ !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT" "${MUI_STARTMENUPAGE_REGISTRY_ROOT}"
+ !endif
+ !ifdef MUI_STARTMENUPAGE_REGISTRY_KEY
+ !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY" "${MUI_STARTMENUPAGE_REGISTRY_KEY}"
+ !endif
+ !ifdef MUI_STARTMENUPAGE_REGISTRY_VALUENAME
+ !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME" "${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}"
+ !endif
+
+ !ifndef MUI_VAR_HWND
+ Var MUI_HWND
+ !define MUI_VAR_HWND
+ !endif
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_STARTMENUPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID}
+
+ !undef MUI_STARTMENUPAGE_VARIABLE
+ !undef MUI_STARTMENUPAGE_TEXT_TOP
+ !undef MUI_STARTMENUPAGE_TEXT_CHECKBOX
+ !undef MUI_STARTMENUPAGE_DEFAULTFOLDER
+ !insertmacro MUI_UNSET MUI_STARTMENUPAGE_NODISABLE
+ !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_ROOT
+ !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_KEY
+ !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_VALUENAME
+ !insertmacro MUI_UNSET MUI_STARTMENUPAGE_BGCOLOR
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_PAGE_INSTFILES
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INSTFILESPAGE
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}instfiles
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_INSTFILESPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID}
+
+ !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_TEXT
+ !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT
+ !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_TEXT
+ !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_SUBTEXT
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_PAGE_FINISH
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_PAGE_INIT
+
+ !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE
+
+ !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TITLE "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TITLE)"
+ !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TEXT)"
+ !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_BUTTON "$(MUI_BUTTONTEXT_FINISH)"
+ !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT_REBOOT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_REBOOT)"
+ !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT_REBOOTNOW "$(MUI_TEXT_FINISH_REBOOTNOW)"
+ !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT_REBOOTLATER "$(MUI_TEXT_FINISH_REBOOTLATER)"
+ !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_RUN_TEXT "$(MUI_TEXT_FINISH_RUN)"
+ !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_SHOWREADME_TEXT "$(MUI_TEXT_FINISH_SHOWREADME)"
+ !insertmacro MUI_DEFAULT MUI_FINISHPAGE_LINK_COLOR "000080"
+
+ !ifndef MUI_VAR_HWND
+ Var MUI_HWND
+ !define MUI_VAR_HWND
+ !endif
+
+ !ifndef MUI_PAGE_UNINSTALLER
+ !ifndef MUI_FINISHPAGE_NOAUTOCLOSE
+ AutoCloseWindow true
+ !endif
+ !endif
+
+ !ifdef MUI_FINISHPAGE_CANCEL_ENABLED
+ !ifndef MUI_VAR_NOABORTWARNING
+ !define MUI_VAR_NOABORTWARNING
+ Var MUI_NOABORTWARNING
+ !endif
+ !endif
+
+ PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom
+
+ PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ PageExEnd
+
+ !insertmacro MUI_FUNCTION_FINISHPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishLeave_${MUI_UNIQUEID}
+
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE_3LINES
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_LARGE
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_BUTTON
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_CANCEL_ENABLED
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOT
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTNOW
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTLATER
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTLATER_DEFAULT
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_TEXT
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_PARAMETERS
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_NOTCHECKED
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_FUNCTION
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_TEXT
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_FUNCTION
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_LOCATION
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_COLOR
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_NOREBOOTSUPPORT
+
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_TOP
+ !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_BOTTOM
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_WELCOME
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+
+ !insertmacro MUI_PAGE_WELCOME
+
+ !insertmacro MUI_UNPAGE_END
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_CONFIRM
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !ifndef MUI_UNINSTALLER
+ !define MUI_UNINSTALLER
+ !endif
+
+ !insertmacro MUI_PAGE_INIT
+
+ !insertmacro MUI_SET MUI_UNCONFIRMPAGE
+
+ !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_TOP ""
+ !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_LOCATION ""
+
+ PageEx un.uninstConfirm
+
+ PageCallbacks un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ UninstallText "${MUI_UNCONFIRMPAGE_TEXT_TOP}" "${MUI_UNCONFIRMPAGE_TEXT_LOCATION}"
+
+ PageExEnd
+
+ !insertmacro MUI_UNFUNCTION_CONFIRMPAGE un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID}
+
+ !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_TOP
+ !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_LOCATION
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_LICENSE LICENSEDATA
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+
+ !insertmacro MUI_PAGE_LICENSE "${LICENSEDATA}"
+
+ !insertmacro MUI_UNPAGE_END
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_COMPONENTS
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+
+ !insertmacro MUI_PAGE_COMPONENTS
+
+ !insertmacro MUI_UNPAGE_END
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_DIRECTORY
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+
+ !insertmacro MUI_PAGE_DIRECTORY
+
+ !insertmacro MUI_UNPAGE_END
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_INSTFILES
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+
+ !insertmacro MUI_PAGE_INSTFILES
+
+ !insertmacro MUI_UNPAGE_END
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_UNPAGE_FINISH
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_UNPAGE_INIT
+
+ !insertmacro MUI_PAGE_FINISH
+
+ !insertmacro MUI_UNPAGE_END
+
+ !verbose pop
+
+!macroend
+
+;--------------------------------
+;PAGE FUNCTIONS
+
+!macro MUI_PAGE_FUNCTION_CUSTOM TYPE
+
+ !ifdef MUI_PAGE_CUSTOMFUNCTION_${TYPE}
+ Call "${MUI_PAGE_CUSTOMFUNCTION_${TYPE}}"
+ !undef MUI_PAGE_CUSTOMFUNCTION_${TYPE}
+ !endif
+
+!macroend
+
+!macro MUI_WELCOMEFINISHPAGE_FUNCTION_CUSTOM
+
+ !ifdef MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT
+ Call "${MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT}"
+ !undef MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT
+ !endif
+
+!macroend
+
+!macro MUI_FUNCTION_WELCOMEPAGE PRE LEAVE
+
+ Function "${PRE}"
+
+ !insertmacro MUI_WELCOMEFINISHPAGE_FUNCTION_CUSTOM
+
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "NumFields" "3"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "NextButtonText" ""
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "CancelEnabled" ""
+
+ !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 2" "Text" MUI_WELCOMEPAGE_TITLE
+
+ !ifndef MUI_WELCOMEPAGE_TITLE_3LINES
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 2" "Bottom" "38"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Top" "45"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 2" "Bottom" "48"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Top" "55"
+ !endif
+
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "185"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 3" "Text" MUI_WELCOMEPAGE_TEXT
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+
+ LockWindow on
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+ LockWindow off
+
+ !insertmacro INSTALLOPTIONS_INITDIALOG "ioSpecial.ini"
+ Pop $MUI_HWND
+ SetCtlColors $MUI_HWND "" "${MUI_BGCOLOR}"
+
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1201
+ SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}"
+
+ CreateFont $MUI_TEMP2 "$(^Font)" "12" "700"
+ SendMessage $MUI_TEMP1 ${WM_SETFONT} $MUI_TEMP2 0
+
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1202
+ SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ !insertmacro INSTALLOPTIONS_SHOW
+
+ LockWindow on
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+ LockWindow off
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ FunctionEnd
+
+!macroend
+
+!macro MUI_FUNCTION_LICENSEPAGE PRE SHOW LEAVE
+
+ Function "${PRE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_SUBTITLE)
+
+ FunctionEnd
+
+ Function "${SHOW}"
+
+ !insertmacro MUI_INNERDIALOG_TEXT 1040 "${MUI_LICENSEPAGE_TEXT_TOP}"
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ FunctionEnd
+
+!macroend
+
+!macro MUI_FUNCTION_COMPONENTSPAGE PRE SHOW LEAVE
+
+ Function "${PRE}"
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_SUBTITLE)
+ FunctionEnd
+
+ Function "${SHOW}"
+
+ !insertmacro MUI_INNERDIALOG_TEXT 1042 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}"
+
+ FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
+ GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043
+ EnableWindow $MUI_TEMP1 0
+
+ !insertmacro MUI_INNERDIALOG_TEXT 1043 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
+ StrCpy $MUI_TEXT "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ FunctionEnd
+
+!macroend
+
+!macro MUI_FUNCTION_DIRECTORYPAGE PRE SHOW LEAVE
+
+ Function "${PRE}"
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_SUBTITLE)
+ FunctionEnd
+
+ Function "${SHOW}"
+ !ifdef MUI_DIRECTORYPAGE_BGCOLOR
+ FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
+ GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1019
+ SetCtlColors $MUI_TEMP1 "" "${MUI_DIRECTORYPAGE_BGCOLOR}"
+ !endif
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+ FunctionEnd
+
+ Function "${LEAVE}"
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+ FunctionEnd
+
+!macroend
+
+!macro MUI_FUNCTION_STARTMENUPAGE PRE LEAVE
+
+ Function "${PRE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+
+ !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT & MUI_STARTMENUPAGE_REGISTRY_KEY & MUI_STARTMENUPAGE_REGISTRY_VALUENAME
+
+ StrCmp "${MUI_STARTMENUPAGE_VARIABLE}" "" 0 +4
+
+ ReadRegStr $MUI_TEMP1 "${MUI_STARTMENUPAGE_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}"
+ StrCmp $MUI_TEMP1 "" +2
+ StrCpy "${MUI_STARTMENUPAGE_VARIABLE}" $MUI_TEMP1
+
+ !endif
+
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_TEXT_STARTMENU_TITLE) $(MUI_TEXT_STARTMENU_SUBTITLE)
+
+ StrCmp $(^RTL) 0 mui.startmenu_nortl
+ !ifndef MUI_STARTMENUPAGE_NODISABLE
+ StartMenu::Init /rtl /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" /checknoshortcuts "${MUI_STARTMENUPAGE_TEXT_CHECKBOX}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}"
+ !else
+ StartMenu::Init /rtl /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}"
+ !endif
+ Goto mui.startmenu_initdone
+ mui.startmenu_nortl:
+ !ifndef MUI_STARTMENUPAGE_NODISABLE
+ StartMenu::Init /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" /checknoshortcuts "${MUI_STARTMENUPAGE_TEXT_CHECKBOX}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}"
+ !else
+ StartMenu::Init /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}"
+ !endif
+ mui.startmenu_initdone:
+
+ Pop $MUI_HWND
+
+ !ifdef MUI_STARTMENUPAGE_BGCOLOR
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1002
+ SetCtlColors $MUI_TEMP1 "" "${MUI_STARTMENUPAGE_BGCOLOR}"
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1004
+ SetCtlColors $MUI_TEMP1 "" "${MUI_STARTMENUPAGE_BGCOLOR}"
+ !endif
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ StartMenu::Show
+
+ Pop $MUI_TEMP1
+ StrCmp $MUI_TEMP1 "success" 0 +2
+ Pop "${MUI_STARTMENUPAGE_VARIABLE}"
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ FunctionEnd
+
+!macroend
+
+!macro MUI_FUNCTION_INSTFILESPAGE PRE SHOW LEAVE
+
+ Function "${PRE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_SUBTITLE)
+
+ FunctionEnd
+
+ Function "${SHOW}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ !insertmacro MUI_ENDHEADER
+ !insertmacro MUI_LANGDLL_SAVELANGUAGE
+
+ FunctionEnd
+
+!macroend
+
+!macro MUI_FUNCTION_FINISHPAGE PRE LEAVE
+
+ Function "${PRE}"
+
+ !insertmacro MUI_WELCOMEFINISHPAGE_FUNCTION_CUSTOM
+
+ !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Settings" "NextButtonText" MUI_FINISHPAGE_BUTTON
+
+ !ifdef MUI_FINISHPAGE_CANCEL_ENABLED
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "CancelEnabled" "1"
+ !endif
+
+ !ifndef MUI_FINISHPAGE_TITLE_3LINES
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 2" "Bottom" "38"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Top" "45"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 2" "Bottom" "48"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Top" "55"
+ !endif
+
+ !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 2" "Text" MUI_FINISHPAGE_TITLE
+
+ !ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME
+ !ifndef MUI_FINISHPAGE_TITLE_3LINES
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "85"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "115"
+ !endif
+ !else
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "95"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "125"
+ !endif
+ !endif
+ !else
+ !ifndef MUI_FINISHPAGE_LINK
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "185"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "175"
+ !endif
+ !endif
+
+ !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT
+
+ IfRebootFlag 0 mui.finish_noreboot_init
+
+ !ifndef MUI_FINISHPAGE_TITLE_3LINES
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "85"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "115"
+ !endif
+ !else
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "95"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "125"
+ !endif
+ !endif
+
+ !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 3" "Text" MUI_FINISHPAGE_TEXT_REBOOT
+
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "5"
+
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Type" "RadioButton"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 4" "Text" MUI_FINISHPAGE_TEXT_REBOOTNOW
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Left" "120"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Right" "321"
+ !ifndef MUI_FINISHPAGE_TITLE_3LINES
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "90"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "100"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "120"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "130"
+ !endif
+ !else
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "100"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "110"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "130"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "140"
+ !endif
+ !endif
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Type" "RadioButton"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 5" "Text" MUI_FINISHPAGE_TEXT_REBOOTLATER
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Left" "120"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Right" "321"
+ !ifndef MUI_FINISHPAGE_TITLE_3LINES
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Top" "110"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Bottom" "120"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Top" "110"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Bottom" "120"
+ !endif
+ !ifdef MUI_FINISHPAGE_REBOOTLATER_DEFAULT
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "State" "0"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "State" "1"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "State" "1"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "State" "0"
+ !endif
+
+ Goto mui.finish_load
+
+ mui.finish_noreboot_init:
+
+ !endif
+
+ !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 3" "Text" MUI_FINISHPAGE_TEXT
+
+ !ifdef MUI_FINISHPAGE_RUN
+
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Type" "CheckBox"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 4" "Text" MUI_FINISHPAGE_RUN_TEXT
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Left" "120"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Right" "315"
+ !ifndef MUI_FINISHPAGE_TITLE_3LINES
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "90"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "100"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "120"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "130"
+ !endif
+ !else
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "100"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "110"
+ !else
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "130"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "140"
+ !endif
+ !endif
+ !ifndef MUI_FINISHPAGE_RUN_NOTCHECKED
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "State" "1"
+ !endif
+
+ !endif
+
+ !ifdef MUI_FINISHPAGE_SHOWREADME
+
+ !ifdef MUI_FINISHPAGE_CURFIELD_NO
+ !undef MUI_FINISHPAGE_CURFIELD_NO
+ !endif
+
+ !ifndef MUI_FINISHPAGE_RUN
+ !define MUI_FINISHPAGE_CURFIELD_NO 4
+ !ifndef MUI_FINISHPAGE_TITLE_3LINES
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !define MUI_FINISHPAGE_CURFIELD_TOP 90
+ !define MUI_FINISHPAGE_CURFIELD_BOTTOM 100
+ !else
+ !define MUI_FINISHPAGE_CURFIELD_TOP 120
+ !define MUI_FINISHPAGE_CURFIELD_BOTTOM 130
+ !endif
+ !else
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !define MUI_FINISHPAGE_CURFIELD_TOP 100
+ !define MUI_FINISHPAGE_CURFIELD_BOTTOM 110
+ !else
+ !define MUI_FINISHPAGE_CURFIELD_TOP 130
+ !define MUI_FINISHPAGE_CURFIELD_BOTTOM 140
+ !endif
+ !endif
+ !else
+ !define MUI_FINISHPAGE_CURFIELD_NO 5
+ !ifndef MUI_FINISHPAGE_TITLE_3LINES
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !define MUI_FINISHPAGE_CURFIELD_TOP 110
+ !define MUI_FINISHPAGE_CURFIELD_BOTTOM 120
+ !else
+ !define MUI_FINISHPAGE_CURFIELD_TOP 140
+ !define MUI_FINISHPAGE_CURFIELD_BOTTOM 150
+ !endif
+ !else
+ !ifndef MUI_FINISHPAGE_TEXT_LARGE
+ !define MUI_FINISHPAGE_CURFIELD_TOP 120
+ !define MUI_FINISHPAGE_CURFIELD_BOTTOM 130
+ !else
+ !define MUI_FINISHPAGE_CURFIELD_TOP 150
+ !define MUI_FINISHPAGE_CURFIELD_BOTTOM 160
+ !endif
+ !endif
+ !endif
+
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Type" "CheckBox"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Text" MUI_FINISHPAGE_SHOWREADME_TEXT
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Left" "120"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Right" "315"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Top" ${MUI_FINISHPAGE_CURFIELD_TOP}
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Bottom" ${MUI_FINISHPAGE_CURFIELD_BOTTOM}
+ !ifndef MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "State" "1"
+ !endif
+
+ !endif
+
+ !ifdef MUI_FINISHPAGE_LINK
+
+ !ifdef MUI_FINISHPAGE_CURFIELD_NO
+ !undef MUI_FINISHPAGE_CURFIELD_NO
+ !endif
+
+ !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME
+ !define MUI_FINISHPAGE_CURFIELD_NO 6
+ !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME
+ !define MUI_FINISHPAGE_CURFIELD_NO 5
+ !else
+ !define MUI_FINISHPAGE_CURFIELD_NO 4
+ !endif
+
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Type" "Link"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Text" MUI_FINISHPAGE_LINK
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Left" "120"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Right" "315"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Top" "175"
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Bottom" "185"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "State" MUI_FINISHPAGE_LINK_LOCATION
+
+ !endif
+
+ !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME & MUI_FINISHPAGE_LINK
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "6"
+ !else ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "5"
+ !else ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_LINK
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "5"
+ !else ifdef MUI_FINISHPAGE_SHOWREADME & MUI_FINISHPAGE_LINK
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "5"
+ !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME | MUI_FINISHPAGE_LINK
+ !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "4"
+ !endif
+
+ !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT
+ mui.finish_load:
+ !endif
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+
+ LockWindow on
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+ LockWindow off
+
+ !insertmacro INSTALLOPTIONS_INITDIALOG "ioSpecial.ini"
+ Pop $MUI_HWND
+ SetCtlColors $MUI_HWND "" "${MUI_BGCOLOR}"
+
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1201
+ SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}"
+
+ CreateFont $MUI_TEMP2 "$(^Font)" "12" "700"
+ SendMessage $MUI_TEMP1 ${WM_SETFONT} $MUI_TEMP2 0
+
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1202
+ SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}"
+
+ !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT
+
+ IfRebootFlag 0 mui.finish_noreboot_show
+
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1203
+ SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}"
+
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1204
+ SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}"
+
+ Goto mui.finish_show
+
+ mui.finish_noreboot_show:
+
+ !endif
+
+ !ifdef MUI_FINISHPAGE_RUN
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1203
+ SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}"
+ !endif
+
+ !ifdef MUI_FINISHPAGE_SHOWREADME
+ !ifndef MUI_FINISHPAGE_RUN
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1203
+ !else
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1204
+ !endif
+ SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}"
+ !endif
+
+ !ifdef MUI_FINISHPAGE_LINK
+ !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1205
+ !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1204
+ !else
+ GetDlgItem $MUI_TEMP1 $MUI_HWND 1203
+ !endif
+ SetCtlColors $MUI_TEMP1 "${MUI_FINISHPAGE_LINK_COLOR}" "${MUI_BGCOLOR}"
+ !endif
+
+ !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT
+ mui.finish_show:
+ !endif
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ !ifdef MUI_FINISHPAGE_CANCEL_ENABLED
+ StrCpy $MUI_NOABORTWARNING "1"
+ !endif
+
+ !insertmacro INSTALLOPTIONS_SHOW
+
+ !ifdef MUI_FINISHPAGE_CANCEL_ENABLED
+ StrCpy $MUI_NOABORTWARNING ""
+ !endif
+
+ LockWindow on
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039
+ ShowWindow $MUI_TEMP1 ${SW_NORMAL}
+
+ GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045
+ ShowWindow $MUI_TEMP1 ${SW_HIDE}
+ LockWindow off
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT
+
+ IfRebootFlag "" mui.finish_noreboot_end
+
+ !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 "ioSpecial.ini" "Field 4" "State"
+
+ StrCmp $MUI_TEMP1 "1" 0 +2
+ Reboot
+
+ Return
+
+ mui.finish_noreboot_end:
+
+ !endif
+
+ !ifdef MUI_FINISHPAGE_RUN
+
+ !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 "ioSpecial.ini" "Field 4" "State"
+
+ StrCmp $MUI_TEMP1 "1" 0 mui.finish_norun
+ !ifndef MUI_FINISHPAGE_RUN_FUNCTION
+ !ifndef MUI_FINISHPAGE_RUN_PARAMETERS
+ StrCpy $MUI_TEMP1 "$\"${MUI_FINISHPAGE_RUN}$\""
+ !else
+ StrCpy $MUI_TEMP1 "$\"${MUI_FINISHPAGE_RUN}$\" ${MUI_FINISHPAGE_RUN_PARAMETERS}"
+ !endif
+ Exec "$MUI_TEMP1"
+ !else
+ Call "${MUI_FINISHPAGE_RUN_FUNCTION}"
+ !endif
+
+ mui.finish_norun:
+
+ !endif
+
+ !ifdef MUI_FINISHPAGE_SHOWREADME
+
+ !ifndef MUI_FINISHPAGE_RUN
+ !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 "ioSpecial.ini" "Field 4" "State"
+ !else
+ !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 "ioSpecial.ini" "Field 5" "State"
+ !endif
+
+ StrCmp $MUI_TEMP1 "1" 0 mui.finish_noshowreadme
+ !ifndef MUI_FINISHPAGE_SHOWREADME_FUNCTION
+ ExecShell "open" "${MUI_FINISHPAGE_SHOWREADME}"
+ !else
+ Call "${MUI_FINISHPAGE_SHOWREADME_FUNCTION}"
+ !endif
+
+ mui.finish_noshowreadme:
+
+ !endif
+
+ FunctionEnd
+
+!macroend
+
+!macro MUI_UNFUNCTION_CONFIRMPAGE PRE SHOW LEAVE
+
+ Function "${PRE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_UNTEXT_CONFIRM_TITLE) $(MUI_UNTEXT_CONFIRM_SUBTITLE)
+
+ FunctionEnd
+
+ Function "${SHOW}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+
+ FunctionEnd
+
+!macroend
+
+;--------------------------------
+;INSTALL OPTIONS (CUSTOM PAGES)
+
+!macro MUI_INSTALLOPTIONS_EXTRACT FILE
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro INSTALLOPTIONS_EXTRACT "${FILE}"
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_EXTRACT_AS FILE FILENAME
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro INSTALLOPTIONS_EXTRACT_AS "${FILE}" "${FILENAME}"
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_DISPLAY FILE
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro INSTALLOPTIONS_DISPLAY "${FILE}"
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_DISPLAY_RETURN FILE
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro INSTALLOPTIONS_DISPLAY_RETURN "${FILE}"
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_INITDIALOG FILE
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro INSTALLOPTIONS_INITDIALOG "${FILE}"
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_SHOW
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro INSTALLOPTIONS_SHOW
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_SHOW_RETURN
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro INSTALLOPTIONS_SHOW_RETURN
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_READ VAR FILE SECTION KEY
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro INSTALLOPTIONS_READ "${VAR}" "${FILE}" "${SECTION}" "${KEY}"
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_WRITE FILE SECTION KEY VALUE
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "${SECTION}" "${KEY}" "${VALUE}"
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT FILE SECTION KEY SYMBOL
+
+ ;Converts default strings from language files to InstallOptions format
+ ;Only for use inside MUI
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !ifndef "${SYMBOL}_DEFAULTSET"
+ !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "${SECTION}" "${KEY}" "${${SYMBOL}}"
+ !else
+ Push "${${SYMBOL}}"
+ Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}Nsis2Io
+ Pop $MUI_TEMP1
+ !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "${SECTION}" "${KEY}" $MUI_TEMP1
+ !endif
+
+ !verbose pop
+
+!macroend
+
+;--------------------------------
+;RESERVE FILES
+
+!macro MUI_RESERVEFILE_INSTALLOPTIONS
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_RESERVEFILE_LANGDLL
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ ReserveFile "${NSISDIR}\Plugins\LangDLL.dll"
+
+ !verbose pop
+
+!macroend
+
+;--------------------------------
+;LANGUAGES
+
+!macro MUI_LANGUAGE LANGUAGE
+
+ ;Include a language
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_INSERT
+
+ LoadLanguageFile "${NSISDIR}\Contrib\Language files\${LANGUAGE}.nlf"
+
+ ;Include language file
+ !insertmacro LANGFILE_INCLUDE_WITHDEFAULT "${NSISDIR}\Contrib\Language files\${LANGUAGE}.nsh" "${NSISDIR}\Contrib\Language files\English.nsh"
+
+ ;Add language to list of languages for selection dialog
+ !ifndef MUI_LANGDLL_LANGUAGES
+ !define MUI_LANGDLL_LANGUAGES "'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' "
+ !define MUI_LANGDLL_LANGUAGES_CP "'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' '${LANG_${LANGUAGE}_CP}' "
+ !else
+ !ifdef MUI_LANGDLL_LANGUAGES_TEMP
+ !undef MUI_LANGDLL_LANGUAGES_TEMP
+ !endif
+ !define MUI_LANGDLL_LANGUAGES_TEMP "${MUI_LANGDLL_LANGUAGES}"
+ !undef MUI_LANGDLL_LANGUAGES
+
+ !ifdef MUI_LANGDLL_LANGUAGES_CP_TEMP
+ !undef MUI_LANGDLL_LANGUAGES_CP_TEMP
+ !endif
+ !define MUI_LANGDLL_LANGUAGES_CP_TEMP "${MUI_LANGDLL_LANGUAGES_CP}"
+ !undef MUI_LANGDLL_LANGUAGES_CP
+
+ !define MUI_LANGDLL_LANGUAGES "'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' ${MUI_LANGDLL_LANGUAGES_TEMP}"
+ !define MUI_LANGDLL_LANGUAGES_CP "'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' '${LANG_${LANGUAGE}_CP}' ${MUI_LANGDLL_LANGUAGES_CP_TEMP}"
+ !endif
+
+ !verbose pop
+
+!macroend
+
+;--------------------------------
+;LANGUAGE SELECTION DIALOG
+
+!macro MUI_LANGDLL_DISPLAY
+
+ !verbose push
+ !verbose ${MUI_VERBOSE}
+
+ !insertmacro MUI_DEFAULT MUI_LANGDLL_WINDOWTITLE "Installer Language"
+ !insertmacro MUI_DEFAULT MUI_LANGDLL_INFO "Please select a language."
+
+ !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME
+
+ ReadRegStr $MUI_TEMP1 "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}"
+ StrCmp $MUI_TEMP1 "" mui.langdll_show
+ StrCpy $LANGUAGE $MUI_TEMP1
+ !ifndef MUI_LANGDLL_ALWAYSSHOW
+ Goto mui.langdll_done
+ !endif
+ mui.langdll_show:
+
+ !endif
+
+ !ifdef NSIS_CONFIG_SILENT_SUPPORT
+ IfSilent mui.langdll_done
+ !endif
+
+ !ifdef MUI_LANGDLL_ALLLANGUAGES
+ LangDLL::LangDialog "${MUI_LANGDLL_WINDOWTITLE}" "${MUI_LANGDLL_INFO}" A ${MUI_LANGDLL_LANGUAGES} ""
+ !else
+ LangDLL::LangDialog "${MUI_LANGDLL_WINDOWTITLE}" "${MUI_LANGDLL_INFO}" AC ${MUI_LANGDLL_LANGUAGES_CP} ""
+ !endif
+
+ Pop $LANGUAGE
+ StrCmp $LANGUAGE "cancel" 0 +2
+ Abort
+
+ !ifdef NSIS_CONFIG_SILENT_SUPPORT
+ mui.langdll_done:
+ !else ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME
+ mui.langdll_done:
+ !endif
+
+ !verbose pop
+
+!macroend
+
+!macro MUI_LANGDLL_SAVELANGUAGE
+
+ !ifndef MUI_PAGE_UNINSTALLER
+
+ IfAbort mui.langdllsavelanguage_abort
+
+ !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME
+ WriteRegStr "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" $LANGUAGE
+ !endif
+
+ mui.langdllsavelanguage_abort:
+
+ !endif
+
+!macroend
+
+!macro MUI_UNGETLANGUAGE
+
+ !verbose pop
+
+ !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME
+
+ ReadRegStr $MUI_TEMP1 "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}"
+ StrCmp $MUI_TEMP1 "" 0 mui.ungetlanguage_setlang
+
+ !endif
+
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+ !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME
+
+ Goto mui.ungetlanguage_done
+
+ mui.ungetlanguage_setlang:
+ StrCpy $LANGUAGE $MUI_TEMP1
+
+ mui.ungetlanguage_done:
+
+ !endif
+
+ !verbose pop
+
+!macroend
+
+;--------------------------------
+;END
+
+!endif
+
+!verbose pop
diff --git a/Engine/bin/tools/nsis/app/Contrib/Modern UI/ioSpecial.ini b/Engine/bin/tools/nsis/app/Contrib/Modern UI/ioSpecial.ini
new file mode 100644
index 000000000..c8dfe6ec5
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/Modern UI/ioSpecial.ini
@@ -0,0 +1,19 @@
+[Settings]
+Rect=1044
+NumFields=3
+[Field 1]
+Type=bitmap
+Left=0
+Right=109
+Top=0
+Bottom=193
+Flags=RESIZETOFIT
+[Field 2]
+Type=label
+Left=120
+Right=315
+Top=10
+[Field 3]
+Type=label
+Left=120
+Right=315
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/UIs/default.exe b/Engine/bin/tools/nsis/app/Contrib/UIs/default.exe
new file mode 100644
index 000000000..e1df845bc
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/UIs/default.exe differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/UIs/modern.exe b/Engine/bin/tools/nsis/app/Contrib/UIs/modern.exe
new file mode 100644
index 000000000..6b6b3ce30
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/UIs/modern.exe differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/UIs/modern_headerbmp.exe b/Engine/bin/tools/nsis/app/Contrib/UIs/modern_headerbmp.exe
new file mode 100644
index 000000000..535c23ca5
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/UIs/modern_headerbmp.exe differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/UIs/modern_headerbmpr.exe b/Engine/bin/tools/nsis/app/Contrib/UIs/modern_headerbmpr.exe
new file mode 100644
index 000000000..4b8bb8057
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/UIs/modern_headerbmpr.exe differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/UIs/modern_nodesc.exe b/Engine/bin/tools/nsis/app/Contrib/UIs/modern_nodesc.exe
new file mode 100644
index 000000000..9b0c9a307
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/UIs/modern_nodesc.exe differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/UIs/modern_smalldesc.exe b/Engine/bin/tools/nsis/app/Contrib/UIs/modern_smalldesc.exe
new file mode 100644
index 000000000..058a17cd5
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/UIs/modern_smalldesc.exe differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/UIs/sdbarker_tiny.exe b/Engine/bin/tools/nsis/app/Contrib/UIs/sdbarker_tiny.exe
new file mode 100644
index 000000000..c3ed0d193
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Contrib/UIs/sdbarker_tiny.exe differ
diff --git a/Engine/bin/tools/nsis/app/Contrib/zip2exe/Base.nsh b/Engine/bin/tools/nsis/app/Contrib/zip2exe/Base.nsh
new file mode 100644
index 000000000..7739d20c0
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/zip2exe/Base.nsh
@@ -0,0 +1,87 @@
+;Change this file to customize zip2exe generated installers
+
+Name "${ZIP2EXE_NAME}"
+OutFile "${ZIP2EXE_OUTFILE}"
+
+AllowRootDirInstall true
+
+
+!ifdef ZIP2EXE_COMPRESSOR_SOLID
+ !define SETCOMPRESSOR_SWITCH /SOLID
+!else
+ !define SETCOMPRESSOR_SWITCH
+!endif
+
+!ifdef ZIP2EXE_COMPRESSOR_ZLIB
+ SetCompressor ${SETCOMPRESSOR_SWITCH} zlib
+!else ifdef ZIP2EXE_COMPRESSOR_BZIP2
+ SetCompressor ${SETCOMPRESSOR_SWITCH} bzip2
+!else ifdef ZIP2EXE_COMPRESSOR_LZMA
+ SetCompressor ${SETCOMPRESSOR_SWITCH} lzma
+!endif
+
+!ifdef ZIP2EXE_INSTALLDIR
+
+ InstallDir "${ZIP2EXE_INSTALLDIR}"
+
+ Function zip2exe.SetOutPath
+ SetOutPath "$INSTDIR"
+ FunctionEnd
+
+!else ifdef ZIP2EXE_INSTALLDIR_WINAMP
+
+ InstallDir "$PROGRAMFILES\Winamp"
+ InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" "UninstallString"
+
+ Function .onVerifyInstDir
+ IfFileExists $INSTDIR\winamp.exe WinampInstalled
+ Abort
+ WinampInstalled:
+ FunctionEnd
+
+ !ifdef ZIP2EXE_INSTALLDIR_WINAMPMODE
+
+ Var ZIP2EXE_TEMP1
+ Var ZIP2EXE_TEMP2
+
+ Function zip2exe.SetOutPath
+ !ifdef ZIP2EXE_INSTALLDIR_SKINS
+ StrCpy $ZIP2EXE_TEMP1 "$INSTDIR\Skins"
+ !else
+ StrCpy $ZIP2EXE_TEMP1 "$INSTDIR\Plugins"
+ !endif
+ ReadINIStr $ZIP2EXE_TEMP2 "$INSTDIR\winamp.ini" "Winamp" "${ZIP2EXE_INSTALLDIR_WINAMPMODE}"
+ StrCmp $ZIP2EXE_TEMP2 "" End
+ IfFileExists $ZIP2EXE_TEMP2 0 End
+ StrCpy $ZIP2EXE_TEMP1 $ZIP2EXE_TEMP2
+ End:
+ SetOutPath $ZIP2EXE_TEMP1
+ FunctionEnd
+
+ !else
+
+ Function zip2exe.SetOutPath
+ !ifdef ZIP2EXE_INSTALLDIR_PLUGINS
+ SetOutPath "$INSTDIR\Plugins"
+ !else
+ SetOutPath "$INSTDIR"
+ !endif
+ FunctionEnd
+
+ !endif
+
+!endif
+
+!macro SECTION_BEGIN
+
+ Section ""
+
+ Call zip2exe.SetOutPath
+
+!macroend
+
+!macro SECTION_END
+
+ SectionEnd
+
+!macroend
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/zip2exe/Classic.nsh b/Engine/bin/tools/nsis/app/Contrib/zip2exe/Classic.nsh
new file mode 100644
index 000000000..de86c4916
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/zip2exe/Classic.nsh
@@ -0,0 +1,4 @@
+;Change this file to customize zip2exe generated installers with a classic interface
+
+Page directory
+Page instfiles
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Contrib/zip2exe/Modern.nsh b/Engine/bin/tools/nsis/app/Contrib/zip2exe/Modern.nsh
new file mode 100644
index 000000000..b0159060a
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Contrib/zip2exe/Modern.nsh
@@ -0,0 +1,8 @@
+;Change this file to customize zip2exe generated installers with a modern interface
+
+!include "MUI.nsh"
+
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+
+!insertmacro MUI_LANGUAGE "English"
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Docs/AdvSplash/advsplash.txt b/Engine/bin/tools/nsis/app/Docs/AdvSplash/advsplash.txt
new file mode 100644
index 000000000..92f333f69
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/AdvSplash/advsplash.txt
@@ -0,0 +1,53 @@
+AdvSplash.dll - small (5.5k), simple plugin that lets you throw
+up a splash screen in NSIS installers with cool fading effects (win2k/xp)
+and transparency.
+
+To use:
+
+Create a .BMP file of your splash screen.
+(optional) Create a .WAV file to play while your splash screen shows.
+
+Add the following lines to your .NSI file:
+
+Function .onInit
+ SetOutPath $TEMP
+ File /oname=spltmp.bmp "my_splash.bmp"
+
+; optional
+; File /oname=spltmp.wav "my_splashshit.wav"
+
+ advsplash::show 1000 600 400 -1 $TEMP\spltmp
+
+ Pop $0 ; $0 has '1' if the user closed the splash screen early,
+ ; '0' if everything closed normally, and '-1' if some error occurred.
+
+ Delete $TEMP\spltmp.bmp
+; Delete $TEMP\spltmp.wav
+FunctionEnd
+
+Calling format
+ advsplash::show Delay FadeIn FadeOut KeyColor FileName
+
+Delay - length to show the screen for (in milliseconds)
+FadeIn - length to show the fadein scene (in ms) (not included in Delay)
+FadeOut - length to show the fadeout scene (in ms) (not included in Delay)
+KeyColor - color used for transparency, could be any RGB value
+ (for ex. R=255 G=100 B=16 -> KeyColor=0xFF6410),
+ use KeyColor=-1 if there is no transparent color at your image.
+FileName - splash bitmap filename (without the .bmp). The BMP file used will be
+ this parameter.bmp, and the wave file used (if present) will be this
+ parameter.wav.
+
+(If you already have an .onInit function, put that in it)
+
+Note 1: fadein/fadeout supported only on win2k/winxp systems, all other systems
+will show simple splash screen with Delay = Delay + FadeIn + FadeOut. Also, I've
+noted my winXP uses no transparent color at 16 bpp, so at bpps lower than 32
+for images with transparent color no fading effect will occur.
+
+Note 2: the return value of splash is 1 if the user closed the splash
+screen early (pop it from the stack)
+
+-Justin
+Converted to a plugin DLL by Amir Szekely (kichik)
+Fading and transparency by Nik Medved (brainsucker)
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Docs/Banner/Readme.txt b/Engine/bin/tools/nsis/app/Docs/Banner/Readme.txt
new file mode 100644
index 000000000..b114e5e77
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/Banner/Readme.txt
@@ -0,0 +1,47 @@
+BANNER PLUG-IN
+--------------
+
+The Banner plug-in shows a banner with customizable text. It uses the IDD_VERIFY dialog of the UI.
+
+There are three functions - show, getWindow and destroy.
+
+Usage
+-----
+
+Banner::show "Text to show"
+
+[optional] Banner::getWindow
+
+Banner::destroy
+
+See Example.nsi for an example.
+
+Modern UI
+---------
+
+The Modern UI has two labels on the IDD_VERIFY dialog. To change all the texts, use:
+
+Banner::show /set 76 "Text 1 (replaces Please wait while Setup is loading...)" "Normal text"
+
+Custom UI
+---------
+
+If you have more labels on your IDD_VERIFY dialog, you can use multiple /set parameters to change the texts.
+
+Example:
+
+Banner::show /set 76 "bah #1" /set 54 "bah #2" "Normal text"
+
+The second parameter for /set is the ID of the control.
+
+Some More Tricks
+----------------
+
+If you use /set to set the main string (IDC_STR, 1030) you can specify a different string for the window's caption and for the main string.
+
+If you use an empty string as the main string (Banner::show "") the banner window will not show on the taskbar.
+
+Credits
+-------
+
+A joint effort of brainsucker and kichik in honor of the messages dropped during the battle
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Docs/BgImage/BgImage.txt b/Engine/bin/tools/nsis/app/Docs/BgImage/BgImage.txt
new file mode 100644
index 000000000..701857004
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/BgImage/BgImage.txt
@@ -0,0 +1,92 @@
+BgImage.DLL - NSIS extension DLL
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Displays an image or a gradient with user defined texts and/or images behind the NSIS window.
+Can also play WAVs.
+
+See Example.nsi for a usage example.
+
+Usage
+~~~~~
+
+1) Call SetBg to set the background
+2) Call AddText, or AddImage to add texts and images
+3) Call Redraw to update the background window
+4) Optional - repeat steps 2-3 to add more images
+ -or-
+ call Clear and repeat steps 1-3 for a completely new background.
+5) Call Destroy when the background is no longer required (.onGUIEnd for example)
+
+Notes
+~~~~~
+
+* This plugin requires NSIS 2.42 and above.
+
+* Do not call SetBg (which creates the window) from a section or a function called by a section.
+ BgImge must be run from the GUI thread as the installation thread is not built to handle GUI.
+
+Available functions
+~~~~~~~~~~~~~~
+
+SetBg [/FILLSCREEN|/TILED] path_to_bitmap
+SetBg /GRADIENT R G B R G B
+ Sets the background and creates the window if necessary
+ Use /FILLSCREEN to make the image fill the screen
+ Use /TILED to set a tiled background
+ Use /GRADIENT to set a gradient background
+
+ If SetReturn on was called returns "success" on the stack
+ or an error string if there was an error
+
+ Do not use in .onInit!
+
+AddImage [/TRANSPARENT R G B] path_to_bitmap X Y
+ Adds an image to the background window at (X,Y)
+ X and Y can be negative to specify distance from right/bottom
+ Use /TRANSPARENT to make BgImage draw the image transparently
+ Define the transparent color using R G B
+
+ If SetReturn on was called returns "success" on the stack
+ or an error string if there was an error
+
+AddText text font_handle R G B X Y X Y
+ Adds text to the background window
+ Use NSIS's CreateFont to create a font and pass it as font_handle
+ Use R G B to set the text color
+ The first X Y is for the top left corner of the text box
+ The second X Y is for the bottom right corner of the text box
+ X and Y can be negative to specify distance from right/bottoms
+
+ If SetReturn on was called returns "success" on the stack
+ or an error string if there was an error
+
+Clear
+ Clears all of the current background, images and texts
+
+Destroy
+ Destroys the current background window
+ Destroy calls Clear automatically
+
+Sound [/WAIT|/LOOP] path_to_wav
+Sound /STOP
+ Plays a wave file
+ Use /WAIT to wait for the sound to finish playing
+ Use /LOOP to loop the sound
+ Use Sound /STOP to stop the loop
+
+SetReturn on|off
+ Enable return values from SetBg, AddImage and AddText
+ Default value is off because all of the possible errors
+ are either things you should handle when debugging your script
+ such as "can't load bitmap" or errors you can do nothing about
+ such as "memory allocation error"
+
+Credits
+~~~~~~~
+
+Coded by Amir Szekely, aka KiCHiK
+
+Ximon Eighteen, aka Sunjammer - Fixed window title bar issues
+iceman_k - Text idea and original implementation
+Lajos Molnar, aka orfanik - Tile idea and original implementation
+Jason Reis - Coding help
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Docs/Dialer/Dialer.txt b/Engine/bin/tools/nsis/app/Docs/Dialer/Dialer.txt
new file mode 100644
index 000000000..7e067d765
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/Dialer/Dialer.txt
@@ -0,0 +1,121 @@
+DIALER PLUGIN
+-------------
+
+Written by Amir Szekely aka KiCHiK
+Readme by Joost Verburg
+
+The Dialer plugin for NSIS provides five functions related to internet connections.
+
+To download files from the internet, use the NSISdl plugin.
+
+USAGE
+-----
+
+Example of usage:
+
+ClearErrors ;Clear the error flag
+Dialer::FunctionName ;Call Dialer function
+IfErrors "" +3 ;Check for errors
+ MessageBox MB_OK "Function not available"
+ Quit
+Pop $R0 ;Get the return value from the stack
+MessageBox MB_OK $R0 ;Display the return value
+
+EXAMPLE FUNCTION
+----------------
+
+; ConnectInternet (uses Dialer plugin)
+; Written by Joost Verburg
+;
+; This function attempts to make a connection to the internet if there is no
+; connection available. If you are not sure that a system using the installer
+; has an active internet connection, call this function before downloading
+; files with NSISdl.
+;
+; The function requires Internet Explorer 3, but asks to connect manually if
+; IE3 is not installed.
+
+Function ConnectInternet
+
+ Push $R0
+
+ ClearErrors
+ Dialer::AttemptConnect
+ IfErrors noie3
+
+ Pop $R0
+ StrCmp $R0 "online" connected
+ MessageBox MB_OK|MB_ICONSTOP "Cannot connect to the internet."
+ Quit ;Remove to make error not fatal
+
+ noie3:
+
+ ; IE3 not installed
+ MessageBox MB_OK|MB_ICONINFORMATION "Please connect to the internet now."
+
+ connected:
+
+ Pop $R0
+
+FunctionEnd
+
+FUNCTIONS
+---------
+
+If a function is not available on the system, the error flag will be set.
+
+* AttemptConnect
+
+ Attempts to make a connection to the Internet if the system is not connected.
+
+ online - already connected / connection successful
+ offline - connection failed
+
+ Requires Internet Explorer 3 or later
+
+* AutodialOnline
+
+ Causes the modem to automatically dial the default Internet connection if the system
+ is not connected to the internet. If the system is not set up to automatically
+ connect, it will prompt the user.
+
+ Return values:
+
+ online - already connected / connection successful
+ offline - connection failed
+
+ Requires Internet Explorer 4 or later
+
+* AutodialUnattended
+
+ Causes the modem to automatically dial the default Internet connection if the system
+ is not connected to the internet. The user will not be prompted.
+
+ Return values:
+
+ online - already connected / connection successful
+ offline - connection failed
+
+ Requires Internet Explorer 4 or later
+
+* AutodialHangup
+
+ Disconnects an automatic dial-up connection.
+
+ Return values:
+
+ success - disconnection successful
+ failure - disconnection failed
+
+ Requires Internet Explorer 4 or later
+
+* GetConnectedState
+
+ Checks whether the system is connected to the internet.
+
+ Return values:
+
+ online - system is online
+ offline - system is offline
+
+ Requires Internet Explorer 4 or later
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Docs/InstallOptions/Changelog.txt b/Engine/bin/tools/nsis/app/Docs/InstallOptions/Changelog.txt
new file mode 100644
index 000000000..27e695252
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/InstallOptions/Changelog.txt
@@ -0,0 +1,144 @@
+DLL version 2.47 (4/27/2007)
+* Line breaks support in Link control
+* Added HLine and VLine controls
+
+DLL version 2.46 (3/31/2007)
+* Use installer's name for message boxes
+
+DLL version 2.45 (1/23/2007)
+* Added FOCUS flag for setting focus to a control other than the first
+
+DLL version 2.44 (10/11/2005)
+* Added HWND and HWND2 entries to the INI file to avoid messy calculations of the correct control id
+
+DLL version 2.43 (10/4/2005)
+* Fixed alteration of the working directory by FileRequest
+* Added WS_EX_LEFTSCROLLBAR in RTL mode
+
+DLL version 2.42 (1/21/2005)
+* Added TRANSPARENT flag for BITMAP fields (funded by Chris Morgan)
+
+DLL version 2.41 (8/5/2004)
+* Bitmaps are now automatically centered
+* Fixed a bug which prevented enabling the next button from the leave function of InstallOptions pages
+* Fixed a rare freeze
+
+DLL version 2.4 (1/4/2004)
+* Initial focus is set in "initDialog" making it possible to override it from NSIS prior to calling "show"
+* When initial focus is to a Text field InstallOptions now follows standard Windows behaviour by having the text selected
+* Label and other static fields no longer have State= written to the INI file when leaving the dialog
+* NOTIFY flag can now be used with Link fields (State should be omitted in this case)
+* Likewise, State can now be used with Button fields (behaves the same as with Link fields)
+* NOTIFY flag can also now be used with ListBox and DropList fields to have NSIS notified when the selection changes
+* Meaning of RIGHT flag is now reversed in right-to-left language mode
+* HSCROLL and VSCROLL flags are no longer restricted to Text fields
+* Various Link field fixes
+
+DLL version 2.3 (12/4/2003)
+* Added new control type "Button"
+* Added new flag "NOTIFY"
+* Added new flag "NOWORDWRAP" for multi-line text boxes
+* Reduced size down to 12K
+* Better RTL support
+
+DLL version 2.2 (6/10/2003)
+* Added New control type LINK
+* \r\n converts to newline in Multiline edit box
+* Support for multiline edit box
+* Better tab order in DirRequest and FileRequest
+* Added READONLY option to text box
+* Minor fixes
+
+DLL version 2.1 (3/15/2003)
+* \r\n converts to newline in both label Text and ValidateText
+* New browse dialog style (modern)
+* Word wrapping for check boxes and radio buttons
+* No ugly border for edit fields under XP
+* Scroll bar for list boxes
+* Works with SetStaticBkColor
+* DISABLED dir and file request fields now disable the browse button too
+* No more STATE value for labels
+* Minor fixes
+
+DLL version 2.0 (1/4/2003)
+* Supports custom font and DPI settings (by Joost Verburg)
+* INI files should contain dialog units now, no pixels (by Joost Verburg)
+* RESIZETOFIT flag for Bitmap control (by Amir Szekely)
+* New documentation (by Joost Verburg)
+* New GROUP/NOTABSTOP/DISABLED flags
+
+DLL version 1.7 beta (11/2/2002)
+* Added initDialog and show DLL functions
+
+DLL version 1.6 beta (9/30/2002)
+* CancelConfirmIcon becomes CancelConfirmFlags and can now take the other common MessageBox flags
+
+DLL version 1.5 beta (9/26/2002)
+* Made close [x] button behave like Cancel (thanks brainsucker)
+
+DLL version 1.4 beta (9/4/2002)
+* Added Icon and Bitmap controls (by Amir Szekely)
+
+DLL version 1.3 beta (8/15/2002)
+* Added CancelShow (by ORTIM)
+* Added pixel transformation for widgets (by ORTIM)
+
+DLL version 1.2 beta (7/31/2002)
+* Added CancelEnabled (by ORTIM)
+* Added CancelConfirmCaption and CancelConfirmIcon (by Amir Szekely)
+
+DLL version 1.1 beta (7/22/2002)
+* Font is now taken from the main NSIS window (by Amir Szekely)
+
+DLL version 1.0 beta (12/16/2001)
+* Moved to DLL, no longer need parentwnd ini writing
+* Tons of changes - no longer fully compatible (see source for a big list)
+* removed support for silent installers (it seems the old version would bring up it's own dialog)
+
+version 1.4 (11/18/2001)
+* Added Listbox controls.
+* Added MULTISELECT flag.
+* Made the HWND list for the parent window controls dynamically allocated. This prevents a crash if NSIS ever gets more than 150 controls on it's main window.
+* The TEXT property of DirRequest control can be used to specify an initial directory. The current directory is automatically selected when clicking the browse button of the DirRequest control.
+* Added ROOT property to DirRequest which can be used to set the root directory (mostly due to felfert)
+* Edit controls will now auto scroll (thanks felfert)
+* Fixed a problem where the window wouldn't draw properly on some systems (thanks felfert)
+
+version 1.3 (11/03/2001)
+* Got rid of the call to RedrawWindow() because it's no longer needed with the WS_CLIPCHILDREN flag for NSIS.
+* Removed a few hardcoded limits of buffer sizes
+* Added Checkbox and RadioButton controls
+* Added RIGHT and CHECKED flags
+
+version 1.2.2 (10/30/2001)
+* Additional size reductions. Further reduced the size down to 8k.
+* The text parameter to a combobox can now be used to specify the initial value
+* Changed from InvalidateRect() to RedrawWindow() to force a redraw after a browse dialog
+* On startup, set the flags of the NSIS window to include WS_CLIPCHILDREN. Otherwise, our controls don't get drawn right.
+
+version 1.2.1 (10/28/2001)
+* Bug fix. ControlID for the caption and the OK button were reused by the first two controls. (Thanks Schultz)
+
+version 1.2j (10/28/2001)
+* 8.5kb from 44kb. heh. (by Justin Frankel)
+
+version 1.2 (10/28/2001)
+* Still 44k
+* Added the "FileRequest" and "DirRequest" control types (thanks Schultz)
+* Added "MinLen", "MaxLen", and "ValidateText" properties to fields
+* Added "Flags" as a way to specify additional parameters for controls
+* Few more changes to the documentation
+* Cleaned the code in a few places...still trying to make it smaller
+
+version 1.1 (10/27/2001)
+* Added the "Title" option (thanks Alex)
+* Moved the OK button so it is in the same location as the buttons on the main NSIS window (thanks Alex)
+* Pressing "ENTER" will now automatically select the OK button (thanks Alex)
+* Slightly improved the documentation
+
+version 1.01 (10/25/2001)
+* Fixed the SetFocus loop so it exits after the first control like it was supposed to
+* Added the license to the documentation
+
+version 1.0 (10/25/2001)
+* Barely qualifies as a distribution
diff --git a/Engine/bin/tools/nsis/app/Docs/InstallOptions/Readme.html b/Engine/bin/tools/nsis/app/Docs/InstallOptions/Readme.html
new file mode 100644
index 000000000..5d7e696c6
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/InstallOptions/Readme.html
@@ -0,0 +1,907 @@
+
+
+
+ InstallOptions 2
+
+
+
+
+
+
+
+
+ InstallOptions 2
+
+
+ The InstallOptions plug-in is deprecated. For new scripts, it is recommended to
+ use the new nsDialogs plug-in instead.
+
+
+
+ Introduction
+
+
+ InstallOptions is an NSIS plugin which allows you to create custom pages for NSIS
+ installers, to prompt the user for extra information.
+
+ The dialogs created by InstallOptions are based on INI files which define the controls
+ on the dialog and their properties. These INI files can be modified from the script
+ to adjust the dialogs on runtime.
+
+ The format of INI files is described in a
+ Wikipedia article.
+
+
+ INI file structure
+
+
+ The INI file has one required section. This section includes the number of controls
+ to be created as well as general window attributes. The INI file also includes a
+ variable number of Field sections which are used to create the controls to be displayed.
+
+ The required section is named "Settings". It can contain the
+ following values:
+
+
+ |
+ NumFields |
+
+ (required) |
+
+ The number of control elements to be displayed on the dialog window. |
+
+
+ |
+ Title |
+
+ (optional) |
+
+ If specified, gives the text to set the titlebar to. Otherwise, the titlebar text
+ is not changed. |
+
+
+ |
+ CancelEnabled |
+
+ (optional) |
+
+ If specified, overrides NSIS settings and enables or disables the cancel button.
+ If set to 1, the cancel button will be enabled. If set to 0, the cancel button will
+ be disabled. |
+
+
+ |
+ CancelShow |
+
+ (optional) |
+
+ If specified, overrides NSIS settings and shows or hides the cancel button If set
+ to 1, the cancel button will be shown. If set to 0, the cancel button will be hidden. |
+
+
+ |
+ BackEnabled |
+
+ (optional) |
+
+ If specified, overrides NSIS settings and enables or disables the back button. If
+ set to 1, the back button will be enabled. If set to 0, the back button will be
+ disabled. |
+
+
+ |
+ CancelButtonText |
+
+ (optional) |
+
+ Overrides the text for the cancel button. If not specified, the cancel button text
+ will not be changed. |
+
+
+ |
+ NextButtonText |
+
+ (optional) |
+
+ Overrides the text for the next button. If not specified, the next button text will
+ not be changed. |
+
+
+ |
+ BackButtonText |
+
+ (optional) |
+
+ Overrides the text for the back button. If not specified, the back button text will
+ not be changed. |
+
+
+ |
+ Rect |
+
+ (optional) |
+
+ Overrides the default rect ID to run over. This will make IO resize itself according
+ to a different rect than NSIS's dialogs rect. |
+
+
+ |
+ RTL |
+
+ (optional) |
+
+ If 1 is specified the dialog will be mirrored and all texts will be aligned to the
+ right. The INSTALLOPTIONS_EXTRACT macros automatically set this field to the right
+ value for the current installer language as given by the NSIS string $(^RTL). |
+
+
+ |
+ State |
+
+ (output) |
+
+ This is not something you have to supply yourself but is set by InstallOptions,
+ before calling your custom page validation function, to the field number of the
+ custom Button control (or other control having the Notify flag) the user pressed,
+ if any. |
+
+
+
+ Each field section has the heading "Field #" where # must be sequential
+ numbers from 1 to NumFields. Each Field section can contain the following values:
+
+
+ |
+ Type |
+
+ (required) |
+
+ Type of control to be created. Valid values are "Label", "Text",
+ "Password", "Combobox", "DropList",
+ "Listbox", "CheckBox", "RadioButton",
+ "FileRequest", "DirRequest" "Icon",
+ "Bitmap", "GroupBox", "HLine",
+ "VLine", "Link" or "Button".
+
+ A "Label" is used to display static text. (i.e. a caption for
+ a textbox)
+ A "Text" and "Password" accept text input
+ from the user. "Password" masks the input with * characters.
+ A "Combobox" allows the user to type text not in the popup list,
+ a "Droplist" only allows selection of items in the list.
+ A "Listbox" shows multiple items and can optionally allow the
+ user to select more than one item.
+ A "CheckBox" control displays a check box with label.
+ A "RadioButton" control displays a radio button with label.
+ A "FileRequest" control displays a textbox and a browse button.
+ Clicking the browse button will display a file requester where the user can browse
+ for a file.
+ A "DirRequest" control displays a textbox and a browse button.
+ Clicking the browse button will display a directory requester where the user can
+ browse for a directory.
+ An "Icon" control displays an icon. Use no Text to use the installer
+ icon.
+ A "Bitmap" control displays a bitmap.
+ A "GroupBox" control displays a frame to group controls.
+ A "HLine" control displays a horizontal line to separate controls.
+ A "VLine" control displays a vertical line to separate controls.
+ A "Link" control displays a static hot text. When the user clicks
+ the control the contents of State (e.g. http://...) will be executed
+ using ShellExecute. Alternatively State can be omitted and the
+ NOTIFY flag used to have your NSIS script called. See the "NOTIFY"
+ flag below for more information.
+ A "Button" control displays a push button that can be used in
+ the same way as the "Link" control above. |
+
+
+ |
+ Text |
+
+ (optional) |
+
+ Specifies the caption of a label, checkbox, or radio button control. For DirRequest
+ control this specifies the title of the browse dialog. For icon and bitmaps control
+ this specifies the path to the image.
+
+ Note: For labels, \r\n will be converted to a newline. To use a
+ back-slash in your text you have to escape it using another back-slash - \\. Described
+ below are NSIS functions for converting text to/from this
+ format. |
+
+
+ |
+ State |
+
+ (optional) |
+
+ Specifies the state of the control. This is updated when the user closes the window,
+ so you can read from it from NSIS. For edit texts and dir and file request boxes,
+ this is the string that is specified. For radio button and check boxes, this can
+ be '0' or '1' (for unchecked or checked). For list boxes, combo boxes and drop lists
+ this is the selected items separated by pipes ('|'). For Links and Buttons this
+ can specify something to be executed or opened (using ShellExecute).
+
+ Note: For Text fields with the MULTILINE flag, \r\n will be converted
+ to a newline. To use a back-slash in your text you have to escape it using another
+ back-slash - \\. Described below are NSIS functions for
+ converting text to/from this format. |
+
+
+ |
+ ListItems |
+
+ (optional) |
+
+ A list of items to display in a combobox, droplist, or listbox.
+ This is a single line of text with each item separated by a pipe character '|' |
+
+
+ |
+ MaxLen |
+
+ (optional) |
+
+ Causes validation on the selected control to limit the maximum length of text.
+ If the user specifies more text than this, a message box will appear when they click
+ "OK" and the dialog will not be dismissed.
+ You should not use this on a "combobox" since the user can not
+ control what is selected.
+ This should be set to a maximum of 260 for "FileRequest" and
+ "DirRequest" controls.
+ Ignored on "Label" controls. |
+
+
+ |
+ MinLen |
+
+ (optional) |
+
+ Causes validation on the selected control to force the user to enter a minimum amount
+ of text.
+ If the user specifies less text than this, a message box will appear when they click
+ "OK" and the dialog will not be dismissed.
+ Unlike MaxLen, this is useful for "Combobox" controls. By setting
+ this to a value of "1" the program will force the user to select an item.
+ Ignored on "Label" controls. |
+
+
+ |
+ ValidateText |
+
+ (optional) |
+
+ If the field fails the test for "MinLen" or "MaxLen",
+ a messagebox will be displayed with this text.
+
+ Note: \r\n will be converted to a newline, two back-slashes will
+ be converted to one - \\. Described below are NSIS functions
+ for converting text to/from this format. |
+
+
+
+ Left
+ Right
+ Top
+ Bottom |
+
+ (required) |
+
+ The position on the dialog where this control appears. All sizes should be set in
+ dialog units. To get the right dimensions for your controls, design your dialog
+ using a resource editor and copy the dimensions to the INI file.
+
+ Note: You can specify negative coordinates to specify the distance
+ from the right or bottom edge.
+
+ Note (2): For combobox or droplist, the "bottom"
+ value is not used in the same way.
+ In this case, the bottom value is the maximum size of the window when the pop-up
+ list is being displayed. All other times, the combobox is automatically sized to
+ be one element tall. If you have trouble where you can not see the combobox drop-down,
+ then check the bottom value and ensure it is large enough. A rough guide for the
+ height required is the number of items in the list multiplied by 8, plus 20.
+
+ Note (3): FileRequest and DirRequest controls will allocate 15
+ dialog units to the browse button. Make this control wide enough the contents of
+ the textbox can be seen. |
+
+
+ |
+ Filter |
+
+ (optional) |
+
+ Specifies the filter to be used in the "FileRequest" control.
+ This is constructed by putting pairs of entries together, each item separated by
+ a | character.
+ The first value in each pair is the text to display for the filter.
+ The second value is the pattern to use to match files.
+ For example, you might specify:
+ Filter=Text Files|*.txt|Programs|*.exe;*.com|All Files|*.*
+ If not specified, then the filter defaults to All Files|*.*
+
+ Note: you should not put any extra spaces around the | characters. |
+
+
+ |
+ Root |
+
+ (optional) |
+
+ Used by DirRequest controls to specify the root directory of the
+ search. By default, this allows the user to browse any directory on the computer.
+ This will limit the search to a particular directory on the system. |
+
+
+ |
+ Flags |
+
+ (optional) |
+
+ This specifies additional flags for the display of different controls. Each value
+ should be separated by a | character, and you should be careful not to put any spaces
+ around the | character.
+
+
+ |
+ Value |
+
+ Meaning |
+
+
+ |
+ REQ_SAVE |
+
+ This causes "FileRequest" controls to display a Save As dialog.
+ If not specified, an Open dialog is used. |
+
+
+ |
+ FILE_MUST_EXIST |
+
+ Used by "FileRequest" to determine if the selected file must
+ exist.
+ This only applies if an "Open" dialog is being displayed.
+ This currently does not force the file to exist other than through the browse button. |
+
+
+ |
+ FILE_EXPLORER |
+
+ Used by "FileRequest", enables new file request look (recommended) |
+
+
+ |
+ FILE_HIDEREADONLY |
+
+ Used by "FileRequest", hides "open read only" checkbox
+ in open dialog. |
+
+
+ |
+ WARN_IF_EXIST |
+
+ Used by "FileRequest" to display a warning message if the selected
+ file already exists.
+ The warning message is only displayed for files selected with the browse button. |
+
+
+ |
+ PATH_MUST_EXIST |
+
+ Used by "FileRequest" to force the path to exist. Prevents the
+ user from typing a non-existent path into the browse dialog window.
+ This only validates path's selected with the browse button. |
+
+
+ |
+ PROMPT_CREATE |
+
+ Used by "FileRequest" to display a warning if the selected file
+ does not exist. However, it still allows the user to select the file.
+ This only displays the warning for files selected with the browse button.
+ Doesn't work along with REQ_SAVE. |
+
+
+ |
+ RIGHT |
+
+ Used by "Checkbox" and "Radiobutton" controls
+ to specify you want the checkbox to the right of the text instead of the left as
+ is the default. |
+
+
+ |
+ MULTISELECT |
+
+ Used by "Listbox" controls. Turns string selection on or off
+ each time the user clicks or double-clicks a string in the list box. The user can
+ select any number of strings. If this flag and EXTENDEDSELCT are not specified,
+ only one item can be selected from the list. |
+
+
+ |
+ EXTENDEDSELCT |
+
+ Used by "Listbox" controls. Allows multiple items to be selected
+ by using the SHIFT key and the mouse or special key combinations. If this flag and
+ MULTISELECT are not specified, only one item can be selected from the list. |
+
+
+ |
+ RESIZETOFIT |
+
+ This causes "Bitmap" controls to resize the image to the size
+ of the control. Also useful to support custom DPI settings. Without this, the image
+ will be centered within the specified area. |
+
+
+ TRANSPARENT |
+
+ Used by "Bitmap" controls. Hides every pixel with the same color
+ as of the top left pixel. This allows to see-through to controls behind it. This
+ flag doesn't work well with a combination of the RESIZETOFIT flag and bitmaps with
+ more than 256 colors. |
+
+
+ |
+ GROUP |
+
+ Add this flag to the first control of a group of controls to group them. Grouping
+ controls allows you to create multiple groups of radio button and makes keyboard
+ navigation using arrow keys easier. |
+
+
+ |
+ FOCUS |
+
+ Sets focus on the specified control, instead of the first focusable control. If
+ more than one field is specified with this flag, only the first one will receive
+ focus. |
+
+
+ |
+ NOTABSTOP |
+
+ Do not stop on the control when the user pressed the Tab key. Add NOTABSTOP to all
+ controls of a group except the first one to allow navigation between groups with
+ the Tab key. |
+
+
+ |
+ DISABLED |
+
+ Causes a control to be disabled. |
+
+
+ |
+ ONLY_NUMBERS |
+
+ Used by "Text" controls. Forces the user to enter only numbers
+ into the edit box. |
+
+
+ |
+ MULTILINE |
+
+ Used by "Text" controls. Causes the control to accept multiple-lines. |
+
+
+ |
+ WANTRETURN |
+
+ Used by "Text" controls with multiple-line. Specifies that a
+ carriage return be inserted when the user presses the ENTER key while entering text
+ into the text box. |
+
+
+ |
+ NOWORDWRAP |
+
+ Used by "Text" controls with multiple-line. Disables the word-wrap
+ that occurs when long lines are entered. Long lines instead scroll off to the side.
+ Specifying the HSCROLL flag also has this effect. |
+
+
+ |
+ HSCROLL |
+
+ Show a horizontal scrollbar. When used by "Text" controls with
+ multiple-lines this also disables word-wrap. |
+
+
+ |
+ VSCROLL |
+
+ Show a vertical scrollbar. |
+
+
+ |
+ READONLY |
+
+ Used by "Text" controls. Prevents the user from entering or editing
+ text in the edit control, but allow the user to select and copy the text. |
+
+
+ |
+ NOTIFY |
+
+ Used by "Button", "Link", "CheckBox",
+ "RadioButton", "ListBox" and "DropList"
+ controls. Causes InstallOptions to call your NSIS custom page validation/leave function
+ whenever the control's selection changes. Your validation/leave function can read
+ the "State" value from the "Settings" section
+ to determine which control caused the notification, if any, and perform some appropriate
+ action followed by an Abort instruction (to tell NSIS to return to the page). The
+ Examples\InstallOptions folder contains an example script showing how this might
+ be used. |
+
+
+ |
+
+
+ |
+ TxtColor |
+
+ (optional) |
+
+ Used by Link controls to specify the foreground color of the text.
+ Format: 0xBBGGRR (hexadecimal). |
+
+
+
+ HWND
+ HWND2 |
+
+ (output) |
+
+ After initDialog returns, this will contain the HWND of the control created by this
+ field. It can be used instead of FindWindow and GetDlgItem. HWND2 contains the HWND
+ of an additional control, such as the browse button. |
+
+
+
+
+ Header file
+
+
+ The InstallOptions header files provides macros and functions to easily create custom
+ dialogs. You can include it on the top of your script as follows:
+
+!include InstallOptions.nsh
+
+
+
+ Creating dialogs
+
+
+ Extracting the INI file
+
+
+ First, you have to extract your InstallOptions INI files in the .onInit function
+ (or un.onInit for the uninstaller) using the INSTALLOPTIONS_EXTRACT macro. The files
+ will be extracted to a temporary folder (the NSIS plug-ins folder) that is automatically
+ created.
+
+Function .onInit
+ !insertmacro INSTALLOPTIONS_EXTRACT "ioFile.ini"
+FunctionEnd
+
+
+ If the INI file is located in another directory, use INSTALLOPTIONS_EXTRACT_AS.
+ The second parameter is the filename in the temporary folder, which is the filename
+ that should be used as input for the other macros.
+
+Function .onInit
+ !insertmacro INSTALLOPTIONS_EXTRACT_AS "..\ioFile.ini" "ioFile.ini"
+FunctionEnd
+
+
+
+ Displaying the dialog
+
+
+ You can call InstallOptions in a page function defined with the Page or UninstPage
+ command. Check the NSIS documentation (Scripting Reference -> Pages) for information
+ about the page system.
+
+Page custom CustomPageFunction
+
+ To display the dialog, use the INSTALLOPTIONS_DISPLAY macro:
+Function CustomPageFunction ;Function name defined with Page command
+ !insertmacro INSTALLOPTIONS_DISPLAY "ioFile.ini"
+FunctionEnd
+
+
+
+
+ User input
+
+
+ To get the input of the user, read the State value of a Field using the INSTALLOPTIONS_READ
+ macro:
+
+!insertmacro INSTALLOPTIONS_READ $VAR "ioFile.ini" "Field #" "Name"
+
+
+
+ Writing to INI files
+
+
+ The INSTALLOPTIONS_WRITE macro allows you to write values to the INI file to change
+ texts or control settings on runtime:
+
+!insertmacro INSTALLOPTIONS_WRITE "ioFile.ini" "Field #" "Name" "Value"
+
+
+
+ Escaped values
+
+
+ Some InstallOptions values are escaped (in a similar manner to "C" strings)
+ to allow characters to be used that are not normally valid in INI file values. The
+ affected values are:
+
+ - The ValidateText field
+ - The Text value of Label fields
+ - The State value of Text fields that have the MULTILINE flag
+
+
+ The escape character is the back-slash character ("\") and the available
+ escape sequences are:
+
+
+ |
+ "\\" |
+
+ Back-slash |
+
+
+ |
+ "\r" |
+
+ Carriage return (ASCII 13) |
+
+
+ |
+ "\n" |
+
+ Line feed (ASCII 10) |
+
+
+ |
+ "\t" |
+
+ Tab (ASCII 9) |
+
+
+
+ The INSTALLOPTIONS_READ_CONVERT and INSTALLOPTIONS_WRITE_CONVERT macros automatically
+ convert these characters in installer code. In uninstaller code, use INSTALLOPTIONS_READ_UNCONVERT
+ and INSTALLOPTIONS_WRITE_UNCONVERT.
+
+ To use these macros in your script, the conversion functions need to be included:
+
+;For INSTALLOPTIONS_READ_CONVERT
+ !insertmacro INSTALLOPTIONS_FUNCTION_READ_CONVERT
+;For INSTALLOPTIONS_WRITE_CONVERT
+ !insertmacro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT
+;For INSTALLOPTIONS_READ_UNCONVERT
+ !insertmacro INSTALLOPTIONS_UNFUNCTION_READ_CONVERT
+;For INSTALLOPTIONS_WRITE_UNCONVERT
+ !insertmacro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT
+
+
+
+ Input validation
+
+
+ To validate the user input (for example, to check whether the user has filled in
+ a textbox) use the leave function of the Page command and Abort when the validation
+ has failed:
+
+Function ValidateCustom
+
+ !insertmacro INSTALLOPTIONS_READ $R0 "test.ini" "Field 1" "State"
+ StrCmp $R0 "" 0 +3
+ MessageBox MB_ICONEXCLAMATION|MB_OK "Please enter your name."
+ Abort
+
+FunctionEnd
+
+
+
+ Return value
+
+ After a dialog is created (using display or show), a return value is available:
+
+ - success - The user has pressed the Next button
+ - back - The user has pressed the Back button
+ - cancel - The user has pressed the Cancel button
+ - error - An error has occurred, the dialog cannot be displayed.
+
+
+ You only have to check this value if you need something really special, such as
+ doing something when the user pressed the Back button.
+
+ If you need the return value, use the INSTALLOPTIONS_DISPLAY_RETURN or INSTALLOPTIONS_SHOW_RETURN
+ macro. The return value will be added to the stack, so you can use the Pop command
+ to get it.
+
+
+ Reserve files
+
+
+ When using solid compression, it's important that files which are being extracted
+ in user interface functions are located before other files in the data block. Otherwise
+ there may be a delay before a page can be displayed.
+
+ To ensure that this is the case, add ReserveFile commands for InstallOptions and
+ the INI files before all sections and functions:
+
+ReserveFile "test.ini"
+ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
+
+
+
+ Fonts and colors
+
+
+ To customize fonts or colors on InstallOptions dialogs, the INSTALLOPTIONS_INITDIALOG
+ and INSTALLOPTIONS_SHOW macro can be used.
+
+ INSTALLOPTIONS_INITDIALOG creates the dialog in memory, but does not show it. After
+ inserting this macro, you can set the fonts and colors, and then insert INSTALLOPTIONS_SHOW
+ to show the dialog.
+
+ The INSTALLOPTIONS_INITDIALOG macro also pushes the HWND of the custom dialog to
+ the stack. Control HWND's are available for each control in the HWND entry of the
+ corresponding field in the INI file.
+
+ Example of using a custom font:
+
+Var HWND
+Var DLGITEM
+Var FONT
+
+Function FunctionName ;FunctionName defined with Page command
+
+ !insertmacro INSTALLOPTIONS_INITDIALOG "ioFile.ini"
+ Pop $HWND ;HWND of dialog
+
+ !insertmacro INSTALLOPTIONS_READ $DLGITEM "ioFile.ini" "Field 1" "HWND"
+
+ ;$DLGITEM contains the HWND of the first field
+ CreateFont $FONT "Tahoma" 10 700
+ SendMessage $DLGITEM ${WM_SETFONT} $FONT 0
+
+ !insertmacro INSTALLOPTIONS_SHOW
+
+FunctionEnd
+
+
+
+ Credits
+
+
+ Original version by Michael Bishop
+ DLL version by Nullsoft, Inc.
+ DLL version 2 by Amir Szekely, ORTIM, Joost Verburg
+ New documentation by Joost Verburg
+
+
+ License
+
+
+Original version Copyright © 2001 Michael Bishop
+DLL version 1 Copyright © 2001-2002 Nullsoft, Inc., ORTIM
+DLL version 2 Copyright © 2003-2009 Amir Szekely, Joost Verburg, Dave Laundon
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute
+it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+ you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment in the
+ product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such,
+ and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any distribution.
+
+
+ |
+
+
diff --git a/Engine/bin/tools/nsis/app/Docs/Math/Math.txt b/Engine/bin/tools/nsis/app/Docs/Math/Math.txt
new file mode 100644
index 000000000..e304b343f
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/Math/Math.txt
@@ -0,0 +1,197 @@
+Math::Script NSIS plugin.
+
+C-like style scripting (operators at least).
+Tip1: plugin watches the case of the letters.
+Tip2: plugin makes almost no error checks. So YOU should check your script
+twice before run :)
+
+New HOW TO USE: run the MathTest.Exe, and try yourself. After spending
+some minutes your should be able to write your script by yourself.
+To include it to your NSIS script just insert that:
+ Math::Script "YourScript1"
+ Math::Script "YourScript2"
+ Math::Script "YourScriptFinal"
+
+How to use it? Simple:
+ Strcpy $0 "Brainsucker"
+ Math::Script "a = 'Math'; B = 'Script'; r0 += ' wants to use ' + a + '::' + b +'!'"
+ DetailPrint "$0"
+That string will fill r0 with some shit.
+
+Here are some other samples:
+ 10! (factorial, r0 will contain '10! = 362880'):
+ r0 = '10! = ' + (1*2*3*4*5*6*7*8*9)
+ the same:
+ a = b = 1; #{++a <= 10, b = b*a}; r0 = (a-1) + '! = ' + b
+ Some floating point:
+ Strcpy $R0 "1e1"
+ Math::Script "pi = 3.14159; R1 = 2*pi*R0; r0 = 'Length of circle with radius ' + R0 + ' is equal to ' + R1 + '.'"
+ Detailprint "$0"
+
+Ok. Variables.
+NSIS: r0-r9 -> $0-$9. R0-R9 -> $R0-$R9.
+Also CL ($CMDLINE), ID ($INSTDIR), OD ($OUTDIR), LG ($LANG), ED ($EXEDIR).
+User definable: name starting from character, up to 28 letters long.
+
+Stacks. Two stacks are supported: NSIS stack and plugin's own stack. I see no
+reasons for using plugin stack, but if you will, remember - the plugin stores
+variables used at function to that stack before function execution, and restores
+after execution. Even less I recommend you to use NSIS stack. You should use it
+only for input/output.
+How to use? It's variable styled. Plugins stack is associated with S variable,
+and NSIS stack associated with NS variable. To push to stack just do "S=0" or
+"NS=0", to pop from stack "a=S" or "b=NS". Combined operations supported too:
+"S += 1.5" will increment value at the top of stack by 1.5.
+
+Supported types: int (in fact that is __int64), float (double in fact),
+string.
+Int: just numbers, may include sign.
+Float: -123.456, 123.456e-78, 123e-45
+String: something in quotes ("", '', ``).
+
+There is also an array type. It is actually a reference type, so if b is array
+and you will perform "a=b", the a and b will reference a single array.
+To create a copy of array, use ca func: dest = ca(source). Btw - you couldn't
+control dimensions of arrays - they are autosized.
+To declare array:
+a = {};
+To declare array and initialize some items with values:
+{"Hello!", "Use", "mixed types", 1.01e23, "like that" ,1234};
+To access array:
+a[index] = "Cool";
+
+Also [] operation could be used to strings. str[x] gives you a single char with
+index x (zero-based) as new string. str[-x] - the same, but x counts from the
+string end (so the last char is -1). str[x,y] gives you characters in range x-y
+(inclusive), both x and y could be <0 - in this case they counted from the end
+of the string.
+
+The function could be useful - is conversion of arrays to strings and back.
+Example:
+a = a("Hello"); str = s(a);
+After running such script array a will contain 6 integers (chars and last zero
+- end of string), and str will contain your string back.
+
+Operators (some binary, some unary):
+>>= <<= -= += /= *= |= &= ^= %= -- ++ >> << && || <= =< >= => != ==
+= + - * / % < > & | ^ ~ !
+Only some are applicable to float (logic & arithmetic) and string (+ and logic)
+of course.
+Additional case: reference/de-reference operators (& and *). & will
+give you the reference to argument which should be a variable (NSIS, user, array
+item, stack), and * will convert it back to original variable. For example
+(a=&b; *a=10) will set b to 10. Expression (*&a) is equal to simple (a).
+
+Script is set of expressions (mathematical in general) delimited with ';'.
+Processing is mathematically right (2+2*2 will give 6), operations are performed
+in a C like order (precedence).
+
+Flow control:
+ if-then-else like: #[if-expression, then-expr, else-expr]
+ example:
+ #[a==0, b=1; c=2, b *= (--c); c/=10]
+ C eq:
+ if (a==0) { b=1; c=2;} else { b*=(c++);c-=10; }
+ while (expr) do; like #{expr, do}
+ example:
+ #{(c<1.1e25)&&(b < 10), b++; c*=1.23}
+ C eq:
+ while ((c<1.1e25)&&(b<10)) { b++; c*=1.23; }
+
+WATCH OUT! Comma (,) separates if-expr, then-expr, and else-expr from each
+other. All sub-expressions separated by (;) are the part of one expression,
+and the result of the last one of these sub-exprs gives you the result of
+expression.
+
+All the shit (like variables and functions) will be saved between calls.
+
+Functions:
+ type conversions:
+ l(string) returns the length of string or array argument
+ s(source) converts source to string type
+ i(source) converts source to int type
+ f(source) converts source to float type
+ c(source) if source is string, returns int value of first
+ char, if source is int, returns string which consists
+ of a single char (source) (+0 terminator).
+ a(source) converts source to array (only string supported)
+ ff(float, format) converts float to string, with format
+ options.
+ options = precision + flags.
+ Precision shows how many digits after decimal point
+ will be shown. Flags:
+ 16 (or 0x10) - No Exponential View
+ (number will be shown as 123.123)
+ 32 (or 0x20) - Only exponential view
+ (number will be shown as 123.12e123)
+ 64 (or 0x40) - use 'E' character instead of 'e'
+ By default the plugin decides itself how to show your
+ number.
+
+ math (description of all these functions is available at MSDN, use the
+ second given name for search):
+ sin(x), sin Sine of argument
+ cos(x), cos Cosine of argument
+ cel(x), ceil Ceil of argument (no fract. part)
+ csh(x), cosh Hyperbolic Cosine of Argument
+ exp(x), exp Exponential
+ abs(x), abs Absolute value (warning: float)
+ flr(x), floor Floor of argument (no fract. part)
+ asn(x), asin ArcSine of argument
+ acs(x), acos ArcCosine of argument
+ atn(x), atan ArcTangent of argument
+ ln(x), log Exponential Logarithm
+ log(x), log10 Decimal logarithm
+ snh(x), sinh Hyperbolic Sine of Argument
+ sqt(x), sqrt Square root of argument
+ tan(x), tan Tangent of argument
+ tnh(x), tanh Hyperbolic tangent of argument
+
+ functions taking two arguments
+ at2(x, y) atan2 Arctangent of the value (y/x)
+ pow(x, y) pow power, x^y
+ fmd(x, y) fmod floating point remainder
+ fex(x, o) frexp Gets the mantissa (result = r)
+ and exponent (o) of floating-point
+ number (x): x = r*(2^o)
+ mdf(x, o) modf Splits a floating-point value into
+ fractional and integer parts.
+
+User-defined functions.
+It's very simple. Example:
+ test(a,b) (a+b);
+After that test(1,2) will give you 3.
+ test2(a,b) (a=a+b; b *= a);
+The result of function is always the result of last expression.
+As said before it better not to use stack (S) in between function calls.
+It will be better to develop variable-safe functions, i.e. functions which will
+not corrupt variables. For this you should either push/pop them to stack, or
+declare as additional arguments, which will never be used. Example:
+ test3(a,b,c) (c=10; #{--c > 0, a=sqrt(a*b)}; a)
+No matter how many arguments will be passed to function, the values of all three
+vars (a,b,c) will be saved.
+Such variable-safe functions could be recursive:
+ Math::Script 'rec(a) (#[a > 0, rec(a-1), 0]+a);'
+ Math::Script 'R1 = rec(10)'
+will set R1 to right result 55.
+Sometimes functions will need to return more than one value, in this case you
+could declare argument as referent (b at example):
+ test4(a, &b) (*b = a*a; a*a*a)
+In this case test4 will return a^3, and if we will call it like that test4(a,c),
+it will place a^2 to c. BUT! Note: you should use de-referencer (*) with variable,
+at example *b. CAUTION: never use the same variable as function internal reference
+variable and external argument variable (for example test4(a,b)). It will surely
+fail. Also: if you declared argument as reference - you should never supply
+a constant expression to it. It could be either array item (array[1]), NSIS
+register R0, any of the user variables (beside the variable with the same name:),
+but never the constant.
+
+Another may-be-useful possibility is to redeclare the function (the usual
+declaration at the time when function already defined will simply call that
+function). For such task you could use "#name", like "func()(1); #func()(2);".
+But beware, function declaration occurs at time of parsing, so it's not possible
+to perform flow controlled declaration.
+SUCH IS NOT POSSIBLE: "#[a<0, #func()(1), #func()(2)]"
+IT WILL SIMPLY DEFINE #func as (2), as the latest variant.
+
+(c) Nik Medved (brainsucker)
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI 2/License.txt b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/License.txt
new file mode 100644
index 000000000..d3a22b9a0
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/License.txt
@@ -0,0 +1,10 @@
+Copyright © 2002-2009 Joost Verburg
+
+This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any distribution.
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI 2/Readme.html b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/Readme.html
new file mode 100644
index 000000000..c4b241c62
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/Readme.html
@@ -0,0 +1,1157 @@
+
+
+
+ NSIS Modern User Interface - Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+ [Expand all] [Collapse
+ all]
+
+
+ Introduction
+
+
+ The Modern UI provides a user interface for NSIS installers with a modern wizard
+ style, similar to the wizards of recent Windows versions. It is based on the basic
+ user interface that is provided by the NSIS compiler itself and extends it with
+ more interface features and pages.
+
+ All standard NSIS pages (such as the pages to select components and the installation
+ folder) are supported as well as a number of additional pages. The welcome page
+ allows you to provide an introduction to the installation process, while the finish
+ page provides a way to let the user decide what steps should be performed after
+ the setup wizard is closed (for example, whether the application should be started
+ immediately). A finish page can also be used to ask for a system restart is necessary.
+
+
+ Screenshots
+
+
+ 
+
+ 
+
+
+
+ Modern UI 2.0
+
+
+ This new version makes it easier to customize pages, because the same method can
+ be used to change standard NSIS pages as well as additional pages provided
+ by the Modern UI. It is now also possible for other NSIS plug-ins to add new pages
+ to the Modern UI. You can expect to see examples of this soon.
+
+ The welcome and finish page are no longer implemented using InstallOptions. Instead,
+ the new nsDialogs plug-in is used. nsDialogs allows you to create custom pages or
+ customize existing pages directly from the script.
+
+ To upgrade a Modern UI 1.8 script, you should:
+
+ - Insert the MUI2.nsh header file instead of MUI.nsh.
+ - The macros for InstallOptions have been moved to a separate header file unrelated
+ to the Modern UI. If you are still using InstallOptions for custom pages, insert
+ InstallOptions.nsh and use the INSTALLOPTIONS_* macros instead of the MUI_INSTALLOPTIONS_*
+ macros. The macros themselves have remained the same.
+ - Rewrite customization code for the Modern UI 1.8 welcome and finish pages in which
+ the InstallOptions INI file is used. nsDialogs commands should be used instead.
+ - Use the standard NSIS method to escape special characters in all texts. For example,
+ $\r$\n creates newline.
+
+
+
+ Script header
+
+
+ The settings for the Modern UI should be inserted in the header of the script file.
+ It's important to follow the same order as the items below. For example,
+ interface settings should be defined before you insert pages, because the pages
+ depend on the interface configuration. It may be useful to look at the
+ example scripts too see how this is done in actual script files.
+
+ Parameters are given in this format: required (option1 | option2)
+ [optional]
+
+
+ 1. Header file
+
+
+ First of all, add this line to the top of script to include the Modern UI:
+
+!include MUI2.nsh
+
+
+
+ 2. Interface configuration
+
+
+ Then, you may want to use interface settings to change the look and feel of the
+ installer. These settings apply to all pages.
+ The interface settings provided by the NSIS compiler itself (such as LicenseText,
+ Icon, CheckBitmap, InstallColors) should not be used in Modern UI scripts. The Modern
+ UI provides equalivent or extended versions of these settings.
+ Examples:
+
+!define MUI_COMPONENTSPAGE_SMALLDESC ;No value
+!define MUI_UI "myUI.exe" ;Value
+!define MUI_INSTFILESPAGE_COLORS "FFFFFF 000000" ;Two colors
+
+
+
+ Interface settings
+
+
+
+ Page header
+
+
+ MUI_ICON icon_file
+ The icon for the installer.
+ Default: ${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico
+
+ MUI_UNICON icon_file
+ The icon for the uninstaller.
+ Default: ${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico
+
+ MUI_HEADERIMAGE
+ Display an image on the header of the page.
+
+
+ MUI_HEADERIMAGE_BITMAP bmp_file
+ Bitmap image to display on the header of installers pages (recommended size: 150x57
+ pixels).
+ Default: ${NSISDIR}\Contrib\Graphics\Header\nsis.bmp
+
+
+ MUI_HEADERIMAGE_BITMAP_NOSTRETCH
+ Do not stretch the installer header bitmap to fit the size of the field. Use this
+ option only if you have an image that does not use the whole space. If you have
+ a full size bitmap that fits exactly, you should not use this option because the
+ size of the field will be different if the user has a custom DPI setting.
+
+ MUI_HEADERIMAGE_BITMAP_RTL bmp_file
+ Bitmap image to display on the header of installers pages when using a RTL language
+ (recommended size: 150x57 pixels).
+ Default: Non-RTL bitmap
+
+
+ MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH
+ Do not stretch the installer header bitmap when using a RTL language to fit the
+ size of the field. Use this option only if you have an image that does not use the
+ whole space. If you have a full size bitmap that fits exactly, you should not use
+ this option because the size of the field will be different if the user has a custom
+ DPI setting.
+
+
+
+ MUI_HEADERIMAGE_UNBITMAP bmp_file
+ Bitmap image to display on the header of uninstaller pages (recommended size: 150x57
+ pixels).
+ Default: Installer header bitmap
+
+
+ MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH
+ Do not stretch the uninstaller header bitmap to fit the size of the field. Use this
+ option only if you have an image that does not use the whole space. If you have
+ a full size bitmap that fits exactly, you should not use this option because the
+ size of the field will be different if the user has a custom DPI setting.
+
+ MUI_HEADERIMAGE_UNBITMAP_RTL bmp_file
+ Bitmap image to display on the header of uninstallers pages when using a RTL language
+ (recommended size: 150x57 pixels).
+ Default: Installer RTL header bitmap
+
+
+ MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH
+ Do not stretch the uninstaller header bitmap when using a RTL language to fit the
+ size of the field. Use this option only if you have an image that does not use the
+ whole space. If you have a full size bitmap that fits exactly, you should not use
+ this option because the size of the field will be different if the user has a custom
+ DPI setting.
+
+
+
+ MUI_HEADERIMAGE_RIGHT
+ Display the header image on the right side instead of the left side (when using
+ a RTL language it will be displayed on the left side instead of the right side).
+
+
+ MUI_BGCOLOR (color: RRGGBBR hexadecimal)
+ Background color for the header, the Welcome page and the Finish page.
+ Default: FFFFFF
+
+ MUI_HEADER_TRANSPARENT_TEXT
+ Set a transparent background for the header's label controls. Useful for custom
+ user interfaces that set a bigger header image.
+
+
+
+ Interface resources
+
+
+ MUI_UI ui_file
+ The interface file with the dialog resources. Change this if you have made your
+ own customized UI.
+ Default: ${NSISDIR}\Contrib\UIs\modern.exe
+
+ MUI_UI_HEADERIMAGE ui_file
+ The interface files with the dialog resource IDD_INST that contains a bitmap control
+ and space for the header bitmap.
+ Default: ${NSISDIR}\Contrib\UIs\modern_headerbmp.exe
+
+ MUI_UI_HEADERIMAGE_RIGHT ui_file
+ The interface files with the dialog resource IDD_INST that contains a bitmap control
+ and space for the header bitmap on the right side.
+ Default: ${NSISDIR}\Contrib\UIs\modern_headerbmpr.exe
+
+ MUI_UI_COMPONENTSPAGE_SMALLDESC ui_file
+ The interface files with a customized dialog resource IDD_SELCOM with a small description
+ area.
+ Default: ${NSISDIR}\Contrib\UIs\modern_smalldesc.exe
+
+ MUI_UI_COMPONENTSPAGE_NODESC ui_file
+ The interface files with a customized dialog resource IDD_SELCOM without a description
+ area.
+ Default: ${NSISDIR}\Contrib\UIs\modern_nodesc.exe
+
+
+
+ Installer welcome/finish page
+
+
+ MUI_WELCOMEFINISHPAGE_BITMAP bmp_file
+ Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).
+ Default: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp
+
+
+ MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
+ Do not stretch the bitmap for the Welcome and Finish page to fit the size of the
+ field. Use this option only if you have an image that does not use the whole space.
+ If you have a full size bitmap that fits exactly, you should not use this option
+ because the size of the field will be different if the user has a custom DPI setting.
+
+
+
+
+ Uninstaller welcome/finish page
+
+
+ MUI_UNWELCOMEFINISHPAGE_BITMAP bmp_file
+ Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).
+ Default: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp
+
+
+ MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH
+ Do not stretch the bitmap for the Welcome and Finish page to fit the size of the
+ field. Use this option only if you have an image that does not use the whole space.
+ If you have a full size bitmap that fits exactly, you should not use this option
+ because the size of the field will be different if the user has a custom DPI setting.
+
+
+
+
+ License page
+
+
+ MUI_LICENSEPAGE_BGCOLOR (/windows | /grey |
+ (color: RRGGBB hexadecimal))
+ The background color for the license textbox. Use /windows for the Windows text
+ background color (usually white). Use the /grey for the window background color
+ (usually grey).
+ Default: /windows
+
+
+
+ Components page
+
+
+ MUI_COMPONENTSPAGE_CHECKBITMAP bitmap_file
+ The bitmap with images for the checks of the component select treeview.
+ Default: ${NSISDIR}\Contrib\Graphics\Checks\modern.bmp
+
+ MUI_COMPONENTSPAGE_SMALLDESC
+ A small description area on the bottom of the page. Use this layout if you have
+ a lot of sections and don't need large descriptions.
+
+ MUI_COMPONENTSPAGE_NODESC
+ No description area.
+
+
+
+ Directory page
+
+
+ MUI_DIRECTORYPAGE_BGCOLOR (color: RRGGBB hexadecimal)
+ The background color for the directory textbox.
+
+
+
+ Start Menu folder page
+
+
+ MUI_STARTMENUPAGE_BGCOLOR (color: RRGGBB hexadecimal)
+ The background color for the startmenu directory list and textbox.
+
+
+
+ Installation page
+
+
+ MUI_INSTFILESPAGE_COLORS (/windows | "(foreground
+ color: RRGGBB hexadecimal) (background color: RRGGBB hexadecimal)")
+ The colors of the details screen. Use /windows for the default Windows colors.
+ Default: /windows
+
+ MUI_INSTFILESPAGE_PROGRESSBAR (""
+ | colored | smooth)
+ The style of the progress bar. Colored makes it use the MUI_INSTALLCOLORS.
+ Default: smooth
+
+
+
+ Installer finish page
+
+
+ MUI_FINISHPAGE_NOAUTOCLOSE
+ Do not automatically jump to the finish page, to allow the user to check the install
+ log.
+
+
+
+ Uninstaller finish page
+
+
+ MUI_UNFINISHPAGE_NOAUTOCLOSE
+ Do not automatically jump to the finish page, to allow the user to check the uninstall
+ log.
+
+
+
+ Abort warning
+
+
+ MUI_ABORTWARNING
+ Show a message box with a warning when the user wants to close the installer.
+
+
+ MUI_ABORTWARNING_TEXT text
+ Text to display on the abort warning message box.
+
+ MUI_ABORTWARNING_CANCEL_DEFAULT
+ Set the Cancel button as the default button on the message box.
+
+
+
+
+ Uninstaller abort warning
+
+
+ MUI_UNABORTWARNING
+ Show a message box with a warning when the user wants to close the uninstaller.
+
+
+ MUI_UNABORTWARNING_TEXT text
+ Text to display on the abort warning message box.
+
+ MUI_UNABORTWARNING_CANCEL_DEFAULT
+ Set the Cancel button as the default button on the message box.
+
+
+
+
+
+ 3. Pages
+
+
+ Insert the following macros to set the pages you want to use. The pages will appear
+ in the order in which you insert them in the script. You can also insert custom
+ Page commands between the macros to add custom pages.
+
+ You can add multiple pages of certain types (for example, if you want the user to
+ specify multiple folders).
+
+ Examples:
+
+!insertmacro MUI_PAGE_LICENSE "License.rtf"
+!insertmacro MUI_PAGE_COMPONENTS
+
+Var StartMenuFolder
+!insertmacro MUI_PAGE_STARTMENU "Application" $StartMenuFolder
+
+
+ You will need the page ID for the Start Menu folder page when using the Start Menu
+ folder macros. The folder will be stored in the specified variable.
+
+ Installer pages
+ MUI_PAGE_WELCOME
+ MUI_PAGE_LICENSE textfile
+ MUI_PAGE_COMPONENTS
+ MUI_PAGE_DIRECTORY
+ MUI_PAGE_STARTMENU pageid variable
+ MUI_PAGE_INSTFILES
+ MUI_PAGE_FINISH
+
+ Uninstaller pages
+ MUI_UNPAGE_WELCOME
+ MUI_UNPAGE_CONFIRM
+ MUI_UNPAGE_LICENSE textfile
+ MUI_UNPAGE_COMPONENTS
+ MUI_UNPAGE_DIRECTORY
+ MUI_UNPAGE_INSTFILES
+ MUI_UNPAGE_FINISH
+
+
+ Page settings
+
+
+ Page settings apply to a single page and should be set before inserting a page macro.
+ The same settings can be used for installer and uninstaller pages. You have to repeat
+ the setting if you want it to apply to multiple pages. Example:
+
+;Add a directory page to let the user specify a plug-ins folder
+;Store the folder in $PluginsFolder
+
+Var PLUGINS_FOLDER
+!define MUI_DIRECTORYPAGE_VARIABLE $PluginsFolder
+!insertmacro MUI_PAGE_DIRECTORY
+
+
+
+ All standard texts in the user interface are loaded from language files, which are
+ available for all languages supported by NSIS. So you only need to define these
+ texts if you want to change the default.
+
+ If the parameter is a text that should be different for each language, define a
+ language string using LangString and use $(LangStringName) as value. For a license
+ text in multiple languages, LicenseLangString can be used. Refer the NSIS Users
+ Manual for more information about installers with multiple languages.
+
+ In all text settings, the doublequote character (") should be escaped in the
+ following form: $\"
+
+
+ General page settings
+
+
+ MUI_PAGE_HEADER_TEXT text
+ Text to display on the header of the page.
+
+ MUI_PAGE_HEADER_SUBTEXT text
+ Subtext to display on the header of the page.
+
+
+
+ Welcome page settings
+
+
+ MUI_WELCOMEPAGE_TITLE title
+ Title to display on the top of the page.
+
+ MUI_WELCOMEPAGE_TITLE_3LINES
+ Extra space for the title area.
+
+ MUI_WELCOMEPAGE_TEXT text
+ Text to display on the page.
+
+
+
+ License page settings
+
+
+ MUI_LICENSEPAGE_TEXT_TOP text
+ Text to display on the top of the page.
+
+ MUI_LICENSEPAGE_TEXT_BOTTOM text
+ Text to display on the bottom of the page.
+
+ MUI_LICENSEPAGE_BUTTON button_text
+ Text to display on the 'I Agree' button.
+
+ MUI_LICENSEPAGE_CHECKBOX
+ Display a checkbox the user has to check to agree with the license terms.
+
+
+ MUI_LICENSEPAGE_CHECKBOX_TEXT text
+ Text to display next to the checkbox to agree with the license terms.
+
+
+ MUI_LICENSEPAGE_RADIOBUTTONS
+ Display two radio buttons to allow the user to choose between accepting the license
+ terms or not.
+
+
+ MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT text
+ Text to display next to the checkbox to accept the license terms.
+
+ MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE text
+ Text to display next to the checkbox to decline the license terms.
+
+
+
+
+ Components page settings
+
+
+ MUI_COMPONENTSPAGE_TEXT_TOP text
+ Text to display on the top of the page.
+
+ MUI_COMPONENTSPAGE_TEXT_COMPLIST text
+ Text to display on next to the components list.
+
+ MUI_COMPONENTSPAGE_TEXT_INSTTYPE text
+ Text to display on next to the installation type combo box.
+
+ MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE text
+ Text to display on the of the top of the description box.
+
+ MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO text
+ Text to display inside the description box when no section is selected.
+
+
+
+ Directory page settings
+
+
+ MUI_DIRECTORYPAGE_TEXT_TOP text
+ Text to display on top of the page.
+
+ MUI_DIRECTORYPAGE_TEXT_DESTINATION text
+ Text to display on the destination folder frame.
+
+ MUI_DIRECTORYPAGE_VARIABLE variable
+ Variable in which to store the selected folder.
+ Default: $INSTDIR
+
+ MUI_DIRECTORYPAGE_VERIFYONLEAVE
+ Does not disable the Next button when a folder is invalid but allows you to use
+ GetInstDirError in the leave function to handle an invalid folder.
+
+
+
+ Start Menu folder page settings
+
+
+ MUI_STARTMENUPAGE_TEXT_TOP text
+ Text to display on the top of the page.
+
+ MUI_STARTMENUPAGE_TEXT_CHECKBOX text
+ Text to display next to the checkbox to disable the Start Menu folder creation.
+
+ MUI_STARTMENUPAGE_DEFAULTFOLDER folder
+ The default Start Menu Folder.
+
+ MUI_STARTMENUPAGE_NODISABLE
+ Do not display the checkbox to disable the creation of Start Menu shortcuts.
+
+ MUI_STARTMENUPAGE_REGISTRY_ROOT root
+ MUI_STARTMENUPAGE_REGISTRY_KEY key
+ MUI_STARTMENUPAGE_REGISTRY_VALUENAME value_name
+ The registry key to store the Start Menu folder. The page will use it to remember
+ the users preference. You should also use for the uninstaller to remove the Start
+ Menu folders. Don't forget to remove this key during uninstallation.
+
+ For the uninstaller, use the MUI_STARTMENU_GETFOLDER macro to get the Start Menu
+ folder:
+
+!insertmacro MUI_STARTMENU_GETFOLDER page_id $R0
+ Delete "$SMPROGRAMS\$R0\Your Shortcut.lnk"
+
+
+
+
+ Installation page settings
+
+
+ MUI_INSTFILESPAGE_FINISHHEADER_TEXT text
+ Text to display on the header of the installation page when the installation has
+ been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).
+
+ MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT text
+ Subtext to display on the header of the installation page when the installation
+ has been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).
+
+ MUI_INSTFILESPAGE_ABORTHEADER_TEXT text
+ Text to display on the header of the installation page when the installation has
+ been aborted.
+
+ MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT text
+ Subext to display on the header of the installation page when the installation has
+ been aborted.
+
+
+
+ Finish page settings
+
+
+ MUI_FINISHPAGE_TITLE title
+ Title to display on the top of the page.
+
+ MUI_FINISHPAGE_TITLE_3LINES
+ Extra space for the title area.
+
+ MUI_FINISHPAGE_TEXT text
+ Text to display on the page.
+
+ MUI_FINISHPAGE_TEXT_LARGE
+ Extra space for the text area (if using checkboxes).
+
+ MUI_FINISHPAGE_BUTTON text
+ Text to display on the Finish button.
+
+ MUI_FINISHPAGE_CANCEL_ENABLED
+ Enable the Cancel button so the user can skip any options displayed on the finish
+ page.
+
+ MUI_FINISHPAGE_TEXT_REBOOT text
+ Text to display on the finish page when asking for a system reboot.
+
+ MUI_FINISHPAGE_TEXT_REBOOTNOW text
+ Text to display next to the 'Reboot now' option button.
+
+ MUI_FINISHPAGE_TEXT_REBOOTLATER text
+ Text to display next to the 'Reboot later' option button.
+
+ MUI_FINISHPAGE_REBOOTLATER_DEFAULT
+ Sets the 'Reboot later' option as the default option.
+
+ MUI_FINISHPAGE_RUN exe_file
+ Application which the user can select to run using a checkbox. You don't need to
+ put quotes around the filename when it contains spaces.
+
+
+ MUI_FINISHPAGE_RUN_TEXT text
+ Texts to display next to the 'Run program' checkbox.
+
+ MUI_FINISHPAGE_RUN_PARAMETERS parameters
+ Parameters for the application to run. Don't forget to escape double quotes in the
+ value (use $\").
+
+ MUI_FINISHPAGE_RUN_NOTCHECKED
+ Do not check the 'Run program' checkbox by default
+
+ MUI_FINISHPAGE_RUN_FUNCTION function
+ Call a function instead of executing an application (define MUI_FINISHPAGE_RUN without
+ parameters). You can use the function to execute multiple applications or you can
+ change the checkbox name and use it for other things.
+
+
+ MUI_FINISHPAGE_SHOWREADME file/url
+ File or website which the user can select to view using a checkbox. You don't need
+ to put quotes around the filename when it contains spaces.
+
+
+ MUI_FINISHPAGE_SHOWREADME_TEXT text
+ Texts to display next to the 'Show Readme' checkbox.
+
+ MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
+ Do not check the 'Show Readme' checkbox by default
+
+ MUI_FINISHPAGE_SHOWREADME_FUNCTION function
+ Call a function instead of showing a file (define MUI_FINISHPAGE_SHOWREADME without
+ parameters). You can use the function to show multiple files or you can change the
+ checkbox name and use it for other things.
+
+
+ MUI_FINISHPAGE_LINK link_text
+ Text for a link on the which the user can click to view a website or file.
+
+
+ MUI_FINISHPAGE_LINK_LOCATION file/url
+ Website or file which the user can select to view using the link. You don't need
+ to put quotes around the filename when it contains spaces.
+
+ MUI_FINISHPAGE_LINK_COLOR (color: RRGGBB hexadecimal)
+ Text color for the link on the Finish page.
+ Default: 000080
+
+
+ MUI_FINISHPAGE_NOREBOOTSUPPORT
+ Disables support for the page that allows the user to reboot the system. Define
+ this option to save some space if you are not using the /REBOOTOK flag or SetRebootFlag.
+
+
+
+ Uninstall confirm page settings
+
+
+ MUI_UNCONFIRMPAGE_TEXT_TOP text
+ Text to display on the top of the page.
+
+ MUI_UNCONFIRMPAGE_TEXT_LOCATION text
+ Text to display next to the uninstall location text box.
+
+
+
+
+ 4. Language files
+
+
+ Insert the Modern UI language files for the languages to want to include.
+
+!insertmacro MUI_LANGUAGE "English"
+
+
+ The standard NSIS language files are loaded automatically, there is no need to use
+ LoadLanguageFile.
+
+
+ 5. Reserve files
+
+
+ If you are using solid compression, files that are required before the actual installation
+ should be stored first in the data block, because this will make your installer
+ start faster. Include reserve file commands for such files before your sections
+ and functions:
+
+ReserveFile MyPlugin.dll
+!insertmacro MUI_RESERVEFILE_LANGDLL ;Language selection dialog
+...
+
+
+
+ Script code for pages
+
+
+ Some pages allow you to show additional information or can be used to get user input.
+ Here you can find the script code to use these features.
+
+ Components page descriptions
+
+
+ The Modern UI components page has a text box in which a description can be shown
+ when the user hovers the mouse over a component. If you don't want to use these
+ descriptions, insert the MUI_COMPONENTSPAGE_NODESC interface setting.
+
+ To set a description for a section, an additional parameter needs to be added to
+ Section commmand with a unique identifier for the section. This name can later be
+ used to set the description for this section.
+
+Section "Section Name 1" Section1
+ ...
+SectionEnd
+
+
+ After the sections, use these macros to set the descriptions:
+
+LangString DESC_Section1 ${LANG_ENGLISH} "Description of section 1."
+LangString DESC_Section2 ${LANG_ENGLISH} "Description of section 2."
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1)
+ !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+
+ For the uninstaller, use the MUI_UNFUNCTION_DESCRIPTION_BEGIN and MUI_UNFUNCTION_DESCRIPTION_END
+ macros.
+
+
+ Start Menu folder
+
+
+ Put the code to write the shortcuts (using CreateShortcut) between the MUI_STARTMENU_WRITE_BEGIN
+ and MUI_STARTMENU_WRITE_END macros:
+
+!insertmacro MUI_STARTMENU_WRITE_BEGIN pageid
+ ...create shortcuts...
+!insertmacro MUI_STARTMENU_WRITE_END
+
+
+ The page ID should be the ID of the page on which the user has selected the folder
+ for the shortcuts you want to write.
+
+ The variable which contains the folder and the page ID are set as parameters of
+ the page macro.
+
+
+
+ Language selection dialog
+
+
+ If you want the installer to display a language selection dialog (see the the MultiLanguage.nsi example),
+ insert the MUI_LANGDLL_DISPLAY macro in the .onInit function:
+
+Function .onInit
+
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+FunctionEnd
+
+
+ This macro can also be used in the un.onInit function.
+
+
+ Settings for registry storage of selected language
+
+
+ To remember the user's preference, you can define a registry key. These defines
+ should be set before inserting the installation page macro.
+
+ MUI_LANGDLL_REGISTRY_ROOT root
+ MUI_LANGDLL_REGISTRY_KEY key
+ MUI_LANGDLL_REGISTRY_VALUENAME value_name
+ The registry key to store the language. The users preference will be remembered.
+ You can also use it for the uninstaller to display the right language. Don't forget
+ to remove this key in the uninstaller.
+
+ For the uninstaller, insert the MUI_UNGETLANGUAGE macro in un.onInit to get the
+ stored language preference:
+
+Function un.onInit
+
+ !insertmacro MUI_UNGETLANGUAGE
+
+FunctionEnd
+
+
+
+
+ Interface settings for selection dialog
+
+
+ To customize the language selection dialog interface, use these defines before inserting
+ the MUI_LANGDLL_DISPLAY macro.
+
+ MUI_LANGDLL_WINDOWTITLE text
+ The window title of the language selection dialog.
+
+ MUI_LANGDLL_INFO text
+ The text to display on the language selection dialog.
+
+ MUI_LANGDLL_ALWAYSSHOW
+ Always show the language selection dialog, even if a language has been stored in
+ the registry. The language stored in the registry will be selected by default.
+
+ MUI_LANGDLL_ALLLANGUAGES
+ Always show all available languages and don't filter according to their codepage.
+
+
+
+ Custom pages
+
+
+ If you want add your custom pages to your installer, you can insert your own page
+ commands between the page macros.
+
+!insertmacro MUI_PAGE_WELCOME
+Page custom FunctionName ;Custom page
+!insertmacro MUI_PAGE_COMPONENTS
+
+;Uninstaller
+!insertmacro MUI_UNPAGE_CONFIRM
+UninstPage custom un.FunctionName ;Custom page
+!insertmacro MUI_UNPAGE_INSTFILES
+
+
+ Use the MUI_HEADER_TEXT macro to set the text on the page header in a page function:
+
+LangString PAGE_TITLE ${LANG_ENGLISH} "Title"
+LangString PAGE_SUBTITLE ${LANG_ENGLISH} "Subtitle"
+
+Function CustomPageFunction
+ !insermacro MUI_HEADER_TEXT $(PAGE_TITLE) $(PAGE_SUBTITLE)
+ ...
+FuctionEnd
+
+
+
+ Custom functions
+
+
+ Interface functions provided by NSIS, like the .onGUIInit function and the page
+ functions are automatically included by the Modern UI and filled with code to support
+ new interface features. If you want to add additional code to these function, create
+ a function with the custom script code in the script use the Modern UI functions
+ call them.
+
+ Example:
+
+!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
+
+Function myGUIInit
+ ...
+FunctionEnd
+
+ Modern UI pages can also customized using custom functions.
+
+
+ General Custom Functions
+
+
+ These defines should be set before inserting the language macros.
+
+ MUI_CUSTOMFUNCTION_GUIINIT function
+ MUI_CUSTOMFUNCTION_UNGUIINIT function
+ MUI_CUSTOMFUNCTION_ABORT function
+ MUI_CUSTOMFUNCTION_UNABORT function
+ MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION function
+ MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION function
+
+ Mouse over functions are only available when the description macros
+ (MUI_FUNCTION_DESCRIPTION_BEGIN) are used. When component page descriptions are not
+ used, regular .onMouseOverSection and un.onMouseOverSection must be used.
+
+
+
+ Page Custom Functions
+
+
+ These defines should be set before inserting a page macro.
+
+ MUI_PAGE_CUSTOMFUNCTION_PRE function
+ MUI_PAGE_CUSTOMFUNCTION_SHOW function
+ MUI_PAGE_CUSTOMFUNCTION_LEAVE function
+
+
+ The pre function is called first and allows you to initalize variables or decide
+ whether the page should be skipped. Then, the show function is called, which can
+ be used to customize the interface. Finally, the user input can be validated in the
+ leave function. The NSIS Users Manual provides more information about these functions.
+
+ In the show function, the window handles of all controls on the page can be retrieved
+ from a Modern UI variable. A list of the variables names is not yet available. For
+ now, refer to the source files of the Modern UI 2.0. The variable declarations can
+ be found in the first lines of the header file for a certain page.
+
+
+
+
+
+ Credits
+
+
+ Written by Joost Verburg.
+ Icons designed by Nikos Adamamas, aka adni18.
+ Thanks to Amir Szekely, aka KiCHiK, for his work on NSIS to make this possible.
+
+
+ License
+
+
+ The zlib/libpng license applies to the Modern UI.
+
+
+ License Terms
+
+
+Copyright © 2002-2009 Joost Verburg
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute
+it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+ you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment in the
+ product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such,
+ and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any distribution.
+
+
+
+
+ |
+
+
+
+
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/closed.gif b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/closed.gif
new file mode 100644
index 000000000..b45054ee8
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/closed.gif differ
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/header.gif b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/header.gif
new file mode 100644
index 000000000..f8810d30c
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/header.gif differ
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/open.gif b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/open.gif
new file mode 100644
index 000000000..9fff60ed5
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/open.gif differ
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/screen1.png b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/screen1.png
new file mode 100644
index 000000000..0e25c0d38
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/screen1.png differ
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/screen2.png b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/screen2.png
new file mode 100644
index 000000000..4fccd41c8
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Docs/Modern UI 2/images/screen2.png differ
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI/Changelog.txt b/Engine/bin/tools/nsis/app/Docs/Modern UI/Changelog.txt
new file mode 100644
index 000000000..673615cce
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/Modern UI/Changelog.txt
@@ -0,0 +1,263 @@
+NSIS Modern User Interface
+Version History
+
+1.8 - August 9, 2007
+* Uses the new language files
+* Updated documentation
+* Although MUI_DIRECTORYPAGE_BGCOLOR and MUI_STARTMENUPAGE_BGCOLOR are documented as interface
+ setttings that apply to every directory page or Start Menu folder page, they were actually
+ implemented as page specific settings. They have been changed to interface settings.
+* MUI_LANGDLL_DISPLAY now also reads a previously saved language from the registry if the
+ installation is silent.
+* InstallOptions macros have been moved to a separate header file (InstallOptions.nsh).
+ The MUI_INSTALLOPTIONS_* macros are still provided for backwards compatibility and insert the
+ equalivent INSTALLOPTIONS_* macros.
+* Added MUI_CUSTOMFUNCTION_MOUSEOVERSECTION
+
+1.78 - June 8, 2007
+* Added MUI_STARTMENUPAGE_BGCOLOR
+* Added MUI_DIRECTORYPAGE_BGCOLOR
+* Added MUI_LANGDLL_ALLLANGUAGES
+
+1.77 - April 27, 2007
+* Added MUI_FINISHPAGE_CANCEL_ENABLED
+* Added MUI_FINISHPAGE_REBOOTLATER_DEFAULT
+* Block unsupported languages in the language selection dialog
+* Cancel button no longer enabled by default on the finish page
+* Reduced flicker caused by MUI_HEADER_TRANSPARENT_TEXT
+
+1.76 - September 23, 2006
+* Added MUI_ABORTWARNING_CANCEL_DEFAULT
+
+1.75 - April 1, 2006
+* Added show function for the start menu page
+* Added MUI_HEADER_TRANSPARENT_TEXT for transparent header texts
+
+1.74 - September 4, 2005
+* Fixed compile error when checkboxes are used on multiple finish page pages
+
+1.73 - August 6, 2005
+* The checkboxes to run an application or show a Readme file can now also be used on an uninstaller
+ finish pages or multiple finish pages
+
+1.72 - November 27, 2004
+* Fixed state of Finish page Cancel button when both an installer and uninstaller page is included
+
+1.71 - October 14, 2004
+* The selected language is only stored in the registry when installation was successful
+
+1.70 - February 6, 2004
+* Improved documentation
+* New Init custom function for Welcome and Finish page
+
+1.69 - January 7, 2004
+* All uninstaller pages work without installer pages
+* Fixed top text on uninstaller license page
+
+1.68 - November 24, 2003
+* New settings for extra space for title and text on Welcome and Finish page.
+* Improved handling of verbose settings. Define MUI_VERBOSE the set the Modern UI verbose level (1-4).
+* Language file string for uninstaller reboot information
+* Setting for folder validation in leave function
+* Fixed finish page text settings for multiple pages
+
+1.67 - November 18, 2003
+* Support for uninstaller Welcome pages and Finish pages
+* Improved and changed text settings
+* ID for Start Menu Folder pages, easier to use multiple pages
+* Renamed a few settings
+* Default header image
+* Support for uninstaller abort warning
+* Setting for 3 line text on Welcome and Finish page
+ (NOTE: New settings have been introduced in version 1.68)
+* Langauge file backwards compatibility: English for missing strings
+* Support for different uninstaller header image
+* Language selection dialog not displayed if installer is silent
+* Cancel button on Finish page when there are options
+* Full RTL support
+
+1.66 - October 7, 2003
+* New system for page settings and custom pages
+* Support for uninstaller components page
+* Support for multiple pages of the same type
+* New position for interface settings
+* Changed macro and setting names
+* Updated langauge system, new language files and settings
+* Removed MUI_BRANDINGTEXT. You can use the standard BrandingText instruction.
+* Removed MUI_PRODUCT and MUI VERSION. You can use the standard Name instruction.
+
+1.65 - July 16, 2003
+* New page configuration system, no different system for installers with custom pages
+* Default windows color for the license text background
+* Example script updates (new format, user variables)
+* Improved registry storage for Start Menu folder
+* ReserveFile macro for StartMenu plug-in
+* Option to always show the language selection dialog (even if a language has been stored in the registry)
+* Checkboxes on Finish page can be used to call a function
+* Support for custom leave functions for Start Menu Folder, Welcome and Finish pages
+* Support for a link on the Finish page
+* New macro to get Start Menu folder in uninstaller
+* Options to disable bitmap stretching
+* Components page description box info text: always displayed
+ when mouse is outside box, disabled style
+
+1.64 - April 27, 2003
+* Support for license page with checkbox or radiobuttons to let the user accept the agreement or not
+* Macros for finish headers don't have to be inserted anymore
+* Language preference stored when installation has completed, no problems anymore when the users selects the wrong language
+* Header text for aborted installation
+* New macros: get language for uninstaller, delete shortcuts
+* Language specific fonts
+* Welcome/Finish page INI files can be modified in pre functions
+* More texts can be customized
+
+1.63 - March 9, 2003
+* Support for a bitmap in the wizard header
+* New defines to change the components page interface
+* MUI_SYSTEM inserted automatically
+* Single macro for language selection dialog
+* Removed page description in window title
+* Easier to customize resource files
+* New system for custom functions
+* Start Menu folder registry key automatically written
+* New InstallOptions macros that do not remove the return value from the stack
+* Support for custom pages before the finish page
+* Renamed Start Menu page defines
+* 'Do not create shortcuts' checkbox can be removed
+* 'MS Shell Dlg' font for header title
+* RTL support
+* Documentation updates
+* Minor fixes
+
+1.62 - February 2, 2003
+* New language strings for Finish page
+* Possibility to let a Modern UI Function call your own function
+* No problems anymore when using both 'Run program' and 'Show Readme' on the Finish page
+* Default state of checkboxes on the finish page can be changed
+* Welcome / Finish page compatible with custom DPI settings
+* Converted Install Options INI files to use dialog units
+* More ReserveFile macros
+ (NOTE: Some of these macros have been removed in later versions)
+* Background color can be changed with a define
+* Support for multilingual branding texts
+* Start Menu / Finish page window titles also work when using custom page commands
+* Language files should be inserted after inserting the MUI_SYSTEM macro
+ (NOTE: The MUI_SYSTEM macro has been removed in version 1.63)
+* Define MUI_MANUALVERBOSE if you don't want the Modern UI to change the verbose settings during compilation
+ (NOTE: This setting has been changed in version 1.68)
+
+1.61 - December 5, 2002
+* modern3.exe UI without description area
+ (NOTE: This setting has been changed in version 1.63)
+* Added define to show uninstall confirm page
+* Added language string for finish page title and continue to uninstall
+* Define for parameters for the application to run on the finish page
+* Minor fixes
+
+1.6 - November 18, 2002
+* Welcome / Finish page
+* Automatic ask for reboot on finish page
+* Create no shortcut option on the Start Menu Folder selection page
+* Customizing GUIInit functions easier
+* Minor font / UI changes
+
+1.5 - November 11, 2002
+* New language file format
+* Language strings can be changed in the script without editing languagefiles
+* Start Menu Folder selection page
+* 'Click Next to continue' and 'Click Install to start the installation' texts automatically change to the page order
+* Install Options macros updated. MUI_INSTALLOPTIONS_DISPLAY is the standard macro now.
+ Use MUI_INSTALLOPTIONS_INITDIALOG and MUI_INSTALLOPTIONS_SHOW if you want to customize dialog controls.
+* No more writing window titles & abort warnings to Install Options INI Files
+* Compatible with updated paging system
+* Renamed macros and defines
+* Minor fixes
+
+1.4 - November 4, 2002
+* Uses new NSIS Page command
+* Macro System updates (smaller)
+* Macro System a lot easier
+* Modern UI Language Files load NLF language files
+* Renamed macros and defines
+
+1.3 - October 27, 2002
+* Easier macro system for basic scripts
+* New MultiLanguage system using Modern UI Language Files
+* New directory structure (header/language files in Contrib\Modern UI)
+* Small bugfixes & typo corrections
+* SetPage function should be set using defines
+* Different NextPage/PrevPage/FinishHeader macros for install/uninstall
+ (NOTE: These macros have been removed in version 1.4)
+* Interface settings can be definend (for example, MUI_ICON), no parameters for MUI_INTERFACE anymore
+* New Install Options macros to read/write IO INI file value
+
+1.21 - September 30, 2002
+* Temp vars set in Modern UI header
+* Currentpage & Install Options vars should be set using
+ parameters of the MUI_INTERFACE and * MUI_INSTALLOPTIONS macros
+ (NOTE: The MUI_INTERFACE macro has been removed in version 1.3)
+* MultiLanguage.nsi uses the new language strings
+
+1.2 - September 22, 2002
+ (NOTE: All macros mentioned here have been removed in version 1.4)
+
+* Lots of macro system updates & fixes
+* InstallOptions support in macro system
+* Added Modern UI + InstallOptions example (InstallOptions.nsi)
+* MUI_NEXTPAGE_OUTER integrated in MUI_NEXTPAGE
+* No hard-coded function names anymore (you should give
+ MUI_PREVPAGE a parameter with the set page function name
+ (for example, MUI_PREVPAGE SetPage)
+* Examples use ReserveFile for faster startup
+
+1.19 - Semtember 19, 2002
+* Renamed some macros
+* Custom code can be used between page start/stop macros
+ (NOTE: These macros have been removed in version 1.4)
+
+1.18 - Semtember 13, 2002
+* Uses the new Sendmessage string option
+
+1.17 - Semtember 10, 2002
+* Win9x font weight bug fixed (font of title in white rect)
+
+1.16 - Semtember 6, 2002
+* Change text 'Scroll down' on license page to 'Press Page Down',
+ because the RichEdit control has focus by default now
+
+1.15 - Semtember 4, 2002
+* Multilanguage example: changed LangDialog to LangDLL::LangDialog (using the DLL name is now required)
+ (NOTE: A new macro for the language selection dialog has been introduced in version 1.63)
+
+1.14 - Semtember 3, 2002
+* Small grammar fix (thanks eccles)
+* UI files updated by Justin for better RichEdit usage
+
+1.13 - Semtember 2, 2002
+* Added 16 color icons
+
+1.12 - August 30, 2002
+* Verifying installer & Unpacking data dialog has no titlebar anymore
+
+1.11 - August 29, 2002
+* Finish header for uninstaller can also be set using MUI_FINISHHEADER
+ (NOTE: The MUI_FINISHHEADER macro has been removed in version 1.64)
+
+1.1 - August 29, 2002
+ (NOTE: All settings mentioned here do not exist anymore)
+
+* Header file with macros, it's now very easy to use the UI in your scripts
+* Added the modern2.exe UI, with an other location of the Description frame, for installers with a lot of subsections (thanks rainwater)
+* Updated example scripts
+* Added Multilanguage.nsi example (Multilanguage & LangDLL)
+* Fixed background color issue with some custom XP themes
+* Removed WS_VISIBLE from black rect for inner dialog (fixes display issues)
+* Changed size of description area
+* Example script: Added instructions for the user on the Description frame
+* Auto sizing branding text
+* Used modern.bmp for the checks (thanks rainwater)
+* Using the new NSIS version, descriptions work using the keyboard and you can give descriptions to subsections
+* Correct font size using High-DPI fonts
+
+1.0 - August 26, 2002
+* Initial release
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI/License.txt b/Engine/bin/tools/nsis/app/Docs/Modern UI/License.txt
new file mode 100644
index 000000000..9621cbbec
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/Modern UI/License.txt
@@ -0,0 +1,10 @@
+Copyright 2002-2009 Joost Verburg
+
+This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any distribution.
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI/Readme.html b/Engine/bin/tools/nsis/app/Docs/Modern UI/Readme.html
new file mode 100644
index 000000000..4e42e8aad
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/Modern UI/Readme.html
@@ -0,0 +1,1154 @@
+
+
+
+ NSIS Modern User Interface - Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+ [Expand all] [Collapse
+ all]
+
+
+ Introduction
+
+
+ The Modern UI provides a user interface for NSIS installers with a modern wizard
+ style, similar to the wizards of recent Windows versions. It is based on the basic
+ user interface that is provided by the NSIS compiler itself and extends it with
+ more interface features and pages.
+
+ All standard NSIS pages (such as the pages to select components and the installation
+ folder) are supported as well as a number of additional pages. The welcome page
+ allows you to provide an introduction to the installation process, while the finish
+ page provides a way to let the user decide what steps should be performed after
+ the setup wizard is closed (for example, whether the application should be started
+ immediately). A finish page can also be used to ask for a system restart is necessary.
+
+
+ Screenshots
+
+
+ 
+
+ 
+
+
+
+ Script header
+
+
+ The settings for the Modern UI should be inserted in the header of the script file.
+ It's important to follow the same order as the items below. For example,
+ interface settings should be defined before you insert pages, because the pages
+ depend on the interface configuration. It may be useful to look at the
+ example scripts too see how this is done in actual script files.
+
+ Parameters are given in this format: required (option1 | option2)
+ [optional]
+
+ 1. Header file
+
+
+ First of all, add this line to the top of script to include the Modern UI:
+
+!include "MUI.nsh"
+
+
+
+ 2. Interface configuration
+
+
+ Then, you may want to use interface settings to change the look and feel of the
+ installer. These settings apply to all pages.
+ The interface settings provided by the NSIS compiler itself (such as LicenseText,
+ Icon, CheckBitmap, InstallColors) should not be used in Modern UI scripts. The Modern
+ UI provides equalivent or extended versions of these settings.
+ Examples:
+
+!define MUI_COMPONENTSPAGE_SMALLDESC ;No value
+!define MUI_UI "myUI.exe" ;Value
+!define MUI_INSTFILESPAGE_COLORS "FFFFFF 000000" ;Two colors
+
+
+
+ Interface settings
+
+
+
+ Page header
+
+
+ MUI_ICON icon_file
+ The icon for the installer.
+ Default: ${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico
+
+ MUI_UNICON icon_file
+ The icon for the uninstaller.
+ Default: ${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico
+
+ MUI_HEADERIMAGE
+ Display an image on the header of the page.
+
+
+ MUI_HEADERIMAGE_BITMAP bmp_file
+ Bitmap image to display on the header of installers pages (recommended size: 150x57
+ pixels).
+ Default: ${NSISDIR}\Contrib\Graphics\Header\nsis.bmp
+
+
+ MUI_HEADERIMAGE_BITMAP_NOSTRETCH
+ Do not stretch the installer header bitmap to fit the size of the field. Use this
+ option only if you have an image that does not use the whole space. If you have
+ a full size bitmap that fits exactly, you should not use this option because the
+ size of the field will be different if the user has a custom DPI setting.
+
+ MUI_HEADERIMAGE_BITMAP_RTL bmp_file
+ Bitmap image to display on the header of installers pages when using a RTL language
+ (recommended size: 150x57 pixels).
+ Default: Non-RTL bitmap
+
+
+ MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH
+ Do not stretch the installer header bitmap when using a RTL language to fit the
+ size of the field. Use this option only if you have an image that does not use the
+ whole space. If you have a full size bitmap that fits exactly, you should not use
+ this option because the size of the field will be different if the user has a custom
+ DPI setting.
+
+
+
+ MUI_HEADERIMAGE_UNBITMAP bmp_file
+ Bitmap image to display on the header of uninstaller pages (recommended size: 150x57
+ pixels).
+ Default: Installer header bitmap
+
+
+ MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH
+ Do not stretch the uninstaller header bitmap to fit the size of the field. Use this
+ option only if you have an image that does not use the whole space. If you have
+ a full size bitmap that fits exactly, you should not use this option because the
+ size of the field will be different if the user has a custom DPI setting.
+
+ MUI_HEADERIMAGE_UNBITMAP_RTL bmp_file
+ Bitmap image to display on the header of uninstallers pages when using a RTL language
+ (recommended size: 150x57 pixels).
+ Default: Installer RTL header bitmap
+
+
+ MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH
+ Do not stretch the uninstaller header bitmap when using a RTL language to fit the
+ size of the field. Use this option only if you have an image that does not use the
+ whole space. If you have a full size bitmap that fits exactly, you should not use
+ this option because the size of the field will be different if the user has a custom
+ DPI setting.
+
+
+
+ MUI_HEADERIMAGE_RIGHT
+ Display the header image on the right side instead of the left side (when using
+ a RTL language it will be displayed on the left side instead of the right side).
+
+
+ MUI_BGCOLOR (color: RRGGBBR hexadecimal)
+ Background color for the header, the Welcome page and the Finish page.
+ Default: FFFFFF
+
+ MUI_HEADER_TRANSPARENT_TEXT
+ Set a transparent background for the header's label controls. Useful for custom
+ user interfaces that set a bigger header image.
+
+
+
+ Interface resources
+
+
+ MUI_UI ui_file
+ The interface file with the dialog resources. Change this if you have made your
+ own customized UI.
+ Default: ${NSISDIR}\Contrib\UIs\modern.exe
+
+ MUI_UI_HEADERIMAGE ui_file
+ The interface files with the dialog resource IDD_INST that contains a bitmap control
+ and space for the header bitmap.
+ Default: ${NSISDIR}\Contrib\UIs\modern_headerbmp.exe
+
+ MUI_UI_HEADERIMAGE_RIGHT ui_file
+ The interface files with the dialog resource IDD_INST that contains a bitmap control
+ and space for the header bitmap on the right side.
+ Default: ${NSISDIR}\Contrib\UIs\modern_headerbmpr.exe
+
+ MUI_UI_COMPONENTSPAGE_SMALLDESC ui_file
+ The interface files with a customized dialog resource IDD_SELCOM with a small description
+ area.
+ Default: ${NSISDIR}\Contrib\UIs\modern_smalldesc.exe
+
+ MUI_UI_COMPONENTSPAGE_NODESC ui_file
+ The interface files with a customized dialog resource IDD_SELCOM without a description
+ area.
+ Default: ${NSISDIR}\Contrib\UIs\modern_nodesc.exe
+
+
+
+ Installer welcome/finish page
+
+
+ MUI_WELCOMEFINISHPAGE_BITMAP bmp_file
+ Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).
+ Default: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp
+
+
+ MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
+ Do not stretch the bitmap for the Welcome and Finish page to fit the size of the
+ field. Use this option only if you have an image that does not use the whole space.
+ If you have a full size bitmap that fits exactly, you should not use this option
+ because the size of the field will be different if the user has a custom DPI setting.
+
+
+ MUI_WELCOMEFINISHPAGE_INI ini_file
+ InstallOptions INI file for the Welcome page and the Finish page.
+ Default: ${NSISDIR}\Contrib\Modern UI\ioSpecial.ini
+
+
+
+ Uninstaller welcome/finish page
+
+
+ MUI_UNWELCOMEFINISHPAGE_BITMAP bmp_file
+ Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).
+ Default: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp
+
+
+ MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH
+ Do not stretch the bitmap for the Welcome and Finish page to fit the size of the
+ field. Use this option only if you have an image that does not use the whole space.
+ If you have a full size bitmap that fits exactly, you should not use this option
+ because the size of the field will be different if the user has a custom DPI setting.
+
+
+ MUI_UNWELCOMEFINISHPAGE_INI ini_file
+ InstallOptions INI file for the uninstaller Welcome page and the Finish page.
+ Default: ${NSISDIR}\Contrib\Modern UI\ioSpecial.ini
+
+
+
+ License page
+
+
+ MUI_LICENSEPAGE_BGCOLOR (/windows | /grey |
+ (color: RRGGBB hexadecimal))
+ The background color for the license textbox. Use /windows for the Windows text
+ background color (usually white). Use the /grey for the window background color
+ (usually grey).
+ Default: /windows
+
+
+
+ Components page
+
+
+ MUI_COMPONENTSPAGE_CHECKBITMAP bitmap_file
+ The bitmap with images for the checks of the component select treeview.
+ Default: ${NSISDIR}\Contrib\Graphics\Checks\modern.bmp
+
+ MUI_COMPONENTSPAGE_SMALLDESC
+ A small description area on the bottom of the page. Use this layout if you have
+ a lot of sections and don't need large descriptions.
+
+ MUI_COMPONENTSPAGE_NODESC
+ No description area.
+
+
+
+ Directory page
+
+
+ MUI_DIRECTORYPAGE_BGCOLOR (color: RRGGBB hexadecimal)
+ The background color for the directory textbox.
+
+
+
+ Start Menu folder page
+
+
+ MUI_STARTMENUPAGE_BGCOLOR (color: RRGGBB hexadecimal)
+ The background color for the startmenu directory list and textbox.
+
+
+
+ Installation page
+
+
+ MUI_INSTFILESPAGE_COLORS (/windows | "(foreground
+ color: RRGGBB hexadecimal) (background color: RRGGBB hexadecimal)")
+ The colors of the details screen. Use /windows for the default Windows colors.
+ Default: /windows
+
+ MUI_INSTFILESPAGE_PROGRESSBAR (""
+ | colored | smooth)
+ The style of the progress bar. Colored makes it use the MUI_INSTALLCOLORS.
+ Default: smooth
+
+
+
+ Installer finish page
+
+
+ MUI_FINISHPAGE_NOAUTOCLOSE
+ Do not automatically jump to the finish page, to allow the user to check the install
+ log.
+
+
+
+ Uninstaller finish page
+
+
+ MUI_UNFINISHPAGE_NOAUTOCLOSE
+ Do not automatically jump to the finish page, to allow the user to check the uninstall
+ log.
+
+
+
+ Abort warning
+
+
+ MUI_ABORTWARNING
+ Show a message box with a warning when the user wants to close the installer.
+
+
+ MUI_ABORTWARNING_TEXT text
+ Text to display on the abort warning message box.
+
+ MUI_ABORTWARNING_CANCEL_DEFAULT
+ Set the Cancel button as the default button on the message box.
+
+
+
+
+ Uninstaller abort warning
+
+
+ MUI_UNABORTWARNING
+ Show a message box with a warning when the user wants to close the uninstaller.
+
+
+ MUI_UNABORTWARNING_TEXT text
+ Text to display on the abort warning message box.
+
+ MUI_UNABORTWARNING_CANCEL_DEFAULT
+ Set the Cancel button as the default button on the message box.
+
+
+
+
+
+ 3. Pages
+
+
+ Insert the following macros to set the pages you want to use. The pages will appear
+ in the order in which you insert them in the script. You can also insert custom
+ Page commands between the macros to add custom pages.
+
+ You can add multiple pages of certain types (for example, if you want the user to
+ specify multiple folders).
+
+ Examples:
+
+!insertmacro MUI_PAGE_LICENSE "License.rtf"
+!insertmacro MUI_PAGE_COMPONENTS
+
+Var StartMenuFolder
+!insertmacro MUI_PAGE_STARTMENU "Application" $StartMenuFolder
+
+
+ You will need the page ID for the Start Menu folder page when using the Start Menu
+ folder macros. The folder will be stored in the specified variable.
+
+ Installer pages
+ MUI_PAGE_WELCOME
+ MUI_PAGE_LICENSE textfile
+ MUI_PAGE_COMPONENTS
+ MUI_PAGE_DIRECTORY
+ MUI_PAGE_STARTMENU pageid variable
+ MUI_PAGE_INSTFILES
+ MUI_PAGE_FINISH
+
+ Uninstaller pages
+ MUI_UNPAGE_WELCOME
+ MUI_UNPAGE_CONFIRM
+ MUI_UNPAGE_LICENSE textfile
+ MUI_UNPAGE_COMPONENTS
+ MUI_UNPAGE_DIRECTORY
+ MUI_UNPAGE_INSTFILES
+ MUI_UNPAGE_FINISH
+
+
+ Page settings
+
+
+ Page settings apply to a single page and should be set before inserting a page macro.
+ The same settings can be used for installer and uninstaller pages. You have to repeat
+ the setting if you want it to apply to multiple pages. Example:
+
+;Add a directory page to let the user specify a plug-ins folder
+;Store the folder in $PluginsFolder
+
+Var PLUGINS_FOLDER
+!define MUI_DIRECTORYPAGE_VARIABLE $PluginsFolder
+!insertmacro MUI_PAGE_DIRECTORY
+
+
+
+ All standard texts in the user interface are loaded from language files, which are
+ available for all languages supported by NSIS. So you only need to define these
+ texts if you want to change the default.
+
+ If the parameter is a text that should be different for each language, define a
+ language string using LangString and use $(LangStringName) as value. For a license
+ text in multiple languages, LicenseLangString can be used. Refer the NSIS Users
+ Manual for more information about installers with multiple languages.
+
+ In all text settings, the doublequote character (") should be escaped in the
+ following form: $\"
+
+
+ General page settings
+
+
+ MUI_PAGE_HEADER_TEXT text
+ Text to display on the header of the page.
+
+ MUI_PAGE_HEADER_SUBTEXT text
+ Subtext to display on the header of the page.
+
+
+
+ Welcome page settings
+
+
+ To add a newline to any of these texts, use \r\n instead of $\r$\n.
+
+ MUI_WELCOMEPAGE_TITLE title
+ Title to display on the top of the page.
+
+ MUI_WELCOMEPAGE_TITLE_3LINES
+ Extra space for the title area.
+
+ MUI_WELCOMEPAGE_TEXT text
+ Text to display on the page.
+
+
+
+ License page settings
+
+
+ MUI_LICENSEPAGE_TEXT_TOP text
+ Text to display on the top of the page.
+
+ MUI_LICENSEPAGE_TEXT_BOTTOM text
+ Text to display on the bottom of the page.
+
+ MUI_LICENSEPAGE_BUTTON button_text
+ Text to display on the 'I Agree' button.
+
+ MUI_LICENSEPAGE_CHECKBOX
+ Display a checkbox the user has to check to agree with the license terms.
+
+
+ MUI_LICENSEPAGE_CHECKBOX_TEXT text
+ Text to display next to the checkbox to agree with the license terms.
+
+
+ MUI_LICENSEPAGE_RADIOBUTTONS
+ Display two radio buttons to allow the user to choose between accepting the license
+ terms or not.
+
+
+ MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT text
+ Text to display next to the checkbox to accept the license terms.
+
+ MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE text
+ Text to display next to the checkbox to decline the license terms.
+
+
+
+
+ Components page settings
+
+
+ MUI_COMPONENTSPAGE_TEXT_TOP text
+ Text to display on the top of the page.
+
+ MUI_COMPONENTSPAGE_TEXT_COMPLIST text
+ Text to display on next to the components list.
+
+ MUI_COMPONENTSPAGE_TEXT_INSTTYPE text
+ Text to display on next to the installation type combo box.
+
+ MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE text
+ Text to display on the of the top of the description box.
+
+ MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO text
+ Text to display inside the description box when no section is selected.
+
+
+
+ Directory page settings
+
+
+ MUI_DIRECTORYPAGE_TEXT_TOP text
+ Text to display on top of the page.
+
+ MUI_DIRECTORYPAGE_TEXT_DESTINATION text
+ Text to display on the destination folder frame.
+
+ MUI_DIRECTORYPAGE_VARIABLE variable
+ Variable in which to store the selected folder.
+ Default: $INSTDIR
+
+ MUI_DIRECTORYPAGE_VERIFYONLEAVE
+ Does not disable the Next button when a folder is invalid but allows you to use
+ GetInstDirError in the leave function to handle an invalid folder.
+
+
+
+ Start Menu folder page settings
+
+
+ MUI_STARTMENUPAGE_TEXT_TOP text
+ Text to display on the top of the page.
+
+ MUI_STARTMENUPAGE_TEXT_CHECKBOX text
+ Text to display next to the checkbox to disable the Start Menu folder creation.
+
+ MUI_STARTMENUPAGE_DEFAULTFOLDER folder
+ The default Start Menu Folder.
+
+ MUI_STARTMENUPAGE_NODISABLE
+ Do not display the checkbox to disable the creation of Start Menu shortcuts.
+
+ MUI_STARTMENUPAGE_REGISTRY_ROOT root
+ MUI_STARTMENUPAGE_REGISTRY_KEY key
+ MUI_STARTMENUPAGE_REGISTRY_VALUENAME value_name
+ The registry key to store the Start Menu folder. The page will use it to remember
+ the users preference. You should also use for the uninstaller to remove the Start
+ Menu folders. Don't forget to remove this key during uninstallation.
+
+ For the uninstaller, use the MUI_STARTMENU_GETFOLDER macro to get the Start Menu
+ folder:
+
+!insertmacro MUI_STARTMENU_GETFOLDER page_id $R0
+ Delete "$SMPROGRAMS\$R0\Your Shortcut.lnk"
+
+
+
+
+ Installation page settings
+
+
+ MUI_INSTFILESPAGE_FINISHHEADER_TEXT text
+ Text to display on the header of the installation page when the installation has
+ been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).
+
+ MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT text
+ Subtext to display on the header of the installation page when the installation
+ has been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).
+
+ MUI_INSTFILESPAGE_ABORTHEADER_TEXT text
+ Text to display on the header of the installation page when the installation has
+ been aborted.
+
+ MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT text
+ Subext to display on the header of the installation page when the installation has
+ been aborted.
+
+
+
+ Finish page settings
+
+
+ To add a newline to any of these texts, use \r\n instead of $\r$\n.
+
+ MUI_FINISHPAGE_TITLE title
+ Title to display on the top of the page.
+
+ MUI_FINISHPAGE_TITLE_3LINES
+ Extra space for the title area.
+
+ MUI_FINISHPAGE_TEXT text
+ Text to display on the page.
+
+ MUI_FINISHPAGE_TEXT_LARGE
+ Extra space for the text area (if using checkboxes).
+
+ MUI_FINISHPAGE_BUTTON text
+ Text to display on the Finish button.
+
+ MUI_FINISHPAGE_CANCEL_ENABLED
+ Enable the Cancel button so the user can skip any options displayed on the finish
+ page.
+
+ MUI_FINISHPAGE_TEXT_REBOOT text
+ Text to display on the finish page when asking for a system reboot.
+
+ MUI_FINISHPAGE_TEXT_REBOOTNOW text
+ Text to display next to the 'Reboot now' option button.
+
+ MUI_FINISHPAGE_TEXT_REBOOTLATER text
+ Text to display next to the 'Reboot later' option button.
+
+ MUI_FINISHPAGE_REBOOTLATER_DEFAULT
+ Sets the 'Reboot later' option as the default option.
+
+ MUI_FINISHPAGE_RUN exe_file
+ Application which the user can select to run using a checkbox. You don't need to
+ put quotes around the filename when it contains spaces.
+
+
+ MUI_FINISHPAGE_RUN_TEXT text
+ Texts to display next to the 'Run program' checkbox.
+
+ MUI_FINISHPAGE_RUN_PARAMETERS parameters
+ Parameters for the application to run. Don't forget to escape double quotes in the
+ value (use $\").
+
+ MUI_FINISHPAGE_RUN_NOTCHECKED
+ Do not check the 'Run program' checkbox by default
+
+ MUI_FINISHPAGE_RUN_FUNCTION function
+ Call a function instead of executing an application (define MUI_FINISHPAGE_RUN without
+ parameters). You can use the function to execute multiple applications or you can
+ change the checkbox name and use it for other things.
+
+
+ MUI_FINISHPAGE_SHOWREADME file/url
+ File or website which the user can select to view using a checkbox. You don't need
+ to put quotes around the filename when it contains spaces.
+
+
+ MUI_FINISHPAGE_SHOWREADME_TEXT text
+ Texts to display next to the 'Show Readme' checkbox.
+
+ MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
+ Do not check the 'Show Readme' checkbox by default
+
+ MUI_FINISHPAGE_SHOWREADME_FUNCTION function
+ Call a function instead of showing a file (define MUI_FINISHPAGE_SHOWREADME without
+ parameters). You can use the function to show multiple files or you can change the
+ checkbox name and use it for other things.
+
+
+ MUI_FINISHPAGE_LINK link_text
+ Text for a link on the which the user can click to view a website or file.
+
+
+ MUI_FINISHPAGE_LINK_LOCATION file/url
+ Website or file which the user can select to view using the link. You don't need
+ to put quotes around the filename when it contains spaces.
+
+ MUI_FINISHPAGE_LINK_COLOR (color: RRGGBB hexadecimal)
+ Text color for the link on the Finish page.
+ Default: 000080
+
+
+ MUI_FINISHPAGE_NOREBOOTSUPPORT
+ Disables support for the page that allows the user to reboot the system. Define
+ this option to save some space if you are not using the /REBOOTOK flag or SetRebootFlag.
+
+
+
+ Uninstall confirm page settings
+
+
+ MUI_UNCONFIRMPAGE_TEXT_TOP text
+ Text to display on the top of the page.
+
+ MUI_UNCONFIRMPAGE_TEXT_LOCATION text
+ Text to display next to the uninstall location text box.
+
+
+
+
+ 4. Language files
+
+
+ Insert the Modern UI language files for the languages to want to include.
+
+!insertmacro MUI_LANGUAGE "English"
+
+
+ The standard NSIS language files are loaded automatically, there is no need to use
+ LoadLanguageFile.
+
+
+ 5. Reserve files
+
+
+ If you are using solid compression, files that are required before the actual installation
+ should be stored first in the data block, because this will make your installer
+ start faster. Include reserve file commands for such files before your sections
+ and functions:
+
+ReserveFile "ioFile.ini" ;Your own InstallOptions INI files
+!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ;InstallOptions plug-in
+!insertmacro MUI_RESERVEFILE_LANGDLL ;Language selection dialog
+
+
+
+
+ Script code for pages
+
+
+ Some pages allow you to show additional information or can be used to get user input.
+ Here you can find the script code to use these features.
+
+ Components page descriptions
+
+
+ The Modern UI components page has a text box in which a description can be shown
+ when the user hovers the mouse over a component. If you don't want to use these
+ descriptions, insert the MUI_COMPONENTSPAGE_NODESC interface setting.
+
+ To set a description for a section, an additional parameter needs to be added to
+ Section commmand with a unique identifier for the section. This name can later be
+ used to set the description for this section.
+
+Section "Section Name 1" Section1
+ ...
+SectionEnd
+
+
+ After the sections, use these macros to set the descriptions:
+
+LangString DESC_Section1 ${LANG_ENGLISH} "Description of section 1."
+LangString DESC_Section2 ${LANG_ENGLISH} "Description of section 2."
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1)
+ !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+
+ For the uninstaller, use the MUI_UNFUNCTION_DESCRIPTION_BEGIN and MUI_UNFUNCTION_DESCRIPTION_END
+ macros.
+
+
+ Start Menu folder
+
+
+ Put the code to write the shortcuts (using CreateShortcut) between the MUI_STARTMENU_WRITE_BEGIN
+ and MUI_STARTMENU_WRITE_END macros:
+
+!insertmacro MUI_STARTMENU_WRITE_BEGIN pageid
+ ...create shortcuts...
+!insertmacro MUI_STARTMENU_WRITE_END
+
+
+ The page ID should be the ID of the page on which the user has selected the folder
+ for the shortcuts you want to write.
+
+ The variable which contains the folder and the page ID are set as parameters of
+ the page macro.
+
+
+
+ Language selection dialog
+
+
+ If you want the installer to display a language selection dialog (see the the MultiLanguage.nsi example),
+ insert the MUI_LANGDLL_DISPLAY macro in the .onInit function:
+
+Function .onInit
+
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+FunctionEnd
+
+
+ This macro can also be used in the un.onInit function.
+
+
+ Settings for registry storage of selected language
+
+
+ To remember the user's preference, you can define a registry key. These defines
+ should be set before inserting the installation page macro.
+
+ MUI_LANGDLL_REGISTRY_ROOT root
+ MUI_LANGDLL_REGISTRY_KEY key
+ MUI_LANGDLL_REGISTRY_VALUENAME value_name
+ The registry key to store the language. The users preference will be remembered.
+ You can also use it for the uninstaller to display the right language. Don't forget
+ to remove this key in the uninstaller.
+
+ For the uninstaller, insert the MUI_UNGETLANGUAGE macro in un.onInit to get the
+ stored language preference:
+
+Function un.onInit
+
+ !insertmacro MUI_UNGETLANGUAGE
+
+FunctionEnd
+
+
+
+
+ Interface settings for selection dialog
+
+
+ To customize the language selection dialog interface, use these defines before inserting
+ the MUI_LANGDLL_DISPLAY macro.
+
+ MUI_LANGDLL_WINDOWTITLE text
+ The window title of the language selection dialog.
+
+ MUI_LANGDLL_INFO text
+ The text to display on the language selection dialog.
+
+ MUI_LANGDLL_ALWAYSSHOW
+ Always show the language selection dialog, even if a language has been stored in
+ the registry. The language stored in the registry will be selected by default.
+
+ MUI_LANGDLL_ALLLANGUAGES
+ Always show all available languages and don't filter according to their codepage.
+
+
+
+ Custom pages
+
+
+ If you want add your custom pages to your installer, you can insert your own page
+ commands between the page macros. The InstallOptions
+ documentation provides information about creating custom pages using InstallOptions.
+
+!insertmacro MUI_PAGE_WELCOME
+Page custom FunctionName ;Custom page
+!insertmacro MUI_PAGE_COMPONENTS
+
+;Uninstaller
+!insertmacro MUI_UNPAGE_CONFIRM
+UninstPage custom un.FunctionName ;Custom page
+!insertmacro MUI_UNPAGE_INSTFILES
+
+
+ Use the MUI_HEADER_TEXT macro to set the text on the page header in a page function:
+
+LangString PAGE_TITLE ${LANG_ENGLISH} "Title"
+LangString PAGE_SUBTITLE ${LANG_ENGLISH} "Subtitle"
+
+Function CustomPageFunction
+ !insertmacro MUI_HEADER_TEXT $(PAGE_TITLE) $(PAGE_SUBTITLE)
+ !insertmacro MUI_INSTALLOPTIONS_DISPLAY "ioFile.ini"
+FuctionEnd
+
+
+
+ Custom functions
+
+
+ Interface functions provided by NSIS, like the .onGUIInit function and the page
+ functions are automatically included by the Modern UI and filled with code to support
+ new interface features. If you want to add additional code to these function, create
+ a function with the custom script code in the script use the Modern UI functions
+ call them.
+
+ Example:
+
+!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
+
+Function myGUIInit
+ ...your own code...
+FunctionEnd
+
+
+
+ General Custom Functions
+
+
+ These defines should be set before inserting the language macros.
+
+ MUI_CUSTOMFUNCTION_GUIINIT function
+ MUI_CUSTOMFUNCTION_UNGUIINIT function
+ MUI_CUSTOMFUNCTION_ABORT function
+ MUI_CUSTOMFUNCTION_UNABORT function
+ MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION function
+ MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION function
+
+ Mouse over functions are only available when the description macros
+ (MUI_FUNCTION_DESCRIPTION_BEGIN) are used. When component page descriptions are not
+ used, regular .onMouseOverSection and un.onMouseOverSection must be used.
+
+
+
+ Page Custom Functions
+
+
+ These defines should be set before inserting a page macro.
+
+ MUI_PAGE_CUSTOMFUNCTION_PRE function
+ MUI_PAGE_CUSTOMFUNCTION_SHOW function
+ MUI_PAGE_CUSTOMFUNCTION_LEAVE function
+
+ Notes:
+
+ - In the Pre function of the Welcome page and the Finish page, you can write to the
+ InstallOptions INI file of the page (ioSpecial.ini)
+ - In the Show function of the Welcome, Finish and StartMenu pages, $MUI_HWND contains
+ the HWND of the inner dialog
+
+
+
+
+ Welcome/Finish Page Custom Functions
+
+
+ This define should be inserted before a single Welcome or Finish page.
+
+ MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT function
+
+ This Init function is called before the InstallOptions INI file for the page is
+ written, so you can use it to initialize any variables used in the page settings.
+
+
+
+
+
+ Credits
+
+
+ Written by Joost Verburg.
+ Icons designed by Nikos Adamamas, aka adni18.
+ Thanks to Amir Szekely, aka KiCHiK, for his work on NSIS to make this possible.
+
+
+ License
+
+
+ The zlib/libpng license applies to the Modern UI.
+
+
+ License Terms
+
+
+Copyright © 2002-2009 Joost Verburg
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute
+it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+ you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment in the
+ product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such,
+ and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any distribution.
+
+
+
+
+ |
+
+
+
+
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI/images/closed.gif b/Engine/bin/tools/nsis/app/Docs/Modern UI/images/closed.gif
new file mode 100644
index 000000000..b45054ee8
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Docs/Modern UI/images/closed.gif differ
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI/images/header.gif b/Engine/bin/tools/nsis/app/Docs/Modern UI/images/header.gif
new file mode 100644
index 000000000..f8810d30c
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Docs/Modern UI/images/header.gif differ
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI/images/open.gif b/Engine/bin/tools/nsis/app/Docs/Modern UI/images/open.gif
new file mode 100644
index 000000000..9fff60ed5
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Docs/Modern UI/images/open.gif differ
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI/images/screen1.png b/Engine/bin/tools/nsis/app/Docs/Modern UI/images/screen1.png
new file mode 100644
index 000000000..0e25c0d38
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Docs/Modern UI/images/screen1.png differ
diff --git a/Engine/bin/tools/nsis/app/Docs/Modern UI/images/screen2.png b/Engine/bin/tools/nsis/app/Docs/Modern UI/images/screen2.png
new file mode 100644
index 000000000..4fccd41c8
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Docs/Modern UI/images/screen2.png differ
diff --git a/Engine/bin/tools/nsis/app/Docs/MultiUser/Readme.html b/Engine/bin/tools/nsis/app/Docs/MultiUser/Readme.html
new file mode 100644
index 000000000..493ca30c1
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/MultiUser/Readme.html
@@ -0,0 +1,404 @@
+
+
+
+ Multi-User Header File (MultiUser.nsh)
+
+
+
+
+
+ Multi-User Header File (MultiUser.nsh)
+
+ Installer configuration for multi-user Windows environments
+
+ Table of Contents
+
+
+ Introduction
+
+ Modern Windows versions support multiple users accounts on a single computer, each
+ with different privileges. For security reasons, the privileges of applications
+ can also be limited. For an installer, the execution level and installation
+ mode are important. The execution level determines the privileges of the
+ installer application. For example, to install hardware drivers, administrator privileges
+ are required. Applications can also be installed for a single user or for all users
+ on a computer, which is determined by the installation mode. Installation for all
+ users requires a higher execution level as compared with a single user setup. The
+ MultiUser.nsh header files provides the features to automatically handle all these
+ aspects related to user accounts and installer privileges.
+
+ Note that all settings need to be set before including the MultiUser.nsh header
+ file.
+
+ Initialization and Execution Level
+
+ Before the MultiUser.nsh file is included, the MULTIUSER_EXECUTIONLEVEL define should
+ be set to one of the following values depending on the execution level that is required:
+
+
+ |
+ Value
+ |
+
+ Description
+ |
+
+ Typical application
+ |
+
+
+ |
+ Admin
+ |
+
+ Administrator privileges are required
+ |
+
+ Access data of all users accounts
+ |
+
+
+ |
+ Power
+ |
+
+ Power User privileges are required
+ (Power Users no longer exist in Windows Vista. For Vista this is equivalent to Admin)
+ |
+
+ Installation for all users (writing to "Program Files" or HKLM registry
+ keys), driver installation
+ |
+
+
+ |
+ Highest
+ |
+
+ Request the highest possible execution level for the current user
+ |
+
+ Mixed-mode installer that can both be installed per-machine or per-user
+ |
+
+
+ |
+ Standard
+ |
+
+ No special rights required
+ |
+
+ Installation for current user only
+ |
+
+
+
+ Insert the MULTIUSER_INIT and MULTIUSER_UNINT macros in the .onInit and un.onInit
+ function to verify these privileges. If no uninstaller is created in the script,
+ set MULTIUSER_NOUNINSTALL.
+
+ !define MULTIUSER_EXECUTIONLEVEL Highest
+;!define MULTIUSER_NOUNINSTALL ;Uncomment if no uninstaller is created
+!include MultiUser.nsh
+
+...
+
+Function .onInit
+ !insertmacro MULTIUSER_INIT
+FunctionEnd
+
+Function un.onInit
+ !insertmacro MULTIUSER_UNINIT
+FunctionEnd
+
+
+ Whether the required privileges can be obtained depends on the user that starts
+ the installer:
+
+ - Windows NT 4/2000/XP/2003 give the installer the same privileges as the user itself.
+ If the privileges of the user are not sufficient (e.g. Admin level is required is
+ set but the user has no administrator rights), the macros will display an error
+ message and quit the installer. If is however possible to manually run the installer
+ with an administrator account.
+ - Windows Vista restricts the privileges of all applications by default. Depending
+ on requested execution level, MultiUser.nsh will set the RequestExecutionLevel flag
+ to request privileges. The user will be asked for confirmation and (if necessary)
+ for an administrator password.
+ - Windows 95/98/98 do not set any restrictions on users or applications. Administrator
+ rights are always available.
+
+
+ It is recommended to insert these initialization macros before macros that require
+ user intervention. For example, it does not make sense to ask a user for an installer
+ language if the installer will quit afterwards because the user account does not
+ have the required privileges. After the macros are inserted, the variable $MultiUser.Privileges
+ will contain the current execution level (Admin, Power, User or Guest).
+
+ The following additional settings are available to customize the initialization:
+
+
+ |
+ Setting |
+ Description
+ |
+
+
+ |
+ MULTIUSER_INIT_TEXT_ADMINREQUIRED
+ |
+
+ Error message to be displayed when administrator rights are required but not available.
+ |
+
+
+ |
+ MULTIUSER_INIT_TEXT_POWERREQUIRED
+ |
+
+ Error message to be displayed when Power User rights are required but not available.
+ |
+
+
+ |
+ MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE
+ |
+
+ Error message to be displayed when administrator or Power User rights are required
+ because of an installation mode setting on the command line (see below) but are
+ not available.
+ |
+
+
+
+ MULTIUSER_INIT_FUNCTIONQUIT
+ MULTIUSER_INIT_UNFUNCTIONQUIT
+ |
+
+ A custom function to be called when the installer is closed due to insufficient
+ privileges.
+ |
+
+
+
+ Installation Mode
+
+ As mentioned before, applications can both be installed for a single users or for
+ all users on a computer. Applications for all users are typically installed in the
+ Program Files folder and appear in the Start Menu of every user. On the contrary,
+ applications for a single user are usually installed in the local Application Data
+ folder and only a appear in the Start Menu of the user who installed the application.
+
+ By default, MultiUser.nsh will set the installation mode for a per-machine installation
+ if Administrator or Power User rights are available (this is always the case if
+ the execution level is set to Admin or Power, if Highest is set it depends on the
+ user account). For the Standard execution level the installation will always be
+ for a single user. On Windows 95/98/Me installation for a single user is not possible.
+
+ The following settings are available to change the default installation mode:
+
+
+ |
+ Setting
+ |
+
+ Description
+ |
+
+
+
+ |
+ MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
+ |
+
+ Set default to a per-user installation, even if the rights for a per-machine installation
+ are available.
+ |
+
+
+ |
+ MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
+ |
+
+ Non-empty registry key that is created during the installation in either HKCU or
+ HKLM. The default installation mode will automatically be set to the previously
+ selected mode depending on the location of the key.
+ |
+
+
+
+ After initialization, the variable $MultiUser.InstallMode will contain the current
+ installation mode (AllUsers or CurrentUser).
+
+
+ Mixed-Mode Installation
+
+ For the Admin and Power levels, both a per-machine as well as a per-user installation
+ is possible. If the Highest level is set and the user is an Administrator or Power
+ User, both options are also available.
+
+ Usually it's a good thing to give the user to choice between these options. For
+ users of the Modern UI version 2, a page is provided that asks the user for the
+ installation mode. To use this page, define MULTIUSER_MUI before including User.nsh.
+ Then, the MULTIUSER_PAGE_INSTALLMODE macro can be used just like a normal Modern
+ UI page (this page will automatically be skipped when running Windows 95/98/Me):
+ !define MULTIUSER_EXECUTIONLEVEL Highest
+!define MULTIUSER_MUI
+!define MULTIUSER_INSTALLMODE_COMMANDLINE
+!include MultiUser.nsh
+!include MUI2.nsh
+
+!insertmacro MULTIUSER_PAGE_INSTALLMODE
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+
+!insertmacro MUI_LANGUAGE English
+
+...
+
+Function .onInit
+ !insertmacro MULTIUSER_INIT
+FunctionEnd
+
+Function un.onInit
+ !insertmacro MULTIUSER_UNINIT
+FunctionEnd
+
+
+ The MULTIUSER_INSTALLMODE_COMMANDLINE setting that also appears in this example
+ enables the installation mode to be set using the /AllUsers or /CurrentUser command
+ line parameters. This is especially useful for silent setup.
+
+ The following settings can be used to customize the texts on the page (in addition
+ to the general Modern UI page settings):
+
+
+ |
+ Setting
+ |
+
+ Description
+ |
+
+
+ |
+ MULTIUSER_INSTALLMODEPAGE_TEXT_TOP
+ |
+
+ Text to display on the top of the page.
+ |
+
+
+ |
+ MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS
+ |
+
+ Text to display on the combo button for a per-machine installation.
+ |
+
+
+ |
+ MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER
+ |
+
+ Text to display on the combo button for a per-user installation.
+ |
+
+
+
+ Installation Mode Initalization
+
+ The SetShellVarContext flag (which determines the folders for e.g. shortcuts, like
+ $DESKTOP) is automatically set depending on the installation mode. In addition,
+ the following settings can be used to perform additional actions when the installation
+ mode is initialized:
+
+
+ |
+ Setting
+ |
+
+ Description
+ |
+
+
+
+ |
+ MULTIUSER_INSTALLMODE_INSTDIR
+ |
+
+ Name of the folder in which to install the application, without a path. This folder
+ will be located in Program Files for a per-machine installation and in the local
+ Application Data folder for a per-user installation (if supported).
+ |
+
+
+ |
+ MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
+ |
+
+ Registry key from which to obtain a previously stored installation folder. It will
+ be retrieved from HKCU for per-user and HKLM for per-machine.
+ |
+
+
+
+ MULTIUSER_INSTALLMODE_FUNCTION
+ MULTIUSER_INSTALLMODE_UNFUNCTION
+ |
+
+ A custom fuction to be called during the initialization of the installation mode
+ to set additional installer settings that depend on the mode
+ |
+
+
+ To set the installation mode manually, call one of these four functions:
+
+
+ |
+ Function name
+ |
+
+ Installation mode
+ |
+
+
+ |
+ MultiUser.InstallMode.AllUsers
+ |
+
+ Installer: Per-machine installation
+ |
+
+
+ |
+ MultiUser.InstallMode.CurrentUser
+ |
+ Installer: Per-user installation
+ |
+
+
+ |
+ un.MultiUser.InstallMode.AllUsers |
+ Uninstaller: Per-machine installation
+ |
+
+
+ |
+ un.MultiUser.InstallMode.CurrentUser |
+ Uninstaller: Per-user installation
+ |
+
+
+
+
diff --git a/Engine/bin/tools/nsis/app/Docs/NSISdl/License.txt b/Engine/bin/tools/nsis/app/Docs/NSISdl/License.txt
new file mode 100644
index 000000000..642304fa0
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/NSISdl/License.txt
@@ -0,0 +1,18 @@
+NSISdl 1.1 - HTTP downloading plugin for NSIS
+Copyright (C) 2001-2002 Yaroslav Faybishenko & Justin Frankel
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Docs/NSISdl/ReadMe.txt b/Engine/bin/tools/nsis/app/Docs/NSISdl/ReadMe.txt
new file mode 100644
index 000000000..db98b4368
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/NSISdl/ReadMe.txt
@@ -0,0 +1,91 @@
+NSISdl 1.3 - HTTP downloading plugin for NSIS
+---------------------------------------------
+
+Copyright (C) 2001-2002 Yaroslav Faybishenko & Justin Frankel
+
+This plugin can be used from NSIS to download files via http.
+
+To connect to the internet, use the Dialer plugin.
+
+USAGE
+-----
+
+NSISdl::download http://www.domain.com/file localfile.exe
+
+You can also pass /TIMEOUT to set the timeout in milliseconds:
+
+NSISdl::download /TIMEOUT=30000 http://www.domain.com/file localfile.exe
+
+The return value is pushed to the stack:
+
+ "cancel" if cancelled
+ "success" if success
+ otherwise, an error string describing the error
+
+If you don't want the progress window to appear, use NSISdl::download_quiet.
+
+Example of usage:
+
+NSISdl::download http://www.domain.com/file localfile.exe
+Pop $R0 ;Get the return value
+ StrCmp $R0 "success" +3
+ MessageBox MB_OK "Download failed: $R0"
+ Quit
+
+For another example, see waplugin.nsi in the examples directory.
+
+PROXIES
+-------
+
+NSISdl supports only basic configurations of proxies. It doesn't support
+proxies which require authentication, automatic configuration script, etc.
+NSISdl reads the proxy configuration from Internet Explorer's registry key
+under HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings. It
+reads and parses ProxyEnable and ProxyServer.
+
+If you don't want NSISdl to use Internet Explorer's settings, use the
+/NOIEPROXY flag. /NOIEPROXY should be used after /TRANSLATE and
+/TIMEOUT. For example:
+
+If you want to specify a proxy on your own, use the /PROXY flag.
+
+NSISdl::download /NOIEPROXY http://www.domain.com/file localfile.exe
+NSISdl::download /TIMEOUT=30000 /NOIEPROXY http://www.domain.com/file localfile.exe
+NSISdl::download /PROXY proxy.whatever.com http://www.domain.com/file localfile.exe
+NSISdl::download /PROXY proxy.whatever.com:8080 http://www.domain.com/file localfile.exe
+
+TRANSLATE
+---------
+
+To translate NSISdl add the following values to the call line:
+
+/TRANSLATE2 downloading connecting second minute hour seconds minutes hours progress
+
+Default values are:
+
+ downloading - "Downloading %s"
+ connecting - "Connecting ..."
+ second - " (1 second remaining)"
+ minute - " (1 minute remaining)"
+ hour - " (1 hour remaining)"
+ seconds - " (%u seconds remaining)"
+ minutes - " (%u minutes remaining)"
+ hours - " (%u hours remaining)"
+ progress - "%skB (%d%%) of %skB @ %u.%01ukB/s"
+
+The old /TRANSLATE method still works for backward compatibility.
+
+/TRANSLATE downloading connecting second minute hour plural progress remianing
+
+Default values are:
+
+ downloading - "Downloading %s"
+ connecting - "Connecting ..."
+ second - "second"
+ minute - "minute"
+ hour - "hour"
+ plural - "s"
+ progress - "%dkB (%d%%) of %ukB @ %d.%01dkB/s"
+ remaining - " (%d %s%s remaining)"
+
+/TRANSLATE and /TRANSLATE2 must come before /TIMEOUT.
diff --git a/Engine/bin/tools/nsis/app/Docs/Splash/splash.txt b/Engine/bin/tools/nsis/app/Docs/Splash/splash.txt
new file mode 100644
index 000000000..e69e073f4
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/Splash/splash.txt
@@ -0,0 +1,41 @@
+Splash.dll - small (4k), simple plugin that lets you throw
+up a splash screen in NSIS installers.
+
+--- UPDATED in 2.0b0 - will break old scripts ---
+
+To use:
+
+Create a .BMP file of your splash screen.
+(optional) Create a .WAV file to play while your splash screen shows.
+
+Add the following lines to your .NSI file:
+
+Function .onInit
+ SetOutPath $TEMP
+ File /oname=spltmp.bmp "my_splash.bmp"
+
+; optional
+; File /oname=spltmp.wav "my_splashshit.wav"
+
+ splash::show 1000 $TEMP\spltmp
+
+ Pop $0 ; $0 has '1' if the user closed the splash screen early,
+ ; '0' if everything closed normally, and '-1' if some error occurred.
+
+ Delete $TEMP\spltmp.bmp
+; Delete $TEMP\spltmp.wav
+FunctionEnd
+
+Note that the first parameter to splash.exe is the length to show the
+screen for (in milliseconds), and the second is the splash bitmap filename (without
+the .bmp). The BMP file used will be this parameter.bmp, and the wave file used
+(if present) will be this parameter.wav.
+
+(If you already have an .onInit function, put that in it)
+
+Note: the return value of splash is 1 if the user closed the splash
+screen early (pop it from the stack)
+
+-Justin
+
+Converted to a plugin DLL by Amir Szekely (kichik)
diff --git a/Engine/bin/tools/nsis/app/Docs/StartMenu/Readme.txt b/Engine/bin/tools/nsis/app/Docs/StartMenu/Readme.txt
new file mode 100644
index 000000000..74329986a
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/StartMenu/Readme.txt
@@ -0,0 +1,47 @@
+StartMenu.dll shows a custom page that lets the user select a start menu program
+folder to put shortcuts in.
+
+To show the dialog use the Select function. This function has one required parameter
+which is the program group default name, and some more optional switches:
+ /autoadd - automatically adds the program name to the selected folder
+ /noicon - doesn't show the icon in the top left corner
+ /text [please select...] - sets the top text to something else than
+ "Select the Start Menu folder in which..."
+ /lastused [folder] - sets the edit box to a specific value folder.
+ Use this to make this plug-in remember the last
+ folder selected by the user
+ /checknoshortcuts text - Shows a check box with the text "text". If
+ the user checks this box, the return value
+ will have > as its first character and you
+ should not create the program group.
+ /rtl - sets the direction of every control on the selection dialog
+ to RTL. This means every text shown on the page will be
+ justified to the right.
+
+The order of the switches doesn't matter but the required parameter must come after
+all of them. Every switch after the required parameter will be ignored and left
+on the stack.
+
+The function pushes "success", "cancel" or an error to the stack. If there was no
+error and the user didn't press on cancel it will push the selected folder name
+after "success". If the user checked the no shortcuts checkbox the result will be
+prefixed with '>'. The function does not push the full path but only the selected
+sub-folder. It's up to you to decide if to put it in the current user or all
+users start menu.
+
+To set properties of the controls on the page, such as colors and fonts use Init
+and Show instead of Select. Init will push the HWND of the page on the stack,
+or an error string. For example:
+
+StartMenu::Init "Test"
+Pop $0
+IntCmp $0 0 failed
+GetDlgItem $0 $0 1003
+SetCtlColors $0 "" FF0000
+StartMenu::Show
+# continue as with Select here
+failed:
+
+Look at Example.nsi for a full example (without Init and Select).
+
+Created by Amir Szekely (aka KiCHiK)
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Docs/StrFunc/StrFunc.txt b/Engine/bin/tools/nsis/app/Docs/StrFunc/StrFunc.txt
new file mode 100644
index 000000000..400f3835f
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/StrFunc/StrFunc.txt
@@ -0,0 +1,707 @@
+String Functions Header File Readme
+-----------------------------------
+
+String Functions Header File contains a set of good string manipulation
+functions in a much simpler way to include and call in NSIS scripts.
+
+How to use
+----------
+
+ Basic Syntax
+ ------------
+
+ Parameters are specified in this format:
+ required (required) (option1 | option2) [optional or add. options]
+ [option1 | option2]
+
+ The stars in command titles (*****) are the function usefulness in my
+ opinion. The more starts, the more useful it is. 5 stars (*****) is the
+ most useful.
+
+ Any time when is mentioned "Default is" means that you can use the value
+ mentioned or keep it blank, the result is the same.
+
+ If you want a certain value (e.g. a text) to be language-specific, set a
+ language string (using LangString) and define $(STRINGNAME) as value.
+
+ If you want to add ` to a string, you should always escape it using $\`
+ because the header file macro functions use ` to separate parameters.
+
+ 1. Include Header file
+ ----------------------
+
+ !include "StrFunc.nsh"
+
+ StrFunc.nsh has to be inside Include directory, so you don't have to
+ specify a path.
+
+ You have to put this command before any command used in this header file.
+
+ 2. Defines
+ ----------
+
+ This header file contains defines that automate the life of some who
+ fear a lot of changes sometimes imposed in this header file, or who have
+ applications that put it to work at maximum capacity. Before you try
+ these, take a look at the information below:
+
+ - Every item on a define value is separated by a "|", and every subitem
+ (items in an item) is separated by " ".
+
+ - Use ${StrTok} $var "${DefineName}" "|" "$counter" "0" to get every
+ item inside the define. For subitems, use ${StrTok} $var2 "$var" " "
+ "$counter2" "0" after getting the value for a desired item.
+
+ - ${StrFunc_List} is automatically made by the header file. The rest
+ is manually added to the header.
+
+ 2.1 Defines List:
+ -----------------
+
+ StrFunc_List - Lists all function names currently available on StrFunc
+ header file.
+
+ *_List - Lists all parameter names currently available for "*"
+ function. (* = function name - i.e. StrTok_List).
+
+ *_TypeList - Lists the types of all parameters on "*" function.
+ (* = function name - i.e. StrTok_List). Possible types
+ for each parameter:
+
+ - Output - Needs a variable to output a function result.
+
+ - Text - Needs text or number to be input.
+
+ - Mixed - Needs text, number or option to be inputed.
+ Each subitem following the "Mixed" word is an
+ option. The first option is ever the default
+ one. Two following spaces " " means that
+ that subitem is empty.
+
+ - Option - Needs an option to be inputed. Each subitem
+ following the "Option" word is an option.
+ The first option is ever the default one. Two
+ following spaces " " means that that subitem
+ is empty.
+
+ 3. Commands
+ -----------
+
+ Some commands have special specifications to work. Consult command's
+ documentation on "3.3 Commands" section.
+
+ 3.1 How To Use Commands In Install Sections and Functions
+ ---------------------------------------------------------
+
+ Every command used in install sections and functions have to be called
+ first before and out of any sections and functions, and without
+ parameters.
+
+ Example:
+ --------
+
+ ${StrStr}
+
+ 3.2 How To Use Commands In Uninstall Sections and Functions
+ -----------------------------------------------------------
+
+ Commands with Uninstall Sections and Functions support have "Un" before
+ the words inside curly brackets "{}".
+
+ Example:
+ --------
+
+ ${UnStrStr}
+
+ A complete example with both Install and Uninstall Commands:
+ ------------------------------------------------------------
+
+
+ !include "StrFunc.nsh"
+
+ ${StrStr} # Supportable for Install Sections and Functions
+
+ ${UnStrStr} # Supportable for Uninstall Sections and Functions
+
+ Section
+
+ ${StrStr} $0 "OK! Now what?" "wh"
+
+ SectionEnd
+
+ Section Uninstall
+
+ ${UnStrStr} $0 "OK! Now what?" "wh"
+
+ SectionEnd
+
+ 3.3 Commands
+ ------------
+
+ =========================================================================
+ ** ${StrCase}
+ -------------------------------------------------------------------------
+ ResultVar String Type(|L|U|T|S|<>)
+ =========================================================================
+ Converts "String" to "Type" Case. Uses LogicLib.
+
+ Parameters:
+
+ ResultVar
+ Destination where result is returned.
+
+ String
+ String to convert to "Type" case.
+
+ Type
+ Type of string case to convert to:
+
+ - "" = Original Case (same as "String")
+ - L = Lower Case (this is just an example. a very simple one.)
+ - U = Upper Case (THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE.)
+ - T = Title Case (This Is Just An Example. A Very Simple One.)
+ - S = Sentence Case (This is just an example. A very simple one.)
+ - <> = Switch Case (This is just an example. A very simple one.)
+
+ Default value is "" (Original Case).
+
+ Result Value -> ResultVar:
+
+ "String" in "Type" case.
+
+ Example:
+
+ ${StrCase} $0 '"Você" is "You" in English.' "U"
+ [__(_)__()___()__()__(____)_]
+
+ $0 = '"VOCÊ" IS "YOU" IN ENGLISH.'
+
+ =========================================================================
+ * ${StrClb}
+ -------------------------------------------------------------------------
+ ResultVar String Action(|>|<|<>)
+ =========================================================================
+ Makes an action with the clipboard depending on value of parameter
+ "Action". Uses LogicLib.
+
+ Parameters:
+
+ String
+ If "Action" = ">" or "<>" - String to put on the clipboard.
+
+ Action
+ Can be one of the following values:
+
+ - "" = Cleans the clipboard.
+ - ">" = Set string to clipboard.
+ - "<" = Get string from clipboard.
+ - "<>" = Swap string with clipboard's.
+
+ Result Value -> ResultVar:
+
+ If "Action" = "<" or "<>" - String found on the clipboard.
+
+ =========================================================================
+ *** ${StrIOToNSIS}
+ -------------------------------------------------------------------------
+ ResultVar String
+ =========================================================================
+ Convert "String" from Install Options plugin to be supported by NSIS.
+ Escape, back-slash, carriage return, line feed and tab characters are
+ converted.
+
+ Parameters:
+
+ ResultVar
+ Destination where result is returned.
+
+ String
+ String to convert to be supportable for NSIS.
+
+ Result Value -> ResultVar:
+
+ "String" supportable for NSIS.
+
+ Example:
+
+ ${StrIOToNSIS} $0 "\r\n\t\\This is just an example\\"
+ [()()()()_______________________()]
+
+ $0 = "$\r$\n$\t\This is just an example\"
+
+ =========================================================================
+ * ${StrLoc}
+ -------------------------------------------------------------------------
+ ResultVar String StrToSearchFor CounterDirection(>|<)
+ =========================================================================
+ Searches for "StrToSearchFor" in "String" and returns its location,
+ according to "CounterDirection".
+
+ Parameters:
+
+ ResultVar
+ Destination where result is returned.
+
+ String
+ String where to search "StrToSearchFor".
+
+ StrToSearchFor
+ String to search in "String".
+
+ CounterDirection(>|<)
+ Direction where the counter increases to. Default is ">".
+ (> = increases from left to right, < = increases from right to left)
+
+ Result Value -> ResultVar:
+
+ Where "StrToSearchFor" is, according to "OffsetDirection".
+
+ Example:
+
+ ${StrLoc} $0 "This is just an example" "just" "<"
+ (__)<<<<<<<<<<<
+
+ $0 = "11"
+
+ =========================================================================
+ *** ${StrNSISToIO}
+ -------------------------------------------------------------------------
+ ResultVar String
+ =========================================================================
+ Converts "String" from NSIS to be supported by Install Options plugin.
+ Escape, back-slash, carriage return, line feed and tab characters are
+ converted.
+
+ Parameters:
+
+ ResultVar
+ Destination where result is returned.
+
+ String
+ String to convert to be supportable for Install Options plugin.
+
+ Result Value -> ResultVar:
+
+ "String" supportable for Install Options plugin.
+
+ Example:
+
+ ${StrNSISToIO} $0 "$\r$\n$\t\This is just an example\"
+ [(_)(_)(_)^_______________________^]
+
+ $0 = "\r\n\t\\This is just an example\\"
+
+ =========================================================================
+ ***** ${StrRep}
+ -------------------------------------------------------------------------
+ ResultVar String StrToReplace ReplacementString
+ =========================================================================
+ Searches for all "StrToReplace" in "String" replacing those with
+ "ReplacementString".
+
+ Parameters:
+
+ ResultVar
+ Destination where result is returned.
+
+ String
+ String where to search "StrToReplace".
+
+ StrToReplaceFor
+ String to search in "String".
+
+ StringToBeReplacedWith
+ String to replace "StringToReplace" when it is found in "String".
+
+ Result Value -> ResultVar:
+
+ "String" with all occurrences of "StringToReplace" replaced with
+ "ReplacementString".
+
+ Example:
+
+ ${StrRep} $0 "This is just an example" "an" "one"
+ [____________()_______]
+
+ $0 = "This is just one example"
+
+ =========================================================================
+ *** ${StrSort}
+ -------------------------------------------------------------------------
+ ResultVar String LeftStr CenterStr RightStr IncludeLeftStr(1|0)
+ IncludeCenterStr(1|0) IncludeRightStr(1|0)
+ =========================================================================
+ Searches for "CenterStr" in "String", and returns only the value
+ between "LeftStr" and "RightStr", including or not the "CenterStr" using
+ "IncludeCenterStr" and/or the "LeftStr" using "IncludeLeftStr" and
+ "RightStr" using "IncludeRightStr".
+
+ Parameters:
+
+ ResultVar
+ Destination where result is returned.
+
+ String
+ String where to search "CenterStr".
+
+ LeftStr
+ The first occurrence of "LeftStr" on the left of "CenterStr".
+ If it is an empty value, or was not found, will return
+ everything on the left of "CenterStr".
+
+ CenterStr
+ String to search in "String".
+
+ RightStr
+ The first occurrence of "RightStr" on the right of "CenterStr".
+ If it is an empty value, or was not found, will return
+ everything on the right of "CenterStr".
+
+ IncludeLeftStr(1|0)
+ Include or not the "LeftStr" in the result value. Default is 1
+ (True). (1 = True, 0 = False)
+
+ IncludeCenterStr(1|0)
+ Include or not the "CenterStr" in the result value. Default is 1
+ (True). (1 = True, 0 = False)
+
+ IncludeRightStr(1|0)
+ Include or not the "RightStr" in the result value. Default is 1
+ (True). (1 = True, 0 = False)
+
+ Result Value -> ResultVar:
+
+ String between "LeftStr" and "RightStr" of a found "CenterStr"
+ including or not the "LeftStr" and "RightStr" if
+ "IncludeLeftRightStr" is 1 and/or the "CenterStr" if
+ "IncludeCenterStr" is 1.
+
+ Example:
+
+ ${StrSort} $0 "This is just an example" " just" "" "ple" "0" "0" "0"
+ [_______(___)_______]( )
+ C R
+
+ $0 = "This is an exam"
+
+ =========================================================================
+ ***** ${StrStr}
+ -------------------------------------------------------------------------
+ ResultVar String StrToSearchFor
+ =========================================================================
+ Searches for "StrToSearchFor" in "String".
+
+ Parameters:
+
+ ResultVar
+ Destination where result is returned.
+
+ String
+ String where to search "StrToSearchFor".
+
+ StrToSearchFor
+ String to search in "String".
+
+ Result Value -> ResultVar:
+
+ "StrToSearchFor" + the string after where "StrToSearchFor" was found in
+ "String".
+
+ Example:
+
+ ${StrStr} $0 "This is just an example" "just"
+ >>>>>>>>>{_)____________]
+
+ $0 = "just an example"
+
+ =========================================================================
+ ***** ${StrStrAdv}
+ -------------------------------------------------------------------------
+ ResultVar String StrToSearchFor SearchDirection(>|<)
+ ResultStrDirection(>|<) DisplayStrToSearch(1|0) Loops CaseSensitive(0|1)
+ =========================================================================
+ Searches for "StrToSearchFor" in "String" in the direction specified by
+ "SearchDirection" and looping "Loops" times.
+
+ Parameters:
+
+ ResultVar
+ Destination where result is returned.
+
+ String
+ String where to search "StrToSearchFor".
+
+ StrToSearchFor
+ String to search in "String".
+
+ SearchDirection (>|<)
+ Where do you want to direct the search. Default is ">" (to right).
+ (< = To left, > = To right)
+
+ ResultStrDirection (>|<)
+ Where the result string will be based on in relation of
+ "StrToSearchFor"
+ position. Default is ">" (to right). (< = To left, > = To right)
+
+ DisplayStrToSearch (1|0)
+ Display "StrToSearchFor" in the result. Default is "1" (True).
+ (1 = True, 0 = False)
+
+ Loops
+ Number of times the code will search "StrToSearchFor" in "String" not
+ including the original execution. Default is "0" (1 code execution).
+
+ CaseSensitive(0|1)
+ If "1" the search will be case-sensitive (differentiates between cases).
+ If "0" it is case-insensitive (does not differentiate between cases).
+ Default is "0" (Case-Insensitive).
+
+
+ Result Value -> ResultVar:
+
+ "StrToSearchFor" if "DisplayStrToSearch" is 1 + the result string after
+ or before "StrToSearchFor", depending on "ResultStrDirection".
+
+ Result with Errors:
+
+ When "StrToSearchFor" was not found, will return an empty string.
+
+ When you put nothing in "StrToSearchFor", will return "String" and set
+ error flag.
+
+ When you put nothing in "String", will return an empty string and set
+ error flag.
+
+ Example:
+
+ ${StrStrAdv} $0 "This IS really just an example" "IS " ">" ">" "0" "0" "1"
+ >>>>>( )[____________________]
+
+
+ $0 = "really just an example"
+
+ =========================================================================
+ **** ${StrTok}
+ -------------------------------------------------------------------------
+ ResultVar String Separators ResultPart[L] SkipEmptyParts(1|0)
+ =========================================================================
+ Returns the part "ResultPart" between two "Separators" inside
+ "String".
+
+ Parameters:
+
+ ResultVar
+ Destination where result is returned.
+
+ String
+ String where to search for "Separators".
+
+ Separators
+ Characters to find on "String".
+
+ ResultPart[L]
+ The part want to be found on "StrToTokenize" between two "Separators".
+ Can be any number, starting at 0, and "L" that is the last part.
+ Default is L (Last part).
+
+ SkipEmptyParts(1|0)
+ Skips empty string parts between two "Separators". Default is 1 (True).
+ (1 = True, 0 = False)
+
+ Result Value -> ResultVar:
+
+ "String" part number "Part" between two "Separators".
+
+ Examples:
+
+ 1) ${StrTok} $0 "This is, or is not, just an example" " ," "4" "1"
+ ( ) () () () [_] ( ) () ( )
+ 0 1 2 3 4 5 6 7
+ $0 = "not"
+
+ 2) ${StrTok} $0 "This is, or is not, just an example" " ," "4" "0"
+ ( ) () ^() [] ( ) ^( ) () ( )
+ 0 1 23 4 5 67 8 9
+ $0 = "is"
+
+ =========================================================================
+ * ${StrTrimNewLines}
+ -------------------------------------------------------------------------
+ ResultVar String
+ =========================================================================
+ Deletes unnecessary new lines at end of "String".
+
+ Parameters:
+
+ ResultVar
+ Destination where result is returned.
+
+ String
+ String where to search unnecessary new lines at end of "String".
+
+ Result Value -> ResultVar:
+
+ "String" with unnecessary end new lines removed.
+
+ Example:
+
+ ${StrTrimNewLines} $0 "$\r$\nThis is just an example$\r$\n$\r$\n"
+ [_____________________________(_)(_)(_)(_)]
+
+ $0 = "$\r$\nThis is just an example"
+
+Functions included and not included
+--------------------------------------------------
+
+11 functions have been included
+ They are not available on Archive
+ They are on LogicLib format
+
+15 functions have not been included
+ 12 were not included because of better functions
+ 6 were not included because of AdvStrTok (called here as StrTok)
+ First String Part Function
+ Save on Variables Function
+ Sort Strings (1, 2 and 3) Functions
+ StrTok Function
+ 2 were not included because of StrCase
+ StrLower Function
+ StrUpper Function
+ 2 were not included because of StrClb
+ StrClbSet Function
+ StrClbGet Function
+ 1 was not included because of NSISToIO and IOToNSIS
+ Convert / to // in Paths Function
+ 1 was not included because of original String Replace Function (called
+ here as StrRep)
+ Another String Replace Function
+ 2 were not included because they aren't useful anymore
+ Slash <-> Backslash Converter Function
+ Trim Function
+ 1 was not included because of bugs
+ Number to String Converter Function
+
+Version History
+---------------
+
+1.09 - 10/22/2004
+
+- Fixed stack problems involving: StrCase, StrRep, StrSort, StrTok.
+- Fixed StrClb: When "Action" = "<>", handle was wrongly outputed as
+ text.
+- Fixed StrSort, StrStrAdv documentation examples.
+- Fixed StrIOToNSIS, StrLoc, StrNSISToIO, StrRep, StrStr: sometimes
+ didn't find "StrToSearch" at all.
+
+1.08 - 10/12/2004
+
+- Converted all the functions to LogicLib.
+- StrSort: Totally remade and it can break old scripts. See
+ documentation for details.
+- StrTok: "ResultPart" has to start from 0 and it can break old scripts.
+ See documentation for details.
+- Added defines: StrFunc_List, *_List and *_TypeList.
+- Fixed StrStrAdv: Variables $R0-$R3 couldn't be used on scripts before
+ calling.
+- StrRep: Cut down some variables.
+- Arranged correctly the order of StrSort on the documentation.
+
+1.07 - 09/21/2004
+
+- Removed ${UnStrFunc} command. Now you can just include uninstall
+ functions commands like ${UnStrStr} to be supported by uninstall functions
+ and sections.
+- Added case-sensitive comparation option for StrStrAdv.
+- StrCase now uses System.dll which makes case conversions effective with
+all latin letters (i.e. ê).
+- Added switch case and original case for StrCase.
+- StrClbSet and StrClbGet removed, added StrClb.
+- Made compact the most usual operations inside the header file. File size
+reduced.
+
+1.06 - 03/26/2004
+
+- StrNumToStr removed due to complex number handling on some languages.
+- Fixed the bug where the old string was attached to string returned by
+ StrCase when $R5 variable was used.
+
+1.05 - 03/17/2004
+
+- Fixed a bug with StrCase, Title Case wasn't working as should be.
+- Fixed a bug with StrStrAdv, previous fix created another bug, string not
+ returned correctly when using backwards search with "DisplayStrToSearch" as
+ "0".
+
+1.04 - 03/07/2004
+
+- Added new StrCase, removed StrLower and StrUpper.
+- Organized by name commands inside header and readme files.
+
+1.03 - 02/12/2004
+
+- Added commands support for uninstall sections and functions.
+- Fixed variables switch in "StrLoc" and "StrTok" after using these.
+
+1.02 - 02/07/2004
+
+- Fixed StrLoc.
+- Fixed Documentation about StrLoc. "Direction" is really "OffsetDirection".
+- Added my new AdvStrSort, and removed the old one.
+
+1.01 - 02/05/2004
+
+- Fixed Documentation about StrSort and StrTok.
+- Fixed StrTok default value for the string part. Now it's "L".
+- Fixed StrStrAdv fixed wrong search when had a combination of same
+ substrings one after another in a string.
+- Fixed StrLoc: when a string isn't found, don't return any value at all.
+
+1.00 - 02/01/2004
+
+- Added documentation.
+- Renamed header file to "StrFunc.nsh".
+- Added 1 function, StrLoc.
+- Modified StrStrAdv, removed some lines.
+- Fixed StrTok, 2 simple numbers made it loop everytime.
+- Fixed some small issues on the header file.
+
+0.02 - 01/24/2004
+
+- Completed StrFunc.nsh file. Need some tests and the readme.
+
+0.01 - 01/22/2004
+
+- First version to test ideas...
+
+Credits
+-------
+
+ Made by Diego Pedroso (aka deguix).
+
+Functions Credits
+-----------------
+
+- All functions are made by Diego Pedroso on LogicLib format. They
+ are based on functions by Amir Szekely, Dave Laundon, Hendri
+ Adriaens, Nik Medved, Joost Verburg, Stuart Welch, Ximon Eighteen,
+ "bigmac666" and "bluenet". "bluenet"'s version of StrIOToNSIS and
+ StrNSISToIO on LogicLib format were included.
+
+License
+-------
+
+This header file is provided 'as-is', without any express or implied
+warranty. In no event will the author be held liable for any damages
+arising from the use of this header file.
+
+Permission is granted to anyone to use this header file for any purpose,
+including commercial applications, and to alter it and redistribute
+it freely, subject to the following restrictions:
+
+1. The origin of this header file must not be misrepresented;
+ you must not claim that you wrote the original header file.
+ If you use this header file in a product, an acknowledgment in the
+ product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such,
+ and must not be misrepresented as being the original header file.
+3. This notice may not be removed or altered from any distribution.
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Docs/System/System.html b/Engine/bin/tools/nsis/app/Docs/System/System.html
new file mode 100644
index 000000000..7898b4c58
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/System/System.html
@@ -0,0 +1,786 @@
+
+
+
+NSIS System Plug-in
+
+
+
+NSIS System Plug-in
+© brainsucker (Nik Medved), 2002
+
+Table of Contents
+
+
+
+Introduction
+
+The System plug-in gives developers the ability to call any exported function from any DLL. For example, you can use it to call GetLogicalDriveStrings to get a list of available drives on the user's computer.
+
+The System plug-in also allows the developer to allocate, free and copy memory; interact with COM objects and perform mathematical operations on 64-bit integers.
+
+Programming knowledge is highly recommended for good understanding of the System plug-in.
+
+The most useful System plug-in functions (Call, Get and Debug) are not available when compiling with GCC. To work around this, either download a MSVC-compiled version or write your own plugin that calls the functions you need.
+
+Usage Examples From The Wiki
+
+
+
+Available Functions
+
+Memory Related Functions
+
+
+
+
+-
+Alloc SIZE
+
+Allocates SIZE bytes and returns a memory address on the stack.
+Usage Example
+
+System::Alloc 64
+Pop $0
+DetailPrint "64 bytes allocated at $0"
+System::Free $0
+
+
+
+
+-
+Copy [/SIZE] DESTINATION SOURCE
+
+Copies SIZE bytes from SOURCE to DESTINATION. If SIZE is not specified, SOURCE's size will queried using GlobalSize. This means that if you don't allocate SOURCE using System::Alloc, System::Call or GlobalAlloc, you must specify SIZE. If DESTINATION is zero it will be allocated and its address will be pushed on the stack.
+Usage example
+
+# allocate a buffer and put 'test string' and an int in it
+System::Call "*(&t1024 'test string', i 5) i .s"
+Pop $0
+# copy to an automatically created buffer
+System::Copy 0 $0
+Pop $1
+# get string and int in $1 buffer
+System::Call "*$1(&t1024 .r2, i .r3)"
+# free buffer
+System::Free $1
+# print result
+DetailPrint $2
+DetailPrint $3
+# copy to our own buffer
+System::Alloc 1028
+Pop $1
+System::Copy $1 $0
+# get string and int in $1 buffer
+System::Call "*$1(&t1024 .r2, i .r3)"
+# free
+System::Free $0
+System::Free $1
+# print result
+DetailPrint $2
+DetailPrint $3
+
+
+
+
+
+-
+Free ADDRESS
+
+Frees ADDRESS.
+Usage Example
+
+System::Alloc 64
+Pop $0
+DetailPrint "64 bytes allocated at $0"
+System::Free $0
+
+
+
+
+-
+Store "OPERATION [OPERATION [OPERATION ...]]"
+
+Performs stack operations. An operation can be pushing or popping a single register from the NSIS stack or pushing or popping all of the registers ($0-$9 and $R0-$R9) from System's private stack. Operations can be separated by any character.
+Available Operations
+
+- To push $#, use p#, where # is a digit from 0 to 9.
+- To pop $#, use r#, where # is a digit from 0 to 9.
+- To push $R#, use P#, where # is a digit from 0 to 9.
+- To pop $R#, use R#, where # is a digit from 0 to 9.
+- To push $0-$9 and $R0-$R9 to System's private stack, use s or S.
+- To pop $0-$9 and $R0-$R9 from System's private stack, use l or L.
+
+Usage Examples
+
+StrCpy $0 "test"
+System::Store "p0"
+Pop $1
+DetailPrint "$0 = $1"
+
+
+StrCpy $2 "test"
+System::Store "p2 R2"
+DetailPrint "$2 = $R2"
+
+
+StrCpy $3 "test"
+System::Store "s"
+StrCpy $3 "another test"
+System::Store "l"
+DetailPrint $3
+
+
+System::Store "r4" "test"
+DetailPrint $4
+
+
+
+
+
+
+
+Calling Functions
+
+
+
+
+- Call PROC [( PARAMS ) [RETURN [? OPTIONS]]]
+- Get PROC [( PARAMS ) [RETURN [? OPTIONS]]]
+
+Call and get both share a common syntax. As the names suggest, Call calls and Get gets. What does it call or get? It depends on PROC's value.
+
+PARAMS is a list of parameters and what do to with them. You can pass data in the parameters and you can also get data from them. The parameters list is separated by commas. Each parameter is combined of three values: type, source and destination. Type can be an integer, a string, etc. Source, which is the source of the parameter value, can be a NSIS register ($0, $1, $INSTDIR), the NSIS stack, a concrete value (5, "test", etc.) or nothing (null). Destination, which is the destination of the parameter value after the call returns, can be a NSIS register, the NSIS stack or nothing which means no output is required. Either one of source or destination can also be a dot (`.') if it is not needed.
+
+RETURN is like a single parameter definition, but source is only used when creating callback functions. Normally source is a dot.
+
+OPTIONS is a list of options which control the way System plug-in behaves. Each option can be turned off by prefixing with an exclamation mark. For example: ?!e.
+
+PARAMS, RETURN and OPTIONS can be repeated many times in one Get/Call line. When repeating, a lot can be omitted, and only what you wish to change can be used. Type, source and/or destination can be omitted for each parameter, even the return value. Options can be added or removed. This allows you to define function prototypes and save on some typing. The last two examples show this.
+
+PROC can also be repeated but must be prefixed with a hash sign (`#').
+
+Possible PROC Values and Meanings
+
+
+
+
+| Value |
+Meaning |
+Example |
+
+
+| DLL::FUNC |
+FUNC exported from DLL |
+user32::MessageBox |
+
+
+| ::ADDR |
+Function located at ADDR |
+see below |
+
+
+| *ADDR |
+Structure located at ADDR |
+see below |
+
+
+| * |
+New structure |
+see below |
+
+
+| IPTR->IDX |
+Member indexed IDX from interface pointed by IPTR |
+see below |
+
+
+| <nothing> |
+New callback function |
+see below |
+
+
+| PROC |
+PROC returned by Get |
+see below |
+
+
+
+
+Available Parameter Types
+
+
+
+
+| Type |
+Meaning |
+
+
+| v |
+void (generally for return) |
+ |
+
+
+| i |
+int (includes char, byte, short, handles, pointers and so on) |
+
+
+| l |
+large integer, int64 |
+
+
+| m |
+ANSI text, string. (FYI: 'm' for multibyte string or 'w' flipped over.) |
+
+
+| t |
+text, string (pointer to first character). Like TCHAR*, it is a Unicode string in Unicode NSIS. |
+
+
+| w |
+WCHAR text, Unicode string |
+
+
+| g |
+GUID |
+
+
+| k |
+callback |
+
+
+| &vN |
+N bytes padding (structures only) |
+
+
+| &iN |
+integer of N bytes (structures only) |
+
+
+| &l |
+structure size (structures only) |
+
+
+| &tN |
+N bytes of text (structures only) |
+
+
+| &wN |
+N bytes of Unicode text (structures only) |
+
+
+| &gN |
+N bytes of GUID (structures only) |
+
+
+Additionally, each type can be prefixed with an asterisk to denote a pointer. When using an asterisk, the System plug-in still expects the value of the parameter, rather than the pointer's address. To pass a direct address, use `i' with no asterisk. A usage example is available. Alloc returns addresses and its return value should therefore be used with `i', without an asterisk.
+
+
+Available Sources and Destinations
+
+
+
+
+| Type |
+Meaning |
+
+
+| . |
+ignored |
+ |
+
+
+| number |
+concrete hex, decimal or octal integer value. several integers can be or'ed using the pipe symbol (`|') |
+
+
+'string' "string" `string` |
+concrete string value |
+
+
+| r0 through r9 |
+$0 through $9 respectively |
+
+
+r10 through r19 R0 through R9 |
+$R0 through $R9 respectively |
+
+
+| c |
+$CMDLINE |
+
+
+| d |
+$INSTDIR |
+
+
+| o |
+$OUTDIR |
+
+
+| e |
+$EXEDIR |
+
+
+| a |
+$LANGUAGE |
+
+
+| s |
+NSIS stack |
+
+
+| n |
+null for source, no output required for destination |
+
+
+
+
+Callbacks
+
+
+Callback functions are simply functions which are passed to a function and called back by it. They are frequently used to pass a possibly large set of data item by item. For example, EnumChildWindows uses a callback function. As NSIS functions are not quite regular functions, the System plug-in provides its own mechanism to support callback functions. It allows you to create callback functions and notifies you each time a callback function was called.
+
+Creation of callback functions is done using Get and the callback creation syntax. As you will not call the callbacks yourself, the source of the parameters should be omitted using a dot. When the callback is called, the destination of the parameters will be filled with the values passed on to the callback. The value the callback will return is set by the source of the return "parameter". The destination of the return "parameter" should always be set as that's where System will notify you the callback was called.
+
+System::Get "(i .r0, i .r1) iss"
+
+To pass a callback to a function, use the k type.
+
+System::Get "(i .r0, i .r1) isR0"
+Pop $0
+System::Call "dll::UseCallback(k r0)"
+
+Each time the callback is called, the string callback#, where # is the number of the callback, will be placed in the destination of the return "parameter". The number of the first callback created is 1, the second's is 2, the third's is 3 and so on. As System is single threaded, a callback can only be called while calling another function. For example, EnumChildWindows's callback can only be called when EnumChildWindows is being called. You should therefore check for callback# after each function call that might call your callback.
+
+System::Get "(i .r0, i .r1) isR0"
+Pop $0
+System::Call "dll::UseCallback(k r0)"
+StrCmp $R0 "callback1" 0 +2
+DetailPrint "UseCallback passed ($0, $1) to the callback"
+
+
+After you've processed the callback call, you should use Call, passing it the value returned by Get - the callback. This tells System to return from the callback. Destination of the return "parameter" must be cleared prior to calling a function, to avoid false detection of a callback call. If you've specified a source for the return "parameter" when the callback was created, you should fill that source with the appropriate return value. Callbacks are not automatically freed, don't forget to free it after you've finished using it.
+
+System::Get "(i .r0, i .r1) isR0"
+Pop $0
+System::Call "dll::UseCallback(k r0)"
+loop:
+ StrCmp $R0 "callback1" 0 done
+ DetailPrint "UseCallback passed ($0, $1) to the callback"
+ Push 1 # return value of the callback
+ StrCpy $R0 "" # clear $R0 in case there are no more callback calls
+ System::Call $0 # tell system to return from the callback
+ Goto loop
+done:
+System::Free $0
+
+
+A complete working example is available in the usage examples section.
+
+
+
+Notes
+
+
+
+- To find out the index of a member in a COM interface, you need to search for the definition of this COM interface in the header files that come with Visual C/C++ or the Platform SDK. Remember the index is zero based.
+- If a function can't be found, an `A' will be appended to its name and it will be looked up again. This is done because a lot of Windows API functions have two versions, one for ANSI strings and one for Unicode strings. The ANSI version of the function is marked with `A' and the Unicode version is marked with `W'. For example: lstrcpyA and lstrcpyW.
+
+
+
+Available Options
+
+
+
+
+| Option |
+Meaning |
+
+
+| c |
+cdecl calling convention (the stack restored by caller). By default stdcall calling convention is used (the stack restored by callee). |
+ |
+
+
+| r |
+Always return (for GET means you should pop result and proc, for CALL means you should pop result (at least)). By default result is returned for errors only (for GET you will pop either error result or right proc, and for CALL you will get either your return or result at defined return place). |
+
+
+| n |
+No redefine. Whenever this proc will be used it will never be redefined either by GET or CALL. This options is never inherited to children. |
+
+
+| s |
+Use general Stack. Whenever the first callback defined the system starts using the temporary stacks for function calls. |
+
+
+| e |
+Call GetLastError() after procedure end and push result on stack. |
+
+
+| u |
+Unload DLL after call (using FreeLibrary, so you'll be able to delete it for example). |
+
+
+
+
+Usage Examples
+
+
+System::Call "user32::MessageBox(i $HWNDPARENT, t 'NSIS System Plug-in', t 'Test', i 0)"
+
+
+System::Call "kernel32::GetModuleHandle(t 'user32.dll') i .s"
+System::Call "kernel32::GetProcAddress(i s, t 'MessageBoxA') i .r0"
+System::Call "::$0(i $HWNDPARENT, t 'GetProcAddress test', t 'NSIS System Plug-in', i 0)"
+
+
+System::Get "user32::MessageBox(i $HWNDPARENT, t 'This is a default text', t 'Default', i 0)"
+Pop $0
+System::Call "$0"
+
+
+System::Get "user32::MessageBox(i $HWNDPARENT, t 'This is a default text', \
+ t 'Default', i 0x1|0x10)"
+Pop $0
+System::Call "$0(, 'This is a System::Get test', 'NSIS System Plug-in',)"
+
+
+System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2"
+DetailPrint "User name - $0"
+DetailPrint "String length - $1"
+DetailPrint "Return value - $2"
+
+
+System::Alloc 4
+Pop $0
+System::Call "*$0(i 5)"
+System::Call "*$0(i .r1)"
+DetailPrint $1
+
+
+System::Call "*(i 5) i .r0"
+System::Call "*$0(i .r1)"
+DetailPrint $1
+
+
+# defines
+!define CLSCTX_INPROC_SERVER 1
+!define CLSID_ActiveDesktop {75048700-EF1F-11D0-9888-006097DEACF9}
+!define IID_IActiveDesktop {F490EB00-1240-11D1-9888-006097DEACF9}
+# create IActiveDesktop interface
+System::Call "ole32::CoCreateInstance( \
+ g '${CLSID_ActiveDesktop}', i 0, \
+ i ${CLSCTX_INPROC_SERVER}, \
+ g '${IID_IActiveDesktop}', *i .r0) i.r1"
+StrCmp $1 0 0 end
+# call IActiveDesktop->GetWallpaper
+System::Call "$0->4(w .r2, i ${NSIS_MAX_STRLEN}, i 0)"
+# call IActiveDesktop->Release
+System::Call "$0->2()"
+# print result
+DetailPrint $2
+end:
+
+
+InitPluginsDir
+SetOutPath $PLUGINSDIR
+File MyDLL.dll
+System::Call "MyDLL::MyFunc(i 5) ? u"
+Delete $PLUGINSDIR\MyDLL.dll
+
+
+System::Get "(i.r1, i) iss"
+Pop $R0
+System::Call "user32::EnumChildWindows(i $HWNDPARENT, k R0, i) i.s"
+loop:
+ Pop $0
+ StrCmp $0 "callback1" 0 done
+ System::Call "user32::GetWindowText(ir1,t.r2,i${NSIS_MAX_STRLEN})"
+ System::Call "user32::GetClassName(ir1,t.r3,i${NSIS_MAX_STRLEN})"
+ IntFmt $1 "0x%X" $1
+ DetailPrint "$1 - [$3] $2"
+ Push 1 # callback's return value
+ System::Call "$R0"
+ Goto loop
+done:
+System::Free $R0
+
+
+!define MB "user32::MessageBox(i$HWNDPARENT,t,t'NSIS System Plug-in',i0)"
+System::Call "${MB}(,'my message',,)"
+System::Call "${MB}(,'another message',,) i.r0"
+MessageBox MB_OK "last call returned $0"
+
+
+System::Call "user32::SendMessage(i $HWNDPARENT, t 'test', t 'test', i 0) i.s ? \
+ e (,t'test replacement',,) i.r0 ? !e #user32::MessageBox"
+DetailPrint $0
+ClearErrors
+Pop $0
+IfErrors good
+MessageBox MB_OK "this message box will never be reached"
+good:
+
+
+
+
+
+
+
+64-bit Functions
+
+
+
+
+
+-
+Int64Op ARG1 OP [ARG2]
+
+Performs OP on ARG1 and optionally ARG2 and returns the result on the stack. Both ARG1 and ARG2 are 64-bit integers. This means they can range between -2^63 and 2^63 - 1.
+Available Operations
+
+- Addition -- +
+- Subtraction -- -
+- Multiplication -- *
+- Division -- /
+- Modulo -- %
+- Shift right -- >>
+- Shift left -- <<
+- Bitwise or -- |
+- Bitwise and -- &
+- Bitwise xor -- ^
+- Logical or -- ||
+- Logical and -- &&
+- Less than -- <
+- Equals -- =
+- Greater than -- >
+- Bitwise not (one argument) -- ~
+- Logical not (one argument) -- !
+
+
+Usage Examples
+
+
+System::Int64Op 5 + 5
+Pop $0
+DetailPrint "5 + 5 = $0" # 10
+
+
+System::Int64Op 64 - 25
+Pop $0
+DetailPrint "64 - 25 = $0" # 39
+
+
+System::Int64Op 526355 * 1565487
+Pop $0
+DetailPrint "526355 * 1565487 = $0" # 824001909885
+
+
+System::Int64Op 5498449498849818 / 3
+Pop $0
+DetailPrint "5498449498849818 / 3 = $0" # 1832816499616606
+
+
+System::Int64Op 0x89498A198E4566C % 157
+Pop $0
+DetailPrint "0x89498A198E4566C % 157 = $0" # 118
+
+
+System::Int64Op 1 << 62
+Pop $0
+DetailPrint "1 << 62 = $0" # 4611686018427387904
+
+
+System::Int64Op 0x4000000000000000 >> 62
+Pop $0
+DetailPrint "0x4000000000000000 >> 62 = $0" # 1
+
+
+System::Int64Op 0xF0F0F0F | 0xF0F0FFF
+Pop $0
+# IntFmt is 32-bit, this is just for the example
+IntFmt $0 "0x%X" $0
+DetailPrint "0xF0F0F0F | 0xF0F0FFF = $0" # 0xF0F0FFF
+
+
+System::Int64Op 0x12345678 & 0xF0F0F0F0
+Pop $0
+# IntFmt is 32-bit, this is just for the example
+IntFmt $0 "0x%X" $0
+DetailPrint "0x12345678 & 0xF0F0F0F0 = $0" # 0x10305070
+
+
+System::Int64Op 1 ^ 0
+Pop $0
+DetailPrint "1 ^ 0 = $0" # 1
+
+
+System::Int64Op 1 || 0
+Pop $0
+DetailPrint "1 || 0 = $0" # 1
+
+
+System::Int64Op 1 && 0
+Pop $0
+DetailPrint "1 && 0 = $0" # 0
+
+
+System::Int64Op 9302157012375 < 570197509190760
+Pop $0
+DetailPrint "9302157012375 < 570197509190760 = $0" # 1
+
+
+System::Int64Op 5168 > 89873
+Pop $0
+DetailPrint "5168 > 89873 = $0" # 0
+
+
+System::Int64Op 189189 = 189189
+Pop $0
+DetailPrint "189189 = 189189 = $0" # 1
+
+
+System::Int64Op 156545668489 ~
+Pop $0
+DetailPrint "1 ~ = $0" # -156545668490
+
+
+System::Int64Op 1 !
+Pop $0
+DetailPrint "1 ! = $0" # 0
+
+
+
+
+
+
+
+
+FAQ
+
+
+
+
+
+-
+Q: How can I pass structs to functions?
+
+A: First of all, you must allocate the struct. This can be done in two ways. You can either use Alloc or Call with the special struct allocation syntax. Next, if you need to pass data in the struct, you must fill it with data. Then you call the function with a pointer to the struct. Finally, if you want to read data from the struct which might have been written by the called function, you must use Call with the struct handling syntax. After all is done, it's important to remember to free the struct.
+
+Allocation
+
+To allocate the struct using Alloc, you must know the size of the struct in bytes. Therefore, it would normally be easier to use Call. In this case it's easy to see the required size is 16 bytes, but other cases might not be that trivial. In both cases, the struct address will be located on the top of the stack and should be retrieved using Pop.
+
+
+System::Alloc 16
+
+
+
+System::Call "*(i, i, i, t)i.s"
+
+
+
+
+Setting Data
+
+Setting data can be done using Call. It can be done in the allocation stage, or in another stage using the struct handling syntax.
+
+
+System::Call "*(i 5, i 2, i 513, t 'test')i.s"
+
+
+
+# assuming the struct's memory address is kept in $0
+System::Call "*$0(i 5, i 2, i 513, t 'test')"
+
+
+
+
+Passing to the Function
+
+As all allocation methods return an address, the type of the passed data should be an integer, an address in memory.
+
+
+# assuming the struct's memory address is kept in $0
+System::Call "dll::func(i r0)"
+
+
+
+
+Reading Data
+
+Reading data from the struct can be done using the same syntax as setting it. The only difference is that the destination part of the parameter will be set and the source part will be omitted using a dot.
+
+
+# assuming the struct's memory address is kept in $0
+System::Call "*$0(i .r0, i .r1, i .r2, t .r3)"
+DetailPrint "first int = $0"
+DetailPrint "second int = $1"
+DetailPrint "third int = $2"
+DetailPrint "string = $3"
+
+
+
+
+Freeing Memory
+
+Memory is freed using Free.
+
+
+# assuming the struct's memory address is kept in $0
+System::Free $0
+
+
+
+
+A Complete Example
+
+
+# allocate
+System::Alloc 32
+Pop $1
+# call
+System::Call "Kernel32::GlobalMemoryStatus(i r1)"
+# get
+System::Call "*$1(i.r2, i.r3, i.r4, i.r5, i.r6, i.r7, i.r8, i.r9)"
+# free
+System::Free $1
+# print
+DetailPrint "Structure size: $2 bytes"
+DetailPrint "Memory load: $3%"
+DetailPrint "Total physical memory: $4 bytes"
+DetailPrint "Free physical memory: $5 bytes"
+DetailPrint "Total page file: $6 bytes"
+DetailPrint "Free page file: $7 bytes"
+DetailPrint "Total virtual: $8 bytes"
+DetailPrint "Free virtual: $9 bytes"
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Engine/bin/tools/nsis/app/Docs/System/WhatsNew.txt b/Engine/bin/tools/nsis/app/Docs/System/WhatsNew.txt
new file mode 100644
index 000000000..959c734b0
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/System/WhatsNew.txt
@@ -0,0 +1,46 @@
+release 2.
+1. Syntax, with inline input
+2. Int64 full support (conversion/operations/comparison)
+3. Structures support
+4. Callbacks support, including multilevel callbacks
+5. Some useful routines (Alloc, Free, Copy)
+6. CDecl and StdCall calling conventions
+
+release 3, 22 march 2003.
+1. Custom Message Boxes (with icons etc) -> bug in case of GetModuleHandle and
+call to FreeLibrary (sysfunc.nsh)
+2. GetFileSysTime -> No SystemTimeToTzSpecificLocalTime at win9x bug,
+changed to use FileTimeToLocalFileTime (sysfunc.nsh)
+3. Incorrect automatic structure size (&l) bug, value actually never filled
+into the structure (strange -> winxp takes no care of the structure size
+members, such as cbSize, and win98 does...) (system.c)
+4. Changed Secondary Stack Allocation behavior - now we just leave 65kb of the
+stack NSIS give to us to the NSIS itself, and use the other part as the stack
+for our calls. (system.c)
+5. Secondary Stack Optimization - in case of no more pending callback procs -
+"free" the secondary stack pointer. (system.c)
+6. PlaySound("", 0, 0) plays the default windows sound at win9x, so changed to
+PlaySound(NULL, 0, 0) for effective sound stopping after splash (sysfunc.nsh).
+
+release 4, 3 september 2003.
+1. Division by zero fatal error at Int64Op killed.
+2. bool type removed (use int instead).
+3. GUID (g) and LPWSTR (w) types added.
+4. Memory cleanup after using t (string), g (guid) and w (unicode string) added.
+5. Automatic A-letter at proc name discovery.
+6. COM optimized: new proc specification "x->y", where x is interface ptr, and
+y is vtable member index. For such procs Interface pointer passed as first arg
+automatically.
+
+release 5, 11 september 2003.
+1. u flag - unload dll after procedure call.
+2. some changes to asm to turn on Whole Program Optimization.
+3. Dll shrunk by 1 kb.
+
+bug-fix-release, 4.06.2004
+1. System::Copy /SIZE fixed (Kichik).
+2. System::Copy with destination auto-allocation now pushes destination
+address on stack.
+3. Callbacks fixed (Kichik's kick is awesome).
+4. Bug with proc call parts redefinition, # for example (pointed by Kichik).
+5. Bug with memory protection during callback processing (Kichik).
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Docs/VPatch/Readme.html b/Engine/bin/tools/nsis/app/Docs/VPatch/Readme.html
new file mode 100644
index 000000000..c93d61c8a
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/VPatch/Readme.html
@@ -0,0 +1,334 @@
+
+
+
+VPatch 3
+
+
+
+
+
+
+
+
+ VPatch 3.1
+
+ Introduction
+
+ VPatch allows to create a patch file to update previous versions
+ of your software. The GenPat utility generates the patch file. The
+ plug-in can use the patch to update a file. Using a patch, you can
+ reduce the download size of your updates, because only the differences
+ between the files are included in the patch file.
+
+ How to use
+
+ Generate the patch file
+
+ Make sure you have the source file (original version) and the target
+ file (version to update to). For example, DATA.DTA (currently on user
+ system) and DATA_20.DTA (version 2.0 of this data file). Now call
+ the command line tool GenPat.exe:
+
+GENPAT oldfile.txt newfile.txt patch.pat
+
+ Now, the patch will be generated, this will take some time.
+ Using the /B=(BlockSize) parameter of the GenPat utility (put it
+ after the filenames), you can use a different block size. A smaller
+ block size may result in a smaller patch, but the generation will
+ take more time (the default blocksize is 64).
+ If you have trouble using this command-line utility, you can download
+ a GUI (graphical user interface) for VPatch from its own website:
+ http://www.tibed.net/vpatch.
+
+ Update the file during installation
+
+ Use the VPatch plug-in to update a file using a patch file:
+
+vpatch::vpatchfile "patch.pat" "oldfile.txt" "temporary_newfile.txt"
+
+ The result of the patch operating will be added to the stack and
+ can be one of the following texts:
+
+ - OK
+ - OK, new version already installed
+ - An error occurred while patching
+ - Patch data is invalid or corrupt
+ - No suitable patches were found
+
+ Check example.nsi for an example. You
+ should check whether the stack string starts with "OK"
+ because then the patch has succeeded and you can rename "temporary_newfile.txt"
+ to "oldfile.txt" to replace the original, if you want.
+
+ Multiple patches in one file
+
+ GenPat appends a patch to the file you specified. If there is already
+ a patch for the same original file, with the same CRC/MD5, in the patch file,
+ the patch will be replaced. For example, if you want to be able to upgrade
+ version 1 and 2 to version 3, you can put a 1 > 3 and 2 > 3 patch in
+ one file.
+ You can also put patches for different files in one patch file, for
+ example, a patch from file A version 1 to file A version 2 and a patch
+ from file B version 1 to file B version 2. Just call the plug-in multiple
+ times with the same patch file. It will automatically select the right
+ patch (based on the file CRC).
+
+ Patch generator (GenPat) exit codes
+
+ In version 3 the following exit codes (known as error levels in
+ the DOS period) can be returned by GenPat. GenPat will return an
+ exit code based on success of the patch generation. Here is a list
+ of the possible exit codes:
+
+
+ | Exit code |
+ Description |
+
+
+ | 0 |
+ Success |
+
+
+ | 1 |
+ Arguments missing |
+
+
+ | 2 |
+ Other error |
+
+
+ | 3 |
+ Source file already has a patch in specified patch file (ERROR),
+ use /R switch to override |
+
+
+ These exit codes can be useful when you generate patch files through
+ a NSIS script.
+
+
+
+
+ Source code
+
+ Source code is available in the original package and in the SVN repository of NSIS.
+ NSIS plug-in (C++)
+
+ The source of the NSIS plug-in that applies patches can be found
+ in the Source\Plugin folder.
+
+ Patch Generator (C++)
+
+ The most interesting part of VPatch, the actual patch generation
+ algorithm, can be found in Source\GenPat\PatchGenerator.cpp. The
+ header of that file contains a brief explanation of the algorithm
+ as well.
+
+ User interface (Delphi)
+
+ A user interface is included as well, which you will have to build
+ yourself because the GUI executable was too large to include. Besides
+ Borland Delphi 6 or higher (you can use the freely available Personal
+ edition), you will also need to install the VirtualTreeView component by Mike Lischke.
+
+
+ Version history
+
+
+ - 3.1
+
+ - GenPat now compiles on POSIX platforms (MinGW/GCC), Visual
+ C++ 6 and Borland C++.
+ - More test cases to verify functionality of GenPat.
+
+
+ - 3.0
+
+ - Final: Updates to the GUI, installer
+ - RC8: GenPat will now flag replacement of a patch (e.g.
+ the source file has the same contents as a previous patch inside
+ a patch file) as an error. You can specifically allow it using
+ the /R switch. Added license to source files.
+ - RC7: Fixed critical bug in GenPat with multiple patches
+ in a single file. Fixed serious bug in stand-alone EXE runtime:
+ process kept on running forever. Included case testing through
+ a Python script to test common usage (and prevent bugs like
+ the one in GenPat in the future).
+ - RC6: Upgraded to non-beta compiler. Added /A switch
+ to change block match limit and /O to deactivate the limit.
+ Updated GUI to support the /O switch.
+ - RC4a to RC5a: input block size is now checked for power
+ of 2 and fixed if incorrect. When patch file does not yet exist,
+ no longer forgets to create the header. No longer tries to allocate
+ memory when there are no chunks. Fixed memory leaks.
+ - Target file date is now preserved inside a patch and restored
+ on the user system.
+ - MD5 checksums are now used instead of CRC32 checksums, unless
+ existing patches in a file already are in CRC32 mode.
+ - The patch generator, GenPat, has been completely rewritten
+ in C++. It no longer needs to keep the entire files in memory,
+ instead memory usage is a certain percentage of the source file
+ size. The percentage is based on the block size, larger block
+ sizes will reduce memory usage.
+ - All runtimes now share a common codebase, perform proper error
+ checking and don't leave behind files if the input file was
+ already up to date.
+ - Bug Fix: The patch generator algorithm no longer reduces to
+ a quadratic runtime if there are many blocks with the same content
+ in the files to patch.
+ - Bug Fix: The documentation of the command-line utilities was
+ incorrect and no warnings would be given by the runtimes, causing
+ the patch not to work (this does not apply to NSIS patches).
+
+
+ - 2.1
+
+ - Added argument checking and error handling to GenPat. Now
+ returns exit codes as well to indicate success/failure (and
+ the reason for failure). Only GenPat has changed in this version
+ compared to 2.0 final.
+ - Bug Fix: GenPat no longer gives an Access Violation when attempting
+ to patch a file smaller than 64 bytes into a file larger than
+ 64 bytes.
+
+
+ - 2.0 final
+
+ - Cleaned up source code for the patch generator, which is now
+ included (this code is written in Borland Delphi 6 and compiles
+ with the freely available Personal edition).
+
+
+ - 2.0 beta 2
+
+ - All new algorithm used in the patch generator: much faster
+ (up to 90%) while using smaller block sizes (higher compression)
+ - Created a NSIS 2 plugin
+ - Works with small files
+ - Replaces existing patch in file if original file CRC is identical
+
+
+
+
+ Credits
+
+ Written by Koen van de Sande
+ C plug-in initially by Edgewize, updated by Koen van de Sande
+ New documentation and example by Joost Verburg and Koen van de Sande
+
+ License
+
+
+Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute
+it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+ you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment in the
+ product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such,
+ and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any distribution.
+
+
+
+ |
+
+
+
+
diff --git a/Engine/bin/tools/nsis/app/Docs/makensisw/License.txt b/Engine/bin/tools/nsis/app/Docs/makensisw/License.txt
new file mode 100644
index 000000000..ccb71be8a
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/makensisw/License.txt
@@ -0,0 +1,17 @@
+Copyright (c) 2002 Robert Rainwater
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
diff --git a/Engine/bin/tools/nsis/app/Docs/makensisw/Readme.txt b/Engine/bin/tools/nsis/app/Docs/makensisw/Readme.txt
new file mode 100644
index 000000000..f28b16272
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/makensisw/Readme.txt
@@ -0,0 +1,214 @@
+----------------------------------------------------
+MakeNSISW - MakeNSIS Windows Wrapper
+----------------------------------------------------
+
+
+About MakeNSISW
+---------------
+MakeNSISW is a wrapper for the MakeNSIS that is distributed with
+NSIS (http://www.nullsoft.com/free/nsis/). MakeNSISW allows you
+to compile NSIS scripts using a Windows GUI interface. To install
+MakeNSISW, compile the source using Visual C++ or Mingw.
+
+
+Requirements
+------------
+MakeNSISW requires NSIS be installed on your system. The default
+directory for this installation is $PROGRAMFILES\NSIS\Contrib\MakeNSISW.
+
+
+Usage:
+------
+If you installed the Shell Extensions option during the installation, then
+all that is required is that you choose 'Compile NSI' from the right-
+click menu on a NSIS script. This will invoke MakeNSISW.
+
+The format of the parameters when calling MakeNSISW from the commandline is:
+ makensisw [options] [script.nsi | - [...]]
+
+For the options, please see the MakeNSIS documentation.
+
+
+Shortcut Keys
+-------------
+Ctrl+A: Select All text
+Ctrl+B: Open Script Folder
+Ctrl+C: Copy selected text
+Ctrl+D: Opens the Define Symbols dialog
+Ctrl+E: Edits the script
+Ctrl+F: Find text
+Ctrl+L: Load a script
+Ctrl+R: Recompiles the script
+Ctrl+T: Tests the installer
+Ctrl+W: Clear Log Window
+Alt+X: Exits the application
+F1: View Documentation
+
+
+Version History
+---------------
+0.1
+ - Initial Release
+
+0.2
+ - Added ability to save output and copy output
+
+0.3
+ - Added option to recompile script (F2 or File|Recompile)
+ - Added Help Menu
+ - Return code is now always set
+ - Added Accelerator key support for Exit and Recompile
+ - No longer uses NSIS's version string
+ - Made clearer status message in title bar
+ - Disabled menu/accelerator functions during compile
+
+0.4
+ - Fixed Copy Selected bug
+
+0.5
+ - Minor Makefile changes (mingw)
+ - Moved strings into global strings to make editing easier
+ - Added Clear Log Command under Edit menu
+ - Recompile no longer clears the log window (use F5)
+ - Close is now the default button when you hit enter
+ - added VC++ project, updated resources to work with VC++
+ - rearranged directory structure
+ - makefiles now target ../../makensisw.exe
+ - removed makensisw home link in help menu (hope this is ok,
+ doesn't really seem needed to me)
+ - made display use a fixed width font (Some people may not like
+ this, but I do)
+ - added 'test' button (peeks output for 'Output' line)
+ - made it so that the log shows the most recent 32k.
+ - made it so that the log always clears on a recompile.
+ - compiled with VC++ so no longer needs msvcrt.dll
+ - made the compiler name be a full path (for more flexibility)
+
+0.6
+ - print correct usage if unable to execute compiler
+ - removed mingw warnings
+ - set title/branding before errors
+ - some docs changes
+ - Added Edit|Edit Script function
+
+0.7
+ - Edit Script should now work for output>32k
+ - Added resize support (thanks to felfert)
+ - Added window position saving (thanks to felfert)
+ - Disable some items when exec of makensis failed
+
+0.8
+ - Added window size constraints (thanks to bcheck)
+ - Cleaned up the resource file
+
+0.9
+ - Removed global strings (moved into #defines)
+ - Some GUI changes
+ - No longer focused Close button (its default anyways)
+ - Fixed resize bug on minimize/restore (thanks to felfert)
+ - Made window placement stored in HKLM instead of HKCU, cause
+ I hate things that get littered in HKCU.
+
+1.0
+ - Fixed bug with large output causing crash
+
+1.1
+ - Crash may actually be fixed
+
+1.2
+ - XP visual style support
+
+1.3
+ - Added Documentation menu item
+ - Fix GUI problem with About dialog
+
+1.4
+ - Edit Script command will now work with or without file associations
+ - Added default filename for save dialog
+ - Use standard fonts
+ - Documentation menuitem caused recompile
+
+1.5
+ - Fixed Copy All function
+
+1.6
+ - Reduced size from 44k to 12k (kichik)
+ - Editbox not limited to 32k (now using richedit control)
+ - Made the log window font-size smaller.
+
+1.7
+ - Added check for warnings
+ - Added sound for sucessfull compilations
+ - Update home page and documentation menu items to Sourceforge page
+
+1.8
+ - Contents of log window are now streamed in
+ - Empty log window check (to prevent random crashes)
+
+1.9
+ - Text always scrolls to bottom (kichik)
+ - Updated link to new docs
+ - Makensisw now takes the same parameters as makensis.exe
+ - Fixed some random crashes
+ - Drag and Drop Support into the Makensisw window
+ - Updated icon to more sexy one
+ - Added Load Script option on File menu
+ - Added Search Dialog (Ctrl+F) (kichik)
+ - Added Select All (Ctrl+A), Copy (Ctrl+C), Exit (Alt+X) keys
+ - Branding text now reflects NSIS version
+ - Added some simple tool tips
+ - Added Context Menu in log window
+ - Added resize gripper
+ - Ctrl+L loads a script
+ - Added Clear Log (Ctrl+W)
+ - Browse Script (Ctrl+B) launches explorer in script directory
+ - Check for Update command
+ - Added link to the NSIS Forum under Help menu
+ - Bunch of other stuff not worth mentioning
+ - Define Symbols menu (Ctrl+D)
+
+2.0
+ - Improved user interface
+ - Define Symbols is available even if a script is not loaded
+ - Defined Symbols are saved on exit and reloaded on start
+ - Added NSIS Update menu
+ - Added toolbar for commonly used menus
+ - Made the Toolbar style flat
+ - Added option for compile & run
+ - Added compressor setting option
+ - Added support for lzma compression
+ - Added named Symbols sets.
+
+2.1
+ - Added "Cancel compilation" menu item
+
+2.2
+- Settings saved in HKCU instead of HKLM
+- Added menu accelerators to MRU list
+
+2.3
+- Escape button closes MakeNSISw
+
+2.3.1
+- Fixed broken command line parameter handling
+
+Copyright Information
+---------------------
+Copyright (c) 2002 Robert Rainwater
+Contributors: Justin Frankel, Fritz Elfert, Amir Szekely, Sunil Kamath, Joost Verburg
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
diff --git a/Engine/bin/tools/nsis/app/Docs/nsDialogs/Readme.html b/Engine/bin/tools/nsis/app/Docs/nsDialogs/Readme.html
new file mode 100644
index 000000000..670334b29
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/nsDialogs/Readme.html
@@ -0,0 +1,924 @@
+
+
+
+nsDialogs
+
+
+
+
+
+NSIS nsDialogs Plug-in
+Next generation of user interface design
+
+Table of Contents
+
+
+
+Introduction
+
+nsDialogs allows creation of custom pages in the installer. On top of the built-in pages, nsDialogs can create pages with any type of controls in any order and arrangement. It can create everything from a simple page with one label to form which reacts to user's actions. Modern UI 2, for example, uses nsDialogs to create the welcome and finish pages.
+
+nsDialogs is a new NSIS plug-in, introduced in version 2.29 as a replacement for InstallOptions. nsDialogs doesn't use INI files, so it's way faster than InstallOptions. Integration with the script is tighter and more natural - creating controls is done using plug-in functions and notification is done by directly calling a function in the script. Unlike InstallOptions, there isn't a predefined set of available control type and by providing a lower level access to Windows API, every type of control can be created and pages can be more customizable.
+
+The same thing that makes nsDialogs more flexible can also make it more complicated for users with no knowledge of Win32 API. This is solved by creating a library of predefined functions, defined in script, that allow creation and handling of controls. This way, novices get easy access to the flexibility, while advanced users still get access to the core functionality by modifying the library or simply avoid using it.
+
+Step-by-Step Tutorial
+
+Basic Script
+
+Before using nsDialogs, lets first create a basic script as our skeleton.
+
+Name nsDialogs
+OutFile nsDialogs.exe
+
+XPStyle on
+
+Page instfiles
+
+Section
+
+ DetailPrint "hello world"
+
+SectionEnd
+
+Custom Page
+
+Next, we'll add a custom page where we can use nsDialogs. nsDialogs cannot be used in sections or any other function but a custom page's function.
+
+Name nsDialogs
+OutFile nsDialogs.exe
+
+XPStyle on
+
+Page custom nsDialogsPage
+Page instfiles
+
+Function nsDialogsPage
+FunctionEnd
+
+Section
+
+ DetailPrint "hello world"
+
+SectionEnd
+
+Creating Page
+
+Now that the foundations are laid, it's time to use nsDialogs. The first call must always be to nsDialogs::Create. It will create a new dialog in the page and return its HWND on the stack. The result must be popped from the stack to prevent stack corruption. If the result is error, the dialog couldn't be created.
+
+nsDialogs::Create accepts one parameter. It has a very specific function, but to keep things simple for this tutorial, it must always be 1018.
+
+HWND is a number that uniquely identifies the dialog and can be used with SendMessage, SetCtlColors and Win32 API.
+
+!include LogicLib.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+
+XPStyle on
+
+Var Dialog
+
+Page custom nsDialogsPage
+Page instfiles
+
+Function nsDialogsPage
+
+ nsDialogs::Create 1018
+ Pop $Dialog
+
+ ${If} $Dialog == error
+ Abort
+ ${EndIf}
+
+FunctionEnd
+
+Section
+
+ DetailPrint "hello world"
+
+SectionEnd
+
+Showing Page
+
+Now that the page is created, it's time to show it. This is done with nsDialogs::Show. This function will not return until the user clicks Next, Back or Cancel.
+
+!include LogicLib.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+
+XPStyle on
+
+Var Dialog
+
+Page custom nsDialogsPage
+Page instfiles
+
+Function nsDialogsPage
+ nsDialogs::Create 1018
+ Pop $Dialog
+
+ ${If} $Dialog == error
+ Abort
+ ${EndIf}
+
+ nsDialogs::Show
+
+FunctionEnd
+
+Section
+
+ DetailPrint "hello world"
+
+SectionEnd
+
+Adding Controls
+
+Compiling the last script and running it results in an empty page which is not very useful. So now we'll add some controls to it to. To do so, we'll use ${NSD_Create*} macros from nsDialogs.nsh. Each of those macros takes 5 parameters - x, y, width, height and text. Each macro also returns one value on the stack, which is the new control's HWND. Like the dialogs HWND, it must be popped from the stack and saved.
+
+Each of the measurements that the macros take can use one of three unit types - pixels, dialog units or percentage of the dialog's size. It can also be negative to indicate it should be measured from the end. To use dialog units, the measurement must be suffixed with the letter u. To use percentage, the measurement must be suffixed with the percentage sign - %. Any other suffix, or no suffix, means pixels.
+
+Dialog units allow creation of dialogs that scale well when different fonts or DPI is used. Its size in pixels is determined on runtime based on the font and the DPI. For example, standard pages in the classic NSIS user interface are 266 dialog units wide and 130 dialog units high. Pages in Modern UI are 300 dialogs units wide and 140 dialog units high. In different resolutions, using different fonts or DPI settings, the dialogs will always have the same size in dialog units, but different size in pixels.
+
+!include nsDialogs.nsh
+!include LogicLib.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+
+XPStyle on
+
+Var Dialog
+Var Label
+Var Text
+
+Page custom nsDialogsPage
+Page instfiles
+
+Function nsDialogsPage
+
+ nsDialogs::Create 1018
+ Pop $Dialog
+
+ ${If} $Dialog == error
+ Abort
+ ${EndIf}
+
+ ${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
+ Pop $Label
+
+ ${NSD_CreateText} 0 13u 100% -13u "Type something here..."
+ Pop $Text
+
+ nsDialogs::Show
+
+FunctionEnd
+
+Section
+
+ DetailPrint "hello world"
+
+SectionEnd
+
+Available control types that can be created with ${NSD_Create*} are:
+
+
+- HLine
+- VLine
+- Label
+- Icon
+- Bitmap
+- BrowseButton
+- Link
+- Button
+- GroupBox
+- CheckBox
+- RadioButton
+- Text
+- Password
+- Number
+- FileRequest
+- DirRequest
+- ComboBox
+- DropList
+- ListBox
+- ProgressBar
+
+
+Control State
+
+Now that we have some controls that the user can interact with, it's time to see what the user actually does with them. For that, we'll first add a leave callback function to our page. In that function, we'll query the state of the text control we've created and display it to the user. To do so, we'll use the ${NSD_GetText} macro. Use the ${NSD_GetState} macro for RadioButton and CheckBox controls.
+
+Note that not all controls support ${NSD_GetText} and some require special handling with specific messages defined in WinMessages.nsh. For example, the ListBox control requires usage of LB_GETCURSEL and LB_GETTEXT. With time, the library of macros in nsDialogs.nsh will fill with more and more macros that'll handle more cases like this.
+
+!include nsDialogs.nsh
+!include LogicLib.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+
+XPStyle on
+
+Var Dialog
+Var Label
+Var Text
+
+Page custom nsDialogsPage nsDialogsPageLeave
+Page instfiles
+
+Function nsDialogsPage
+
+ nsDialogs::Create 1018
+ Pop $Dialog
+
+ ${If} $Dialog == error
+ Abort
+ ${EndIf}
+
+ ${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
+ Pop $Label
+
+ ${NSD_CreateText} 0 13u 100% -13u "Type something here..."
+ Pop $Text
+
+ nsDialogs::Show
+
+FunctionEnd
+
+Function nsDialogsPageLeave
+
+ ${NSD_GetText} $Text $0
+ MessageBox MB_OK "You typed:$\n$\n$0"
+
+FunctionEnd
+
+Section
+
+ DetailPrint "hello world"
+
+SectionEnd
+
+Real-time Notification
+
+One of the more exciting new features of nsDialogs is callback function notification of changes to the dialog. nsDialogs can call a function defined in a script in response to a user action such as changing of a text field or click of a button. To make nsDialogs notify us of events, we'll use ${NSD_OnClick} and ${NSD_OnChange}. Not every control supports both of the events. For example, there is nothing to notify about label changes, only clicks.
+
+When the callback function is called, the control's HWND will be waiting on the stack and must be popped to prevent stack corruption. In this simple example, this is not so useful. But in case of a bigger script where several controls are associated with the same callback function, the HWND can shed some light on which control originated the event.
+
+The new example will respond to the user type hello in the text box.
+
+!include nsDialogs.nsh
+!include LogicLib.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+
+XPStyle on
+
+Var Dialog
+Var Label
+Var Text
+
+Page custom nsDialogsPage nsDialogsPageLeave
+Page instfiles
+
+Function nsDialogsPage
+
+ nsDialogs::Create 1018
+ Pop $Dialog
+
+ ${If} $Dialog == error
+ Abort
+ ${EndIf}
+
+ ${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
+ Pop $Label
+
+ ${NSD_CreateText} 0 13u 100% -13u "Type something here..."
+ Pop $Text
+ ${NSD_OnChange} $Text nsDialogsPageTextChange
+
+ nsDialogs::Show
+
+FunctionEnd
+
+Function nsDialogsPageLeave
+
+ ${NSD_GetText} $Text $0
+ MessageBox MB_OK "You typed:$\n$\n$0"
+
+FunctionEnd
+
+Function nsDialogsPageTextChange
+
+ Pop $1 # $1 == $ Text
+
+ ${NSD_GetText} $Text $0
+
+ ${If} $0 == "hello"
+
+ MessageBox MB_OK "right back at ya!"
+
+ ${EndIf}
+
+FunctionEnd
+
+Section
+
+ DetailPrint "hello world"
+
+SectionEnd
+
+Memory
+
+So far we have a page that has some basic input controls. But what happens when the user goes to the next page and comes back? With the current code, the user's input will not be remembered. To remember, we'll use the already present leave callback function to store the user's choice in variables and pass these values when creating the controls the next time. For a better example, we'll also add a checkbox to the page and use ${NSD_GetState} and ${NSD_SetState} to get and set its state.
+
+For clarity, we'll remove some of the notifications from the previous step.
+
+!include nsDialogs.nsh
+!include LogicLib.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+
+XPStyle on
+
+Var Dialog
+Var Label
+Var Text
+Var Text_State
+Var Checkbox
+Var Checkbox_State
+
+Page custom nsDialogsPage nsDialogsPageLeave
+Page license
+Page instfiles
+
+Function .onInit
+
+ StrCpy $Text_State "Type something here..."
+
+FunctionEnd
+
+Function nsDialogsPage
+
+ nsDialogs::Create 1018
+ Pop $Dialog
+
+ ${If} $Dialog == error
+ Abort
+ ${EndIf}
+
+ ${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
+ Pop $Label
+
+ ${NSD_CreateText} 0 13u 100% 12u $Text_State
+ Pop $Text
+
+ ${NSD_CreateCheckbox} 0 30u 100% 10u "&Something"
+ Pop $Checkbox
+
+ ${If} $Checkbox_State == ${BST_CHECKED}
+ ${NSD_Check} $Checkbox
+ ${EndIf}
+
+ # alternative for the above ${If}:
+ #${NSD_SetState} $Checkbox_State
+
+ nsDialogs::Show
+
+FunctionEnd
+
+Function nsDialogsPageLeave
+
+ ${NSD_GetText} $Text $Text_State
+ ${NSD_GetState} $Checkbox $Checkbox_State
+
+FunctionEnd
+
+Section
+
+ DetailPrint "hello world"
+
+SectionEnd
+
+Function Reference
+
+Create
+
+nsDialogs::Create rect
+
+Creates a new dialog. rect specific the identifier of the control whose location will be mimiced. This should usually be 1018, which is control mimiced for creation of built-in pages. The Modern UI also has control 1040 for the welcome and the finish page.
+
+Returns the new dialog's HWND on the stack or error.
+
+CreateControl
+
+nsDialogs::CreateControl class style extended_style x y width height text
+
+Create a new control in the current dialog. A dialog must exist for this to work, so nsDialogs::Create must be called prior to this function.
+
+Returns the new dialog's HWND on the stack or error.
+
+Show
+
+nsDialogs::Show
+
+Displays the page. Call this once finished with nsDialogs::Create, nsDialogs::CreateControl and the rest.
+
+Returns nothing.
+
+SelectFileDialog
+
+nsDialogs::SelectFileDialog mode initial_selection filter
+
+Displays a file selection dialog to the user. If mode is set to save, displays a file save dialog. If mode is set to open, displays a file open dialog. filter is a list of available file filters separated by pipes. If an empty string is passed, the default is used - All Files|*.*.
+
+initial_selection can be used to provide the user with a default file to look for and/or a default folder to look in. If initial_selection is empty no default filename will be provided for the user and the dialog will start in the current working directory. If initial_selection specifies just a filename, for example "test.exe", the dialog will be set up to look for a file called test.exe in the current working directory. If initial_selection specifies just a directory, for example "C:\Program Files", the dialog starts in the provided directory with no file name provided. If initial_selection specifies a directory and a filename, for example "C:\Windows\System32\calc.exe", the dialog will be set up to look for a file called calc.exe in the directory C:\Windows\System32.
+
+Returns the selected file on the stack or an empty string if the user canceled the operation.
+
+SelectFolderDialog
+
+nsDialogs::SelectFolderDialog title initial_selection
+
+Displays a directory selection dialog to the user.
+
+Returns the selected directory on the stack or "error" in case the user canceled the operation or an error occured.
+
+SetRTL
+
+nsDialogs::SetRTL rtl_setting
+
+Sets right-to-left mode on or off. If rtl_setting is 0, it's set to off. If rtl_setting is 1, it's set to on. This function must be called before any calls to nsDialogs::CreateControl.
+
+Returns nothing.
+
+GetUserData
+
+nsDialogs::GetUserData control_HWND
+
+Returns user data associated with the control on the stack. Use nsDialogs::SetUserData to set this data.
+
+SetUserData
+
+nsDialogs::SetUserData control_HWND data
+
+Associates data with the control. Use nsDialogs::GetUserData to get this data.
+
+Returns nothing.
+
+OnBack
+
+nsDialogs::OnBack function_address
+
+Sets the callback function for the Back button. This function will be called when the user clicks the back button. Call Abort in this function to prevent the user from going back to the last page.
+
+Use GetFunctionAddress to get the address of the desired callback function.
+
+Returns nothing.
+
+OnChange
+
+nsDialogs::OnChange control_HWND function_address
+
+Sets a change notification callback function for the given control. Whenever the control changes, the function will be called and the control's HWND will be waiting on its stack.
+
+Use GetFunctionAddress to get the address of the desired callback function.
+
+Returns nothing.
+
+OnClick
+
+nsDialogs::OnClick control_HWND function_address
+
+Sets a click notification callback function for the given control. Whenever the control is clicked, the function will be called and the control's HWND will be waiting on its stack.
+
+Use GetFunctionAddress to get the address of the desired callback function.
+
+Returns nothing.
+
+OnNotify
+
+nsDialogs::OnNotify control_HWND function_address
+
+Sets a notification callback function for the given control. Whenever the control receives the WM_NOTIFY message, the function will be called and the control's HWND, notification code and a pointer to the MNHDR structure will be waiting on its stack.
+
+Use GetFunctionAddress to get the address of the desired callback function.
+
+Returns nothing.
+
+OnTimer
+
+nsDialogs::OnTimer function_address timer_interval
+
+Sets a timer that'd call the callback function for the given control every in a constant interval. Interval times are specified in milliseconds.
+
+Use GetFunctionAddress to get the address of the desired callback function.
+
+Returns nothing.
+
+KillTimer
+
+nsDialogs::KillTimer function_address
+
+Kills a previously set timer.
+
+Use GetFunctionAddress to get the address of the desired callback function.
+
+Returns nothing.
+
+Macro Reference
+
+nsDialogs.nsh contains a lot of macros that can make nsDialogs usage a lot easier. Below is a description of each of those macros including purpose, syntax, input and output.
+
+NSD_Create*
+
+${NSD_Create*} x y width height text
+
+Create a new control in the current dialog. A dialog must exist for this to work, so nsDialogs::Create must be called prior to this function.
+
+Available variants:
+
+
+- ${NSD_CreateHLine}
+- ${NSD_CreateVLine}
+- ${NSD_CreateLabel}
+- ${NSD_CreateIcon}
+- ${NSD_CreateBitmap}
+- ${NSD_CreateBrowseButton}
+- ${NSD_CreateLink}
+- ${NSD_CreateButton}
+- ${NSD_CreateGroupBox}
+- ${NSD_CreateCheckBox}
+- ${NSD_CreateRadioButton}
+- ${NSD_CreateText}
+- ${NSD_CreatePassword}
+- ${NSD_CreateNumber}
+- ${NSD_CreateFileRequest}
+- ${NSD_CreateDirRequest}
+- ${NSD_CreateComboBox}
+- ${NSD_CreateDropList}
+- ${NSD_CreateListBox}
+- ${NSD_CreateProgressBar}
+
+
+Returns the new dialog's HWND on the stack or error.
+
+NSD_OnBack
+
+${NSD_OnBack} function_address
+
+See OnBack for more details.
+
+
+
+NSD_OnChange
+
+${NSD_OnChange} control_HWND function_address
+
+See OnChange for more details.
+
+See Real-time Notification for usage example.
+
+NSD_OnClick
+
+${NSD_OnClick} control_HWND function_address
+
+See OnClick for more details.
+
+NSD_OnNotify
+
+${NSD_OnNotify} control_HWND function_address
+
+See OnNotify for more details.
+
+NSD_OnTimer
+
+${NSD_OnTimer} function_address timer_interval
+
+See OnTimer for more details.
+
+NSD_KillTimer
+
+${NSD_KillTimer} function_address
+
+See KillTimer for more details.
+
+NSD_AddStyle
+
+${NSD_AddStyle} control_HWND style
+
+Adds one or more window style to a control. Multiple styles should be separated with pipes `|'.
+
+See MSDN for style description.
+
+NSD_AddExStyle
+
+${NSD_AddExStyle} control_HWND style
+
+Adds one or more extended window style to a control. Multiple styles should be separated with pipes `|'.
+
+See MSDN for style description.
+
+NSD_GetText
+
+${NSD_GetText} control_HWND output_variable
+
+Retrieves the text of a control and stores it into output_variable. Especially useful for textual controls.
+
+See Control State for usage example.
+
+NSD_SetText
+
+${NSD_SetText} control_HWND text
+
+Sets the text of a control.
+
+NSD_SetTextLimit
+
+${NSD_SetTextLimit} control_HWND limit
+
+Sets input size limit for a text control.
+
+NSD_GetState
+
+${NSD_GetState} control_HWND output_variable
+
+Retrieves the state of a check box or a radio button control. Possible outputs are ${BST_CHECKED} and ${BST_UNCHECKED}.
+
+See Memory for usage example.
+
+NSD_SetState
+
+${NSD_SetState} control_HWND state
+
+Sets the state of a check box or a radio button control. Possible values for state are ${BST_CHECKED} and ${BST_UNCHECKED}.
+
+See Memory for usage example.
+
+NSD_Check
+
+${NSD_Check} control_HWND
+
+Checks a check box or a radio button control. Same as calling ${NSD_SetState} with ${BST_CHECKED}.
+
+NSD_Uncheck
+
+${NSD_Uncheck} control_HWND
+
+Unchecks a check box or a radio button control. Same as calling ${NSD_SetState} with ${BST_UNCHECKED}.
+
+See Memory for usage example.
+
+NSD_CB_AddString
+
+${NSD_CB_AddString} combo_HWND string
+
+Adds a string to a combo box.
+
+NSD_CB_SelectString
+
+${NSD_CB_SelectString} combo_HWND string
+
+Selects a string in a combo box.
+
+NSD_LB_AddString
+
+${NSD_LB_AddString} listbox_HWND string
+
+Adds a string to a list box.
+
+NSD_LB_DelString
+
+${NSD_LB_DelString} listbox_HWND string
+
+Deletes a string from a list box.
+
+
+
+${NSD_LB_Clear} listbox_HWND
+
+Deletes all strings from a list box.
+
+
+
+${NSD_LB_GetCount} listbox_HWND output_variable
+
+Retrieves the number of strings from a list box.
+
+NSD_LB_SelectString
+
+${NSD_LB_SelectString} listbox_HWND string
+
+Selects a string in a list box.
+
+
+
+${NSD_LB_GetSelection} listbox_HWND output_variable
+
+Retrieves the selected stringed from a list box. Returns an empty string if no string is selected.
+
+NSD_SetFocus
+
+${NSD_SetFocus} control_HWND
+
+Sets focus to a control.
+
+NSD_SetImage
+
+${NSD_SetImage} control_HWND image_path output_variable
+
+Loads a bitmap from image_path and displays it on control_HWND created by ${NSD_CreateBitmap}. The image handle is stored in output_variable and should be freed using ${NSD_FreeImage} once no longer necessary.
+
+The image must be extracted to the user's computer prior to calling this macro. A good place to extract images is $PLUGINSDIR.
+
+!include nsDialogs.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+
+XPStyle on
+
+Page custom nsDialogsImage
+Page instfiles
+
+Var Dialog
+Var Image
+Var ImageHandle
+
+Function .onInit
+
+ InitPluginsDir
+ File /oname=$PLUGINSDIR\image.bmp "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
+
+FunctionEnd
+
+Function nsDialogsImage
+
+ nsDialogs::Create 1018
+ Pop $Dialog
+
+ ${If} $Dialog == error
+ Abort
+ ${EndIf}
+
+ ${NSD_CreateBitmap} 0 0 100% 100% ""
+ Pop $Image
+ ${NSD_SetImage} $Image $PLUGINSDIR\image.bmp $ImageHandle
+
+ nsDialogs::Show
+
+ ${NSD_FreeImage} $ImageHandle
+
+FunctionEnd
+
+Section
+SectionEnd
+
+NSD_SetStretchedImage
+
+${NSD_SetStretchedImage} control_HWND image_path output_variable
+
+Loads and displays a bitmap just like ${NSD_SetImage}, but stretched the image to fit the control.
+
+NSD_SetIcon
+
+${NSD_SetIcon} control_HWND image_path output_variable
+
+Same as ${NSD_SetImage}, but used for loading and setting an icon in a control created by ${NSD_CreateIcon}. The image handle is stored in output_variable and should be freed using ${NSD_FreeIcon} once no longer necessary.
+
+NSD_SetIconFromInstaller
+
+${NSD_SetIconFromInstaller} control_HWND output_variable
+
+Loads the icon used in the isntaller and displays it on control_HWND created by ${NSD_CreateIcon}. The image handle is stored in output_variable and should be freed using ${NSD_FreeIcon} once no longer necessary.
+
+NSD_ClearImage
+
+${NSD_ClearImage} control_HWND
+
+Clears an image from a control.
+
+NSD_ClearIcon
+
+${NSD_ClearIcon} control_HWND
+
+Clears an icon from a control.
+
+NSD_FreeImage
+
+${NSD_FreeImage} image_handle
+
+Frees an image handle previously loaded with ${NSD_SetImage} or ${NSD_SetStretchedImage}.
+
+NSD_FreeIcon
+
+${NSD_FreeIcon} icon_handle
+
+Frees an icon handle previously loaded with ${NSD_SetIcon} or ${NSD_SetIconFromInstaller}.
+
+
+FAQ
+
+
+
+
+
+-
+Q: Can nsDialogs handle InstallOptions INI files?
+
+A: nsDialogs.nsh contains a function called CreateDialogFromINI that can create nsDialogs' dialog from an INI file. It can handle every type of control InstallOptions supports, but doesn't handle the flags or notification yet. Examples\nsDialogs\InstallOptions.nsi shows a usage example of this function.
In the future there'll also be a function that creates the script itself.
+
+
+
+
+
+
+
+
+
diff --git a/Engine/bin/tools/nsis/app/Docs/nsExec/nsExec.txt b/Engine/bin/tools/nsis/app/Docs/nsExec/nsExec.txt
new file mode 100644
index 000000000..3fcb5cf75
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Docs/nsExec/nsExec.txt
@@ -0,0 +1,49 @@
+nsExec
+------
+nsExec will execute command-line based programs and capture the output
+without opening a dos box.
+
+
+Usage
+-----
+nsExec::Exec [/OEM] [/TIMEOUT=x] path
+
+-or-
+
+nsExec::ExecToLog [/OEM] [/TIMEOUT=x] path
+
+-or-
+
+nsExec::ExecToStack [/OEM] [/TIMEOUT=x] path
+
+All functions are the same except ExecToLog will print the output
+to the log window and ExecToStack will push up to ${NSIS_MAX_STRLEN}
+characters of output onto the stack after the return value.
+
+Use the /OEM switch to convert the output text from OEM to ANSI.
+
+The timeout value is optional. The timeout is the time in
+milliseconds nsExec will wait for output. If output from the
+process is received, the timeout value is reset and it will
+again wait for more output using the timeout value. See Return
+Value for how to check if there was a timeout.
+
+To ensure that command are executed without problems on all windows versions,
+is recommended to use the following syntax:
+
+ nsExec::ExecToStack [OPTIONS] '"PATH" param1 param2 paramN'
+
+This way the application path may contain non 8.3 paths (with spaces)
+
+Return Value
+------------
+If nsExec is unable to execute the process, it will return "error"
+on the top of the stack, if the process timed out it will return
+"timeout", else it will return the return code from the
+executed process.
+
+
+Copyright Info
+--------------
+Copyright (c) 2002 Robert Rainwater
+Thanks to Justin Frankel and Amir Szekely
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/AdvSplash/Example.nsi b/Engine/bin/tools/nsis/app/Examples/AdvSplash/Example.nsi
new file mode 100644
index 000000000..751c8361c
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/AdvSplash/Example.nsi
@@ -0,0 +1,35 @@
+Name "AdvSplash.dll test"
+
+OutFile "AdvSplash Test.exe"
+
+XPStyle on
+
+Function .onInit
+ # the plugins dir is automatically deleted when the installer exits
+ InitPluginsDir
+ File /oname=$PLUGINSDIR\splash.bmp "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp"
+ #optional
+ #File /oname=$PLUGINSDIR\splash.wav "C:\myprog\sound.wav"
+
+ MessageBox MB_OK "Fading"
+
+ advsplash::show 1000 600 400 -1 $PLUGINSDIR\splash
+
+ Pop $0 ; $0 has '1' if the user closed the splash screen early,
+ ; '0' if everything closed normally, and '-1' if some error occurred.
+
+ MessageBox MB_OK "Transparency"
+ File /oname=$PLUGINSDIR\splash.bmp "${NSISDIR}\Contrib\Graphics\Wizard\orange-uninstall.bmp"
+ advsplash::show 2000 0 0 0x1856B1 $PLUGINSDIR\splash
+ Pop $0
+
+ MessageBox MB_OK "Transparency/Fading"
+ File /oname=$PLUGINSDIR\splash.bmp "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp"
+ advsplash::show 1000 600 400 0x04025C $PLUGINSDIR\splash
+ Pop $0
+
+ Delete $PLUGINSDIR\splash.bmp
+FunctionEnd
+
+Section
+SectionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/Banner/Example.nsi b/Engine/bin/tools/nsis/app/Examples/Banner/Example.nsi
new file mode 100644
index 000000000..2a98e875f
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Banner/Example.nsi
@@ -0,0 +1,38 @@
+# Look at Readme.txt for usage alongside with the Modern UI
+
+!include "WinMessages.nsh"
+
+Name "Banner.dll test"
+
+OutFile "Banner Test.exe"
+
+ShowInstDetails show
+
+Function .onInit
+ Banner::show "Calculating important stuff..."
+
+ Banner::getWindow
+ Pop $1
+
+ again:
+ IntOp $0 $0 + 1
+ Sleep 1
+ StrCmp $0 100 0 again
+
+ GetDlgItem $2 $1 1030
+ SendMessage $2 ${WM_SETTEXT} 0 "STR:Calculating more important stuff..."
+
+ again2:
+ IntOp $0 $0 + 1
+ Sleep 1
+ StrCmp $0 200 0 again2
+
+ Banner::destroy
+FunctionEnd
+
+Section
+ DetailPrint "Using previous calculations to quickly calculate 1*2000..."
+ Sleep 1000
+ DetailPrint "Eureka! It's $0!!!"
+ DetailPrint ""
+SectionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/BgImage/Example.nsi b/Engine/bin/tools/nsis/app/Examples/BgImage/Example.nsi
new file mode 100644
index 000000000..14154ddbb
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/BgImage/Example.nsi
@@ -0,0 +1,100 @@
+Name "BgImage.dll test"
+
+OutFile "BgImage Test.exe"
+
+XPStyle on
+
+!define DEBUG
+!macro GetReturnValue
+!ifdef DEBUG
+ Pop $R9
+ StrCmp $R9 success +2
+ DetailPrint "Error: $R9"
+!endif
+!macroend
+
+Function .onGUIInit
+ # the plugins dir is automatically deleted when the installer exits
+ InitPluginsDir
+ # lets extract some bitmaps...
+ File /oname=$PLUGINSDIR\1.bmp "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp"
+ File /oname=$PLUGINSDIR\2.bmp "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp"
+
+!ifdef DEBUG
+ # turn return values on if in debug mode
+ BgImage::SetReturn on
+!endif
+
+ # set the initial background for images to be drawn on
+ # we will use a gradient from drak green to dark red
+ BgImage::SetBg /GRADIENT 0 0x80 0 0x80 0 0
+ !insertmacro GetReturnValue
+ # add an image @ (150,0)
+ BgImage::AddImage $PLUGINSDIR\2.bmp 150 0
+ !insertmacro GetReturnValue
+ # add the same image only transparent (magenta wiped) @ (150,16)
+ BgImage::AddImage /TRANSPARENT 255 0 255 $PLUGINSDIR\2.bmp 150 16
+ !insertmacro GetReturnValue
+ # create the font for the following text
+ CreateFont $R0 "Comic Sans MS" 50 700
+ # add a blue shadow for the text
+ BgImage::AddText "Testing 1... 2... 3..." $R0 0 0 255 48 48 798 198
+ !insertmacro GetReturnValue
+ # add a green shadow for the text
+ BgImage::AddText "Testing 1... 2... 3..." $R0 0 255 0 52 52 802 202
+ !insertmacro GetReturnValue
+ # add the text
+ BgImage::AddText "Testing 1... 2... 3..." $R0 255 0 0 50 50 800 200
+ !insertmacro GetReturnValue
+ # show our creation to the world!
+ BgImage::Redraw
+ # Refresh doesn't return any value
+
+FunctionEnd
+
+ShowInstDetails show
+
+Section
+ # play some sounds
+ FindFirst $0 $1 $WINDIR\Media\*.wav
+ StrCmp $0 "" skipSound
+ moreSounds:
+ StrCmp $1 "" noMoreSounds
+ BgImage::Sound /WAIT $WINDIR\Media\$1
+ # Sound doesn't return any value either
+ MessageBox MB_YESNO "Another sound?" IDNO noMoreSounds
+ FindNext $0 $1
+ Goto moreSounds
+
+ noMoreSounds:
+ FindClose $0
+ skipSound:
+
+ # change the background image to Mike, tiled
+ BgImage::SetBg /TILED $PLUGINSDIR\1.bmp
+ !insertmacro GetReturnValue
+ # we have to redraw to reflect the changes
+ BgImage::Redraw
+
+ MessageBox MB_OK "Mike the llama"
+
+ # clear everything
+ BgImage::Clear
+ # Clear doesn't return any value
+ # set another gradient
+ BgImage::SetBg /GRADIENT 0xFF 0xFA 0xBA 0xAA 0xA5 0x65
+ !insertmacro GetReturnValue
+ # add some text
+ BgImage::AddText "A Desert for Mike" $R0 0 0 0 50 50 800 150
+ !insertmacro GetReturnValue
+ # add mike as an image
+ BgImage::AddImage $PLUGINSDIR\1.bmp 50 150
+ !insertmacro GetReturnValue
+ # again, we have to call redraw to reflect changes
+ BgImage::Redraw
+SectionEnd
+
+Function .onGUIEnd
+ BgImage::Destroy
+ # Destroy doesn't return any value
+FunctionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/FileFunc.ini b/Engine/bin/tools/nsis/app/Examples/FileFunc.ini
new file mode 100644
index 000000000..5b227f415
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/FileFunc.ini
@@ -0,0 +1,91 @@
+[Settings]
+NumFields=11
+NextButtonText=&Enter
+
+[Field 1]
+Type=Droplist
+Flags=NOTIFY
+State=" 1. Locate"
+ListItems=| 1. Locate| 2. GetSize (file)| (directory)| (no size, no subdir)| 3. DriveSpace| 4. GetDrives (by type)| (all by letter)| 5. GetTime (local time)| (file time)| 6. GetFileAttributes| 7. GetFileVersion| 8. GetExeName| 9. GetExePath|10. GetParameters|11. GetOptions|12. GetRoot|13. GetParent|14. GetFileName|15. GetBaseName|16. GetFileExt|17. BannerTrimPath|18. DirState|19. RefreshShellIcons
+Left=44
+Right=190
+Top=1
+Bottom=210
+
+[Field 2]
+Type=FileRequest
+Left=44
+Right=-10
+Top=22
+Bottom=33
+
+[Field 3]
+Type=DirRequest
+Left=44
+Right=-10
+Top=22
+Bottom=33
+
+[Field 4]
+Type=Text
+Left=44
+Right=-10
+Top=36
+Bottom=49
+
+[Field 5]
+Type=Text
+State=LocateCallback
+Left=44
+Right=232
+Top=53
+Bottom=66
+
+[Field 6]
+Type=Button
+Text=view
+Flags=NOTIFY
+Left=236
+Right=255
+Top=54
+Bottom=65
+
+[Field 7]
+Type=Text
+Flags=MULTILINE|VSCROLL|HSCROLL|READONLY
+Left=44
+Right=-10
+Top=73
+Bottom=128
+
+[Field 8]
+Type=Label
+Text=Path
+Left=10
+Right=43
+Top=24
+Bottom=36
+
+[Field 9]
+Type=Label
+Text=Options
+Left=10
+Right=43
+Top=40
+Bottom=52
+
+[Field 10]
+Type=Label
+Text=Function
+Left=10
+Right=44
+Top=56
+Bottom=67
+
+[Field 11]
+Type=Label
+Text=Result:
+Left=12
+Right=42
+Top=94
+Bottom=102
diff --git a/Engine/bin/tools/nsis/app/Examples/FileFunc.nsi b/Engine/bin/tools/nsis/app/Examples/FileFunc.nsi
new file mode 100644
index 000000000..f109ec7ca
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/FileFunc.nsi
@@ -0,0 +1,732 @@
+;_____________________________________________________________________________
+;
+; File Functions
+;_____________________________________________________________________________
+;
+; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
+
+Name "File Functions"
+OutFile "FileFunc.exe"
+Caption "$(^Name)"
+XPStyle on
+RequestExecutionLevel user
+
+!include "WinMessages.nsh"
+!include "FileFunc.nsh"
+
+Var INI
+Var HWND
+Var STATE
+Var FUNCTION
+Var LOCATE1
+Var LOCATE2
+Var GETSIZE1
+Var GETSIZE2
+Var GETSIZE3
+Var GETSIZE4
+Var GETSIZE5
+Var GETSIZE6
+Var DRIVESPACE1
+Var DRIVESPACE2
+Var GETDRIVES1
+Var GETTIME1
+Var GETTIME2
+Var GETFILEATTRIBUTES1
+Var GETFILEATTRIBUTES2
+Var GETFILEVERSION1
+Var GETOPTIONS1
+Var GETOPTIONS2
+Var GETROOT1
+Var GETPARENT1
+Var GETFILENAME1
+Var GETBASENAME1
+Var GETFILEEXT1
+Var BANNERTRIMPATH1
+Var BANNERTRIMPATH2
+Var DIRSTATE1
+
+Page Custom ShowCustom LeaveCustom
+
+Function ShowCustom
+ InstallOptions::initDialog "$INI"
+ Pop $hwnd
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1206
+ EnableWindow $1 0
+ SendMessage $1 ${WM_ENABLE} 1 0
+ StrCpy $LOCATE1 $DOCUMENTS
+ StrCpy $LOCATE2 '/L=FD /M=*.* /S=0B /G=1 /B=0'
+ StrCpy $GETSIZE1 '$WINDIR'
+ StrCpy $GETSIZE2 '/M=Explorer.exe /S=0K /G=0'
+ StrCpy $GETSIZE3 '$PROGRAMFILES\Common Files'
+ StrCpy $GETSIZE4 '/S=0M'
+ StrCpy $GETSIZE5 '$WINDIR'
+ StrCpy $GETSIZE6 '/G=0'
+ StrCpy $DRIVESPACE1 'C:\'
+ StrCpy $DRIVESPACE2 '/D=F /S=M'
+ StrCpy $GETDRIVES1 'FDD+CDROM'
+ StrCpy $GETTIME1 '$WINDIR\Explorer.exe'
+ StrCpy $GETTIME2 'C'
+ StrCpy $GETFILEATTRIBUTES1 'C:\IO.SYS'
+ StrCpy $GETFILEATTRIBUTES2 'ALL'
+ StrCpy $GETFILEVERSION1 '$WINDIR\Explorer.exe'
+ StrCpy $GETOPTIONS1 '/SILENT=yes /INSTDIR="$PROGRAMFILES\Common Files"'
+ StrCpy $GETOPTIONS2 '/INSTDIR='
+ StrCpy $GETROOT1 'C:\path\file.dll'
+ StrCpy $GETPARENT1 'C:\path\file.dll'
+ StrCpy $GETFILENAME1 'C:\path\file.dll'
+ StrCpy $GETBASENAME1 'C:\path\file.dll'
+ StrCpy $GETFILEEXT1 'C:\path\file.dll'
+ StrCpy $BANNERTRIMPATH1 'C:\Server\Documents\Terminal\license.htm'
+ StrCpy $BANNERTRIMPATH2 '34A'
+ StrCpy $DIRSTATE1 '$TEMP'
+
+ GetDlgItem $1 $HWND 1203
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$LOCATE1"
+ GetDlgItem $1 $HWND 1205
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$LOCATE2"
+ InstallOptions::show
+ Pop $0
+FunctionEnd
+
+Function LeaveCustom
+ ReadINIStr $STATE $INI "Field 1" "State"
+ ReadINIStr $R1 $INI "Field 2" "State"
+ ReadINIStr $R2 $INI "Field 3" "State"
+ ReadINIStr $R3 $INI "Field 4" "State"
+ ReadINIStr $R4 $INI "Field 5" "State"
+ ReadINIStr $0 $INI "Settings" "State"
+ StrCmp $0 6 view
+ StrCmp $0 0 Enter
+ goto main
+
+ view:
+ StrCpy $0 '$$'
+ StrCpy $1 'n'
+ StrCpy $2 'r'
+ StrCmp $R4 "LocateCallback" 0 +3
+ StrCpy $R0 `Function LocateCallback$\r$\n MessageBox MB_OKCANCEL '$0$$R9 "path\name"=[$$R9]$0\$1$0$$R8 "path" =[$$R8]$0\$1$0$$R7 "name" =[$$R7]$0\$1$0$$R6 "size" =[$$R6]' IDOK +2$\r$\n StrCpy $$R0 StopLocate$\r$\n$\r$\n Push $$R0$\r$\nFunctionEnd`
+ goto send
+ StrCmp $R4 "GetDrivesCallback" 0 error
+ StrCpy $R0 `Function GetDrivesCallback$\r$\n MessageBox MB_OKCANCEL '$0$$9 "drive letter"=[$$9]$0\$1$0$$8 "drive type" =[$$8]' IDOK +2$\r$\n StrCpy $$R0 StopGetDrives$\r$\n StrCpy $$R5 '$$R5$$9 [$$8 Drive]$$\$2$$\$1'$\r$\n$\r$\n Push $$R0$\r$\nFunctionEnd`
+ goto send
+
+ main:
+ StrCmp $FUNCTION '' DefaultSend
+ StrCmp $FUNCTION Locate 0 +4
+ StrCpy $LOCATE1 $R2
+ StrCpy $LOCATE2 $R3
+ goto DefaultSend
+ StrCmp $FUNCTION GetSize1 0 +4
+ StrCpy $GETSIZE1 $R2
+ StrCpy $GETSIZE2 $R3
+ goto DefaultSend
+ StrCmp $FUNCTION GetSize2 0 +4
+ StrCpy $GETSIZE3 $R2
+ StrCpy $GETSIZE4 $R3
+ goto DefaultSend
+ StrCmp $FUNCTION GetSize3 0 +4
+ StrCpy $GETSIZE5 $R2
+ StrCpy $GETSIZE6 $R3
+ goto DefaultSend
+ StrCmp $FUNCTION DriveSpace 0 +4
+ StrCpy $DRIVESPACE1 $R1
+ StrCpy $DRIVESPACE2 $R3
+ goto DefaultSend
+ StrCmp $FUNCTION GetDrives 0 +3
+ StrCpy $GETDRIVES1 $R1
+ goto DefaultSend
+ StrCmp $FUNCTION GetTime 0 +4
+ StrCpy $GETTIME1 $R1
+ StrCpy $GETTIME2 $R3
+ goto DefaultSend
+ StrCmp $FUNCTION GetFileAttributes 0 +4
+ StrCpy $GETFILEATTRIBUTES1 $R1
+ StrCpy $GETFILEATTRIBUTES2 $R3
+ goto DefaultSend
+ StrCmp $FUNCTION GetFileVersion 0 +3
+ StrCpy $GETFILEVERSION1 $R1
+ goto DefaultSend
+ StrCmp $FUNCTION GetOptions 0 +4
+ StrCpy $GETOPTIONS1 $R1
+ StrCpy $GETOPTIONS2 $R3
+ goto DefaultSend
+ StrCmp $FUNCTION GetRoot 0 +3
+ StrCpy $GETROOT1 $R1
+ goto DefaultSend
+ StrCmp $FUNCTION GetParent 0 +3
+ StrCpy $GETPARENT1 $R1
+ goto DefaultSend
+ StrCmp $FUNCTION GetFileName 0 +3
+ StrCpy $GETFILENAME1 $R1
+ goto DefaultSend
+ StrCmp $FUNCTION GetBaseName 0 +3
+ StrCpy $GETBASENAME1 $R1
+ goto DefaultSend
+ StrCmp $FUNCTION GetFileExt 0 +3
+ StrCpy $GETFILEEXT1 $R1
+ goto DefaultSend
+ StrCmp $FUNCTION BannerTrimPath 0 +4
+ StrCpy $BANNERTRIMPATH1 $R1
+ StrCpy $BANNERTRIMPATH2 $R3
+ goto DefaultSend
+ StrCmp $FUNCTION DirState 0 +2
+ StrCpy $DIRSTATE1 $R2
+
+ DefaultSend:
+ GetDlgItem $1 $HWND 1201
+ EnableWindow $1 1
+ ShowWindow $1 0
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1202
+ EnableWindow $1 1
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1203
+ EnableWindow $1 1
+ ShowWindow $1 0
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1204
+ EnableWindow $1 1
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1205
+ EnableWindow $1 1
+ GetDlgItem $1 $HWND 1206
+ ShowWindow $1 0
+ EnableWindow $1 0
+ GetDlgItem $1 $HWND 1207
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1208
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+
+ ReadINIStr $0 $INI "Field 1" "State"
+ StrCmp $0 " 1. Locate" 0 GetSize1Send
+ StrCpy $FUNCTION Locate
+ GetDlgItem $1 $HWND 1203
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$LOCATE1"
+ GetDlgItem $1 $HWND 1204
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$LOCATE2"
+ GetDlgItem $1 $HWND 1206
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:LocateCallback"
+ GetDlgItem $1 $HWND 1207
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Path"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Options"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Function"
+ abort
+
+ GetSize1Send:
+ StrCmp $0 " 2. GetSize (file)" 0 GetSize2Send
+ StrCpy $FUNCTION 'GetSize1'
+ GetDlgItem $1 $HWND 1203
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE1"
+ GetDlgItem $1 $HWND 1204
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE2"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:File"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Options"
+ Abort
+
+ GetSize2Send:
+ StrCmp $0 " (directory)" 0 GetSize3Send
+ StrCpy $FUNCTION 'GetSize2'
+ GetDlgItem $1 $HWND 1203
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE3"
+ GetDlgItem $1 $HWND 1204
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE4"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Directory"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Options"
+ Abort
+
+ GetSize3Send:
+ StrCmp $0 " (no size, no subdir)" 0 DriveSpaceSend
+ StrCpy $FUNCTION 'GetSize3'
+ GetDlgItem $1 $HWND 1203
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE5"
+ GetDlgItem $1 $HWND 1204
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE6"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Directory"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Options"
+ Abort
+
+ DriveSpaceSend:
+ StrCmp $0 " 3. DriveSpace" 0 GetDrivesSend
+ StrCpy $FUNCTION DriveSpace
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$DRIVESPACE1"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ EnableWindow $1 0
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$DRIVESPACE2"
+ GetDlgItem $1 $HWND 1206
+ ShowWindow $1 0
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1207
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Drive"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Options"
+ abort
+
+ GetDrivesSend:
+ StrCmp $0 " 4. GetDrives (by type)" 0 GetDrives2Send
+ StrCpy $FUNCTION GetDrives
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETDRIVES1"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ EnableWindow $1 0
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1206
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:GetDrivesCallback"
+ GetDlgItem $1 $HWND 1207
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Option"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Function"
+ abort
+
+ GetDrives2Send:
+ StrCmp $0 " (all by letter)" 0 GetTime1Send
+ StrCpy $FUNCTION ''
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ EnableWindow $1 0
+ SendMessage $1 ${WM_ENABLE} 1 0
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:ALL"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ EnableWindow $1 0
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1206
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:GetDrivesCallback"
+ GetDlgItem $1 $HWND 1207
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Option"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Function"
+ abort
+
+ GetTime1Send:
+ StrCmp $0 " 5. GetTime (local time)" 0 GetTime2Send
+ StrCpy $FUNCTION ''
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ EnableWindow $1 0
+ SendMessage $1 ${WM_ENABLE} 1 0
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ EnableWindow $1 0
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 1
+ EnableWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:L"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Option"
+ Abort
+
+ GetTime2Send:
+ StrCmp $0 " (file time)" 0 GetFileAttributesSend
+ StrCpy $FUNCTION GetTime
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETTIME1"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETTIME2"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:File"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Option"
+ Abort
+
+ GetFileAttributesSend:
+ StrCmp $0 " 6. GetFileAttributes" 0 GetFileVersionSend
+ StrCpy $FUNCTION GetFileAttributes
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILEATTRIBUTES1"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILEATTRIBUTES2"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Path"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Attrib"
+ Abort
+
+ GetFileVersionSend:
+ StrCmp $0 " 7. GetFileVersion" 0 GetCmdSend
+ StrCpy $FUNCTION GetFileVersion
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILEVERSION1"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:File"
+ Abort
+
+ GetCmdSend:
+ StrCmp $0 " 8. GetExeName" +3
+ StrCmp $0 " 9. GetExePath" +2
+ StrCmp $0 "10. GetParameters" 0 GetOptionsSend
+ StrCpy $FUNCTION ''
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 0
+ Abort
+
+ GetOptionsSend:
+ StrCmp $0 "11. GetOptions" 0 GetRootSend
+ StrCpy $FUNCTION GetOptions
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETOPTIONS1"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ EnableWindow $1 0
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETOPTIONS2"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Parameters"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Option"
+ Abort
+
+ GetRootSend:
+ StrCmp $0 "12. GetRoot" 0 GetParentSend
+ StrCpy $FUNCTION GetRoot
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETROOT1"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:FullPath"
+ Abort
+
+ GetParentSend:
+ StrCmp $0 "13. GetParent" 0 GetFileNameSend
+ StrCpy $FUNCTION GetParent
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETPARENT1"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:PathString"
+ Abort
+
+ GetFileNameSend:
+ StrCmp $0 "14. GetFileName" 0 GetBaseNameSend
+ StrCpy $FUNCTION GetFileName
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILENAME1"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:PathString"
+ Abort
+
+ GetBaseNameSend:
+ StrCmp $0 "15. GetBaseName" 0 GetFileExtSend
+ StrCpy $FUNCTION GetBaseName
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETBASENAME1"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:FileString"
+ Abort
+
+ GetFileExtSend:
+ StrCmp $0 "16. GetFileExt" 0 BannerTrimPathSend
+ StrCpy $FUNCTION GetFileExt
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILEEXT1"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:FileString"
+ Abort
+
+ BannerTrimPathSend:
+ StrCmp $0 "17. BannerTrimPath" 0 DirStateSend
+ StrCpy $FUNCTION BannerTrimPath
+ GetDlgItem $1 $HWND 1201
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$BANNERTRIMPATH1"
+ GetDlgItem $1 $HWND 1202
+ ShowWindow $1 1
+ EnableWindow $1 0
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$BANNERTRIMPATH2"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:PathString"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Option"
+ Abort
+
+ DirStateSend:
+ StrCmp $0 "18. DirState" 0 RefreshShellIconsSend
+ StrCpy $FUNCTION DirState
+ GetDlgItem $1 $HWND 1203
+ ShowWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$DIRSTATE1"
+ GetDlgItem $1 $HWND 1204
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Directory"
+ Abort
+
+ RefreshShellIconsSend:
+ StrCmp $0 "19. RefreshShellIcons" 0 Abort
+ StrCpy $FUNCTION ''
+ GetDlgItem $1 $HWND 1205
+ ShowWindow $1 0
+
+ Abort:
+ Abort
+
+;=Enter=
+ Enter:
+ StrCpy $R0 ''
+ StrCpy $R5 ''
+
+ StrCmp $STATE " 1. Locate" Locate
+ StrCmp $STATE " 2. GetSize (file)" GetSize
+ StrCmp $STATE " (directory)" GetSize
+ StrCmp $STATE " (no size, no subdir)" GetSize
+ StrCmp $STATE " 3. DriveSpace" DriveSpace
+ StrCmp $STATE " 4. GetDrives (by type)" GetDrives
+ StrCmp $STATE " (all by letter)" GetDrives
+ StrCmp $STATE " 5. GetTime (local time)" GetTime
+ StrCmp $STATE " (file time)" GetTime
+ StrCmp $STATE " 6. GetFileAttributes" GetFileAttributes
+ StrCmp $STATE " 7. GetFileVersion" GetFileVersion
+ StrCmp $STATE " 8. GetExeName" GetExeName
+ StrCmp $STATE " 9. GetExePath" GetExePath
+ StrCmp $STATE "10. GetParameters" GetParameters
+ StrCmp $STATE "11. GetOptions" GetOptions
+ StrCmp $STATE "12. GetRoot" GetRoot
+ StrCmp $STATE "13. GetParent" GetParent
+ StrCmp $STATE "14. GetFileName" GetFileName
+ StrCmp $STATE "15. GetBaseName" GetBaseName
+ StrCmp $STATE "16. GetFileExt" GetFileExt
+ StrCmp $STATE "17. BannerTrimPath" BannerTrimPath
+ StrCmp $STATE "18. DirState" DirState
+ StrCmp $STATE "19. RefreshShellIcons" RefreshShellIcons
+ Abort
+
+ Locate:
+ ${Locate} "$R2" "$R3" "LocateCallback"
+ IfErrors error
+ StrCmp $R0 StopLocate 0 +3
+ StrCpy $R0 'stopped'
+ goto send
+ StrCpy $R0 'done'
+ goto send
+
+ GetSize:
+ ${GetSize} "$R2" "$R3" $0 $1 $2
+ IfErrors error
+ StrCpy $R0 "Size=$0$\r$\nFiles=$1$\r$\nFolders=$2"
+ goto send
+
+ DriveSpace:
+ ${DriveSpace} "$R1" "$R3" $0
+ IfErrors error
+ StrCpy $R0 "$0"
+ goto send
+
+ GetDrives:
+ ${GetDrives} "$R1" "GetDrivesCallback"
+ StrCmp $R0 StopGetDrives 0 +3
+ StrCpy $R0 '$R5stopped'
+ goto send
+ StrCpy $R0 '$R5done'
+ goto send
+
+ GetTime:
+ ${GetTime} "$R1" "$R3" $0 $1 $2 $3 $4 $5 $6
+ IfErrors error
+ StrCpy $R0 'Date=$0/$1/$2 ($3)$\r$\nTime=$4:$5:$6'
+ goto send
+
+ GetFileAttributes:
+ ${GetFileAttributes} "$R1" "$R3" $0
+ IfErrors error
+ StrCpy $R0 '$0'
+ goto send
+
+ GetFileVersion:
+ ${GetFileVersion} "$R1" $0
+ IfErrors error
+ StrCpy $R0 '$0'
+ goto send
+
+ GetExeName:
+ ${GetExeName} $0
+ StrCpy $R0 '$0'
+ goto send
+
+ GetExePath:
+ ${GetExePath} $0
+ StrCpy $R0 '$0'
+ goto send
+
+ GetParameters:
+ ${GetParameters} $0
+ StrCpy $R0 '$0'
+ StrCmp $R0 '' 0 send
+ StrCpy $R0 'no parameters'
+ goto send
+
+ GetOptions:
+ ${GetOptions} "$R1" "$R3" $0
+ IfErrors error
+ StrCpy $R0 '$0'
+ goto send
+
+ GetRoot:
+ ${GetRoot} "$R1" $0
+ StrCpy $R0 '$0'
+ goto send
+
+ GetParent:
+ ${GetParent} "$R1" $0
+ StrCpy $R0 '$0'
+ goto send
+
+ GetFileName:
+ ${GetFileName} "$R1" $0
+ StrCpy $R0 '$0'
+ goto send
+
+ GetBaseName:
+ ${GetBaseName} "$R1" $0
+ StrCpy $R0 '$0'
+ goto send
+
+ GetFileExt:
+ ${GetFileExt} "$R1" $0
+ StrCpy $R0 '$0'
+ goto send
+
+ BannerTrimPath:
+ ${BannerTrimPath} "$R1" "$R3" $0
+ StrCpy $R0 '$0'
+ goto send
+
+ DirState:
+ ${DirState} "$R2" $0
+ StrCpy $R0 '$0'
+ goto send
+
+ RefreshShellIcons:
+ ${RefreshShellIcons}
+ StrCpy $R0 'done'
+ goto send
+
+ error:
+ StrCpy $R0 'error'
+
+ send:
+ GetDlgItem $1 $HWND 1208
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$R0"
+
+ abort
+FunctionEnd
+
+Function LocateCallback
+ MessageBox MB_OKCANCEL '$$R9 "path\name"=[$R9]$\n$$R8 "path" =[$R8]$\n$$R7 "name" =[$R7]$\n$$R6 "size" =[$R6]' IDOK +2
+ StrCpy $R0 StopLocate
+
+ Push $R0
+FunctionEnd
+
+Function GetDrivesCallback
+ MessageBox MB_OKCANCEL '$$9 "drive letter"=[$9]$\n$$8 "drive type" =[$8]' IDOK +2
+ StrCpy $R0 StopGetDrives
+ StrCpy $R5 '$R5$9 [$8 Drive]$\r$\n'
+
+ Push $R0
+FunctionEnd
+
+Function .onInit
+ InitPluginsDir
+ GetTempFileName $INI $PLUGINSDIR
+ File /oname=$INI "FileFunc.ini"
+FunctionEnd
+
+Page instfiles
+
+Section "Empty"
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/FileFuncTest.nsi b/Engine/bin/tools/nsis/app/Examples/FileFuncTest.nsi
new file mode 100644
index 000000000..0a2db35b1
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/FileFuncTest.nsi
@@ -0,0 +1,572 @@
+;_____________________________________________________________________________
+;
+; File Functions Test
+;_____________________________________________________________________________
+;
+; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
+
+Name "File Functions Test"
+OutFile "FileFuncTest.exe"
+Caption "$(^Name)"
+ShowInstDetails show
+XPStyle on
+RequestExecutionLevel user
+
+Var FUNCTION
+Var OUT1
+Var OUT2
+Var OUT3
+Var OUT4
+Var OUT5
+Var OUT6
+Var OUT7
+
+!include "FileFunc.nsh"
+!include "LogicLib.nsh"
+
+;############### INSTALL ###############
+
+!define StackVerificationStart `!insertmacro StackVerificationStart`
+!macro StackVerificationStart _FUNCTION
+ StrCpy $FUNCTION ${_FUNCTION}
+ Call StackVerificationStart
+!macroend
+
+!define StackVerificationEnd `!insertmacro StackVerificationEnd`
+!macro StackVerificationEnd
+ Call StackVerificationEnd
+!macroend
+
+Function StackVerificationStart
+ StrCpy $0 !0
+ StrCpy $1 !1
+ StrCpy $2 !2
+ StrCpy $3 !3
+ StrCpy $4 !4
+ StrCpy $5 !5
+ StrCpy $6 !6
+ StrCpy $7 !7
+ StrCpy $8 !8
+ StrCpy $9 !9
+ StrCpy $R0 !R0
+ StrCpy $R1 !R1
+ StrCpy $R2 !R2
+ StrCpy $R3 !R3
+ StrCpy $R4 !R4
+ StrCpy $R5 !R5
+ StrCpy $R6 !R6
+ StrCpy $R7 !R7
+ StrCpy $R8 !R8
+ StrCpy $R9 !R9
+FunctionEnd
+
+Function StackVerificationEnd
+ IfErrors +3
+ DetailPrint 'PASSED $FUNCTION no errors'
+ goto +2
+ DetailPrint 'FAILED $FUNCTION error'
+
+ StrCmp $0 '!0' 0 error
+ StrCmp $1 '!1' 0 error
+ StrCmp $2 '!2' 0 error
+ StrCmp $3 '!3' 0 error
+ StrCmp $4 '!4' 0 error
+ StrCmp $5 '!5' 0 error
+ StrCmp $6 '!6' 0 error
+ StrCmp $7 '!7' 0 error
+ StrCmp $8 '!8' 0 error
+ StrCmp $9 '!9' 0 error
+ StrCmp $R0 '!R0' 0 error
+ StrCmp $R1 '!R1' 0 error
+ StrCmp $R2 '!R2' 0 error
+ StrCmp $R3 '!R3' 0 error
+ StrCmp $R4 '!R4' 0 error
+ StrCmp $R5 '!R5' 0 error
+ StrCmp $R6 '!R6' 0 error
+ StrCmp $R7 '!R7' 0 error
+ StrCmp $R8 '!R8' 0 error
+ StrCmp $R9 '!R9' 0 error
+ DetailPrint 'PASSED $FUNCTION stack'
+ goto end
+
+ error:
+ DetailPrint 'FAILED $FUNCTION stack'
+; MessageBox MB_OKCANCEL '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}' IDOK +2
+; quit
+
+ end:
+FunctionEnd
+
+
+
+Section Locate
+ ${StackVerificationStart} Locate
+
+ ${Locate} '$DOCUMENTS' '/L=FD /M=*.* /S=0B /G=0' 'LocateCallback'
+
+ ${StackVerificationEnd}
+SectionEnd
+
+Function LocateCallback
+; MessageBox MB_YESNO '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}$\n$\nContinue?' IDYES +2
+; StrCpy $0 StopLocate
+
+ Push $0
+FunctionEnd
+
+
+Section GetSize
+ ${StackVerificationStart} GetSize
+
+ ${GetSize} '$WINDIR' '/M=Explorer.exe /S=0K /G=0' $OUT1 $OUT2 $OUT3
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section DriveSpace
+ ${StackVerificationStart} DriveSpace
+
+ ${DriveSpace} 'C:\' '/D=F /S=M' $OUT1
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetDrives
+ ${StackVerificationStart} GetDrives
+
+ ${GetDrives} 'FDD+CDROM' 'GetDrivesCallback'
+
+ ${StackVerificationEnd}
+SectionEnd
+
+Function GetDrivesCallback
+; MessageBox MB_YESNO '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}$\n$\nContinue?' IDYES +2
+; StrCpy $0 StopGetDrives
+
+ Push $0
+FunctionEnd
+
+
+Section GetTime
+ ${StackVerificationStart} GetTime
+
+ ${GetTime} '' 'L' $OUT1 $OUT2 $OUT3 $OUT4 $OUT5 $OUT6 $OUT7
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetFileAttributes
+ ${StackVerificationStart} GetFileAttributes
+
+ ${GetFileAttributes} '$WINDIR\explorer.exe' 'ALL' $OUT1
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetFileVersion
+ ${StackVerificationStart} GetFileVersion
+
+ ${GetFileVersion} '$WINDIR\explorer.exe' $OUT1
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetExeName
+ ${StackVerificationStart} GetExeName
+
+ ${GetExeName} $OUT1
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetExePath
+ ${StackVerificationStart} GetExePath
+
+ ${GetExePath} $OUT1
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetParameters
+ ${StackVerificationStart} GetParameters
+
+ # basic stuff
+
+ StrCpy $CMDLINE '"$PROGRAMFILES\Something\Hello.exe"'
+ ${GetParameters} $OUT1
+ StrCpy $CMDLINE '"$PROGRAMFILES\Something\Hello.exe" test'
+ ${GetParameters} $OUT2
+ StrCpy $CMDLINE '"$PROGRAMFILES\Something\Hello.exe" "test"'
+ ${GetParameters} $OUT3
+ StrCpy $CMDLINE 'C:\Hello.exe'
+ ${GetParameters} $OUT4
+ StrCpy $CMDLINE 'C:\Hello.exe test'
+ ${GetParameters} $OUT5
+ StrCpy $CMDLINE 'C:\Hello.exe "test"'
+ ${GetParameters} $OUT6
+ StrCpy $CMDLINE 'C:\Hello.exe test test '
+ ${GetParameters} $OUT7
+
+ ${If} $OUT1 != ""
+ ${OrIf} $OUT2 != "test"
+ ${OrIf} $OUT3 != '"test"'
+ ${OrIf} $OUT4 != ""
+ ${OrIf} $OUT5 != "test"
+ ${OrIf} $OUT6 != '"test"'
+ ${OrIf} $OUT7 != 'test test'
+ SetErrors
+ ${EndIf}
+
+ # some corner cases
+
+ StrCpy $CMDLINE ''
+ ${GetParameters} $OUT1
+ StrCpy $CMDLINE '"'
+ ${GetParameters} $OUT2
+ StrCpy $CMDLINE '""'
+ ${GetParameters} $OUT3
+ StrCpy $CMDLINE '"" test'
+ ${GetParameters} $OUT4
+ StrCpy $CMDLINE ' test'
+ ${GetParameters} $OUT5
+ StrCpy $CMDLINE ' test' # left over bug(?) from old GetParameters
+ # it starts looking for ' ' from the third char
+ ${GetParameters} $OUT6
+ StrCpy $CMDLINE ' '
+ ${GetParameters} $OUT7
+
+ ${If} $OUT1 != ""
+ ${OrIf} $OUT2 != ""
+ ${OrIf} $OUT3 != ""
+ ${OrIf} $OUT4 != ""
+ ${OrIf} $OUT5 != ""
+ ${OrIf} $OUT6 != ""
+ ${OrIf} $OUT7 != ""
+ SetErrors
+ ${EndIf}
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetOptions
+ ${StackVerificationStart} GetOptions
+
+ ${GetOptions} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1
+ StrCmp $OUT1 'C:\Program Files\Common Files' 0 error
+
+ ${GetOptions} '-TMP=temp.tmp -INSTDIR="C:/Program Files/Common Files" -SILENT=yes' '-INSTDIR=' $OUT1
+ StrCmp $OUT1 'C:/Program Files/Common Files' 0 error
+
+ ${GetOptions} "/INSTDIR='C:/Program Files/Common Files' /SILENT=yes" '/INSTDIR=' $OUT1
+ StrCmp $OUT1 'C:/Program Files/Common Files' 0 error
+
+ StrCpy $OUT1 '/INSTDIR=`C:/Program Files/Common Files` /SILENT=yes'
+ ${GetOptions} '$OUT1' '/INSTDIR=' $OUT1
+ StrCmp $OUT1 'C:/Program Files/Common Files' 0 error
+
+ ${GetOptions} '/SILENT=yes /INSTDIR=C:\Program Files\Common Files' '/INSTDIR=' $OUT1
+ StrCmp $OUT1 'C:\Program Files\Common Files' 0 error
+
+ ${GetOptions} "/INSTDIR=common directory: 'C:\Program Files\Common Files' /SILENT=yes" '/INSTDIR=' $OUT1
+ StrCmp $OUT1 "common directory: 'C:\Program Files\Common Files'" 0 error
+
+ ${GetOptions} '/INSTDIR=WxxxW /SILENT=yes' '/INSTDIR=' $OUT1
+ StrCmp $OUT1 'WxxxW' 0 error
+
+ ${GetOptions} "/Prm='/D=True' /D=1" '/D=' $OUT1
+ StrCmp $OUT1 "1" 0 error
+
+ ${GetOptions} "/D=1 /Prm='/D=True'" '/Prm=' $OUT1
+ StrCmp $OUT1 "/D=True" 0 error
+
+ ${GetOptions} `/D=1 /Prm='/D="True" /S="/Temp"'` '/Prm=' $OUT1
+ StrCmp $OUT1 '/D="True" /S="/Temp"' 0 error
+
+ ${GetOptions} `/INSTDIR='"C:/Program Files/Common Files"' /SILENT=yes` '/INSTDIR=' $OUT1
+ StrCmp $OUT1 '"C:/Program Files/Common Files"' 0 error
+
+ ${GetOptions} `/INSTDIR='"C:/Program Files/Common Files"' /SILENT=yes` '/INSTDIR*=' $OUT1
+ IfErrors 0 error
+ StrCmp $OUT1 '' 0 error
+
+ ${GetOptions} `/INSTDIR="C:/Program Files/Common Files" /SILENT=yes` '' $OUT1
+ IfErrors 0 error
+ StrCmp $OUT1 '' 0 error
+
+ ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT' '/SILENT' $OUT1
+ IfErrors error
+ StrCmp $OUT1 '' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetOptionsS
+ ${StackVerificationStart} GetOptionsS
+
+ ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1
+ IfErrors error
+ StrCmp $OUT1 'C:\Program Files\Common Files' 0 error
+
+ ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/Instdir=' $OUT1
+ IfErrors 0 error
+ StrCmp $OUT1 '' 0 error
+
+ ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT' '/SILENT' $OUT1
+ IfErrors error
+ StrCmp $OUT1 '' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetRoot
+ ${StackVerificationStart} GetRoot
+
+ ${GetRoot} 'C:\Program Files\NSIS' $OUT1
+ StrCmp $OUT1 'C:' 0 error
+
+ ${GetRoot} '\\SuperPimp\NSIS\Source\exehead\Ui.c' $OUT1
+ StrCmp $OUT1 '\\SuperPimp\NSIS' 0 error
+
+ ${GetRoot} '\\Program Files\NSIS' $OUT1
+ StrCmp $OUT1 '\\Program Files\NSIS' 0 error
+
+ ${GetRoot} '\\Program Files\NSIS\' $OUT1
+ StrCmp $OUT1 '\\Program Files\NSIS' 0 error
+
+ ${GetRoot} '\\Program Files\NSIS\Source\exehead\Ui.c' $OUT1
+ StrCmp $OUT1 '\\Program Files\NSIS' 0 error
+
+ ${GetRoot} '\Program Files\NSIS' $OUT1
+ StrCmp $OUT1 '' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetParent
+ ${StackVerificationStart} GetParent
+
+ ${GetParent} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1
+ StrCmp $OUT1 'C:\Program Files\Winamp' 0 error
+
+ ${GetParent} 'C:\Program Files\Winamp\plugins' $OUT1
+ StrCmp $OUT1 'C:\Program Files\Winamp' 0 error
+
+ ${GetParent} 'C:\Program Files\Winamp\plugins\' $OUT1
+ StrCmp $OUT1 'C:\Program Files\Winamp' 0 error
+
+ ${GetParent} 'C:\' $OUT1
+ StrCmp $OUT1 '' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetFileName
+ ${StackVerificationStart} GetFileName
+
+ ${GetFileName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1
+ StrCmp $OUT1 'uninstwa.exe' 0 error
+
+ ${GetFileName} 'uninstwa.exe' $OUT1
+ StrCmp $OUT1 'uninstwa.exe' 0 error
+
+ ${GetFileName} 'C:\Program Files\Winamp\plugins' $OUT1
+ StrCmp $OUT1 'plugins' 0 error
+
+ ${GetFileName} 'C:\Program Files\Winamp\plugins\' $OUT1
+ StrCmp $OUT1 'plugins' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetBaseName
+ ${StackVerificationStart} GetBaseName
+
+ ${GetBaseName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1
+ StrCmp $OUT1 'uninstwa' 0 error
+
+ ${GetBaseName} 'uninstwa.exe' $OUT1
+ StrCmp $OUT1 'uninstwa' 0 error
+
+ ${GetBaseName} 'C:\Program Files\Winamp\plugins' $OUT1
+ StrCmp $OUT1 'plugins' 0 error
+
+ ${GetBaseName} 'C:\Program Files\Winamp\plugins\' $OUT1
+ StrCmp $OUT1 '' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section GetFileExt
+ ${StackVerificationStart} GetFileExt
+
+ ${GetFileExt} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1
+ StrCmp $OUT1 'exe' 0 error
+
+ ${GetFileExt} 'uninstwa.exe' $OUT1
+ StrCmp $OUT1 'exe' 0 error
+
+ ${GetFileExt} 'C:\Program Files\Winamp\plugins' $OUT1
+ StrCmp $OUT1 '' 0 error
+
+ ${GetFileExt} 'C:\Program Files\Winamp\plugins\' $OUT1
+ StrCmp $OUT1 '' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section BannerTrimPath
+ ${StackVerificationStart} BannerTrimPath
+
+ ${BannerTrimPath} 'C:\Server\Documents\Terminal\license.htm' '35A' $OUT1
+ StrCmp $OUT1 'C:\Server\...\Terminal\license.htm' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '3A' $OUT1
+ StrCmp $OUT1 '' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '4A' $OUT1
+ StrCmp $OUT1 'C...' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '11A' $OUT1
+ StrCmp $OUT1 'C:\12\...' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '13A' $OUT1
+ StrCmp $OUT1 'C:\12\...\789' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '14A' $OUT1
+ StrCmp $OUT1 'C:\12\3456\789' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '14A' $OUT1
+ StrCmp $OUT1 'C:\12\3456\789' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '11B' $OUT1
+ StrCmp $OUT1 'C:\12\...' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '5B' $OUT1
+ StrCmp $OUT1 'C:...' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '5B' $OUT1
+ StrCmp $OUT1 'C:...' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '11C' $OUT1
+ StrCmp $OUT1 'C:\12\34...' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '9D' $OUT1
+ StrCmp $OUT1 'C:\12\...' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '10D' $OUT1
+ StrCmp $OUT1 'C:\...\789' 0 error
+
+ ${BannerTrimPath} 'C:\12\3456\789' '11D' $OUT1
+ StrCmp $OUT1 'C:\1...\789' 0 error
+
+ ${BannerTrimPath} '123456789' '5D' $OUT1
+ StrCmp $OUT1 '12...' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section DirState
+ ${StackVerificationStart} DirState
+
+ ${DirState} '$TEMP' $OUT1
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section RefreshShellIcons
+ ${StackVerificationStart} RefreshShellIcons
+
+ ${RefreshShellIcons}
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WriteUninstaller
+ goto +2
+ WriteUninstaller '$EXEDIR\un.FileFuncTest.exe'
+SectionEnd
+
+
+
+;############### UNINSTALL ###############
+
+Section un.Uninstall
+ ${Locate} '$DOCUMENTS' '/L=FD /M=*.* /S=0B /G=0' 'un.LocateCallback'
+ ${GetSize} '$WINDIR' '/M=Explorer.exe /S=0K /G=0' $OUT1 $OUT2 $OUT3
+ ${DriveSpace} 'C:\' '/D=F /S=M' $OUT1
+ ${GetDrives} 'FDD+CDROM' 'un.GetDrivesCallback'
+ ${GetTime} '' 'L' $OUT1 $OUT2 $OUT3 $OUT4 $OUT5 $OUT6 $OUT7
+ ${GetFileAttributes} '$WINDIR\explorer.exe' 'ALL' $OUT1
+ ${GetFileVersion} '$WINDIR\explorer.exe' $OUT1
+ ${GetExeName} $OUT1
+ ${GetExePath} $OUT1
+ ${GetParameters} $OUT1
+ ${GetOptions} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1
+ ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1
+ ${GetRoot} 'C:\Program Files\NSIS' $OUT1
+ ${GetParent} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1
+ ${GetFileName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1
+ ${GetBaseName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1
+ ${GetFileExt} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1
+ ${BannerTrimPath} 'C:\Server\Documents\Terminal\license.htm' '35A' $OUT1
+ ${DirState} '$TEMP' $OUT1
+ ${RefreshShellIcons}
+SectionEnd
+
+Function un.LocateCallback
+ Push $0
+FunctionEnd
+
+Function un.GetDrivesCallback
+ Push $0
+FunctionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/InstallOptions/test.ini b/Engine/bin/tools/nsis/app/Examples/InstallOptions/test.ini
new file mode 100644
index 000000000..7b94875fe
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/InstallOptions/test.ini
@@ -0,0 +1,76 @@
+[Settings]
+NumFields=8
+
+[Field 1]
+Type=GroupBox
+Left=0
+Right=-1
+Top=0
+Bottom=-5
+Text=" This is a group box... "
+
+[Field 2]
+Type=checkbox
+Text=Install support for X
+Left=10
+Right=-10
+Top=17
+Bottom=25
+State=0
+Flags=GROUP
+
+[Field 3]
+Type=checkbox
+Text=Install support for Y
+Left=10
+Right=-10
+Top=30
+Bottom=38
+State=1
+Flags=NOTABSTOP
+
+[Field 4]
+Type=checkbox
+Text=Install support for Z
+Left=10
+Right=-10
+Top=43
+Bottom=51
+State=0
+Flags=NOTABSTOP
+
+[Field 5]
+Type=FileRequest
+State=C:\poop.poop
+Left=10
+Right=-10
+Top=56
+Bottom=68
+Filter=Poop Files|*.poop|All files|*.*
+Flags=GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY
+
+[Field 6]
+Type=DirRequest
+Left=10
+Right=-10
+Top=73
+Bottom=85
+Text=Select a directory...
+State=C:\Program Files\NSIS
+
+[Field 7]
+Type=Label
+Left=10
+Right=-10
+Top=90
+Bottom=98
+Text=This is a label...
+
+[Field 8]
+Type=Text
+Left=10
+Right=-10
+Top=98
+Bottom=120
+State="Multiline\r\nedit..."
+Flags=MULTILINE|VSCROLL|WANTRETURN
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/InstallOptions/test.nsi b/Engine/bin/tools/nsis/app/Examples/InstallOptions/test.nsi
new file mode 100644
index 000000000..53afe9b9f
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/InstallOptions/test.nsi
@@ -0,0 +1,84 @@
+;InstallOptions Test Script
+;Written by Joost Verburg
+;--------------------------
+
+!define TEMP1 $R0 ;Temp variable
+
+;The name of the installer
+Name "InstallOptions Test"
+
+;The file to write
+OutFile "Test.exe"
+
+; Show install details
+ShowInstDetails show
+
+;Things that need to be extracted on startup (keep these lines before any File command!)
+;Only useful for BZIP2 compression
+;Use ReserveFile for your own InstallOptions INI files too!
+
+ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
+ReserveFile "test.ini"
+
+;Order of pages
+Page custom SetCustom ValidateCustom ": Testing InstallOptions" ;Custom page. InstallOptions gets called in SetCustom.
+Page instfiles
+
+Section "Components"
+
+ ;Get Install Options dialog user input
+
+ ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 2" "State"
+ DetailPrint "Install X=${TEMP1}"
+ ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 3" "State"
+ DetailPrint "Install Y=${TEMP1}"
+ ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 4" "State"
+ DetailPrint "Install Z=${TEMP1}"
+ ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 5" "State"
+ DetailPrint "File=${TEMP1}"
+ ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 6" "State"
+ DetailPrint "Dir=${TEMP1}"
+ ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 8" "State"
+ DetailPrint "Info=${TEMP1}"
+
+SectionEnd
+
+Function .onInit
+
+ ;Extract InstallOptions files
+ ;$PLUGINSDIR will automatically be removed when the installer closes
+
+ InitPluginsDir
+ File /oname=$PLUGINSDIR\test.ini "test.ini"
+
+FunctionEnd
+
+Function SetCustom
+
+ ;Display the InstallOptions dialog
+
+ Push ${TEMP1}
+
+ InstallOptions::dialog "$PLUGINSDIR\test.ini"
+ Pop ${TEMP1}
+
+ Pop ${TEMP1}
+
+FunctionEnd
+
+Function ValidateCustom
+
+ ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 2" "State"
+ StrCmp ${TEMP1} 1 done
+
+ ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 3" "State"
+ StrCmp ${TEMP1} 1 done
+
+ ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 4" "State"
+ StrCmp ${TEMP1} 1 done
+ MessageBox MB_ICONEXCLAMATION|MB_OK "You must select at least one install option!"
+ Abort
+
+ done:
+
+FunctionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/InstallOptions/testimgs.ini b/Engine/bin/tools/nsis/app/Examples/InstallOptions/testimgs.ini
new file mode 100644
index 000000000..381a98617
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/InstallOptions/testimgs.ini
@@ -0,0 +1,65 @@
+[Settings]
+NumFields=8
+
+[Field 1]
+Type=GroupBox
+Left=0
+Right=-1
+Top=0
+Bottom=-5
+Text=" Images "
+
+[Field 2]
+Type=Bitmap
+Left=10
+Right=-10
+Top=10
+Bottom=30
+Flags=TRANSPARENT
+
+[Field 3]
+Type=Bitmap
+Left=10
+Right=-10
+Top=35
+Bottom=45
+Flags=TRANSPARENT
+
+[Field 4]
+Type=Bitmap
+Left=10
+Right=-10
+Top=50
+Bottom=70
+Flags=RESIZETOFIT|TRANSPARENT
+
+[Field 5]
+Type=Bitmap
+Left=10
+Right=-10
+Top=75
+Bottom=95
+Flags=RESIZETOFIT|TRANSPARENT
+
+[Field 6]
+Type=Icon
+Left=10
+Right=40
+Top=100
+Bottom=120
+
+[Field 7]
+Type=Icon
+Left=50
+Right=80
+Top=100
+Bottom=120
+
+[Field 8]
+Type=Label
+Left=10
+Right=-10
+Top=10
+Bottom=-10
+Text=ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ
+
diff --git a/Engine/bin/tools/nsis/app/Examples/InstallOptions/testimgs.nsi b/Engine/bin/tools/nsis/app/Examples/InstallOptions/testimgs.nsi
new file mode 100644
index 000000000..1a832e910
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/InstallOptions/testimgs.nsi
@@ -0,0 +1,59 @@
+;InstallOptions Test Script
+;Written by Joost Verburg
+;--------------------------
+
+;The name of the installer
+Name "InstallOptions Test"
+
+;The file to write
+OutFile "Test.exe"
+
+; Show install details
+ShowInstDetails show
+
+;Things that need to be extracted on startup (keep these lines before any File command!)
+;Only useful for BZIP2 compression
+;Use ReserveFile for your own InstallOptions INI files too!
+
+ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
+ReserveFile "testimgs.ini"
+ReserveFile "${NSISDIR}\Contrib\Graphics\Checks\colorful.bmp"
+ReserveFile "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp"
+ReserveFile "${NSISDIR}\Contrib\Graphics\Icons\pixel-install.ico"
+
+;Order of pages
+Page custom SetCustom "" ": Testing InstallOptions" ;Custom page. InstallOptions gets called in SetCustom.
+Page instfiles
+
+Section
+SectionEnd
+
+Function .onInit
+
+ ;Extract InstallOptions files
+ ;$PLUGINSDIR will automatically be removed when the installer closes
+
+ InitPluginsDir
+ File /oname=$PLUGINSDIR\testimgs.ini "testimgs.ini"
+ File /oname=$PLUGINSDIR\image.bmp "${NSISDIR}\Contrib\Graphics\Checks\colorful.bmp"
+ File /oname=$PLUGINSDIR\image2.bmp "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp"
+ File /oname=$PLUGINSDIR\icon.ico "${NSISDIR}\Contrib\Graphics\Icons\pixel-install.ico"
+
+ ;Write image paths to the INI file
+
+ WriteINIStr $PLUGINSDIR\testimgs.ini "Field 2" "Text" $PLUGINSDIR\image.bmp
+ WriteINIStr $PLUGINSDIR\testimgs.ini "Field 3" "Text" $PLUGINSDIR\image2.bmp
+ WriteINIStr $PLUGINSDIR\testimgs.ini "Field 4" "Text" $PLUGINSDIR\image.bmp
+ WriteINIStr $PLUGINSDIR\testimgs.ini "Field 5" "Text" $PLUGINSDIR\image2.bmp
+ WriteINIStr $PLUGINSDIR\testimgs.ini "Field 6" "Text" $PLUGINSDIR\icon.ico
+ ;No Text for Field 7 so it'll show the installer's icon
+
+FunctionEnd
+
+Function SetCustom
+
+ ;Display the InstallOptions dialog
+ InstallOptions::dialog "$PLUGINSDIR\testimgs.ini"
+ Pop $0
+
+FunctionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/InstallOptions/testlink.ini b/Engine/bin/tools/nsis/app/Examples/InstallOptions/testlink.ini
new file mode 100644
index 000000000..592ae930e
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/InstallOptions/testlink.ini
@@ -0,0 +1,44 @@
+[Settings]
+NumFields=5
+
+[Field 1]
+Type=Label
+Left=10
+Right=-40
+Top=10
+Bottom=18
+Text=This custom page demonstrates the "Link" control
+
+[Field 2]
+Type=Link
+Left=20
+Right=-40
+Top=40
+Bottom=50
+Text=* Run notepad
+
+[Field 3]
+Type=Link
+Left=20
+Right=-40
+Top=55
+Bottom=65
+State=mailto:someone@anywhere.com
+Text=* Send E-mail
+
+[Field 4]
+Type=Link
+Left=20
+Right=-40
+Top=70
+Bottom=80
+State=http://nsis.sourceforge.net/
+Text=* Homepage http://nsis.sourceforge.net/
+
+[Field 5]
+Type=Text
+Left=20
+Right=-40
+Top=85
+Bottom=98
+State=Just to test proper interaction with the other fields
diff --git a/Engine/bin/tools/nsis/app/Examples/InstallOptions/testlink.nsi b/Engine/bin/tools/nsis/app/Examples/InstallOptions/testlink.nsi
new file mode 100644
index 000000000..8b73fc951
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/InstallOptions/testlink.nsi
@@ -0,0 +1,58 @@
+;InstallOptions Test Script
+;Written by Ramon
+;This script demonstrates the power of the new control "LINK"
+;that allows you to execute files, send mails, open wepsites, etc.
+;--------------------------
+
+!define TEMP1 $R0 ;Temp variable
+
+;The name of the installer
+Name "InstallOptions Test Link"
+
+;The file to write
+OutFile "TestLink.exe"
+
+; Show install details
+ShowInstDetails show
+
+;Things that need to be extracted on startup (keep these lines before any File command!)
+;Only useful for BZIP2 compression
+;Use ReserveFile for your own InstallOptions INI files too!
+
+ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
+ReserveFile "testlink.ini"
+
+;Order of pages
+Page custom SetCustom
+Page instfiles
+
+Section "Components"
+
+ ;Get Install Options dialog user input
+
+SectionEnd
+
+Function .onInit
+
+ ;Extract InstallOptions files
+ ;$PLUGINSDIR will automatically be removed when the installer closes
+
+ InitPluginsDir
+ File /oname=$PLUGINSDIR\test.ini "testlink.ini"
+ WriteIniStr $PLUGINSDIR\test.ini "Field 2" "State" "$WINDIR\Notepad.exe"
+
+FunctionEnd
+
+Function SetCustom
+
+ ;Display the InstallOptions dialog
+
+ Push ${TEMP1}
+
+ InstallOptions::dialog "$PLUGINSDIR\test.ini"
+ Pop ${TEMP1}
+
+ Pop ${TEMP1}
+
+FunctionEnd
+
diff --git a/Engine/bin/tools/nsis/app/Examples/InstallOptions/testnotify.ini b/Engine/bin/tools/nsis/app/Examples/InstallOptions/testnotify.ini
new file mode 100644
index 000000000..f86fc8e5a
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/InstallOptions/testnotify.ini
@@ -0,0 +1,105 @@
+[Settings]
+NumFields=11
+
+[Field 1]
+Type=Groupbox
+Text="This is a group box..."
+Left=0
+Right=-1
+Top=0
+Bottom=-4
+
+[Field 2]
+Type=Checkbox
+Text=Install support for X
+Flags=NOTIFY
+State=1
+Left=10
+Right=100
+Top=17
+Bottom=25
+
+[Field 3]
+Type=Checkbox
+Text=Install support for Y
+State=0
+Left=10
+Right=100
+Top=30
+Bottom=38
+
+[Field 4]
+Type=Checkbox
+Text=Install support for Z
+Flags=RIGHT
+State=0
+Left=10
+Right=100
+Top=43
+Bottom=51
+
+[Field 5]
+Type=FileRequest
+Flags=GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY
+State=C:\poop.poop
+Filter=Poop Files|*.poop|All files|*.*
+Left=10
+Right=-10
+Top=56
+Bottom=69
+
+[Field 6]
+Type=DirRequest
+Text=Select a directory...
+State=C:\Program Files\NSIS
+Left=10
+Right=-10
+Top=74
+Bottom=87
+
+[Field 7]
+Type=Label
+Text=This is a label...
+Left=10
+Right=-10
+Top=89
+Bottom=97
+
+[Field 8]
+Type=Text
+Flags=MULTILINE|VSCROLL|WANTRETURN|NOWORDWRAP
+State="Multiline\r\nedit..."
+Left=10
+Right=-10
+Top=97
+Bottom=118
+MinLen=1
+ValidateText=Please enter some text before proceeding.
+
+[Field 9]
+Type=Button
+Flags=NOTIFY
+Text=&Clear
+Left=-60
+Right=-10
+Top=19
+Bottom=33
+
+[Field 10]
+Type=Button
+Text=&Email
+State=mailto:someone@anywhere.com
+Left=-60
+Right=-10
+Top=35
+Bottom=49
+
+[Field 11]
+Type=DROPLIST
+ListItems=Show|Hide
+State=Show
+Flags=NOTIFY
+Left=120
+Right=-80
+Top=20
+Bottom=56
diff --git a/Engine/bin/tools/nsis/app/Examples/InstallOptions/testnotify.nsi b/Engine/bin/tools/nsis/app/Examples/InstallOptions/testnotify.nsi
new file mode 100644
index 000000000..a8ab734a9
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/InstallOptions/testnotify.nsi
@@ -0,0 +1,133 @@
+; InstallOptions script demonstrating custom buttons
+;----------------------------------------------------
+
+!include WinMessages.nsh
+
+; The name of the installer
+Name "InstallOptions Test"
+
+; The file to write
+OutFile "TestNotify.exe"
+
+; Show install details
+ShowInstDetails show
+
+; Called before anything else as installer initialises
+Function .onInit
+
+ ; Extract InstallOptions files
+ ; $PLUGINSDIR will automatically be removed when the installer closes
+ InitPluginsDir
+ File /oname=$PLUGINSDIR\test.ini "testnotify.ini"
+
+FunctionEnd
+
+; Our custom page
+Page custom ShowCustom LeaveCustom ": Testing InstallOptions"
+
+Function ShowCustom
+
+ ; Initialise the dialog but don't show it yet
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Test the right-to-left version?" IDNO +2
+ WriteINIStr "$PLUGINSDIR\test.ini" "Settings" "RTL" "1"
+ InstallOptions::initDialog "$PLUGINSDIR\test.ini"
+ ; In this mode InstallOptions returns the window handle so we can use it
+ Pop $0
+ ; Now show the dialog and wait for it to finish
+ InstallOptions::show
+ ; Finally fetch the InstallOptions status value (we don't care what it is though)
+ Pop $0
+
+FunctionEnd
+
+Function LeaveCustom
+
+ ; At this point the user has either pressed Next or one of our custom buttons
+ ; We find out which by reading from the INI file
+ ReadINIStr $0 "$PLUGINSDIR\test.ini" "Settings" "State"
+ StrCmp $0 0 validate ; Next button?
+ StrCmp $0 2 supportx ; "Install support for X"?
+ StrCmp $0 9 clearbtn ; "Clear" button?
+ StrCmp $0 11 droplist ; "Show|Hide" drop-list?
+ Abort ; Return to the page
+
+supportx:
+ ; Make the FileRequest field depend on the first checkbox
+ ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 2" "State"
+ ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 5" "HWND"
+ EnableWindow $1 $0
+ ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 5" "HWND2"
+ EnableWindow $1 $0
+ ; Add the disabled flag too so when we return to this page it's disabled again
+ StrCmp $0 0 0 +3
+
+ WriteINIStr "$PLUGINSDIR\test.ini" "Field 5" "Flags" "GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY|DISABLED"
+ Goto +2
+
+ WriteINIStr "$PLUGINSDIR\test.ini" "Field 5" "Flags" "GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY"
+ Abort ; Return to the page
+
+clearbtn:
+ ; Clear all text fields
+ ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 5" "HWND"
+ SendMessage $1 ${WM_SETTEXT} 0 "STR:"
+ ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 6" "HWND"
+ SendMessage $1 ${WM_SETTEXT} 0 "STR:"
+ ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 8" "HWND"
+ SendMessage $1 ${WM_SETTEXT} 0 "STR:"
+ Abort ; Return to the page
+
+droplist:
+ ; Make the DirRequest field depend on the droplist
+ ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 11" "State"
+ StrCmp $0 "Show" +3
+ StrCpy $0 0
+ Goto +2
+ StrCpy $0 1
+ ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 6" "HWND"
+ EnableWindow $1 $0
+ ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 6" "HWND2"
+ EnableWindow $1 $0
+ ; Add the disabled flag too so when we return to this page it's disabled again
+ StrCmp $0 0 0 +3
+
+ WriteINIStr "$PLUGINSDIR\test.ini" "Field 6" "Flags" "DISABLED"
+ Goto +2
+
+ WriteINIStr "$PLUGINSDIR\test.ini" "Field 6" "Flags" ""
+ Abort ; Return to the page
+
+validate:
+ ; At this point we know the Next button was pressed, so perform any validation
+ ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 2" "State"
+ StrCmp $0 1 done
+ ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 3" "State"
+ StrCmp $0 1 done
+ ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 4" "State"
+ StrCmp $0 1 done
+ MessageBox MB_ICONEXCLAMATION|MB_OK "You must select at least one install option!"
+ Abort
+done:
+
+FunctionEnd
+
+; Installation page
+Page instfiles
+
+Section
+
+ ;Get Install Options dialog user input
+ ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 2" "State"
+ DetailPrint "Install X=$0"
+ ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 3" "State"
+ DetailPrint "Install Y=$0"
+ ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 4" "State"
+ DetailPrint "Install Z=$0"
+ ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 5" "State"
+ DetailPrint "File=$0"
+ ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 6" "State"
+ DetailPrint "Dir=$0"
+ ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 8" "State"
+ DetailPrint "Info=$0"
+
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/Library.nsi b/Engine/bin/tools/nsis/app/Examples/Library.nsi
new file mode 100644
index 000000000..9dc8d7490
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Library.nsi
@@ -0,0 +1,129 @@
+# This example tests the compile time aspect of the Library macros
+# more than the runtime aspect. It is more of a syntax example,
+# rather than a usage example.
+
+!include "Library.nsh"
+
+Name "Library Test"
+OutFile "Library Test.exe"
+
+InstallDir "$TEMP\Library Test"
+
+Page directory
+Page instfiles
+
+XPStyle on
+
+RequestExecutionLevel user
+
+!define TestDLL '"${NSISDIR}\Plugins\LangDLL.dll"'
+!define TestEXE '"${NSISDIR}\Contrib\UIs\default.exe"'
+
+Section
+
+!insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib DLL NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib DLL NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib DLL NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+
+!insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+
+!insertmacro InstallLib TLB NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib TLB NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib TLB NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib TLB NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+
+!insertmacro InstallLib REGDLLTLB NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib REGDLLTLB NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib REGDLLTLB NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib REGDLLTLB NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+
+!insertmacro InstallLib DLL $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib DLL $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib DLL $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib DLL $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+
+!insertmacro InstallLib REGDLL $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib REGDLL $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib REGDLL $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib REGDLL $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+
+!insertmacro InstallLib TLB $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib TLB $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib TLB $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib TLB $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+
+!insertmacro InstallLib REGDLLTLB $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib REGDLLTLB $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib REGDLLTLB $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+!insertmacro InstallLib REGDLLTLB $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR
+
+!insertmacro InstallLib REGEXE $0 REBOOT_PROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR
+!insertmacro InstallLib REGEXE $0 NOREBOOT_PROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR
+!insertmacro InstallLib REGEXE $0 REBOOT_NOTPROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR
+!insertmacro InstallLib REGEXE $0 NOREBOOT_NOTPROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR
+
+WriteUninstaller $INSTDIR\uninstall.exe
+
+SectionEnd
+
+Section uninstall
+
+!insertmacro UninstallLib DLL NOTSHARED NOREMOVE $INSTDIR\test.dll
+!insertmacro UninstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib DLL NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib DLL NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib DLL NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
+
+!insertmacro UninstallLib REGDLL NOTSHARED NOREMOVE $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLL NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
+
+!insertmacro UninstallLib TLB NOTSHARED NOREMOVE $INSTDIR\test.dll
+!insertmacro UninstallLib TLB NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib TLB NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib TLB NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib TLB NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
+
+!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREMOVE $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLLTLB NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLLTLB NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
+
+!insertmacro UninstallLib DLL SHARED NOREMOVE $INSTDIR\test.dll
+!insertmacro UninstallLib DLL SHARED REBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib DLL SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib DLL SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib DLL SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
+
+!insertmacro UninstallLib REGDLL SHARED NOREMOVE $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLL SHARED REBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLL SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLL SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLL SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
+
+!insertmacro UninstallLib TLB SHARED NOREMOVE $INSTDIR\test.dll
+!insertmacro UninstallLib TLB SHARED REBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib TLB SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib TLB SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib TLB SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
+
+!insertmacro UninstallLib REGDLLTLB SHARED NOREMOVE $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLLTLB SHARED REBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLLTLB SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLLTLB SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll
+!insertmacro UninstallLib REGDLLTLB SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll
+
+!insertmacro UninstallLib REGEXE SHARED NOREMOVE $INSTDIR\test.exe
+!insertmacro UninstallLib REGEXE SHARED REBOOT_PROTECTED $INSTDIR\test.exe
+!insertmacro UninstallLib REGEXE SHARED NOREBOOT_PROTECTED $INSTDIR\test.exe
+!insertmacro UninstallLib REGEXE SHARED REBOOT_NOTPROTECTED $INSTDIR\test.exe
+!insertmacro UninstallLib REGEXE SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.exe
+
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/LogicLib.nsi b/Engine/bin/tools/nsis/app/Examples/LogicLib.nsi
new file mode 100644
index 000000000..824bb45c1
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/LogicLib.nsi
@@ -0,0 +1,599 @@
+!verbose 2
+
+Name "NSIS LogicLib Example"
+OutFile "LogicLib.exe"
+ShowInstDetails show
+RequestExecutionLevel user
+
+!include "LogicLib.nsh"
+
+;!undef LOGICLIB_VERBOSITY
+;!define LOGICLIB_VERBOSITY 4 ; For debugging - watch what logiclib does with your code!
+
+Page components "" "" ComponentsLeave
+Page instfiles
+
+Section /o "Run tests" TESTS
+
+ ; kinds of if other than "value1 comparison value2"
+ ClearErrors
+ FindFirst $R1 $R2 "$PROGRAMFILES\*"
+ ${Unless} ${Errors}
+ ${Do}
+ ${Select} $R2
+ ${Case2} "." ".."
+ ; Do nothing
+ ${CaseElse}
+ DetailPrint "Found $PROGRAMFILES\$R2"
+ ${EndSelect}
+ FindNext $R1 $R2
+ ${LoopUntil} ${Errors}
+ FindClose $R1
+ ${EndUnless}
+
+ ${If} ${FileExists} "${__FILE__}"
+ DetailPrint 'Source file "${__FILE__}" still exists'
+ ${Else}
+ DetailPrint 'Source file "${__FILE__}" has gone'
+ ${EndIf}
+
+ ; if..endif
+ StrCpy $R1 1
+ StrCpy $R2 ""
+ ${If} $R1 = 1
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} $R1 = 2
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} $R1 < 2
+ StrCpy $R2 $R2C
+ ${EndIf}
+ ${If} $R1 < -2
+ StrCpy $R2 $R2D
+ ${EndIf}
+ ${If} $R1 > 2
+ StrCpy $R2 $R2E
+ ${EndIf}
+ ${If} $R1 > -2
+ StrCpy $R2 $R2F
+ ${EndIf}
+ ${If} $R1 <> 1
+ StrCpy $R2 $R2G
+ ${EndIf}
+ ${If} $R1 <> 2
+ StrCpy $R2 $R2H
+ ${EndIf}
+ ${If} $R1 >= 2
+ StrCpy $R2 $R2I
+ ${EndIf}
+ ${If} $R1 >= -2
+ StrCpy $R2 $R2J
+ ${EndIf}
+ ${If} $R1 <= 2
+ StrCpy $R2 $R2K
+ ${EndIf}
+ ${If} $R1 <= -2
+ StrCpy $R2 $R2L
+ ${EndIf}
+ ${If} $R2 == "ACFHJK"
+ DetailPrint "PASSED If..EndIf test"
+ ${Else}
+ DetailPrint "FAILED If..EndIf test"
+ ${EndIf}
+
+ ; if..elseif..else..endif
+ StrCpy $R1 A
+ StrCpy $R2 ""
+ ${If} $R1 == A
+ StrCpy $R2 $R2A
+ ${ElseIf} $R1 == B
+ StrCpy $R2 $R2B
+ ${ElseUnless} $R1 != C
+ StrCpy $R2 $R2C
+ ${Else}
+ StrCpy $R2 $R2D
+ ${EndIf}
+ ${If} $R1 == D
+ StrCpy $R2 $R2D
+ ${ElseIf} $R1 == A
+ StrCpy $R2 $R2A
+ ${ElseUnless} $R1 != B
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2C
+ ${EndIf}
+ ${If} $R1 == C
+ StrCpy $R2 $R2C
+ ${ElseIf} $R1 == D
+ StrCpy $R2 $R2D
+ ${ElseUnless} $R1 != A
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} $R1 == B
+ StrCpy $R2 $R2B
+ ${ElseIf} $R1 == C
+ StrCpy $R2 $R2C
+ ${ElseUnless} $R1 != D
+ StrCpy $R2 $R2D
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} $R2 == "$R1$R1$R1$R1"
+ DetailPrint "PASSED If..ElseIf..Else..EndIf test"
+ ${Else}
+ DetailPrint "FAILED If..ElseIf..Else..EndIf test"
+ ${EndIf}
+
+ ; if..andif..orif..endif
+ StrCpy $R2 ""
+ ${If} 1 = 1
+ ${AndIf} 2 = 2
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 1 = 1
+ ${AndIf} 2 = 3
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} 1 = 2
+ ${AndIf} 2 = 2
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} 1 = 2
+ ${AndIf} 2 = 3
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+
+ ${If} 1 = 1
+ ${OrIf} 2 = 2
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 1 = 1
+ ${OrIf} 2 = 3
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 1 = 2
+ ${OrIf} 2 = 2
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 1 = 2
+ ${OrIf} 2 = 3
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+
+ ${If} 1 = 1
+ ${AndIf} 2 = 2
+ ${OrIf} 3 = 3
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 1 = 1
+ ${AndIf} 2 = 3
+ ${OrIf} 3 = 3
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 1 = 2
+ ${AndIf} 2 = 2
+ ${OrIf} 3 = 3
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 1 = 2
+ ${AndIf} 2 = 3
+ ${OrIf} 3 = 3
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 1 = 1
+ ${AndIf} 2 = 2
+ ${OrIf} 3 = 4
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 1 = 1
+ ${AndIf} 2 = 3
+ ${OrIf} 3 = 4
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} 1 = 2
+ ${AndIf} 2 = 2
+ ${OrIf} 3 = 4
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} 1 = 2
+ ${AndIf} 2 = 3
+ ${OrIf} 3 = 4
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+
+ ${If} 1 = 1
+ ${OrIf} 2 = 2
+ ${AndIf} 3 = 3
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 1 = 1
+ ${OrIf} 2 = 3
+ ${AndIf} 3 = 3
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 1 = 2
+ ${OrIf} 2 = 2
+ ${AndIf} 3 = 3
+ StrCpy $R2 $R2A
+ ${Else}
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 1 = 2
+ ${OrIf} 2 = 3
+ ${AndIf} 3 = 3
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} 1 = 1
+ ${OrIf} 2 = 2
+ ${AndIf} 3 = 4
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} 1 = 1
+ ${OrIf} 2 = 3
+ ${AndIf} 3 = 4
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} 1 = 2
+ ${OrIf} 2 = 2
+ ${AndIf} 3 = 4
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} 1 = 2
+ ${OrIf} 2 = 3
+ ${AndIf} 3 = 4
+ StrCpy $R2 $R2B
+ ${Else}
+ StrCpy $R2 $R2A
+ ${EndIf}
+
+ ${If} $R2 == "AAAAAAAAAAAAAAAAAAAAAAAA"
+ DetailPrint "PASSED If..AndIf..OrIf..Else..EndIf test"
+ ${Else}
+ DetailPrint "FAILED If..AndIf..OrIf..Else..EndIf test"
+ ${EndIf}
+
+ ; ifthen..|..|
+ StrCpy $R1 1
+ StrCpy $R2 ""
+ ${IfThen} $R1 = 1 ${|} StrCpy $R2 $R2A ${|}
+ ${IfThen} $R1 = 2 ${|} StrCpy $R2 $R2B ${|}
+ ${IfNotThen} $R1 = 1 ${|} StrCpy $R2 $R2C ${|}
+ ${IfNotThen} $R1 = 2 ${|} StrCpy $R2 $R2D ${|}
+ ${If} $R2 == "AD"
+ DetailPrint "PASSED IfThen test"
+ ${Else}
+ DetailPrint "FAILED IfThen test"
+ ${EndIf}
+
+ ; ifcmd..||..| and if/unless cmd
+ StrCpy $R2 ""
+ ${IfCmd} MessageBox MB_YESNO "Please click Yes" IDYES ${||} StrCpy $R2 $R2A ${|}
+ ${Unless} ${Cmd} `MessageBox MB_YESNO|MB_DEFBUTTON2 "Please click No" IDYES`
+ StrCpy $R2 $R2B
+ ${EndUnless}
+ ${If} $R2 == "AB"
+ DetailPrint "PASSED IfCmd/If Cmd test"
+ ${Else}
+ DetailPrint "FAILED IfCmd/If Cmd test"
+ ${EndIf}
+
+ ; select..case..case2..case3..case4..case5..caseelse..endselect
+ StrCpy $R1 1
+ StrCpy $R2 ""
+ ${Select} $R1
+ ${Case} "1"
+ StrCpy $R2 $R2A
+ ${Case} "2"
+ StrCpy $R2 $R2B
+ ${Case2} "3" "4"
+ StrCpy $R2 $R2C
+ ${CaseElse}
+ StrCpy $R2 $R2D
+ ${EndSelect}
+ ${Select} $R1
+ ${Case} "2"
+ StrCpy $R2 $R2A
+ ${Case} "3"
+ StrCpy $R2 $R2B
+ ${Case2} "4" "5"
+ StrCpy $R2 $R2C
+ ${CaseElse}
+ StrCpy $R2 $R2D
+ ${EndSelect}
+ ${Select} $R1
+ ${Case} "3"
+ StrCpy $R2 $R2A
+ ${Case} "4"
+ StrCpy $R2 $R2B
+ ${Case2} "5" "1"
+ StrCpy $R2 $R2C
+ ${CaseElse}
+ StrCpy $R2 $R2D
+ ${EndSelect}
+ ${Select} $R1
+ ${Case} "4"
+ StrCpy $R2 $R2A
+ ${Case} "5"
+ StrCpy $R2 $R2B
+ ${Case2} "1" "2"
+ StrCpy $R2 $R2C
+ ${CaseElse}
+ StrCpy $R2 $R2D
+ ${EndSelect}
+ ${If} $R2 == "ADCC"
+ DetailPrint "PASSED Select..Case*..EndSelect test"
+ ${Else}
+ DetailPrint "FAILED Select..Case*..EndSelect test"
+ ${EndIf}
+
+ ; switch..case..caseelse..endswitch
+ StrCpy $R2 ""
+ ${For} $R1 1 10
+ ${Switch} $R1
+ ${Case} 3
+ StrCpy $R2 $R2A
+ ${Case} 4
+ StrCpy $R2 $R2B
+ ${Break}
+ ${Case} 5
+ StrCpy $R2 $R2C
+ ${EndSwitch}
+ ${Switch} $R1
+ ${Case} 1
+ StrCpy $R2 $R2D
+ ${Default}
+ StrCpy $R2 $R2E
+ ${Break}
+ ${Case} 2
+ StrCpy $R2 $R2F
+ ${EndSwitch}
+ ${Switch} $R1
+ ${Case} 6
+ ${Case} 7
+ StrCpy $R2 $R2G
+ ${If} $R1 = 6
+ ${Case} 8
+ StrCpy $R2 $R2H
+ ${Switch} $R1
+ ${Case} 6
+ StrCpy $R2 $R2I
+ ${Break}
+ ${Case} 8
+ StrCpy $R2 $R2J
+ ${EndSwitch}
+ ${EndIf}
+ StrCpy $R2 $R2K
+ ${Break}
+ ${Default}
+ StrCpy $R2 $R2L
+ ${Case} 9
+ StrCpy $R2 $R2M
+ ${EndSwitch}
+ ${Next}
+ ${If} $R2 == "DELMFLMABELMBELMCELMEGHIKEGKEHJKEMELM"
+ DetailPrint "PASSED Switch..Case*..EndSwitch test"
+ ${Else}
+ DetailPrint "FAILED Switch..Case*..EndSwitch test"
+ ${EndIf}
+
+ ; for[each]..exitfor..next
+ StrCpy $R2 ""
+ ${For} $R1 1 5
+ StrCpy $R2 $R2$R1
+ ${Next}
+ ${ForEach} $R1 10 1 - 1
+ StrCpy $R2 $R2$R1
+ ${Next}
+ ${For} $R1 1 0
+ StrCpy $R2 $R2$R1
+ ${Next}
+ ${If} $R2 == "1234510987654321"
+ DetailPrint "PASSED For[Each]..Next test"
+ ${Else}
+ DetailPrint "FAILED For[Each]..Next test"
+ ${EndIf}
+
+ ; do..exitdo..loop
+ StrCpy $R1 0
+ StrCpy $R2 ""
+ ${Do}
+ StrCpy $R2 $R2$R1
+ IntOp $R1 $R1 + 1
+ ${If} $R1 > 10
+ ${ExitDo}
+ ${EndIf}
+ ${Loop}
+ ${If} $R2 == "012345678910"
+ DetailPrint "PASSED Do..ExitDo..Loop test"
+ ${Else}
+ DetailPrint "FAILED Do..ExitDo..Loop test"
+ ${EndIf}
+
+ ; do..exitdo..loopuntil
+ StrCpy $R1 0
+ StrCpy $R2 ""
+ ${Do}
+ StrCpy $R2 $R2$R1
+ IntOp $R1 $R1 + 1
+ ${LoopUntil} $R1 >= 5
+ ${If} $R2 == "01234"
+ DetailPrint "PASSED Do..ExitDo..LoopUntil test"
+ ${Else}
+ DetailPrint "FAILED Do..ExitDo..LoopUntil test"
+ ${EndIf}
+
+ ; dountil..exitdo..loop
+ StrCpy $R1 0
+ StrCpy $R2 ""
+ ${DoUntil} $R1 >= 5
+ StrCpy $R2 $R2$R1
+ IntOp $R1 $R1 + 1
+ ${Loop}
+ ${If} $R2 == "01234"
+ DetailPrint "PASSED DoUntil..ExitDo..Loop test"
+ ${Else}
+ DetailPrint "FAILED DoUntil..ExitDo..Loop test"
+ ${EndIf}
+
+ ; nested do test
+ StrCpy $R1 0
+ StrCpy $R2 0
+ StrCpy $R3 ""
+ ${Do}
+ StrCpy $R3 $R3$R1$R2
+ IntOp $R1 $R1 + 1
+ ${If} $R1 > 5
+ ${ExitDo}
+ ${EndIf}
+ StrCpy $R2 0
+ ${Do}
+ StrCpy $R3 $R3$R1$R2
+ IntOp $R2 $R2 + 1
+ ${If} $R2 >= 5
+ ${ExitDo}
+ ${EndIf}
+ ${Loop}
+ ${Loop}
+ ${If} $R3 == "00101112131415202122232425303132333435404142434445505152535455"
+ DetailPrint "PASSED nested Do test"
+ ${Else}
+ DetailPrint "FAILED nested Do test"
+ ${EndIf}
+
+ ; while..exitwhile..endwhile (exact replica of dowhile..enddo}
+ StrCpy $R1 0
+ StrCpy $R2 ""
+ ${While} $R1 < 5
+ StrCpy $R2 $R2$R1
+ IntOp $R1 $R1 + 1
+ ${EndWhile}
+ ${If} $R2 == "01234"
+ DetailPrint "PASSED While..ExitWhile..EndWhile test"
+ ${Else}
+ DetailPrint "FAILED While..ExitWhile..EndWhile test"
+ ${EndIf}
+
+ ; Unsigned integer tests
+ StrCpy $R2 ""
+ ${If} -1 < 1
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} -1 U< 1
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 0xFFFFFFFF > 1
+ StrCpy $R2 $R2C
+ ${EndIf}
+ ${If} 0xFFFFFFFF U> 1
+ StrCpy $R2 $R2D
+ ${EndIf}
+ ${If} $R2 == "AD"
+ DetailPrint "PASSED unsigned integer test"
+ ${Else}
+ DetailPrint "FAILED unsigned integer test"
+ ${EndIf}
+
+ ; 64-bit integer tests (uses System.dll)
+ StrCpy $R2 ""
+ ${If} 0x100000000 L= 4294967296
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} 0x100000000 L< 0x200000000
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} 0x500000000 L>= 0x500000000
+ StrCpy $R2 $R2C
+ ${EndIf}
+ ${If} $R2 == "ABC"
+ DetailPrint "PASSED 64-bit integer test"
+ ${Else}
+ DetailPrint "FAILED 64-bit integer test"
+ ${EndIf}
+
+ ; Extra string tests (uses System.dll)
+ StrCpy $R2 ""
+ ${If} "A" S< "B"
+ StrCpy $R2 $R2A
+ ${EndIf}
+ ${If} "b" S> "A"
+ StrCpy $R2 $R2B
+ ${EndIf}
+ ${If} "a" S<= "B"
+ StrCpy $R2 $R2C
+ ${EndIf}
+ ${If} "B" S< "B"
+ StrCpy $R2 $R2D
+ ${EndIf}
+ ${If} "A" S== "A"
+ StrCpy $R2 $R2E
+ ${EndIf}
+ ${If} "A" S== "a"
+ StrCpy $R2 $R2F
+ ${EndIf}
+ ${If} "A" S!= "a"
+ StrCpy $R2 $R2G
+ ${EndIf}
+ ${If} $R2 == "ABCEG"
+ DetailPrint "PASSED extra string test"
+ ${Else}
+ DetailPrint "FAILED extra string test"
+ ${EndIf}
+
+SectionEnd
+
+Function ComponentsLeave
+ ; Section flags tests (requires sections.nsh be included)
+ ${Unless} ${SectionIsSelected} ${TESTS}
+ MessageBox MB_OK "Please select the component"
+ Abort
+ ${EndIf}
+FunctionEnd
+
+!verbose 3
diff --git a/Engine/bin/tools/nsis/app/Examples/Math/math.nsi b/Engine/bin/tools/nsis/app/Examples/Math/math.nsi
new file mode 100644
index 000000000..a32ab3c03
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Math/math.nsi
@@ -0,0 +1,33 @@
+; This is just an example of Math plugin
+;
+; (c) brainsucker, 2002
+; (r) BSForce
+
+Name "Math Plugin Example"
+OutFile "math.exe"
+ShowInstDetails show
+XPStyle on
+
+Section "ThisNameIsIgnoredSoWhyBother?"
+ Math::Script 'SaR(s,fa,ra, i,f,r,e,p) (i=0;#{i=0, (NS=s[p+4,]; NS=#[p>0,s[,p-1],'']), (NS='';NS=s)])"
+
+ Math::Script "a = 'Hello \r\n World \r\n!!!'; a = SaR(a,{'\r','\n'},{'$\r','$\n'}); R0 = a"
+ Math::Script "NS = '$\"In quotes$\"'; TQ(); R1=NS; R3=P(s(R1),'qu')"
+ Math::Script "NS = 'No quotes'; TQ(); R2=NS"
+ Math::Script "NS='123\r\n456\r\n789'; DL(); R4=NS; DL(); R5=NS; DL(); R6=NS; R7=NS"
+
+
+ DetailPrint "'$R0'"
+ DetailPrint "'$R1'"
+ DetailPrint "'$R2'"
+ DetailPrint "'$R3'"
+ DetailPrint "'$R4'"
+ DetailPrint "'$R5'"
+ DetailPrint "'$R6'"
+ DetailPrint "'$R7'"
+SectionEnd
+
+; eof
diff --git a/Engine/bin/tools/nsis/app/Examples/Math/mathtest.ini b/Engine/bin/tools/nsis/app/Examples/Math/mathtest.ini
new file mode 100644
index 000000000..f18075b7f
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Math/mathtest.ini
@@ -0,0 +1,101 @@
+[Settings]
+NumFields=10
+NextButtonText=Execute
+CancelButtonText=Quit
+BackButtonText=Readme
+
+[Field 1]
+Type=label
+Text=Enter your script here:
+Left=0
+Right=-1
+Top=0
+Bottom=8
+
+[Field 2]
+Type=text
+Left=0
+Right=-1
+Top=9
+Bottom=55
+flags=MULTILINE|WANTRETURN|HSCROLL
+State=""
+
+[Field 3]
+Type=text
+Left=53
+Right=175
+Top=56
+Bottom=140
+flags=MULTILINE|READONLY
+State=""
+
+[Field 4]
+Type=text
+Left=175
+Right=-1
+Top=56
+Bottom=140
+flags=MULTILINE|READONLY
+State=""
+
+[Field 5]
+Type=RadioButton
+Left=0
+Right=-1
+Top=70
+Bottom=80
+flags=GROUP
+Text="Your script"
+State=1
+
+[Field 6]
+Type=RadioButton
+Left=0
+Right=-1
+Top=80
+Bottom=90
+flags=
+Text="Sample 1"
+State=0
+
+[Field 7]
+Type=RadioButton
+Left=0
+Right=-1
+Top=90
+Bottom=100
+flags=
+Text="Sample 2"
+State=0
+
+[Field 8]
+Type=RadioButton
+Left=0
+Right=-1
+Top=100
+Bottom=110
+flags=
+Text="Sample 3"
+State=0
+
+[Field 9]
+Type=RadioButton
+Left=0
+Right=-1
+Top=110
+Bottom=120
+flags=
+Text="Sample 4"
+State=0
+
+[Field 10]
+Type=RadioButton
+Left=0
+Right=-1
+Top=120
+Bottom=130
+flags=
+Text="Sample 5"
+State=0
+
diff --git a/Engine/bin/tools/nsis/app/Examples/Math/mathtest.nsi b/Engine/bin/tools/nsis/app/Examples/Math/mathtest.nsi
new file mode 100644
index 000000000..191fa8ba5
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Math/mathtest.nsi
@@ -0,0 +1,171 @@
+;NSIS Modern User Interface version 1.65
+;InstallOptions Example Script
+;Written by Joost Verburg
+
+ !define MUI_BUTTONTEXT_NEXT "Execute"
+
+;---------------------
+;Include Modern UI
+
+ !include "MUI.nsh"
+
+;--------------------------------
+;Product Info
+
+Name "Math::Script Test"
+
+;--------------------------------
+;Configuration
+
+ ;General
+ OutFile "MathTest.exe"
+
+;--------------------------------
+;Variables
+
+ Var TEMP1
+ Var TEMP2
+ Var TEMP3
+
+;--------------------------------
+;Pages
+
+ !insertmacro MUI_PAGE_LICENSE "mathtest.txt"
+ Page custom ScriptPageEnter
+ Page instfiles
+
+;--------------------------------
+;Modern UI Configuration
+
+; !define MUI_ABORTWARNING
+
+;--------------------------------
+;Languages
+
+ !insertmacro MUI_LANGUAGE "English"
+
+;--------------------------------
+;Reserve Files
+
+ ;Things that need to be extracted on first (keep these lines before any File command!)
+ ;Only for BZIP2 compression
+
+ ReserveFile "MathTest.ini"
+ !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
+
+;--------------------------------
+;Installer Functions
+
+LangString SCRIPTSAMPLE0 ${LANG_ENGLISH} "r0 = 'Hello'; r1 = 'Math::Script'\r\nr0 += ' from the ' + r1 + '!'; r1=''"
+LangString SCRIPTSAMPLE1 ${LANG_ENGLISH} "a =0; b=1.0\r\n#{a++ < 100, b *= a}\r\nr0 = a; R0 = b; R1 = ff(b, 15)\r\nr1 = (a-1) + '! = ' + b"
+LangString SCRIPTSAMPLE2 ${LANG_ENGLISH} 'pi=3.14159; \r\nangle = pi/4;\r\ntext = "x = " + ff(angle,16+3) \r\nr0 = text += ", sin x = " + sin(angle)'
+LangString SCRIPTSAMPLE3 ${LANG_ENGLISH} "v1 = 123.456; v2 = 123456789.1011\r\nr0 = v1; r1 = v2\r\nr2 = ff(v1, 3); r3 = ff(v2, 3); r4 = ff(v1, 3+16); r5 = ff(v2, 3+16)\r\nr6 = ff(v1, 3+32); r7 = ff(v2, 3+32); r8 = ff(v1, 3+32+64); r9 = ff(v2, 3+32+64)\r\n"
+LangString SCRIPTSAMPLE4 ${LANG_ENGLISH} "a = 10000; b = 0; #{--a > 0, b+= a}; r0 = a; r1 = b\r\nz = 1.55; r2 = #[z > 1.5, 'Its greater', 'Its lower']\r\nz = 1.45; r3 = #[z > 1.5, 'Its greater', 'Its lower']"
+LangString SCRIPTSAMPLE5 ${LANG_ENGLISH} 'r0 = "123a123"\r\nr1 = r0; \r\nr2 = s(r0); r3 = f(r0); r4 = i(r0); r5 = l(r0)'
+
+Function .onInit
+
+ ;Extract InstallOptions INI files
+ !insertmacro MUI_INSTALLOPTIONS_EXTRACT "MathTest.ini"
+
+ Strcpy "$TEMP1" "$(SCRIPTSAMPLE0)"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 2" "State" $TEMP1
+
+FunctionEnd
+
+LangString TEXT_IO_TITLE ${LANG_ENGLISH} "MathTest Script Page"
+LangString TEXT_IO_SUBTITLE ${LANG_ENGLISH} "Try your scripting capapibilites or test one of sample scripts"
+
+
+Function DumpVariables
+ Strcpy "$TEMP1" "$$0='$0'\r\n$$1='$1'\r\n$$2='$2'\r\n$$3='$3'\r\n$$4='$4'\r\n$$5='$5'\r\n$$6='$6'\r\n$$7='$7'\r\n$$8='$8'\r\n$$9='$9'"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 3" "State" $TEMP1
+ Strcpy "$TEMP1" "$$R0='$R0'\r\n$$R1='$R1'\r\n$$R2='$R2'\r\n$$R3='$R3'\r\n$$R4='$R4'\r\n$$R5='$R5'\r\n$$R6='$R6'\r\n$$R7='$R7'\r\n$$R8='$R8'\r\n$$R9='$R9'"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 4" "State" $TEMP1
+FunctionEnd
+
+Function ClearVariables
+ Math::Script "r0=r1=r2=r3=r4=r5=r6=r7=r8=r9=R0=R1=R2=R3=R4=R5=R6=R7=R8=R9=''"
+FunctionEnd
+
+Function GetLine
+ push $TEMP1
+ Math::Script "mtsDL()"
+ pop $TEMP2
+ pop $TEMP1
+FunctionEnd
+
+Function ExecuteScript
+ !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 2" "State"
+
+ Math::Script "mtsTQ(s) (s = s(NS); #[s[0]=='$\"',s=s[1,]]; #[s[-1]=='$\"',s=s[,-2]]; NS = s)"
+ Math::Script "mtsP(s,e, p,i) (p=-1;i=0; #{(i=0, (NS=s[p+4,]; NS=#[p>0,s[,p-1],'']), (NS='';NS=s)])"
+
+ push $TEMP1
+ ; remove ""
+ Math::Script "mtsTQ()"
+ pop $TEMP1
+
+ ; script at $TEMP1
+Go:
+ StrLen $TEMP3 $TEMP1
+ IntCmp $TEMP3 0 End
+ ; get single line to $TEMP2
+ Call GetLine
+; MessageBox MB_OK "'$TEMP2' '$TEMP1'"
+ Math::Script "$TEMP2"
+ goto Go
+End:
+ Math::Script ""
+FunctionEnd
+
+Function ScriptPageEnter
+
+ !insertmacro MUI_HEADER_TEXT "$(TEXT_IO_TITLE)" "$(TEXT_IO_SUBTITLE)"
+
+Again:
+ Call ClearVariables
+ Call ExecuteScript
+ Call DumpVariables
+
+ !insertmacro MUI_INSTALLOPTIONS_DISPLAY_RETURN "mathtest.ini"
+ pop $TEMP3
+
+ !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 5" "State"
+ IntCmp $TEMP1 1 Test
+
+ Strcpy "$TEMP2" "$(SCRIPTSAMPLE1)"
+ !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 6" "State"
+ IntCmp $TEMP1 1 Write
+
+ Strcpy "$TEMP2" "$(SCRIPTSAMPLE2)"
+ !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 7" "State"
+ IntCmp $TEMP1 1 Write
+
+ Strcpy "$TEMP2" "$(SCRIPTSAMPLE3)"
+ !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 8" "State"
+ IntCmp $TEMP1 1 Write
+
+ Strcpy "$TEMP2" "$(SCRIPTSAMPLE4)"
+ !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 9" "State"
+ IntCmp $TEMP1 1 Write
+
+ Strcpy "$TEMP2" "$(SCRIPTSAMPLE5)"
+
+Write:
+ !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 2" "State" "$TEMP2"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 5" "State" "1"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 6" "State" "0"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 7" "State" "0"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 8" "State" "0"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 9" "State" "0"
+ !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 10" "State" "0"
+
+Test:
+ Strcmp $TEMP3 "success" Again
+
+FunctionEnd
+
+Section "Dummy Section" SecDummy
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/Math/mathtest.txt b/Engine/bin/tools/nsis/app/Examples/Math/mathtest.txt
new file mode 100644
index 000000000..f911e66de
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Math/mathtest.txt
@@ -0,0 +1,7 @@
+Math Tester.
+
+This demo allows you to test your Math::Script expressions without need to compile anything. Just enter your expressions into multiline editbox (every single line is a separate call to Math::Script) or select one of sample expressions and press Execute.
+
+Every call to Math::Script can accept up to 1kb of script, but this demo is limited to the summ of 1 kb at all lines. And... watch your scripts. No.... Watch your errors at scripts!
+
+(c) Brainsucker, 2003.
diff --git a/Engine/bin/tools/nsis/app/Examples/Memento.nsi b/Engine/bin/tools/nsis/app/Examples/Memento.nsi
new file mode 100644
index 000000000..531bc5757
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Memento.nsi
@@ -0,0 +1,79 @@
+!include LogicLib.nsh
+!include Memento.nsh
+
+Name Memento
+OutFile Memento.exe
+
+XPStyle on
+
+ShowInstDetails show
+
+Page components
+Page instfiles
+
+RequestExecutionLevel user
+
+# settings
+
+!define MEMENTO_REGISTRY_ROOT HKCU
+!define MEMENTO_REGISTRY_KEY "Software\NSIS\Memento Test"
+
+# restore
+
+Function .onInit
+
+ ${If} ${Cmd} `MessageBox MB_YESNO "Would you like to load an example state?" IDYES`
+
+ DeleteRegKey HKCU "Software\NSIS\Memento Test"
+
+ WriteRegStr HKCU "Software\NSIS\Memento Test" MementoSectionUsed ""
+ WriteRegDWORD HKCU "Software\NSIS\Memento Test" MementoSection_sec_horse 1
+ WriteRegDWORD HKCU "Software\NSIS\Memento Test" MementoSection_sec_chicken 1
+ WriteRegDWORD HKCU "Software\NSIS\Memento Test" MementoSection_sec_donkey 0
+ WriteRegDWORD HKCU "Software\NSIS\Memento Test" MementoSection_sec_croc 0
+
+ ${EndIf}
+
+ ${MementoSectionRestore}
+
+FunctionEnd
+
+# sections
+
+${MementoSection} horse sec_horse
+${MementoSectionEnd}
+
+${MementoSection} donkey sec_donkey
+${MementoSectionEnd}
+
+${MementoSection} chicken sec_chicken
+${MementoSectionEnd}
+
+SectionGroup /e group
+
+ SectionGroup /e group
+
+ ${MementoSection} croc sec_croc
+ ${MementoSectionEnd}
+
+ ${MementoSection} cow sec_cow
+ ${MementoSectionEnd}
+
+ SectionGroupEnd
+
+SectionGroupEnd
+
+${MementoUnselectedSection} dinosaur sec_dinosaur
+${MementoSectionEnd}
+
+# done...
+
+${MementoSectionDone}
+
+# save
+
+Function .onInstSuccess
+
+ ${MementoSectionSave}
+
+FunctionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/Modern UI/Basic.nsi b/Engine/bin/tools/nsis/app/Examples/Modern UI/Basic.nsi
new file mode 100644
index 000000000..d0fc7a2d9
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Modern UI/Basic.nsi
@@ -0,0 +1,88 @@
+;NSIS Modern User Interface
+;Basic Example Script
+;Written by Joost Verburg
+
+;--------------------------------
+;Include Modern UI
+
+ !include "MUI2.nsh"
+
+;--------------------------------
+;General
+
+ ;Name and file
+ Name "Modern UI Test"
+ OutFile "Basic.exe"
+
+ ;Default installation folder
+ InstallDir "$LOCALAPPDATA\Modern UI Test"
+
+ ;Get installation folder from registry if available
+ InstallDirRegKey HKCU "Software\Modern UI Test" ""
+
+ ;Request application privileges for Windows Vista
+ RequestExecutionLevel user
+
+;--------------------------------
+;Interface Settings
+
+ !define MUI_ABORTWARNING
+
+;--------------------------------
+;Pages
+
+ !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
+ !insertmacro MUI_PAGE_COMPONENTS
+ !insertmacro MUI_PAGE_DIRECTORY
+ !insertmacro MUI_PAGE_INSTFILES
+
+ !insertmacro MUI_UNPAGE_CONFIRM
+ !insertmacro MUI_UNPAGE_INSTFILES
+
+;--------------------------------
+;Languages
+
+ !insertmacro MUI_LANGUAGE "English"
+
+;--------------------------------
+;Installer Sections
+
+Section "Dummy Section" SecDummy
+
+ SetOutPath "$INSTDIR"
+
+ ;ADD YOUR OWN FILES HERE...
+
+ ;Store installation folder
+ WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR
+
+ ;Create uninstaller
+ WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+SectionEnd
+
+;--------------------------------
+;Descriptions
+
+ ;Language strings
+ LangString DESC_SecDummy ${LANG_ENGLISH} "A test section."
+
+ ;Assign language strings to sections
+ !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy)
+ !insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+;--------------------------------
+;Uninstaller Section
+
+Section "Uninstall"
+
+ ;ADD YOUR OWN FILES HERE...
+
+ Delete "$INSTDIR\Uninstall.exe"
+
+ RMDir "$INSTDIR"
+
+ DeleteRegKey /ifempty HKCU "Software\Modern UI Test"
+
+SectionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/Modern UI/HeaderBitmap.nsi b/Engine/bin/tools/nsis/app/Examples/Modern UI/HeaderBitmap.nsi
new file mode 100644
index 000000000..c31cdee18
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Modern UI/HeaderBitmap.nsi
@@ -0,0 +1,90 @@
+;NSIS Modern User Interface
+;Header Bitmap Example Script
+;Written by Joost Verburg
+
+;--------------------------------
+;Include Modern UI
+
+ !include "MUI2.nsh"
+
+;--------------------------------
+;General
+
+ ;Name and file
+ Name "Modern UI Test"
+ OutFile "HeaderBitmap.exe"
+
+ ;Default installation folder
+ InstallDir "$LOCALAPPDATA\Modern UI Test"
+
+ ;Get installation folder from registry if available
+ InstallDirRegKey HKCU "Software\Modern UI Test" ""
+
+ ;Request application privileges for Windows Vista
+ RequestExecutionLevel user
+
+;--------------------------------
+;Interface Configuration
+
+ !define MUI_HEADERIMAGE
+ !define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" ; optional
+ !define MUI_ABORTWARNING
+
+;--------------------------------
+;Pages
+
+ !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
+ !insertmacro MUI_PAGE_COMPONENTS
+ !insertmacro MUI_PAGE_DIRECTORY
+ !insertmacro MUI_PAGE_INSTFILES
+
+ !insertmacro MUI_UNPAGE_CONFIRM
+ !insertmacro MUI_UNPAGE_INSTFILES
+
+;--------------------------------
+;Languages
+
+ !insertmacro MUI_LANGUAGE "English"
+
+;--------------------------------
+;Installer Sections
+
+Section "Dummy Section" SecDummy
+
+ SetOutPath "$INSTDIR"
+
+ ;ADD YOUR OWN FILES HERE...
+
+ ;Store installation folder
+ WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR
+
+ ;Create uninstaller
+ WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+SectionEnd
+
+;--------------------------------
+;Descriptions
+
+ ;Language strings
+ LangString DESC_SecDummy ${LANG_ENGLISH} "A test section."
+
+ ;Assign language strings to sections
+ !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy)
+ !insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+;--------------------------------
+;Uninstaller Section
+
+Section "Uninstall"
+
+ ;ADD YOUR OWN FILES HERE...
+
+ Delete "$INSTDIR\Uninstall.exe"
+
+ RMDir "$INSTDIR"
+
+ DeleteRegKey /ifempty HKCU "Software\Modern UI Test"
+
+SectionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/Modern UI/MultiLanguage.nsi b/Engine/bin/tools/nsis/app/Examples/Modern UI/MultiLanguage.nsi
new file mode 100644
index 000000000..43569bb40
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Modern UI/MultiLanguage.nsi
@@ -0,0 +1,178 @@
+;NSIS Modern User Interface
+;Multilingual Example Script
+;Written by Joost Verburg
+
+;--------------------------------
+;Include Modern UI
+
+ !include "MUI2.nsh"
+
+;--------------------------------
+;General
+
+ ;Name and file
+ Name "Modern UI Test"
+ OutFile "MultiLanguage.exe"
+
+ ;Default installation folder
+ InstallDir "$LOCALAPPDATA\Modern UI Test"
+
+ ;Get installation folder from registry if available
+ InstallDirRegKey HKCU "Software\Modern UI Test" ""
+
+ ;Request application privileges for Windows Vista
+ RequestExecutionLevel user
+
+;--------------------------------
+;Interface Settings
+
+ !define MUI_ABORTWARNING
+
+;--------------------------------
+;Language Selection Dialog Settings
+
+ ;Remember the installer language
+ !define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
+ !define MUI_LANGDLL_REGISTRY_KEY "Software\Modern UI Test"
+ !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
+
+;--------------------------------
+;Pages
+
+ !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
+ !insertmacro MUI_PAGE_COMPONENTS
+ !insertmacro MUI_PAGE_DIRECTORY
+ !insertmacro MUI_PAGE_INSTFILES
+
+ !insertmacro MUI_UNPAGE_CONFIRM
+ !insertmacro MUI_UNPAGE_INSTFILES
+
+;--------------------------------
+;Languages
+
+ !insertmacro MUI_LANGUAGE "English" ;first language is the default language
+ !insertmacro MUI_LANGUAGE "French"
+ !insertmacro MUI_LANGUAGE "German"
+ !insertmacro MUI_LANGUAGE "Spanish"
+ !insertmacro MUI_LANGUAGE "SpanishInternational"
+ !insertmacro MUI_LANGUAGE "SimpChinese"
+ !insertmacro MUI_LANGUAGE "TradChinese"
+ !insertmacro MUI_LANGUAGE "Japanese"
+ !insertmacro MUI_LANGUAGE "Korean"
+ !insertmacro MUI_LANGUAGE "Italian"
+ !insertmacro MUI_LANGUAGE "Dutch"
+ !insertmacro MUI_LANGUAGE "Danish"
+ !insertmacro MUI_LANGUAGE "Swedish"
+ !insertmacro MUI_LANGUAGE "Norwegian"
+ !insertmacro MUI_LANGUAGE "NorwegianNynorsk"
+ !insertmacro MUI_LANGUAGE "Finnish"
+ !insertmacro MUI_LANGUAGE "Greek"
+ !insertmacro MUI_LANGUAGE "Russian"
+ !insertmacro MUI_LANGUAGE "Portuguese"
+ !insertmacro MUI_LANGUAGE "PortugueseBR"
+ !insertmacro MUI_LANGUAGE "Polish"
+ !insertmacro MUI_LANGUAGE "Ukrainian"
+ !insertmacro MUI_LANGUAGE "Czech"
+ !insertmacro MUI_LANGUAGE "Slovak"
+ !insertmacro MUI_LANGUAGE "Croatian"
+ !insertmacro MUI_LANGUAGE "Bulgarian"
+ !insertmacro MUI_LANGUAGE "Hungarian"
+ !insertmacro MUI_LANGUAGE "Thai"
+ !insertmacro MUI_LANGUAGE "Romanian"
+ !insertmacro MUI_LANGUAGE "Latvian"
+ !insertmacro MUI_LANGUAGE "Macedonian"
+ !insertmacro MUI_LANGUAGE "Estonian"
+ !insertmacro MUI_LANGUAGE "Turkish"
+ !insertmacro MUI_LANGUAGE "Lithuanian"
+ !insertmacro MUI_LANGUAGE "Slovenian"
+ !insertmacro MUI_LANGUAGE "Serbian"
+ !insertmacro MUI_LANGUAGE "SerbianLatin"
+ !insertmacro MUI_LANGUAGE "Arabic"
+ !insertmacro MUI_LANGUAGE "Farsi"
+ !insertmacro MUI_LANGUAGE "Hebrew"
+ !insertmacro MUI_LANGUAGE "Indonesian"
+ !insertmacro MUI_LANGUAGE "Mongolian"
+ !insertmacro MUI_LANGUAGE "Luxembourgish"
+ !insertmacro MUI_LANGUAGE "Albanian"
+ !insertmacro MUI_LANGUAGE "Breton"
+ !insertmacro MUI_LANGUAGE "Belarusian"
+ !insertmacro MUI_LANGUAGE "Icelandic"
+ !insertmacro MUI_LANGUAGE "Malay"
+ !insertmacro MUI_LANGUAGE "Bosnian"
+ !insertmacro MUI_LANGUAGE "Kurdish"
+ !insertmacro MUI_LANGUAGE "Irish"
+ !insertmacro MUI_LANGUAGE "Uzbek"
+ !insertmacro MUI_LANGUAGE "Galician"
+ !insertmacro MUI_LANGUAGE "Afrikaans"
+ !insertmacro MUI_LANGUAGE "Catalan"
+ !insertmacro MUI_LANGUAGE "Esperanto"
+
+;--------------------------------
+;Reserve Files
+
+ ;If you are using solid compression, files that are required before
+ ;the actual installation should be stored first in the data block,
+ ;because this will make your installer start faster.
+
+ !insertmacro MUI_RESERVEFILE_LANGDLL
+
+;--------------------------------
+;Installer Sections
+
+Section "Dummy Section" SecDummy
+
+ SetOutPath "$INSTDIR"
+
+ ;ADD YOUR OWN FILES HERE...
+
+ ;Store installation folder
+ WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR
+
+ ;Create uninstaller
+ WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+SectionEnd
+
+;--------------------------------
+;Installer Functions
+
+Function .onInit
+
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+FunctionEnd
+
+;--------------------------------
+;Descriptions
+
+ ;USE A LANGUAGE STRING IF YOU WANT YOUR DESCRIPTIONS TO BE LANGAUGE SPECIFIC
+
+ ;Assign descriptions to sections
+ !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} "A test section."
+ !insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+
+;--------------------------------
+;Uninstaller Section
+
+Section "Uninstall"
+
+ ;ADD YOUR OWN FILES HERE...
+
+ Delete "$INSTDIR\Uninstall.exe"
+
+ RMDir "$INSTDIR"
+
+ DeleteRegKey /ifempty HKCU "Software\Modern UI Test"
+
+SectionEnd
+
+;--------------------------------
+;Uninstaller Functions
+
+Function un.onInit
+
+ !insertmacro MUI_UNGETLANGUAGE
+
+FunctionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/Modern UI/StartMenu.nsi b/Engine/bin/tools/nsis/app/Examples/Modern UI/StartMenu.nsi
new file mode 100644
index 000000000..760f8acc2
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Modern UI/StartMenu.nsi
@@ -0,0 +1,114 @@
+;NSIS Modern User Interface
+;Start Menu Folder Selection Example Script
+;Written by Joost Verburg
+
+;--------------------------------
+;Include Modern UI
+
+ !include "MUI2.nsh"
+
+;--------------------------------
+;General
+
+ ;Name and file
+ Name "Modern UI Test"
+ OutFile "StartMenu.exe"
+
+ ;Default installation folder
+ InstallDir "$LOCALAPPDATA\Modern UI Test"
+
+ ;Get installation folder from registry if available
+ InstallDirRegKey HKCU "Software\Modern UI Test" ""
+
+ ;Request application privileges for Windows Vista
+ RequestExecutionLevel user
+
+;--------------------------------
+;Variables
+
+ Var StartMenuFolder
+
+;--------------------------------
+;Interface Settings
+
+ !define MUI_ABORTWARNING
+
+;--------------------------------
+;Pages
+
+ !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
+ !insertmacro MUI_PAGE_COMPONENTS
+ !insertmacro MUI_PAGE_DIRECTORY
+
+ ;Start Menu Folder Page Configuration
+ !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
+ !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Modern UI Test"
+ !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
+
+ !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder
+
+ !insertmacro MUI_PAGE_INSTFILES
+
+ !insertmacro MUI_UNPAGE_CONFIRM
+ !insertmacro MUI_UNPAGE_INSTFILES
+
+;--------------------------------
+;Languages
+
+ !insertmacro MUI_LANGUAGE "English"
+
+;--------------------------------
+;Installer Sections
+
+Section "Dummy Section" SecDummy
+
+ SetOutPath "$INSTDIR"
+
+ ;ADD YOUR OWN FILES HERE...
+
+ ;Store installation folder
+ WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR
+
+ ;Create uninstaller
+ WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+ !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+
+ ;Create shortcuts
+ CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
+ CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
+
+ !insertmacro MUI_STARTMENU_WRITE_END
+
+SectionEnd
+
+;--------------------------------
+;Descriptions
+
+ ;Language strings
+ LangString DESC_SecDummy ${LANG_ENGLISH} "A test section."
+
+ ;Assign language strings to sections
+ !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy)
+ !insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+;--------------------------------
+;Uninstaller Section
+
+Section "Uninstall"
+
+ ;ADD YOUR OWN FILES HERE...
+
+ Delete "$INSTDIR\Uninstall.exe"
+
+ RMDir "$INSTDIR"
+
+ !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder
+
+ Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk"
+ RMDir "$SMPROGRAMS\$StartMenuFolder"
+
+ DeleteRegKey /ifempty HKCU "Software\Modern UI Test"
+
+SectionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/Modern UI/WelcomeFinish.nsi b/Engine/bin/tools/nsis/app/Examples/Modern UI/WelcomeFinish.nsi
new file mode 100644
index 000000000..2121ea110
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Modern UI/WelcomeFinish.nsi
@@ -0,0 +1,92 @@
+;NSIS Modern User Interface
+;Welcome/Finish Page Example Script
+;Written by Joost Verburg
+
+;--------------------------------
+;Include Modern UI
+
+ !include "MUI2.nsh"
+
+;--------------------------------
+;General
+
+ ;Name and file
+ Name "Modern UI Test"
+ OutFile "WelcomeFinish.exe"
+
+ ;Default installation folder
+ InstallDir "$LOCALAPPDATA\Modern UI Test"
+
+ ;Get installation folder from registry if available
+ InstallDirRegKey HKCU "Software\Modern UI Test" ""
+
+ ;Request application privileges for Windows Vista
+ RequestExecutionLevel user
+
+;--------------------------------
+;Interface Settings
+
+ !define MUI_ABORTWARNING
+
+;--------------------------------
+;Pages
+
+ !insertmacro MUI_PAGE_WELCOME
+ !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
+ !insertmacro MUI_PAGE_COMPONENTS
+ !insertmacro MUI_PAGE_DIRECTORY
+ !insertmacro MUI_PAGE_INSTFILES
+ !insertmacro MUI_PAGE_FINISH
+
+ !insertmacro MUI_UNPAGE_WELCOME
+ !insertmacro MUI_UNPAGE_CONFIRM
+ !insertmacro MUI_UNPAGE_INSTFILES
+ !insertmacro MUI_UNPAGE_FINISH
+
+;--------------------------------
+;Languages
+
+ !insertmacro MUI_LANGUAGE "English"
+
+;--------------------------------
+;Installer Sections
+
+Section "Dummy Section" SecDummy
+
+ SetOutPath "$INSTDIR"
+
+ ;ADD YOUR OWN FILES HERE...
+
+ ;Store installation folder
+ WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR
+
+ ;Create uninstaller
+ WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+SectionEnd
+
+;--------------------------------
+;Descriptions
+
+ ;Language strings
+ LangString DESC_SecDummy ${LANG_ENGLISH} "A test section."
+
+ ;Assign language strings to sections
+ !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy)
+ !insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+;--------------------------------
+;Uninstaller Section
+
+Section "Uninstall"
+
+ ;ADD YOUR OWN FILES HERE...
+
+ Delete "$INSTDIR\Uninstall.exe"
+
+ RMDir "$INSTDIR"
+
+ DeleteRegKey /ifempty HKCU "Software\Modern UI Test"
+
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/Plugin/exdll-vs2008.sln b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll-vs2008.sln
new file mode 100644
index 000000000..1e79e86c7
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll-vs2008.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "exdll", "exdll.vcproj", "{5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Debug|Win32.Build.0 = Debug|Win32
+ {5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Release|Win32.ActiveCfg = Release|Win32
+ {5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Engine/bin/tools/nsis/app/Examples/Plugin/exdll-vs2008.vcproj b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll-vs2008.vcproj
new file mode 100644
index 000000000..800220aa0
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll-vs2008.vcproj
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Engine/bin/tools/nsis/app/Examples/Plugin/exdll.c b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll.c
new file mode 100644
index 000000000..6e5c1ac7e
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll.c
@@ -0,0 +1,38 @@
+#include
+#include // nsis plugin
+
+HINSTANCE g_hInstance;
+
+HWND g_hwndParent;
+
+void __declspec(dllexport) myFunction(HWND hwndParent, int string_size,
+ char *variables, stack_t **stacktop,
+ extra_parameters *extra)
+{
+ g_hwndParent=hwndParent;
+
+ EXDLL_INIT();
+
+
+ // note if you want parameters from the stack, pop them off in order.
+ // i.e. if you are called via exdll::myFunction file.dat poop.dat
+ // calling popstring() the first time would give you file.dat,
+ // and the second time would give you poop.dat.
+ // you should empty the stack of your parameters, and ONLY your
+ // parameters.
+
+ // do your stuff here
+ {
+ char buf[1024];
+ wsprintf(buf,"$0=%s\n",getuservariable(INST_0));
+ MessageBox(g_hwndParent,buf,0,MB_OK);
+ }
+}
+
+
+
+BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
+{
+ g_hInstance=hInst;
+ return TRUE;
+}
diff --git a/Engine/bin/tools/nsis/app/Examples/Plugin/exdll.dpr b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll.dpr
new file mode 100644
index 000000000..ec70b1082
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll.dpr
@@ -0,0 +1,118 @@
+{
+ NSIS ExDLL example
+ (C) 2001 - Peter Windridge
+
+ Fixed and formatted by Brett Dever
+ http://editor.nfscheats.com/
+
+ Tested in Delphi 7.0
+}
+
+library exdll;
+
+uses Windows;
+
+type
+ VarConstants = (
+ INST_0,
+ INST_1, // $1
+ INST_2, // $2
+ INST_3, // $3
+ INST_4, // $4
+ INST_5, // $5
+ INST_6, // $6
+ INST_7, // $7
+ INST_8, // $8
+ INST_9, // $9
+ INST_R0, // $R0
+ INST_R1, // $R1
+ INST_R2, // $R2
+ INST_R3, // $R3
+ INST_R4, // $R4
+ INST_R5, // $R5
+ INST_R6, // $R6
+ INST_R7, // $R7
+ INST_R8, // $R8
+ INST_R9, // $R9
+ INST_CMDLINE, // $CMDLINE
+ INST_INSTDIR, // $INSTDIR
+ INST_OUTDIR, // $OUTDIR
+ INST_EXEDIR, // $EXEDIR
+ INST_LANG, // $LANGUAGE
+ __INST_LAST
+ );
+ TVariableList = INST_0..__INST_LAST;
+ pstack_t = ^stack_t;
+ stack_t = record
+ next: pstack_t;
+ text: PChar;
+ end;
+
+var
+ g_stringsize: integer;
+ g_stacktop: ^pstack_t;
+ g_variables: PChar;
+ g_hwndParent: HWND;
+
+function PopString(): string;
+var
+ th: pstack_t;
+begin
+ if integer(g_stacktop^) <> 0 then begin
+ th := g_stacktop^;
+ Result := PChar(@th.text);
+ g_stacktop^ := th.next;
+ GlobalFree(HGLOBAL(th));
+ end;
+end;
+
+procedure PushString(const str: string='');
+var
+ th: pstack_t;
+begin
+ if integer(g_stacktop) <> 0 then begin
+ th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize));
+ lstrcpyn(@th.text, PChar(str), g_stringsize);
+ th.next := g_stacktop^;
+ g_stacktop^ := th;
+ end;
+end;
+
+function GetUserVariable(const varnum: TVariableList): string;
+begin
+ if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
+ Result := g_variables + integer(varnum) * g_stringsize
+ else
+ Result := '';
+end;
+
+procedure SetUserVariable(const varnum: TVariableList; const value: string);
+begin
+ if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
+ lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value))
+end;
+
+procedure NSISDialog(const text, caption: string; const buttons: integer);
+begin
+ MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);
+end;
+
+procedure ex_dll(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;
+begin
+ // setup global variables
+ g_stringsize := string_size;
+ g_hwndParent := hwndParent;
+ g_stacktop := stacktop;
+ g_variables := variables;
+ // end global variable setup
+
+ NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK);
+ NSISDialog(PopString, 'pop', MB_OK);
+ PushString('Hello, this is a push');
+ SetUserVariable(INST_0, 'This is user var $0');
+end;
+
+exports ex_dll;
+
+begin
+end.
diff --git a/Engine/bin/tools/nsis/app/Examples/Plugin/exdll.dsp b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll.dsp
new file mode 100644
index 000000000..9ff8fc2c6
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="exdll" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=exdll - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "exdll.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "exdll.mak" CFG="exdll - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "exdll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "exdll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "exdll - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O1 /I "." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /D NSISCALL=__stdcall /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib nsis\pluginapi.lib /nologo /entry:"DllMain" /dll /machine:I386 /nodefaultlib /out:"../../Plugins/exdll.dll" /opt:nowin98
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "exdll - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /D NSISCALL=__stdcall /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib nsis\pluginapi.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+
+!ENDIF
+
+# Begin Target
+
+# Name "exdll - Win32 Release"
+# Name "exdll - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\exdll.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\nsis\pluginapi.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/Engine/bin/tools/nsis/app/Examples/Plugin/exdll.dsw b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll.dsw
new file mode 100644
index 000000000..e8a07c1a2
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "exdll"=.\exdll.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/Engine/bin/tools/nsis/app/Examples/Plugin/exdll_with_unit.dpr b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll_with_unit.dpr
new file mode 100644
index 000000000..ad206af86
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Plugin/exdll_with_unit.dpr
@@ -0,0 +1,31 @@
+{
+ NSIS ExDLL2 example
+ Original is ExDLL
+ (C) 2001 - Peter Windridge
+
+ Changed with delphi unit nsis.pas
+ by bernhard mayer
+
+ Tested in Delphi 7.0
+}
+
+library exdll;
+
+uses
+ nsis, windows;
+
+procedure ex_dll(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;
+begin
+ // set up global variables
+ Init(hwndParent, string_size, variables, stacktop);
+
+ NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK);
+ NSISDialog(PopString, 'pop', MB_OK);
+ PushString('Hello, this is a push');
+ SetUserVariable(INST_0, 'This is user var $0');
+end;
+
+exports ex_dll;
+
+begin
+end.
diff --git a/Engine/bin/tools/nsis/app/Examples/Plugin/extdll.inc b/Engine/bin/tools/nsis/app/Examples/Plugin/extdll.inc
new file mode 100644
index 000000000..e3b7476ca
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Plugin/extdll.inc
@@ -0,0 +1,145 @@
+;################################################################
+; ExtDLL header for MASM32
+;
+; Author: Ramon
+;
+; Obs: This header must be included after windows.inc and kernel32.inc
+; because it need the prototypes for lstrcpy, lstrcpyn,
+; GlobalAlloc and GlobalFree
+;
+;################################################################
+stack_t struct
+ next dd ?
+ text dd ? ; 1 DUP(?) ; this should be the length of string_size
+stack_t ends
+
+.const
+; For page showing plug-ins
+WM_NOTIFY_OUTER_NEXT equ (WM_USER+0x8)
+WM_NOTIFY_CUSTOM_READY equ (WM_USER+0xd)
+NOTIFY_BYE_BYE equ 'x'
+
+INST_0 EQU 0 ; $0
+INST_1 EQU 1 ; $1
+INST_2 EQU 2 ; $2
+INST_3 EQU 3 ; $3
+INST_4 EQU 4 ; $4
+INST_5 EQU 5 ; $5
+INST_6 EQU 6 ; $6
+INST_7 EQU 7 ; $7
+INST_8 EQU 8 ; $8
+INST_9 EQU 9 ; $9
+INST_R0 EQU 10 ; $R0
+INST_R1 EQU 11 ; $R1
+INST_R2 EQU 12 ; $R2
+INST_R3 EQU 13 ; $R3
+INST_R4 EQU 14 ; $R4
+INST_R5 EQU 15 ; $R5
+INST_R6 EQU 16 ; $R6
+INST_R7 EQU 17 ; $R7
+INST_R8 EQU 18 ; $R8
+INST_R9 EQU 19 ; $R9
+INST_CMDLINE EQU 20 ; $CMDLINE
+INST_INSTDIR EQU 21 ; $INSTDIR
+INST_OUTDIR EQU 22 ; $OUTDIR
+INST_EXEDIR EQU 23 ; $EXEDIR
+INST_LANG EQU 24 ; $LANGUAGE
+__INST_LAST EQU 25
+
+.data?
+g_stringsize dd ?
+g_stacktop dd ?
+g_variables dd ?
+
+m2m MACRO M1, M2
+ push M2
+ pop M1
+ENDM
+
+EXDLL_INIT MACRO
+ m2m g_stringsize, string_size
+ m2m g_stacktop, stacktop
+ m2m g_variables, variables
+ENDM
+
+.code
+
+; utility functions (not required but often useful)
+popstring proc uses edi pStr:DWORD
+
+ LOCAL th:DWORD
+
+ mov edi, g_stacktop
+ cmp edi, 0
+ jz STACK_ERR
+ mov edi, [edi]
+ cmp edi, 0
+ jz STACK_ERR
+
+ ASSUME edi:PTR stack_t
+ invoke lstrcpy, pStr, ADDR [edi].text
+ mov th , edi
+ mov edi, [edi].next
+ mov eax, g_stacktop
+ mov [eax], edi
+ invoke GlobalFree, th
+ ASSUME edi:PTR NOTHING
+ mov eax, 0
+ ret
+
+STACK_ERR:
+ mov eax, 1
+ ret
+
+popstring endp
+
+pushstring proc uses edi pStr:DWORD
+
+ cmp g_stacktop, 0
+ jz STACK_ERR
+
+ mov eax, sizeof stack_t
+ add eax, g_stringsize
+ invoke GlobalAlloc, GPTR, eax
+
+ mov edi, eax
+ assume edi:PTR stack_t
+
+ invoke lstrcpyn, ADDR [edi].text, pStr, g_stringsize
+ mov eax, g_stacktop
+ push DWORD PTR[eax]
+ mov [eax], edi
+ pop eax
+ ;lea edi, [edi].next ; Not needed [edi].next == edi
+ mov DWORD PTR[edi], eax
+ ASSUME edi:PTR NOTHING
+
+STACK_ERR:
+ ret
+
+pushstring endp
+
+getuservariable proc varnum:DWORD
+
+ .if varnum < 0 || varnum >= __INST_LAST
+ xor eax, eax
+ .else
+ mov eax, varnum
+ imul eax, g_stringsize
+ add eax, g_variables
+ .endif
+ ret
+
+getuservariable endp
+
+setuservariable proc varnum:DWORD, var:DWORD
+
+ .if (var != NULL && varnum >= 0 && varnum < __INST_LAST)
+ mov eax, varnum
+ imul eax, g_stringsize
+ add eax, g_variables
+ invoke lstrcpy, eax, var
+ .endif
+ ret
+
+setuservariable endp
diff --git a/Engine/bin/tools/nsis/app/Examples/Plugin/nsis.pas b/Engine/bin/tools/nsis/app/Examples/Plugin/nsis.pas
new file mode 100644
index 000000000..be80e1bd8
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Plugin/nsis.pas
@@ -0,0 +1,126 @@
+{
+ Original Code from
+ (C) 2001 - Peter Windridge
+
+ Code in seperate unit and some changes
+ 2003 by Bernhard Mayer
+
+ Fixed and formatted by Brett Dever
+ http://editor.nfscheats.com/
+
+ simply include this unit in your plugin project and export
+ functions as needed
+}
+
+
+unit nsis;
+
+interface
+
+uses
+ windows;
+
+type
+ VarConstants = (
+ INST_0, // $0
+ INST_1, // $1
+ INST_2, // $2
+ INST_3, // $3
+ INST_4, // $4
+ INST_5, // $5
+ INST_6, // $6
+ INST_7, // $7
+ INST_8, // $8
+ INST_9, // $9
+ INST_R0, // $R0
+ INST_R1, // $R1
+ INST_R2, // $R2
+ INST_R3, // $R3
+ INST_R4, // $R4
+ INST_R5, // $R5
+ INST_R6, // $R6
+ INST_R7, // $R7
+ INST_R8, // $R8
+ INST_R9, // $R9
+ INST_CMDLINE, // $CMDLINE
+ INST_INSTDIR, // $INSTDIR
+ INST_OUTDIR, // $OUTDIR
+ INST_EXEDIR, // $EXEDIR
+ INST_LANG, // $LANGUAGE
+ __INST_LAST
+ );
+ TVariableList = INST_0..__INST_LAST;
+ pstack_t = ^stack_t;
+ stack_t = record
+ next: pstack_t;
+ text: PChar;
+ end;
+
+var
+ g_stringsize: integer;
+ g_stacktop: ^pstack_t;
+ g_variables: PChar;
+ g_hwndParent: HWND;
+
+procedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer);
+function PopString(): string;
+procedure PushString(const str: string='');
+function GetUserVariable(const varnum: TVariableList): string;
+procedure SetUserVariable(const varnum: TVariableList; const value: string);
+procedure NSISDialog(const text, caption: string; const buttons: integer);
+
+implementation
+
+procedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer);
+begin
+ g_stringsize := string_size;
+ g_hwndParent := hwndParent;
+ g_stacktop := stacktop;
+ g_variables := variables;
+end;
+
+function PopString(): string;
+var
+ th: pstack_t;
+begin
+ if integer(g_stacktop^) <> 0 then begin
+ th := g_stacktop^;
+ Result := PChar(@th.text);
+ g_stacktop^ := th.next;
+ GlobalFree(HGLOBAL(th));
+ end;
+end;
+
+procedure PushString(const str: string='');
+var
+ th: pstack_t;
+begin
+ if integer(g_stacktop) <> 0 then begin
+ th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize));
+ lstrcpyn(@th.text, PChar(str), g_stringsize);
+ th.next := g_stacktop^;
+ g_stacktop^ := th;
+ end;
+end;
+
+function GetUserVariable(const varnum: TVariableList): string;
+begin
+ if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
+ Result := g_variables + integer(varnum) * g_stringsize
+ else
+ Result := '';
+end;
+
+procedure SetUserVariable(const varnum: TVariableList; const value: string);
+begin
+ if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
+ lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value))
+end;
+
+procedure NSISDialog(const text, caption: string; const buttons: integer);
+begin
+ MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);
+end;
+
+begin
+end.
diff --git a/Engine/bin/tools/nsis/app/Examples/Plugin/nsis/api.h b/Engine/bin/tools/nsis/app/Examples/Plugin/nsis/api.h
new file mode 100644
index 000000000..e22c72ccb
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Plugin/nsis/api.h
@@ -0,0 +1,83 @@
+/*
+ * apih
+ *
+ * This file is a part of NSIS.
+ *
+ * Copyright (C) 1999-2009 Nullsoft and Contributors
+ *
+ * Licensed under the zlib/libpng license (the "License");
+ * you may not use this file except in compliance with the License.
+ *
+ * Licence details can be found in the file COPYING.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty.
+ */
+
+#ifndef _NSIS_EXEHEAD_API_H_
+#define _NSIS_EXEHEAD_API_H_
+
+// Starting with NSIS 2.42, you can check the version of the plugin API in exec_flags->plugin_api_version
+// The format is 0xXXXXYYYY where X is the major version and Y is the minor version (MAKELONG(y,x))
+// When doing version checks, always remember to use >=, ex: if (pX->exec_flags->plugin_api_version >= NSISPIAPIVER_1_0) {}
+
+#define NSISPIAPIVER_1_0 0x00010000
+#define NSISPIAPIVER_CURR NSISPIAPIVER_1_0
+
+// NSIS Plug-In Callback Messages
+enum NSPIM
+{
+ NSPIM_UNLOAD, // This is the last message a plugin gets, do final cleanup
+ NSPIM_GUIUNLOAD, // Called after .onGUIEnd
+};
+
+// Prototype for callbacks registered with extra_parameters->RegisterPluginCallback()
+// Return NULL for unknown messages
+// Should always be __cdecl for future expansion possibilities
+typedef UINT_PTR (*NSISPLUGINCALLBACK)(enum NSPIM);
+
+// extra_parameters data structures containing other interesting stuff
+// but the stack, variables and HWND passed on to plug-ins.
+typedef struct
+{
+ int autoclose;
+ int all_user_var;
+ int exec_error;
+ int abort;
+ int exec_reboot; // NSIS_SUPPORT_REBOOT
+ int reboot_called; // NSIS_SUPPORT_REBOOT
+ int XXX_cur_insttype; // depreacted
+ int plugin_api_version; // see NSISPIAPIVER_CURR
+ // used to be XXX_insttype_changed
+ int silent; // NSIS_CONFIG_SILENT_SUPPORT
+ int instdir_error;
+ int rtl;
+ int errlvl;
+ int alter_reg_view;
+ int status_update;
+} exec_flags_t;
+
+#ifndef NSISCALL
+# define NSISCALL __stdcall
+#endif
+
+typedef struct {
+ exec_flags_t *exec_flags;
+ int (NSISCALL *ExecuteCodeSegment)(int, HWND);
+ void (NSISCALL *validate_filename)(char *);
+ int (NSISCALL *RegisterPluginCallback)(HMODULE, NSISPLUGINCALLBACK); // returns 0 on success, 1 if already registered and < 0 on errors
+} extra_parameters;
+
+// Definitions for page showing plug-ins
+// See Ui.c to understand better how they're used
+
+// sent to the outer window to tell it to go to the next inner window
+#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)
+
+// custom pages should send this message to let NSIS know they're ready
+#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd)
+
+// sent as wParam with WM_NOTIFY_OUTER_NEXT when user cancels - heed its warning
+#define NOTIFY_BYE_BYE 'x'
+
+#endif /* _PLUGIN_H_ */
diff --git a/Engine/bin/tools/nsis/app/Examples/Plugin/nsis/pluginapi.h b/Engine/bin/tools/nsis/app/Examples/Plugin/nsis/pluginapi.h
new file mode 100644
index 000000000..a63202671
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Plugin/nsis/pluginapi.h
@@ -0,0 +1,74 @@
+#ifndef ___NSIS_PLUGIN__H___
+#define ___NSIS_PLUGIN__H___
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "api.h"
+
+#ifndef NSISCALL
+# define NSISCALL __stdcall
+#endif
+
+#define EXDLL_INIT() { \
+ g_stringsize=string_size; \
+ g_stacktop=stacktop; \
+ g_variables=variables; }
+
+typedef struct _stack_t {
+ struct _stack_t *next;
+ char text[1]; // this should be the length of string_size
+} stack_t;
+
+enum
+{
+INST_0, // $0
+INST_1, // $1
+INST_2, // $2
+INST_3, // $3
+INST_4, // $4
+INST_5, // $5
+INST_6, // $6
+INST_7, // $7
+INST_8, // $8
+INST_9, // $9
+INST_R0, // $R0
+INST_R1, // $R1
+INST_R2, // $R2
+INST_R3, // $R3
+INST_R4, // $R4
+INST_R5, // $R5
+INST_R6, // $R6
+INST_R7, // $R7
+INST_R8, // $R8
+INST_R9, // $R9
+INST_CMDLINE, // $CMDLINE
+INST_INSTDIR, // $INSTDIR
+INST_OUTDIR, // $OUTDIR
+INST_EXEDIR, // $EXEDIR
+INST_LANG, // $LANGUAGE
+__INST_LAST
+};
+
+extern unsigned int g_stringsize;
+extern stack_t **g_stacktop;
+extern char *g_variables;
+
+int NSISCALL popstring(char *str); // 0 on success, 1 on empty stack
+int NSISCALL popstringn(char *str, int maxlen); // with length limit, pass 0 for g_stringsize
+int NSISCALL popint(); // pops an integer
+int NSISCALL popint_or(); // with support for or'ing (2|4|8)
+int NSISCALL myatoi(const char *s); // converts a string to an integer
+unsigned NSISCALL myatou(const char *s); // converts a string to an unsigned integer, decimal only
+int NSISCALL myatoi_or(const char *s); // with support for or'ing (2|4|8)
+void NSISCALL pushstring(const char *str);
+void NSISCALL pushint(int value);
+char * NSISCALL getuservariable(const int varnum);
+void NSISCALL setuservariable(const int varnum, const char *var);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif//!___NSIS_PLUGIN__H___
diff --git a/Engine/bin/tools/nsis/app/Examples/Plugin/nsis/pluginapi.lib b/Engine/bin/tools/nsis/app/Examples/Plugin/nsis/pluginapi.lib
new file mode 100644
index 000000000..2fdd1f858
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Examples/Plugin/nsis/pluginapi.lib differ
diff --git a/Engine/bin/tools/nsis/app/Examples/Splash/Example.nsi b/Engine/bin/tools/nsis/app/Examples/Splash/Example.nsi
new file mode 100644
index 000000000..2cc62b52c
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/Splash/Example.nsi
@@ -0,0 +1,21 @@
+Name "Splash.dll test"
+
+OutFile "Splash Test.exe"
+
+XPStyle on
+
+Function .onInit
+ # the plugins dir is automatically deleted when the installer exits
+ InitPluginsDir
+ File /oname=$PLUGINSDIR\splash.bmp "${NSISDIR}\Contrib\Graphics\Wizard\orange-nsis.bmp"
+ #optional
+ #File /oname=$PLUGINSDIR\splash.wav "C:\myprog\sound.wav"
+
+ splash::show 1000 $PLUGINSDIR\splash
+
+ Pop $0 ; $0 has '1' if the user closed the splash screen early,
+ ; '0' if everything closed normally, and '-1' if some error occurred.
+FunctionEnd
+
+Section
+SectionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/StartMenu/Example.nsi b/Engine/bin/tools/nsis/app/Examples/StartMenu/Example.nsi
new file mode 100644
index 000000000..9a9a82e79
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/StartMenu/Example.nsi
@@ -0,0 +1,50 @@
+Name "StartMenu.dll test"
+
+OutFile "StartMenu Test.exe"
+
+XPStyle on
+
+Page directory
+DirText "This installer will create some shortcuts to MakeNSIS in the start menu.$\nFor this it needs NSIS's path." \
+ "Please specify the path in which you have installed NSIS:"
+InstallDir "${NSISDIR}"
+Function .onVerifyInstDir
+ IfFileExists $INSTDIR\makensis.exe +2
+ Abort
+FunctionEnd
+
+Page custom StartMenuGroupSelect "" ": Start Menu Folder"
+Function StartMenuGroupSelect
+ Push $R1
+
+ StartMenu::Select /checknoshortcuts "Don't create a start menu folder" /autoadd /lastused $R0 "StartMenu.dll test"
+ Pop $R1
+
+ StrCmp $R1 "success" success
+ StrCmp $R1 "cancel" done
+ ; error
+ MessageBox MB_OK $R1
+ StrCpy $R0 "StartMenu.dll test" # use default
+ Return
+ success:
+ Pop $R0
+
+ done:
+ Pop $R1
+FunctionEnd
+
+Page instfiles
+Section
+ # this part is only necessary if you used /checknoshortcuts
+ StrCpy $R1 $R0 1
+ StrCmp $R1 ">" skip
+
+ CreateDirectory $SMPROGRAMS\$R0
+ CreateShortCut $SMPROGRAMS\$R0\MakeNSISw.lnk $INSTDIR\makensisw.exe
+
+ SetShellVarContext All
+ CreateDirectory $SMPROGRAMS\$R0
+ CreateShortCut "$SMPROGRAMS\$R0\All users MakeNSISw.lnk" $INSTDIR\makensisw.exe
+
+ skip:
+SectionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/StrFunc.nsi b/Engine/bin/tools/nsis/app/Examples/StrFunc.nsi
new file mode 100644
index 000000000..f0df35374
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/StrFunc.nsi
@@ -0,0 +1,635 @@
+Name "NSIS StrFunc Example"
+OutFile "StrFunc.exe"
+ShowInstDetails show
+ShowUninstDetails show
+XPStyle on
+RequestExecutionLevel user
+
+!include "StrFunc.nsh"
+
+# Declare used functions
+${StrCase}
+${StrClb}
+${StrIOToNSIS}
+${StrLoc}
+${StrNSISToIO}
+${StrRep}
+${StrStr}
+${StrStrAdv}
+${StrTok}
+${StrTrimNewLines}
+${StrSort}
+
+${UnStrCase}
+${UnStrClb}
+${UnStrIOToNSIS}
+${UnStrLoc}
+${UnStrNSISToIO}
+${UnStrRep}
+${UnStrStr}
+${UnStrStrAdv}
+${UnStrTok}
+${UnStrTrimNewLines}
+${UnStrSort}
+
+!macro StackVerificationStart
+ StrCpy $0 S0
+ StrCpy $1 S1
+ StrCpy $2 S2
+ StrCpy $3 S3
+ StrCpy $4 S4
+ StrCpy $5 S5
+ StrCpy $6 S6
+ StrCpy $7 S7
+ StrCpy $8 S8
+ StrCpy $9 S9
+ StrCpy $R0 SR0
+ StrCpy $R1 SR1
+ StrCpy $R2 SR2
+ StrCpy $R3 SR3
+ StrCpy $R4 SR4
+ StrCpy $R5 SR5
+ StrCpy $R6 SR6
+ StrCpy $R7 SR7
+ StrCpy $R8 SR8
+ StrCpy $R9 SR9
+!macroend
+
+!macro StackVerificationEnd
+ ClearErrors
+ ${If} $1 != "S1"
+ ${OrIf} $2 != "S2"
+ ${OrIf} $3 != "S3"
+ ${OrIf} $4 != "S4"
+ ${OrIf} $5 != "S5"
+ ${OrIf} $6 != "S6"
+ ${OrIf} $7 != "S7"
+ ${OrIf} $8 != "S8"
+ ${OrIf} $9 != "S9"
+ ${OrIf} $R0 != "SR0"
+ ${OrIf} $R1 != "SR1"
+ ${OrIf} $R2 != "SR2"
+ ${OrIf} $R3 != "SR3"
+ ${OrIf} $R4 != "SR4"
+ ${OrIf} $R5 != "SR5"
+ ${OrIf} $R6 != "SR6"
+ ${OrIf} $R7 != "SR7"
+ ${OrIf} $R8 != "SR8"
+ ${OrIf} $R9 != "SR9"
+ SetErrors
+ ${EndIf}
+!macroend
+
+Section
+
+ # Test case conversion
+ !insertmacro StackVerificationStart
+ ${StrCase} $0 "This is just an example. A very simple one." ""
+ StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror
+ ${StrCase} $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." "S"
+ StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror
+ ${StrCase} $0 "This is just an example. A very simple one." "L"
+ StrCmp $0 "this is just an example. a very simple one." 0 strcaseerror
+ ${StrCase} $0 "This is just an example. A very simple one." "U"
+ StrCmp $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." 0 strcaseerror
+ ${StrCase} $0 "This is just an example. A very simple one." "T"
+ StrCmp $0 "This Is Just An Example. A Very Simple One." 0 strcaseerror
+ ${StrCase} $0 "This is just an example. A very simple one." "<>"
+ StrCmp $0 "tHIS IS JUST AN EXAMPLE. a VERY SIMPLE ONE." 0 strcaseerror
+ ${StrCase} $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" "S"
+ StrCmp $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" 0 strcaseerror
+ ${StrCase} $0 "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#%^&*()abcdefghijklmnopqrstuvwxyz-_=+[]{};:,./<>?" "<>"
+ StrCmp $0 "123456789abcdefghijklmnopqrstuvwxyz!@#%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ-_=+[]{};:,./<>?" 0 strcaseerror
+ ${StrCase} $0 "what about taking a shower tomorrow? it's late to do so now! try to sleep now. Good Night!" "S"
+ StrCmp $0 "What about taking a shower tomorrow? It's late to do so now! Try to sleep now. Good night!" 0 strcaseerror
+ !insertmacro StackVerificationEnd
+ IfErrors strcaseerror
+
+ DetailPrint "PASSED StrCase test"
+ Goto +2
+strcaseerror:
+ DetailPrint "FAILED StrCase test"
+
+ # Test clipboard function
+ !insertmacro StackVerificationStart
+ ${StrClb} $0 "StrFunc clipboard test" ">"
+ StrCmp $0 "" 0 strclberror
+ ${StrClb} $0 "StrFunc clipboard test #2" "<>"
+ StrCmp $0 "StrFunc clipboard test" 0 strclberror
+ ${StrClb} $0 "" "<"
+ StrCmp $0 "StrFunc clipboard test #2" 0 strclberror
+ ${StrClb} $0 "" ""
+ StrCmp $0 "" 0 strclberror
+ !insertmacro StackVerificationEnd
+ IfErrors strclberror
+
+ DetailPrint "PASSED StrClb test"
+ Goto +2
+strclberror:
+ DetailPrint "FAILED StrClb test"
+
+ # Test IO functions
+ !insertmacro StackVerificationStart
+ !macro testio str
+ ${StrNSISToIO} $0 "${str}"
+ ${StrIOToNSIS} $0 $0
+ StrCmp $0 "${str}" 0 ioerror
+ !macroend
+ !insertmacro testio "$\rtest$\n"
+ !insertmacro testio "test$\n"
+ !insertmacro testio "$\rtest"
+ !insertmacro testio "test"
+ !insertmacro testio "$\r\$\t$\n"
+ !insertmacro testio "$\r \ $\t $\n $$"
+ !insertmacro testio ""
+ !insertmacro testio " "
+ !insertmacro StackVerificationEnd
+ IfErrors ioerror
+
+ DetailPrint "PASSED StrNSISToIO/StrIOToNSIS test"
+ Goto +2
+ioerror:
+ DetailPrint "FAILED StrNSISToIO/StrIOToNSIS test"
+
+ # Test string search functions
+ !insertmacro StackVerificationStart
+ ${StrLoc} $0 "This is just an example" "just" "<"
+ StrCmp $0 "11" 0 strlocerror
+ ${StrLoc} $0 a abc <
+ StrCmp $0 "" 0 strlocerror
+ ${StrLoc} $0 a abc >
+ StrCmp $0 "" 0 strlocerror
+ ${StrLoc} $0 abc a >
+ StrCmp $0 "0" 0 strlocerror
+ ${StrLoc} $0 abc b >
+ StrCmp $0 "1" 0 strlocerror
+ ${StrLoc} $0 abc c >
+ StrCmp $0 "2" 0 strlocerror
+ ${StrLoc} $0 abc a <
+ StrCmp $0 "2" 0 strlocerror
+ ${StrLoc} $0 abc b <
+ StrCmp $0 "1" 0 strlocerror
+ ${StrLoc} $0 abc c <
+ StrCmp $0 "0" 0 strlocerror
+ ${StrLoc} $0 abc d <
+ StrCmp $0 "" 0 strlocerror
+ !insertmacro StackVerificationEnd
+ IfErrors strlocerror
+
+ DetailPrint "PASSED StrLoc test"
+ Goto +2
+strlocerror:
+ DetailPrint "FAILED StrLoc test"
+
+ # Test string replacement
+ !insertmacro StackVerificationStart
+ ${StrRep} $0 "This is just an example" "an" "one"
+ StrCmp $0 "This is just one example" 0 strreperror
+ ${StrRep} $0 "test... test... 1 2 3..." "test" "testing"
+ StrCmp $0 "testing... testing... 1 2 3..." 0 strreperror
+ ${StrRep} $0 "" "test" "testing"
+ StrCmp $0 "" 0 strreperror
+ ${StrRep} $0 "test" "test" "testing"
+ StrCmp $0 "testing" 0 strreperror
+ ${StrRep} $0 "test" "test" ""
+ StrCmp $0 "" 0 strreperror
+ ${StrRep} $0 "test" "" "abc"
+ StrCmp $0 "test" 0 strreperror
+ ${StrRep} $0 "test" "" ""
+ StrCmp $0 "test" 0 strreperror
+ !insertmacro StackVerificationEnd
+ IfErrors strreperror
+
+ DetailPrint "PASSED StrRep test"
+ Goto +2
+strreperror:
+ DetailPrint "FAILED StrRep test"
+
+ # Test sorting
+ !insertmacro StackVerificationStart
+ ${StrSort} $0 "This is just an example" "" " just" "ple" "0" "0" "0"
+ StrCmp $0 "This is an exam" 0 strsorterror
+ ${StrSort} $0 "This is just an example" " " "j" " " "0" "" "0"
+ StrCmp $0 "just" 0 strsorterror
+ ${StrSort} $0 "This is just an example" "" "j" "" "0" "1" "0"
+ StrCmp $0 "This is just an example" 0 strsorterror
+ ${StrSort} $0 "This is just an example" " " "us" "" "0" "1" "0"
+ StrCmp $0 "just an example" 0 strsorterror
+ ${StrSort} $0 "This is just an example" "" "u" " " "0" "1" "0"
+ StrCmp $0 "This is just" 0 strsorterror
+ ${StrSort} $0 "This is just an example" " " "just" " " "0" "1" "0"
+ StrCmp $0 "just" 0 strsorterror
+ ${StrSort} $0 "This is just an example" " " "t" " " "0" "1" "0"
+ StrCmp $0 "This" 0 strsorterror
+ ${StrSort} $0 "This is just an example" " " "le" " " "0" "1" "0"
+ StrCmp $0 "example" 0 strsorterror
+ ${StrSort} $0 "This is just an example" " " "le" " " "1" "0" "0"
+ StrCmp $0 " examp" 0 strsorterror
+ ${StrSort} $0 "an error has occurred" " " "e" " " "0" "1" "0"
+ StrCmp $0 "error" 0 strsorterror
+ ${StrSort} $0 "" " " "something" " " "0" "1" "0"
+ StrCmp $0 "" 0 strsorterror
+ ${StrSort} $0 "This is just an example" " " "j" " " "" "" ""
+ StrCmp $0 " just " 0 strsorterror
+ ${StrSort} $0 "This is just an example" " " "j" " " "1" "0" "1"
+ StrCmp $0 " ust " 0 strsorterror
+ ${StrSort} $0 "This is just an example" "" "j" "" "0" "0" "1"
+ StrCmp $0 "This is ust an example" 0 strsorterror
+ ${StrSort} $0 "This is just an example" " " "us" "" "1" "0" "0"
+ StrCmp $0 " jt an example" 0 strsorterror
+ ${StrSort} $0 "This is just an example" "" "u" " " "0" "0" "1"
+ StrCmp $0 "This is jst " 0 strsorterror
+ ${StrSort} $0 "This is just an example" " " "just" " " "1" "0" "1"
+ StrCmp $0 " " 0 strsorterror
+ ${StrSort} $0 "an error has occurred" " " "e" "h" "1" "0" "0"
+ StrCmp $0 " rror " 0 strsorterror
+ ${StrSort} $0 "" " " "something" " " "1" "0" "1"
+ StrCmp $0 "" 0 strsorterror
+ !insertmacro StackVerificationEnd
+ IfErrors strsorterror
+
+ DetailPrint "PASSED StrSort test"
+ Goto +2
+strsorterror:
+ DetailPrint "FAILED StrSort test"
+
+ !insertmacro StackVerificationStart
+ ${StrStr} $0 "abcefghijklmnopqrstuvwxyz" "g"
+ StrCmp $0 "ghijklmnopqrstuvwxyz" 0 strstrerror
+ ${StrStr} $0 "abcefghijklmnopqrstuvwxyz" "ga"
+ StrCmp $0 "" 0 strstrerror
+ ${StrStr} $0 "abcefghijklmnopqrstuvwxyz" ""
+ StrCmp $0 "abcefghijklmnopqrstuvwxyz" 0 strstrerror
+ ${StrStr} $0 "a" "abcefghijklmnopqrstuvwxyz"
+ StrCmp $0 "" 0 strstrerror
+ !insertmacro StackVerificationEnd
+ IfErrors strstrerror
+
+ DetailPrint "PASSED StrStr test"
+ Goto +2
+strstrerror:
+ DetailPrint "FAILED StrStr test"
+
+ !insertmacro StackVerificationStart
+ ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "0" "0"
+ StrCmp $0 "abcabcabc" 0 strstradverror
+ ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "1" "0"
+ StrCmp $0 "abcabc" 0 strstradverror
+ ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "2" "0"
+ StrCmp $0 "abc" 0 strstradverror
+ ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "3" "0"
+ StrCmp $0 "" 0 strstradverror
+ ${StrStrAdv} $0 "abcabcabc" "abc" ">" "<" "1" "1" "0"
+ StrCmp $0 "abcabc" 0 strstradverror
+ ${StrStrAdv} $0 "abcabcabc" "abc" ">" "<" "0" "1" "0"
+ StrCmp $0 "abc" 0 strstradverror
+ ${StrStrAdv} $0 "abcabcabc" "abc" "<" "<" "1" "0" "0"
+ StrCmp $0 "abcabcabc" 0 strstradverror
+ ${StrStrAdv} $0 "abcabcabc" "abc" "<" "<" "0" "0" "0"
+ StrCmp $0 "abcabc" 0 strstradverror
+ ${StrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "0" "0"
+ StrCmp $0 "" 0 strstradverror
+ ${StrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "1" "0"
+ StrCmp $0 "abc" 0 strstradverror
+ ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "0" "1"
+ StrCmp $0 "abcabc" 0 strstradverror
+ ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "1" "1"
+ StrCmp $0 "abc" 0 strstradverror
+ ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "2" "1"
+ StrCmp $0 "" 0 strstradverror
+ ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "3" "1"
+ StrCmp $0 "" 0 strstradverror
+ ${StrStrAdv} $0 "ABCabcabc" "abc" ">" "<" "1" "1" "1"
+ StrCmp $0 "ABCabcabc" 0 strstradverror
+ ${StrStrAdv} $0 "ABCabcabc" "abc" ">" "<" "0" "1" "1"
+ StrCmp $0 "ABCabc" 0 strstradverror
+ ${StrStrAdv} $0 "ABCabcabc" "abc" "<" "<" "1" "0" "1"
+ StrCmp $0 "ABCabcabc" 0 strstradverror
+ ${StrStrAdv} $0 "ABCabcabc" "abc" "<" "<" "0" "0" "1"
+ StrCmp $0 "ABCabc" 0 strstradverror
+ ${StrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "0" "1"
+ StrCmp $0 "" 0 strstradverror
+ ${StrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "1" "1"
+ StrCmp $0 "abc" 0 strstradverror
+ !insertmacro StackVerificationEnd
+ IfErrors strstradverror
+
+ DetailPrint "PASSED StrStrAdv test"
+ Goto +2
+strstradverror:
+ DetailPrint "FAILED StrStrAdv test"
+
+ # Test tokenizer
+ !insertmacro StackVerificationStart
+ ${StrTok} $0 "This is, or is not, just an example" " ," "4" "1"
+ StrCmp $0 "not" 0 strtokerror
+ ${StrTok} $0 "This is, or is not, just an example" " ," "4" "0"
+ StrCmp $0 "is" 0 strtokerror
+ ${StrTok} $0 "This is, or is not, just an example" " ," "152" "0"
+ StrCmp $0 "" 0 strtokerror
+ ${StrTok} $0 "This is, or is not, just an example" " ," "" "0"
+ StrCmp $0 "example" 0 strtokerror
+ ${StrTok} $0 "This is, or is not, just an example" " ," "L" "0"
+ StrCmp $0 "example" 0 strtokerror
+ ${StrTok} $0 "This is, or is not, just an example" " ," "0" "0"
+ StrCmp $0 "This" 0 strtokerror
+ !insertmacro StackVerificationEnd
+ IfErrors strtokerror
+
+ DetailPrint "PASSED StrTok test"
+ Goto +2
+strtokerror:
+ DetailPrint "FAILED StrTok test"
+
+ # Test trim new lines
+ !insertmacro StackVerificationStart
+ ${StrTrimNewLines} $0 "$\r$\ntest$\r$\ntest$\r$\n"
+ StrCmp $0 "$\r$\ntest$\r$\ntest" 0 strtrimnewlineserror
+ !insertmacro StackVerificationEnd
+ IfErrors strtrimnewlineserror
+
+ DetailPrint "PASSED StrTrimNewLines test"
+ Goto +2
+strtrimnewlineserror:
+ DetailPrint "FAILED StrTrimNewLines test"
+
+ WriteUninstaller $EXEDIR\UnStrFunc.exe
+
+ Exec $EXEDIR\UnStrFunc.exe
+
+SectionEnd
+
+Section Uninstall
+
+ # Test case conversion
+ !insertmacro StackVerificationStart
+ ${UnStrCase} $0 "This is just an example. A very simple one." ""
+ StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror
+ ${UnStrCase} $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." "S"
+ StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror
+ ${UnStrCase} $0 "This is just an example. A very simple one." "L"
+ StrCmp $0 "this is just an example. a very simple one." 0 strcaseerror
+ ${UnStrCase} $0 "This is just an example. A very simple one." "U"
+ StrCmp $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." 0 strcaseerror
+ ${UnStrCase} $0 "This is just an example. A very simple one." "T"
+ StrCmp $0 "This Is Just An Example. A Very Simple One." 0 strcaseerror
+ ${UnStrCase} $0 "This is just an example. A very simple one." "<>"
+ StrCmp $0 "tHIS IS JUST AN EXAMPLE. a VERY SIMPLE ONE." 0 strcaseerror
+ ${UnStrCase} $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" "S"
+ StrCmp $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" 0 strcaseerror
+ ${UnStrCase} $0 "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#%^&*()abcdefghijklmnopqrstuvwxyz-_=+[]{};:,./<>?" "<>"
+ StrCmp $0 "123456789abcdefghijklmnopqrstuvwxyz!@#%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ-_=+[]{};:,./<>?" 0 strcaseerror
+ ${UnStrCase} $0 "what about taking a shower tomorrow? it's late to do so now! try to sleep now. Good Night!" "S"
+ StrCmp $0 "What about taking a shower tomorrow? It's late to do so now! Try to sleep now. Good night!" 0 strcaseerror
+ !insertmacro StackVerificationEnd
+ IfErrors strcaseerror
+
+ DetailPrint "PASSED StrCase test"
+ Goto +2
+strcaseerror:
+ DetailPrint "FAILED StrCase test"
+
+ # Test clipboard function
+ !insertmacro StackVerificationStart
+ ${UnStrClb} $0 "StrFunc clipboard test" ">"
+ StrCmp $0 "" 0 strclberror
+ ${UnStrClb} $0 "StrFunc clipboard test #2" "<>"
+ StrCmp $0 "StrFunc clipboard test" 0 strclberror
+ ${UnStrClb} $0 "" "<"
+ StrCmp $0 "StrFunc clipboard test #2" 0 strclberror
+ ${UnStrClb} $0 "" ""
+ StrCmp $0 "" 0 strclberror
+ !insertmacro StackVerificationEnd
+ IfErrors strclberror
+
+ DetailPrint "PASSED StrClb test"
+ Goto +2
+strclberror:
+ DetailPrint "FAILED StrClb test"
+
+ # Test IO functions
+ !insertmacro StackVerificationStart
+ !macro untestio str
+ ${UnStrNSISToIO} $0 "${str}"
+ ${UnStrIOToNSIS} $0 $0
+ StrCmp $0 "${str}" 0 ioerror
+ !macroend
+ !insertmacro untestio "$\rtest$\n"
+ !insertmacro untestio "test$\n"
+ !insertmacro untestio "$\rtest"
+ !insertmacro untestio "test"
+ !insertmacro untestio "$\r\$\t$\n"
+ !insertmacro untestio "$\r \ $\t $\n $$"
+ !insertmacro untestio ""
+ !insertmacro untestio " "
+ !insertmacro StackVerificationEnd
+ IfErrors ioerror
+
+ DetailPrint "PASSED StrNSISToIO/StrIOToNSIS test"
+ Goto +2
+ioerror:
+ DetailPrint "FAILED StrNSISToIO/StrIOToNSIS test"
+
+ # Test string search functions
+ !insertmacro StackVerificationStart
+ ${UnStrLoc} $0 "This is just an example" "just" "<"
+ StrCmp $0 "11" 0 strlocerror
+ ${UnStrLoc} $0 a abc <
+ StrCmp $0 "" 0 strlocerror
+ ${UnStrLoc} $0 a abc >
+ StrCmp $0 "" 0 strlocerror
+ ${UnStrLoc} $0 abc a >
+ StrCmp $0 "0" 0 strlocerror
+ ${UnStrLoc} $0 abc b >
+ StrCmp $0 "1" 0 strlocerror
+ ${UnStrLoc} $0 abc c >
+ StrCmp $0 "2" 0 strlocerror
+ ${UnStrLoc} $0 abc a <
+ StrCmp $0 "2" 0 strlocerror
+ ${UnStrLoc} $0 abc b <
+ StrCmp $0 "1" 0 strlocerror
+ ${UnStrLoc} $0 abc c <
+ StrCmp $0 "0" 0 strlocerror
+ ${UnStrLoc} $0 abc d <
+ StrCmp $0 "" 0 strlocerror
+ !insertmacro StackVerificationEnd
+ IfErrors strlocerror
+
+ DetailPrint "PASSED StrLoc test"
+ Goto +2
+strlocerror:
+ DetailPrint "FAILED StrLoc test"
+
+ # Test string replacement
+ !insertmacro StackVerificationStart
+ ${UnStrRep} $0 "This is just an example" "an" "one"
+ StrCmp $0 "This is just one example" 0 strreperror
+ ${UnStrRep} $0 "test... test... 1 2 3..." "test" "testing"
+ StrCmp $0 "testing... testing... 1 2 3..." 0 strreperror
+ ${UnStrRep} $0 "" "test" "testing"
+ StrCmp $0 "" 0 strreperror
+ ${UnStrRep} $0 "test" "test" "testing"
+ StrCmp $0 "testing" 0 strreperror
+ ${UnStrRep} $0 "test" "test" ""
+ StrCmp $0 "" 0 strreperror
+ ${UnStrRep} $0 "test" "" "abc"
+ StrCmp $0 "test" 0 strreperror
+ ${UnStrRep} $0 "test" "" ""
+ StrCmp $0 "test" 0 strreperror
+ !insertmacro StackVerificationEnd
+ IfErrors strreperror
+
+ DetailPrint "PASSED StrRep test"
+ Goto +2
+strreperror:
+ DetailPrint "FAILED StrRep test"
+
+ # Test sorting
+ !insertmacro StackVerificationStart
+ ${UnStrSort} $0 "This is just an example" "" " just" "ple" "0" "0" "0"
+ StrCmp $0 "This is an exam" 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" " " "j" " " "0" "" "0"
+ StrCmp $0 "just" 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" "" "j" "" "0" "1" "0"
+ StrCmp $0 "This is just an example" 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" " " "us" "" "0" "1" "0"
+ StrCmp $0 "just an example" 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" "" "u" " " "0" "1" "0"
+ StrCmp $0 "This is just" 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" " " "just" " " "0" "1" "0"
+ StrCmp $0 "just" 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" " " "t" " " "0" "1" "0"
+ StrCmp $0 "This" 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" " " "le" " " "0" "1" "0"
+ StrCmp $0 "example" 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" " " "le" " " "1" "0" "0"
+ StrCmp $0 " examp" 0 strsorterror
+ ${UnStrSort} $0 "an error has occurred" " " "e" " " "0" "1" "0"
+ StrCmp $0 "error" 0 strsorterror
+ ${UnStrSort} $0 "" " " "something" " " "0" "1" "0"
+ StrCmp $0 "" 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" " " "j" " " "" "" ""
+ StrCmp $0 " just " 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" " " "j" " " "1" "0" "1"
+ StrCmp $0 " ust " 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" "" "j" "" "0" "0" "1"
+ StrCmp $0 "This is ust an example" 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" " " "us" "" "1" "0" "0"
+ StrCmp $0 " jt an example" 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" "" "u" " " "0" "0" "1"
+ StrCmp $0 "This is jst " 0 strsorterror
+ ${UnStrSort} $0 "This is just an example" " " "just" " " "1" "0" "1"
+ StrCmp $0 " " 0 strsorterror
+ ${UnStrSort} $0 "an error has occurred" " " "e" "h" "1" "0" "0"
+ StrCmp $0 " rror " 0 strsorterror
+ ${UnStrSort} $0 "" " " "something" " " "1" "0" "1"
+ StrCmp $0 "" 0 strsorterror
+ !insertmacro StackVerificationEnd
+ IfErrors strsorterror
+
+ DetailPrint "PASSED StrSort test"
+ Goto +2
+strsorterror:
+ DetailPrint "FAILED StrSort test"
+
+ !insertmacro StackVerificationStart
+ ${UnStrStr} $0 "abcefghijklmnopqrstuvwxyz" "g"
+ StrCmp $0 "ghijklmnopqrstuvwxyz" 0 strstrerror
+ ${UnStrStr} $0 "abcefghijklmnopqrstuvwxyz" "ga"
+ StrCmp $0 "" 0 strstrerror
+ ${UnStrStr} $0 "abcefghijklmnopqrstuvwxyz" ""
+ StrCmp $0 "abcefghijklmnopqrstuvwxyz" 0 strstrerror
+ ${UnStrStr} $0 "a" "abcefghijklmnopqrstuvwxyz"
+ StrCmp $0 "" 0 strstrerror
+ !insertmacro StackVerificationEnd
+ IfErrors strstrerror
+
+ DetailPrint "PASSED StrStr test"
+ Goto +2
+strstrerror:
+ DetailPrint "FAILED StrStr test"
+
+ !insertmacro StackVerificationStart
+ ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "0" "0"
+ StrCmp $0 "abcabcabc" 0 strstradverror
+ ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "1" "0"
+ StrCmp $0 "abcabc" 0 strstradverror
+ ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "2" "0"
+ StrCmp $0 "abc" 0 strstradverror
+ ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "3" "0"
+ StrCmp $0 "" 0 strstradverror
+ ${UnStrStrAdv} $0 "abcabcabc" "abc" ">" "<" "1" "1" "0"
+ StrCmp $0 "abcabc" 0 strstradverror
+ ${UnStrStrAdv} $0 "abcabcabc" "abc" ">" "<" "0" "1" "0"
+ StrCmp $0 "abc" 0 strstradverror
+ ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" "<" "1" "0" "0"
+ StrCmp $0 "abcabcabc" 0 strstradverror
+ ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" "<" "0" "0" "0"
+ StrCmp $0 "abcabc" 0 strstradverror
+ ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "0" "0"
+ StrCmp $0 "" 0 strstradverror
+ ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "1" "0"
+ StrCmp $0 "abc" 0 strstradverror
+ ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "0" "1"
+ StrCmp $0 "abcabc" 0 strstradverror
+ ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "1" "1"
+ StrCmp $0 "abc" 0 strstradverror
+ ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "2" "1"
+ StrCmp $0 "" 0 strstradverror
+ ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "3" "1"
+ StrCmp $0 "" 0 strstradverror
+ ${UnStrStrAdv} $0 "ABCabcabc" "abc" ">" "<" "1" "1" "1"
+ StrCmp $0 "ABCabcabc" 0 strstradverror
+ ${UnStrStrAdv} $0 "ABCabcabc" "abc" ">" "<" "0" "1" "1"
+ StrCmp $0 "ABCabc" 0 strstradverror
+ ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" "<" "1" "0" "1"
+ StrCmp $0 "ABCabcabc" 0 strstradverror
+ ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" "<" "0" "0" "1"
+ StrCmp $0 "ABCabc" 0 strstradverror
+ ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "0" "1"
+ StrCmp $0 "" 0 strstradverror
+ ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "1" "1"
+ StrCmp $0 "abc" 0 strstradverror
+ !insertmacro StackVerificationEnd
+ IfErrors strstradverror
+
+ DetailPrint "PASSED StrStrAdv test"
+ Goto +2
+strstradverror:
+ DetailPrint "FAILED StrStrAdv test"
+
+ # Test tokenizer
+ !insertmacro StackVerificationStart
+ ${UnStrTok} $0 "This is, or is not, just an example" " ," "4" "1"
+ StrCmp $0 "not" 0 strtokerror
+ ${UnStrTok} $0 "This is, or is not, just an example" " ," "4" "0"
+ StrCmp $0 "is" 0 strtokerror
+ ${UnStrTok} $0 "This is, or is not, just an example" " ," "152" "0"
+ StrCmp $0 "" 0 strtokerror
+ ${UnStrTok} $0 "This is, or is not, just an example" " ," "" "0"
+ StrCmp $0 "example" 0 strtokerror
+ ${UnStrTok} $0 "This is, or is not, just an example" " ," "L" "0"
+ StrCmp $0 "example" 0 strtokerror
+ ${UnStrTok} $0 "This is, or is not, just an example" " ," "0" "0"
+ StrCmp $0 "This" 0 strtokerror
+ !insertmacro StackVerificationEnd
+ IfErrors strtokerror
+
+ DetailPrint "PASSED StrTok test"
+ Goto +2
+strtokerror:
+ DetailPrint "FAILED StrTok test"
+
+ # Test trim new lines
+ !insertmacro StackVerificationStart
+ ${UnStrTrimNewLines} $0 "$\r$\ntest$\r$\ntest$\r$\n"
+ StrCmp $0 "$\r$\ntest$\r$\ntest" 0 strtrimnewlineserror
+ !insertmacro StackVerificationEnd
+ IfErrors strtrimnewlineserror
+
+ DetailPrint "PASSED StrTrimNewLines test"
+ Goto +2
+strtrimnewlineserror:
+ DetailPrint "FAILED StrTrimNewLines test"
+
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/System/Resource.dll b/Engine/bin/tools/nsis/app/Examples/System/Resource.dll
new file mode 100644
index 000000000..6d7f35d81
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Examples/System/Resource.dll differ
diff --git a/Engine/bin/tools/nsis/app/Examples/System/SysFunc.nsh b/Engine/bin/tools/nsis/app/Examples/System/SysFunc.nsh
new file mode 100644
index 000000000..57c201674
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/System/SysFunc.nsh
@@ -0,0 +1,398 @@
+; Some useful functions based on System plugin
+;
+; (c) brainsucker, 2002
+; (r) BSForce
+
+; Check for double includes
+!ifndef SysFunc.NSH.Included
+!define SysFunc.NSH.Included
+
+!include "${NSISDIR}\Examples\System\System.nsh"
+
+!verbose 3 ; For WinMessages especially
+ !include "WinMessages.nsh"
+!verbose 4
+
+; ================= GetInstallerExeName implementation =================
+
+; Adopted Get Parameter function -> now it gets full installer.exe path
+; input - nothing, output -> full path at the top of the stack
+Function GetInstallerExeName
+ Push $R0
+ Push $R1
+ Push $R2
+ StrCpy $R0 $CMDLINE 1
+ StrCpy $R1 '"'
+ StrCpy $R2 1
+ StrCmp $R0 '"' loop
+ StrCpy $R1 ' ' ; we're scanning for a space instead of a quote
+ loop:
+ StrCpy $R0 $CMDLINE 1 $R2
+ StrCmp $R0 $R1 loop2
+ StrCmp $R0 "" loop2
+ IntOp $R2 $R2 + 1
+ Goto loop
+ loop2:
+
+ ; Ok, have we found last exename character or string end?
+ StrCmp $R0 "" "" +2
+ IntOp $R2 $R2 - 1 ; last exename char
+ StrCmp $R1 ' ' +3 ; was first character the '"', or something other?
+ StrCpy $R1 1 ; it was quote
+ Goto +2
+ StrCpy $R1 0
+ IntOp $R2 $R2 - $R1
+ StrCpy $R0 $CMDLINE $R2 $R1
+
+ SearchPath $R0 $R0 ; expand file name to full path
+
+ Pop $R2
+ Pop $R1
+ Exch $R0
+FunctionEnd
+
+; ================= systemGetFileSysTime implementation =================
+
+!macro smGetFileSysTime FILENAME
+ Push ${FILENAME}
+ Call systemGetFileSysTime
+ Pop $R0
+!macroend
+
+; -----------------------------------------------------------------
+; systemGetFileSysTime (params on stack):
+; FILENAME - name of file to get file time
+; returns to stack (SYSTEMTIME struct addr)
+; -----------------------------------------------------------------
+
+; uses original method from NSIS
+Function systemGetFileSysTime
+ System::Store "s r1"
+
+ StrCpy $R0 0
+
+ ; create WIN32_FIND_DATA struct
+ System::Call '*${stWIN32_FIND_DATA} .r2'
+
+ ; Find file info
+ System::Call '${sysFindFirstFile}(r1, r2) .r3'
+
+ ; ok?
+ IntCmp $3 ${INVALID_HANDLE_VALUE} sgfst_exit
+
+ ; close file search
+ System::Call '${sysFindClose}(r3)'
+
+ ; Create systemtime struct for local time
+ System::Call '*${stSYSTEMTIME} .R0'
+
+ ; Get File time
+ System::Call '*$2${stWIN32_FIND_DATA} (,,, .r3)'
+
+ ; Convert file time (UTC) to local file time
+ System::Call '${sysFileTimeToLocalFileTime}(r3, .r1)'
+
+ ; Convert file time to system time
+ System::Call '${sysFileTimeToSystemTime}(r1, R0)'
+
+sgfst_exit:
+ ; free used memory for WIN32_FIND_DATA struct
+ System::Free $2
+
+ System::Store "P0 l"
+FunctionEnd
+
+; ================= systemMessageBox implementation =================
+
+; return to $R0
+!macro smMessageBox MODULE MSG CAPTION STYLE ICON
+ Push "${ICON}"
+ Push "${STYLE}"
+ Push "${CAPTION}"
+ Push "${MSG}"
+ Push "${MODULE}"
+ Call systemMessageBox
+ Pop $R0
+!macroend
+
+; -----------------------------------------------------------------
+; systemMessageBox (params on stack):
+; Module: either handle ("i HANDLE", HANDLE could be 0) or "modulename"
+; Msg: text of message
+; Caption: caption of message box window
+; Style: style, buttons etc
+; Icon: either icon handle ("i HANDLE") or resource name
+; returns to stack
+; -----------------------------------------------------------------
+Function systemMessageBox
+ System::Store "s r2r3r4r5r6"
+
+ ; may be Module is module handle?
+ StrCpy $1 $2
+ IntCmp $1 0 0 smbnext smbnext
+
+ ; Get module handle
+ System::Call '${sysGetModuleHandle}($2) .r1'
+ IntCmp $1 0 loadlib libnotloaded libnotloaded
+
+loadlib:
+ ; Load module and get handle
+ System::Call '${sysLoadLibrary}($2) .r1'
+ IntCmp $1 0 0 smbnext smbnext
+
+libnotloaded:
+ ; Indicate that LoadLibrary wasn't used
+ StrCpy $2 1
+
+smbnext:
+ ; Create MSGBOXPARAMS structure
+ System::Call '*${stMSGBOXPARAMS}(, $HWNDPARENT, r1, r3, r4, "$5|${MB_USERICON}", $6, _) .r0'
+ ; call MessageBoxIndirect
+ System::Call '${sysMessageBoxIndirect}(r0) .R0'
+ ; free MSGBOXPARAMS structure
+
+ System::Free $0
+
+ ; have we used load library at start?
+ IntCmp $2 0 0 smbskipfree smbskipfree
+ ; No, then free the module
+ System::Call '${sysFreeLibrary}(r1)'
+
+smbskipfree:
+ System::Store "P0 l"
+FunctionEnd
+
+; ================= systemSplash implementation =================
+
+; returns to $R0
+!macro smSystemSplash DELAY FILE
+ Push ${FILE}
+ Push ${DELAY}
+ call systemSplash
+ Pop $R0
+!macroend
+
+; -----------------------------------------------------------------
+; systemSplash (params on stack):
+; Delay - time in ms to show the splash
+; File - bitmap (& audio) file name (without extension)
+; returns to stack
+; -----------------------------------------------------------------
+
+Function _systemSplashWndCB
+ ; Callback receives 4 values
+ System::Store "s r2r5r7r9"
+
+ ; Message branching
+ IntCmp $5 ${WM_CLOSE} m_Close
+ IntCmp $5 ${WM_TIMER} m_Timer
+ IntCmp $5 ${WM_LBUTTONDOWN} m_Lbtn
+ IntCmp $5 ${WM_CREATE} m_Create
+ IntCmp $5 ${WM_PAINT} m_Paint
+ goto default
+
+m_Create:
+ ; Create structures
+ System::Call "*${stRECT} (_) .R8"
+ System::Call "*${stBITMAP} (_, &l0 .R7) .R9"
+
+ ; Get bitmap info
+ System::Call "${sysGetObject} (r6, R7, R9)"
+
+ ; Get desktop info
+ System::Call "${sysSystemParametersInfo} (${SPI_GETWORKAREA}, 0, R8, 0)"
+
+ ; Style (callbacked)
+ System::Call "${sysSetWindowLong} (r2, ${GWL_STYLE}, 0) .s"
+ !insertmacro SINGLE_CALLBACK 5 $R7 1 _systemSplashWndCB
+
+ ; Calculate and set window pos
+
+ ; Get bmWidth(R2) and bmHeight(R3)
+ System::Call "*$R9${stBITMAP} (,.R2,.R3)"
+ ; Get left(R4), top(R5), right(R6), bottom(R7)
+ System::Call "*$R8${stRECT} (.R4,.R5,.R6,.R7)"
+
+ ; Left pos
+ IntOp $R0 $R6 - $R4
+ IntOp $R0 $R0 - $R2
+ IntOp $R0 $R0 / 2
+ IntOp $R0 $R0 + $R4
+
+ ; Top pos
+ IntOp $R1 $R7 - $R5
+ IntOp $R1 $R1 - $R3
+ IntOp $R1 $R1 / 2
+ IntOp $R1 $R1 + $R5
+
+ System::Call "${sysSetWindowPos} (r2, 0, R0, R1, R2, R3, ${SWP_NOZORDER}) .s"
+ !insertmacro SINGLE_CALLBACK 6 $R7 1 _systemSplashWndCB
+
+ ; Show window
+ System::Call "${sysShowWindow} (r2, ${SW_SHOW}) .s"
+ !insertmacro SINGLE_CALLBACK 7 $R7 1 _systemSplashWndCB
+
+ ; Set Timer
+ System::Call "${sysSetTimer} (r2, 1, r8,)"
+
+ ; Free used memory
+ System::Free $R8
+ System::Free $R9
+
+ StrCpy $R0 0
+ goto exit
+
+m_Paint:
+ ; Create structures
+ System::Call "*${stRECT} (_) .R8"
+ System::Call "*${stPAINTSTRUCT} (_) .R9"
+
+ ; Begin Paint
+ System::Call "${sysBeginPaint} (r2, R9) .R7"
+
+ ; CreateCompatibleDC
+ System::Call "${sysCreateCompatibleDC} (R7) .R6"
+
+ ; GetClientRect
+ System::Call "${sysGetClientRect} (r2, R8)"
+
+ ; Select new bitmap
+ System::Call "${sysSelectObject} (R6, r6) .R5"
+
+ ; Get left(R0), top(R1), right(R2), bottom(R3)
+ System::Call "*$R8${stRECT} (.R0,.R1,.R2,.R3)"
+
+ ; width=right-left
+ IntOp $R2 $R2 - $R0
+ ; height=bottom-top
+ IntOp $R3 $R3 - $R1
+
+ System::Call "${sysBitBlt} (R7, R0, R1, R2, R3, R6, 0, 0, ${SRCCOPY})"
+
+ ; Select old bitmap
+ System::Call "${sysSelectObject} (R6, R5)"
+
+ ; Delete compatible DC
+ System::Call "${sysDeleteDC} (R6)"
+
+ ; End Paint
+ System::Call "${sysEndPaint} (r2, R9)"
+
+ ; Free used memory
+ System::Free $R8
+ System::Free $R9
+
+ StrCpy $R0 0
+ goto exit
+
+m_Timer:
+m_Lbtn:
+ StrCpy $4 0
+ IntCmp $5 ${WM_TIMER} destroy
+ StrCpy $4 1
+
+destroy:
+ System::Call "${sysDestroyWindow} (r2) .s"
+ !insertmacro SINGLE_CALLBACK 12 $R4 1 _systemSplashWndCB
+
+default:
+ ; Default
+ System::Call "${sysDefWindowProc} (r2, r5, r7, r9) .s"
+ !insertmacro SINGLE_CALLBACK 14 $R0 1 _systemSplashWndCB
+ goto exit
+
+m_Close:
+ StrCpy $R0 0
+ goto exit
+
+exit:
+ ; Restore
+ System::Store "p4P0 l R0r4"
+
+ ; Return from callback
+ System::Call "$3" $R0
+FunctionEnd
+
+Function systemSplash
+
+ ; Save registers and get input
+ System::Store "s r8r9"
+
+ ; Get module instance
+ System::Call "${sysGetModuleHandle} (i) .r7"
+
+ ; Get arrow cursor
+ System::Call "${sysLoadCursor} (0, i ${IDC_ARROW}) .R9"
+
+ ; Get callback
+ System::Get "${sysWNDPROC}"
+ Pop $3
+
+ ; Create window class
+ System::Call "*${stWNDCLASS} (0,r3,0,0,r7,0,R9,0,i 0,'_sp') .R9"
+
+ ; Register window class
+ System::Call "${sysRegisterClass} (R9) .R9"
+ IntCmp $R9 0 errorexit ; Class registered ok?
+
+ ; Load Image (LR_CREATEDIBSECTION|LR_LOADFROMFILE = 0x2010)
+ System::Call '${sysLoadImage} (, s, ${IMAGE_BITMAP}, 0, 0, ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) .r6' "$9.bmp"
+ IntCmp $6 0 errorexit ; Image loaded ok?
+
+ ; Start the sound (SND_ASYNC|SND_FILENAME|SND_NODEFAULT = 0x20003)
+ System::Call "${sysPlaySound} (s,,${SND_ASYNC}|${SND_FILENAME}|${SND_NODEFAULT})" "$9.wav"
+
+ ; Create window
+ System::Call "${sysCreateWindowEx} (${WS_EX_TOOLWINDOW}, s, s,,,,,, $HWNDPARENT,,r7,) .s" "_sp" "_sp"
+ !insertmacro SINGLE_CALLBACK 1 $5 1 _systemSplashWndCB
+
+ ; Create MSG struct
+ System::Call "*${stMSG} (_) i.R9"
+
+ ; -------------------------
+repeat:
+ ; Check for window
+ System::Call "${sysIsWindow} (r5) .s"
+ !insertmacro SINGLE_CALLBACK 2 $R8 1 _systemSplashWndCB
+ IntCmp $R8 0 finish
+
+ ; Get message
+ System::Call "${sysGetMessage} (R9, r5,_) .s"
+ !insertmacro SINGLE_CALLBACK 3 $R8 1 _systemSplashWndCB
+ IntCmp $R8 0 finish
+
+ ; Dispatch message
+ System::Call "${sysDispatchMessage} (R9) .s"
+ !insertmacro SINGLE_CALLBACK 4 $R8 1 _systemSplashWndCB
+
+ ; Repeat dispatch cycle
+ goto repeat
+ ; -------------------------
+
+finish:
+ ; Stop the sound
+ System::Call "${sysPlaySound} (i 0, i 0, i 0)"
+
+ ; Delete bitmap object
+ System::Call "${sysDeleteObject} (r6)"
+
+ ; Delete the callback queue
+ System::Free $3
+
+ ; Dialog return
+ StrCpy $R0 $4
+ goto exit
+
+; Exit in case of error
+errorexit:
+ StrCpy $R0 -1
+ goto exit
+
+exit:
+ ; Restore register and put output
+ System::Store "P0 l"
+FunctionEnd
+
+!verbose 4
+
+!endif
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/System/System.nsh b/Engine/bin/tools/nsis/app/Examples/System/System.nsh
new file mode 100644
index 000000000..b550d19f3
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/System/System.nsh
@@ -0,0 +1,472 @@
+; Some useful functions, structures, constants
+;
+; (c) brainsucker, 2002
+; (r) BSForce
+
+; Check for double includes
+!ifndef System.NSH.Included
+!define System.NSH.Included
+
+!verbose 3
+
+; ------------- Functions --------------
+
+; LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+!define sysWNDPROC "(i.s, i.s, i.s, i.s) iss"
+
+; LRESULT DefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
+!define sysDefWindowProc "user32::DefWindowProcA(i, i, i, i) i"
+
+!define sysMessageBox "user32::MessageBoxA(i, t, t, i) i"
+
+!define sysMessageBeep "user32::MessageBeep(i) i"
+
+!define sysMessageBoxIndirect 'user32::MessageBoxIndirectA(i) i'
+
+; HMODULE GetModuleHandle(LPCTSTR lpModuleName);
+!define sysGetModuleHandle "kernel32::GetModuleHandleA(t) i"
+
+; HMODULE LoadLibrary(LPCTSTR lpFileName);
+!define sysLoadLibrary "kernel32::LoadLibraryA(t) i"
+
+; BOOL FreeLibrary(HMODULE hModule);
+!define sysFreeLibrary "kernel32::FreeLibrary(i) i"
+
+; HCURSOR LoadCursor(HINSTANCE hInstance, LPCTSTR lpCursorName);
+!define sysLoadCursor "user32::LoadCursorA(i, t) i"
+
+; ATOM RegisterClass(CONST WNDCLASS *lpWndClass);
+!define sysRegisterClass "user32::RegisterClassA(i) i"
+
+; HANDLE LoadImage(HINSTANCE hinst, LPCTSTR lpszName, UINT uType,
+; int cxDesired, int cyDesired, UINT fuLoad);
+!define sysLoadImage "user32::LoadImageA(i, t, i, i, i, i) i"
+
+; BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
+!define sysPlaySound "winmm.dll::PlaySoundA(t, i, i) i"
+
+; HWND CreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName,
+; DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent,
+; HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
+!define sysCreateWindowEx "user32::CreateWindowExA(i, t, t, i, i, i, i, i, i, i, i, i) i"
+
+; BOOL IsWindow(HWND hWnd);
+!define sysIsWindow "user32::IsWindow(i) i"
+
+; LONG SetWindowLong(HWND hWnd, int nIndex, LONG dwNewLong);
+!define sysSetWindowLong "user32::SetWindowLongA(i, i, i) i"
+
+; BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);
+!define sysSetWindowPos "user32::SetWindowPos(i, i, i, i, i, i, i) i"
+
+; BOOL ShowWindow(HWND hWnd, int nCmdShow);
+!define sysShowWindow "user32::ShowWindow(i, i) i"
+
+; BOOL DestroyWindow(HWND hWnd);
+!define sysDestroyWindow "user32::DestroyWindow(i) i"
+
+; BOOL GetClientRect(HWND hWnd, LPRECT lpRect);
+!define sysGetClientRect "user32::GetClientRect(i, i) i"
+
+; BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
+!define sysGetMessage "user32::GetMessageA(i, i, i, i) i"
+
+; LRESULT DispatchMessage(CONST MSG *lpmsg);
+!define sysDispatchMessage "user32::DispatchMessageA(i) i"
+
+; BOOL DeleteObject(HGDIOBJ hObject);
+!define sysDeleteObject "gdi32::DeleteObject(i) i"
+
+; int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);
+!define sysGetObject "gdi32::GetObjectA(i, i, i) i"
+
+; HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);
+!define sysSelectObject "gdi32::SelectObject(i, i) i"
+
+; HDC CreateCompatibleDC(HDC hdc);
+!define sysCreateCompatibleDC "gdi32::CreateCompatibleDC(i) i"
+
+; BOOL DeleteDC(HDC hdc);
+!define sysDeleteDC "gdi32::DeleteDC(i) i"
+
+; BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight,
+; HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop);
+!define sysBitBlt "gdi32::BitBlt(i, i, i, i, i, i, i, i, i) i"
+
+; proposed by abgandar
+; int AddFontResource(LPCTSTR lpszFilename);
+!define sysAddFontResource "gdi32::AddFontResourceA(t) i"
+
+; HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint);
+!define sysBeginPaint "user32::BeginPaint(i, i) i"
+
+; BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint);
+!define sysEndPaint "user32::EndPaint(i, i) i"
+
+; BOOL SystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);
+!define sysSystemParametersInfo "user32::SystemParametersInfoA(i, i, i, i) i"
+
+; UINT_PTR SetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);
+!define sysSetTimer "user32::SetTimer(i, i, i, k) i"
+
+!define sysGetLogicalDriveStrings 'kernel32::GetLogicalDriveStringsA(i, i) i'
+
+!define sysGetDiskFreeSpaceEx 'kernel32::GetDiskFreeSpaceExA(t, *l, *l, *l) i'
+
+; UINT GetDriveType(LPCTSTR lpRootPathName);
+!define sysGetDriveType 'kernel32::GetDriveTypeA(t) i'
+
+; HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData);
+!define sysFindFirstFile 'kernel32::FindFirstFileA(t, i) i'
+
+; BOOL FindClose(HANDLE hFindFile);
+!define sysFindClose 'kernel32::FindClose(i) i'
+
+; BOOL FileTimeToSystemTime(CONST FILETIME *lpFileTime,
+; LPSYSTEMTIME lpSystemTime);
+!define sysFileTimeToSystemTime 'kernel32::FileTimeToSystemTime(*l, i) i'
+
+; BOOL FileTimeToLocalFileTime(
+; CONST FILETIME *lpFileTime,
+; LPFILETIME lpLocalFileTime);
+!define sysFileTimeToLocalFileTime 'kernel32::FileTimeToLocalFileTime(*l, *l) i'
+
+; BOOL SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION lpTimeZone,
+; LPSYSTEMTIME lpUniversalTime, LPSYSTEMTIME lpLocalTime);
+!define sysSystemTimeToTzSpecificLocalTime 'kernel32::SystemTimeToTzSpecificLocalTime(i, i, i) i'
+
+!define syslstrlen 'kernel32::lstrlenA(t) i'
+
+; int wsprintf(LPTSTR lpOut, LPCTSTR lpFmt, ...);
+!define syswsprintf "user32::wsprintfA(t, t) i ? c"
+
+; ------------- Structures --------------
+
+; typedef struct _WNDCLASS {
+; UINT style;
+; WNDPROC lpfnWndProc;
+; int cbClsExtra;
+; int cbWndExtra;
+; HINSTANCE hInstance;
+; HICON hIcon;
+; HCURSOR hCursor;
+; HBRUSH hbrBackground;
+; LPCTSTR lpszMenuName;
+; LPCTSTR lpszClassName;
+; } WNDCLASS, *PWNDCLASS;
+!define stWNDCLASS "(i, k, i, i, i, i, i, i, t, t) i"
+
+; typedef struct tagMSG {
+; HWND hwnd;
+; UINT message;
+; WPARAM wParam;
+; LPARAM lParam;
+; DWORD time;
+; POINT pt; -> will be presented as two separate px and py
+; } MSG, *PMSG;
+!define stMSG "(i, i, i, i, i, i, i) i"
+
+; typedef struct tagBITMAP {
+; LONG bmType;
+; LONG bmWidth;
+; LONG bmHeight;
+; LONG bmWidthBytes;
+; WORD bmPlanes;
+; WORD bmBitsPixel;
+; LPVOID bmBits;
+; } BITMAP, *PBITMAP;
+!define stBITMAP "(i, i, i, i, i, i, i) i"
+
+; typedef struct _RECT {
+; LONG left;
+; LONG top;
+; LONG right;
+; LONG bottom;
+; } RECT, *PRECT;
+!define stRECT "(i, i, i, i) i"
+
+; typedef struct tagPAINTSTRUCT {
+; HDC hdc;
+; BOOL fErase;
+; RECT rcPaint; (rcl, rct, rcr, rcb)
+; BOOL fRestore;
+; BOOL fIncUpdate;
+; BYTE rgbReserved[32];
+; } PAINTSTRUCT, *PPAINTSTRUCT;
+!define stPAINTSTRUCT "(i, i, i, i, i, i, i, i, &v32) i"
+
+; typedef struct {
+; UINT cbSize;
+; HWND hwndOwner;
+; HINSTANCE hInstance;
+; LPCTSTR lpszText;
+; LPCTSTR lpszCaption;
+; DWORD dwStyle;
+; LPCTSTR lpszIcon;
+; DWORD_PTR dwContextHelpId;
+; MSGBOXCALLBACK lpfnMsgBoxCallback;
+; DWORD dwLanguageId;
+; } MSGBOXPARAMS, *PMSGBOXPARAMS;
+!define stMSGBOXPARAMS '(&l4, i, i, t, t, i, t, i, k, i) i'
+
+; typedef struct _SYSTEMTIME {
+; WORD wYear;
+; WORD wMonth;
+; WORD wDayOfWeek;
+; WORD wDay;
+; WORD wHour;
+; WORD wMinute;
+; WORD wSecond;
+; WORD wMilliseconds;
+; } SYSTEMTIME, *PSYSTEMTIME;
+!define stSYSTEMTIME '(&i2, &i2, &i2, &i2, &i2, &i2, &i2, &i2) i'
+
+; Maximal windows path
+!define MAX_PATH 260
+
+; typedef struct _WIN32_FIND_DATA {
+; DWORD dwFileAttributes;
+; FILETIME ftCreationTime;
+; FILETIME ftLastAccessTime;
+; FILETIME ftLastWriteTime;
+; DWORD nFileSizeHigh;
+; DWORD nFileSizeLow;
+; DWORD dwReserved0;
+; DWORD dwReserved1;
+; TCHAR cFileName[ MAX_PATH ];
+; TCHAR cAlternateFileName[ 14 ];
+; } WIN32_FIND_DATA, *PWIN32_FIND_DATA;
+!define stWIN32_FIND_DATA '(i, l, l, l, i, i, i, i, &t${MAX_PATH}, &t14) i'
+
+; ------------- Constants --------------
+
+; == Other ==
+!define INVALID_HANDLE_VALUE -1
+
+; == Cursors ==
+
+!define IDC_ARROW 32512
+!define IDC_IBEAM 32513
+!define IDC_WAIT 32514
+!define IDC_CROSS 32515
+!define IDC_UPARROW 32516
+!define IDC_SIZE 32640
+!define IDC_ICON 32641
+!define IDC_SIZENWSE 32642
+!define IDC_SIZENESW 32643
+!define IDC_SIZEWE 32644
+!define IDC_SIZENS 32645
+!define IDC_SIZEALL 32646
+!define IDC_NO 32648
+!define IDC_HAND 32649
+!define IDC_APPSTARTING 32650
+!define IDC_HELP 32651
+
+; == Images ==
+
+!define IMAGE_BITMAP 0
+!define IMAGE_ICON 1
+!define IMAGE_CURSOR 2
+!define IMAGE_ENHMETAFILE 3
+
+!define LR_DEFAULTCOLOR 0x0000
+!define LR_MONOCHROME 0x0001
+!define LR_COLOR 0x0002
+!define LR_COPYRETURNORG 0x0004
+!define LR_COPYDELETEORG 0x0008
+!define LR_LOADFROMFILE 0x0010
+!define LR_LOADTRANSPARENT 0x0020
+!define LR_DEFAULTSIZE 0x0040
+!define LR_VGACOLOR 0x0080
+!define LR_LOADMAP3DCOLORS 0x1000
+!define LR_CREATEDIBSECTION 0x2000
+!define LR_COPYFROMRESOURCE 0x4000
+!define LR_SHARED 0x8000
+
+; == Sounds ==
+
+!define SND_SYNC 0x0000
+!define SND_ASYNC 0x0001
+!define SND_NODEFAULT 0x0002
+!define SND_MEMORY 0x0004
+!define SND_LOOP 0x0008
+!define SND_NOSTOP 0x0010
+
+!define SND_NOWAIT 0x00002000
+!define SND_ALIAS 0x00010000
+!define SND_ALIAS_ID 0x00110000
+!define SND_FILENAME 0x00020000
+!define SND_RESOURCE 0x00040004
+!define SND_PURGE 0x0040
+!define SND_APPLICATION 0x0080
+
+; == Windows ==
+
+!define WS_OVERLAPPED 0x00000000
+!define WS_POPUP 0x80000000
+!define WS_CHILD 0x40000000
+!define WS_MINIMIZE 0x20000000
+!define WS_VISIBLE 0x10000000
+!define WS_DISABLED 0x08000000
+!define WS_CLIPSIBLINGS 0x04000000
+!define WS_CLIPCHILDREN 0x02000000
+!define WS_MAXIMIZE 0x01000000
+!define WS_CAPTION 0x00C00000
+!define WS_BORDER 0x00800000
+!define WS_DLGFRAME 0x00400000
+!define WS_VSCROLL 0x00200000
+!define WS_HSCROLL 0x00100000
+!define WS_SYSMENU 0x00080000
+!define WS_THICKFRAME 0x00040000
+!define WS_GROUP 0x00020000
+!define WS_TABSTOP 0x00010000
+!define WS_MINIMIZEBOX 0x00020000
+!define WS_MAXIMIZEBOX 0x00010000
+!define WS_TILED ${WS_OVERLAPPED}
+!define WS_ICONIC ${WS_MINIMIZE}
+!define WS_SIZEBOX ${WS_THICKFRAME}
+!define WS_OVERLAPPEDWINDOW 0x00CF0000
+!define WS_TILEDWINDOW ${WS_OVERLAPPEDWINDOW}
+!define WS_POPUPWINDOW 0x80880000
+!define WS_CHILDWINDOW ${WS_CHILD}
+!define WS_EX_DLGMODALFRAME 0x00000001
+!define WS_EX_NOPARENTNOTIFY 0x00000004
+!define WS_EX_TOPMOST 0x00000008
+!define WS_EX_ACCEPTFILES 0x00000010
+!define WS_EX_TRANSPARENT 0x00000020
+!define WS_EX_MDICHILD 0x00000040
+!define WS_EX_TOOLWINDOW 0x00000080
+!define WS_EX_WINDOWEDGE 0x00000100
+!define WS_EX_CLIENTEDGE 0x00000200
+!define WS_EX_CONTEXTHELP 0x00000400
+!define WS_EX_RIGHT 0x00001000
+!define WS_EX_LEFT 0x00000000
+!define WS_EX_RTLREADING 0x00002000
+!define WS_EX_LTRREADING 0x00000000
+!define WS_EX_LEFTSCROLLBAR 0x00004000
+!define WS_EX_RIGHTSCROLLBAR 0x00000000
+!define WS_EX_CONTROLPARENT 0x00010000
+!define WS_EX_STATICEDGE 0x00020000
+!define WS_EX_APPWINDOW 0x00040000
+!define WS_EX_OVERLAPPEDWINDOW 0x00000300
+!define WS_EX_PALETTEWINDOW 0x00000188
+!define WS_EX_LAYERED 0x00080000
+!define WS_EX_NOINHERITLAYOUT 0x00100000
+!define WS_EX_LAYOUTRTL 0x00400000
+!define WS_EX_COMPOSITED 0x02000000
+!define WS_EX_NOACTIVATE 0x08000000
+
+
+; == System Parameters Info ==
+
+!define SPI_GETWORKAREA 0x0030
+
+; == Window Long Offsets ==
+
+!define GWL_WNDPROC -4
+!define GWL_HINSTANCE -6
+!define GWL_HWNDPARENT -8
+!define GWL_STYLE -16
+!define GWL_EXSTYLE -20
+!define GWL_USERDATA -21
+!define GWL_ID -12
+
+; == Window swap ==
+
+!define SWP_NOSIZE 0x0001
+!define SWP_NOMOVE 0x0002
+!define SWP_NOZORDER 0x0004
+!define SWP_NOREDRAW 0x0008
+!define SWP_NOACTIVATE 0x0010
+!define SWP_FRAMECHANGED 0x0020
+!define SWP_SHOWWINDOW 0x0040
+!define SWP_HIDEWINDOW 0x0080
+!define SWP_NOCOPYBITS 0x0100
+!define SWP_NOOWNERZORDER 0x0200
+!define SWP_NOSENDCHANGING 0x0400
+
+!define SWP_DRAWFRAME ${SWP_FRAMECHANGED}
+!define SWP_NOREPOSITION ${SWP_NOOWNERZORDER}
+!define SWP_DEFERERASE 0x2000
+!define SWP_ASYNCWINDOWPOS 0x4000
+
+; == Bit Copy ==
+
+!define SRCCOPY 0x00CC0020
+!define SRCPAINT 0x00EE0086
+!define SRCAND 0x008800C6
+!define SRCINVERT 0x00660046
+!define SRCERASE 0x00440328
+!define NOTSRCCOPY 0x00330008
+!define NOTSRCERASE 0x001100A6
+!define MERGECOPY 0x00C000CA
+!define MERGEPAINT 0x00BB0226
+!define PATCOPY 0x00F00021
+!define PATPAINT 0x00FB0A09
+!define PATINVERT 0x005A0049
+!define DSTINVERT 0x00550009
+!define BLACKNESS 0x00000042
+!define WHITENESS 0x00FF0062
+
+; == Message Box ==
+
+!define MB_OK 0x00000000
+!define MB_OKCANCEL 0x00000001
+!define MB_ABORTRETRYIGNORE 0x00000002
+!define MB_YESNOCANCEL 0x00000003
+!define MB_YESNO 0x00000004
+!define MB_RETRYCANCEL 0x00000005
+!define MB_CANCELTRYCONTINUE 0x00000006
+!define MB_ICONHAND 0x00000010
+!define MB_ICONQUESTION 0x00000020
+!define MB_ICONEXCLAMATION 0x00000030
+!define MB_ICONASTERISK 0x00000040
+!define MB_USERICON 0x00000080
+!define MB_ICONWARNING ${MB_ICONEXCLAMATION}
+!define MB_ICONERROR ${MB_ICONHAND}
+
+!define MB_ICONINFORMATION ${MB_ICONASTERISK}
+!define MB_ICONSTOP ${MB_ICONHAND}
+
+!define MB_DEFBUTTON1 0x00000000
+!define MB_DEFBUTTON2 0x00000100
+!define MB_DEFBUTTON3 0x00000200
+!define MB_DEFBUTTON4 0x00000300
+
+!define MB_APPLMODAL 0x00000000
+!define MB_SYSTEMMODAL 0x00001000
+!define MB_TASKMODAL 0x00002000
+!define MB_HELP 0x00004000
+
+!define MB_NOFOCUS 0x00008000
+!define MB_SETFOREGROUND 0x00010000
+!define MB_DEFAULT_DESKTOP_ONLY 0x00020000
+
+!define MB_TOPMOST 0x00040000
+!define MB_RIGHT 0x00080000
+!define MB_RTLREADING 0x00100000
+
+; == Drive type constants ==
+
+!define DRIVE_UNKNOWN 0
+!define DRIVE_NO_ROOT_DIR 1
+!define DRIVE_REMOVABLE 2
+!define DRIVE_FIXED 3
+!define DRIVE_REMOTE 4
+!define DRIVE_CDROM 5
+!define DRIVE_RAMDISK 6
+
+; == Callbacks ==
+
+!macro SINGLE_CALLBACK CHKN RES INDEX FUNC
+CheckCB_${CHKN}:
+ Pop ${RES}
+ StrCmp ${RES} "callback${INDEX}" 0 ExitCB_${CHKN}
+ Call ${FUNC}
+ Goto CheckCB_${CHKN}
+ExitCB_${CHKN}:
+!macroend
+
+!verbose 4
+
+!endif
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/System/System.nsi b/Engine/bin/tools/nsis/app/Examples/System/System.nsi
new file mode 100644
index 000000000..66e08a21f
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/System/System.nsi
@@ -0,0 +1,136 @@
+; This is just an example of System Plugin
+;
+; (c) brainsucker, 2002
+; (r) BSForce
+
+Name "System Plugin Example"
+OutFile "System.exe"
+
+!include "SysFunc.nsh"
+
+Section "ThisNameIsIgnoredSoWhyBother?"
+ SetOutPath $TEMP
+
+ ; ----- Sample 1 ----- Message box with custom icon -----
+
+ ; there are no default beeps for custom message boxes, use sysMessageBeep
+ ; in case you need it (see next message box example)
+ !insertmacro smMessageBox "i 0" "Message box with custom icon!" "System Example 1a" ${MB_OK} "i 103"
+ ; i 0 - installer exe as module
+ ; i 103 - icon ID
+
+ ; The same example but using icon from resource.dll.
+ ; You could use this dll for storing your resources, just replace FAR icon
+ ; with something you really need.
+ File "Resource.dll"
+ System::Call '${sysMessageBeep} (${MB_ICONHAND})' ; custom beep
+ !insertmacro smMessageBox "`$TEMP\resource.dll`" "Message box with custom icon from resource.dll!" "System Example 1b" ${MB_OKCANCEL} "i 103"
+ Delete $TEMP\resource.dll
+
+ ; ----- Sample 2 ----- Fixed disks size/space -----
+
+ StrCpy $7 ' Disk, Size, Free, Free for user:$\n$\n'
+
+ ; Memory for paths
+ System::Alloc 1024
+ Pop $1
+ ; Get drives
+ System::Call '${sysGetLogicalDriveStrings}(1024, r1)'
+enumok:
+ ; One more drive?
+ System::Call '${syslstrlen}(i r1) .r2'
+ IntCmp $2 0 enumex
+
+ ; Is it DRIVE_FIXED?
+ System::Call '${sysGetDriveType} (i r1) .r3'
+ StrCmp $3 ${DRIVE_FIXED} 0 enumnext
+
+ ; Drive space
+ System::Call '${sysGetDiskFreeSpaceEx}(i r1, .r3, .r4, .r5)'
+
+ ; Pretty KBs will be saved on stack
+ System::Int64Op $3 / 1048576
+ System::Int64Op $5 / 1048576
+ System::Int64Op $4 / 1048576
+
+ ; Get pretty drive path string
+ System::Call '*$1(&t1024 .r6)'
+ System::Call '${syswsprintf} (.r7, "%s%20s %20s mb %20s mb %20s mb$\n", tr7, tr6, ts, ts, ts)'
+
+enumnext:
+ ; Next drive path
+ IntOp $1 $1 + $2
+ IntOp $1 $1 + 1
+ goto enumok
+enumex: ; End of drives or user cancel
+ ; Free memory for paths
+ System::Free $1
+
+ ; Message box
+ System::Call '${sysMessageBox}($HWNDPARENT, s, "System Example 2", ${MB_OKCANCEL})' "$7"
+
+ ; ----- Sample 3 ----- Direct proc defenition -----
+
+ ; Direct specification demo
+ System::Call 'user32::MessageBoxA(i $HWNDPARENT, t "Just direct MessageBoxA specification demo ;)", t "System Example 3", i ${MB_OK}) i.s'
+ Pop $0
+
+ ; ----- Sample 4 ----- Int64, mixed definition demo -----
+
+ ; Long int demo
+ StrCpy $2 "12312312"
+ StrCpy $3 "12345678903"
+ System::Int64Op $2 "*" $3
+ Pop $4
+
+ ; Cdecl demo (uses 3 defenitions (simple example))
+ System::Call "${syswsprintf}(.R1, s,,, t, ir0) .R0 (,,tr2,tr3,$4_)" "Int64 ops and strange defenition demo, %s x %s == %s, and previous msgbox result = %d"
+ MessageBox MB_OKCANCEL "Cool: '$R1'"
+
+ ; ----- Sample 5 ----- Small structure example -----
+
+ ; Create & Fill structure
+ System::Call "*(i 123123123, &t10 'Hello', &i1 0x123dd, &i2 0xffeeddccaa) i.s"
+ Pop $1
+ ; Read data from structure
+ System::Call "*$1(i .r2, &t10 .r3, &i1 .r4, &i2 .r5, &l0 .r6)"
+ ; Show data and delete structure
+ MessageBox MB_OK "Structure example: $\nint == $2 $\nstring == $3 $\nbyte == $4 $\nshort == $5 $\nsize == $6"
+ System::Free $1
+
+ ; ----- Sample 6 ----- systemGetFileSysTime demo -----
+ Call GetInstallerExeName
+ pop $0
+
+ !insertmacro smGetFileSysTime $0
+ System::Call '*$R0${stSYSTEMTIME}(.r1, .r2, .r3, .r4, .r5, .r6, .r7, .r8)'
+
+ MessageBox MB_OK "GetFileSysTime example: file '$0', year $1, month $2, dow $3, day $4, hour $5, min $6, sec $7, ms $8"
+
+ ; free memory from SYSTEMTIME
+ System::Free $R0
+
+ ; ----- Sample 7 ----- systemSplash -> Callbacks demonstration -----
+
+ ; Logo
+ File /oname=spltmp.bmp "${NSISDIR}\Contrib\Graphics\Header\orange-nsis.bmp"
+; File /oname=spltmp.wav "d:\Windows\Media\tada.wav"
+
+ ; I. systemSplash variant
+ !insertmacro smSystemSplash 2000 "$TEMP\spltmp"
+
+ ; II. Splash Plugin variant
+; splash::show 2000 $TEMP\spltmp
+; Pop $R0 ; $R0 has '1' if the user closed the splash screen early,
+
+ ; remove logo
+ Delete $TEMP\spltmp.bmp
+; Delete $TEMP\spltmp.wav
+
+ ; Display splash result
+ pop $0
+ MessageBox MB_OK "Splash (callbacks) demo result $R0"
+
+SectionEnd
+
+; eof
diff --git a/Engine/bin/tools/nsis/app/Examples/TextFunc.ini b/Engine/bin/tools/nsis/app/Examples/TextFunc.ini
new file mode 100644
index 000000000..5b9a7bc47
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/TextFunc.ini
@@ -0,0 +1,130 @@
+[Settings]
+NumFields=15
+NextButtonText=&Enter
+
+[Field 1]
+Type=Droplist
+Flags=NOTIFY
+State=1. LineFind
+ListItems=1. LineFind|2. LineRead|3. FileReadFromEnd|4. LineSum|5. FileJoin|6. TextCompare|7. ConfigRead|8. ConfigWrite|9. FileRecode
+Left=44
+Right=139
+Top=9
+Bottom=100
+
+[Field 2]
+Type=FileRequest
+Left=44
+Right=-17
+Top=30
+Bottom=41
+
+[Field 3]
+Type=FileRequest
+Left=44
+Right=-17
+Top=46
+Bottom=57
+
+[Field 4]
+Type=FileRequest
+State=3:-1
+Left=44
+Right=-17
+Top=62
+Bottom=75
+
+[Field 5]
+Type=Droplist
+Flags=NOTIFY
+State=Example1 (delete first two symbols)
+ListItems=Example1 (delete first two symbols)|Example2 (show changed lines)|Example3 (delete lines)|Example4 (insert lines)|Example5 (replace in file - WordFunc.nsh required)|Example6 (line string to cut or delete)|Example7 (read lines)
+Left=44
+Right=-36
+Top=81
+Bottom=155
+
+[Field 6]
+Type=Droplist
+Flags=NOTIFY
+State=Example1 (Different or Equal)
+ListItems=Example1 (Different or Equal)|Example2 (Compare line-by-line - Different)|Example3 (Compare line-by-line - Equal)|Example4 (Compare all lines - Different)|Example5 (Compare all lines - Equal)
+Left=44
+Right=-36
+Top=81
+Bottom=140
+
+[Field 7]
+Type=Droplist
+State=FileReadFromEndCallback
+ListItems=FileReadFromEndCallback
+Left=44
+Right=-36
+Top=81
+Bottom=92
+
+[Field 8]
+Type=Text
+Flags=READONLY
+Left=9
+Right=-36
+Top=108
+Bottom=120
+
+[Field 9]
+Type=Button
+Text=Edit
+Flags=NOTIFY
+Left=234
+Right=256
+Top=81
+Bottom=92
+
+[Field 10]
+Type=Button
+Text=Log
+Flags=NOTIFY|DISABLED
+Left=234
+Right=256
+Top=108
+Bottom=120
+
+[Field 11]
+Type=Label
+Text=InputFile
+Left=10
+Right=43
+Top=32
+Bottom=44
+
+[Field 12]
+Type=Label
+Text=OutputFile
+Left=10
+Right=43
+Top=48
+Bottom=60
+
+[Field 13]
+Type=Label
+Text=Range
+Left=10
+Right=44
+Top=65
+Bottom=75
+
+[Field 14]
+Type=Label
+Text=Function
+Left=10
+Right=43
+Top=81
+Bottom=92
+
+[Field 15]
+Type=Label
+Text=Result:
+Left=10
+Right=229
+Top=97
+Bottom=105
diff --git a/Engine/bin/tools/nsis/app/Examples/TextFunc.nsi b/Engine/bin/tools/nsis/app/Examples/TextFunc.nsi
new file mode 100644
index 000000000..e05b7f7e1
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/TextFunc.nsi
@@ -0,0 +1,834 @@
+;_____________________________________________________________________________
+;
+; Text Functions
+;_____________________________________________________________________________
+;
+; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
+
+Name "Text Functions"
+OutFile "TextFunc.exe"
+Caption "$(^Name)"
+XPStyle on
+RequestExecutionLevel user
+
+!include "WinMessages.nsh"
+!include "TextFunc.nsh"
+
+Var HWND
+Var INI
+Var LOG
+Var PROJECT
+Var CALLBACK
+Var VIEW
+Var FUNCTION
+Var LINEFIND1
+Var LINEFIND2
+Var LINEFIND3
+Var LINEREAD1
+Var LINEREAD2
+Var FILEREADFROMEND1
+Var LINESUM1
+Var FILEJOIN1
+Var FILEJOIN2
+Var FILEJOIN3
+Var TEXTCOMPARE1
+Var TEXTCOMPARE2
+Var TEXTCOMPARE3
+Var CONFIGREAD1
+Var CONFIGREAD2
+Var CONFIGWRITE1
+Var CONFIGWRITE2
+Var CONFIGWRITE3
+Var FILERECODE1
+Var FILERECODE2
+
+Page Custom ShowCustom LeaveCustom
+
+Function ShowCustom
+ InstallOptions::initDialog "$INI"
+ Pop $hwnd
+ GetDlgItem $0 $HWND 1206
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1208
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1209
+ ShowWindow $0 0
+ StrCpy $FUNCTION LineFind
+ StrCpy $LINEREAD2 10
+ StrCpy $TEXTCOMPARE3 FastDiff
+ StrCpy $CONFIGREAD1 "$WINDIR\system.ini"
+ StrCpy $CONFIGREAD2 "shell="
+ StrCpy $FILERECODE2 CharToOem
+ InstallOptions::show
+ Pop $0
+FunctionEnd
+
+Function LeaveCustom
+ ReadINIStr $0 $INI "Settings" "State"
+ ReadINIStr $R0 $INI "Field 1" "State"
+ ReadINIStr $R1 $INI "Field 2" "State"
+ ReadINIStr $R2 $INI "Field 3" "State"
+ ReadINIStr $R3 $INI "Field 4" "State"
+ ReadINIStr $R4 $INI "Field 5" "State"
+ ReadINIStr $R5 $INI "Field 6" "State"
+ StrCpy $R4 $R4 8
+ StrCpy $R5 $R5 8
+ StrCpy $6 0
+ StrCpy $7 '$${'
+ StrCpy $8 'r'
+ StrCpy $9 'n'
+
+ StrCmp $0 10 Log
+ StrCmp $0 9 ViewOrEdit
+ StrCmp $0 0 Enter
+ goto MainSend
+
+ Log:
+ Exec 'notepad.exe $LOG'
+ Abort
+
+ ViewOrEdit:
+ StrCmp $FUNCTION FileReadFromEnd 0 Edit
+ StrCmp $VIEW '' 0 ViewFileReadFromEndCallback
+ GetTempFileName $VIEW $PLUGINSDIR
+ StrCpy $7 '$$'
+ FileOpen $0 $VIEW w
+ FileWrite $0 `Function FileReadFromEndCallback$\r$\n`
+ FileWrite $0 ` MessageBox MB_OKCANCEL '$7$$9 "Line"=[$$9]$7\$9$7$$8 "#"=[$$8]$7\$9$7$$7 "-#"=[$$7]' IDOK +2$\r$\n`
+ FileWrite $0 ` StrCpy $$R0 StopFileReadFromEnd$\r$\n$\r$\n`
+ FileWrite $0 ` Push $$R0$\r$\n`
+ FileWrite $0 `FunctionEnd$\r$\n`
+ FileClose $0
+ StrCpy $7 '$${'
+ SetFileAttributes $VIEW READONLY
+ ViewFileReadFromEndCallback:
+ Exec 'notepad.exe $VIEW'
+ Abort
+
+ Edit:
+ StrCmp $CALLBACK '' +5
+ StrCmp $6$R6 '0$R0$R4$R5' showproject
+ StrCmp $R6 '$R0$R4$R5' +3
+ Delete $CALLBACK
+ StrCpy $CALLBACK ''
+ StrCpy $R6 '$R0$R4$R5'
+
+ #Project#
+ StrCmp $6$R0 "01. LineFind" 0 +5
+ IfFileExists $CALLBACK +2
+ GetTempFileName $CALLBACK $PLUGINSDIR
+ FileOpen $0 $CALLBACK w
+ goto function
+ IfFileExists $PROJECT +2
+ GetTempFileName $PROJECT $PLUGINSDIR
+ FileOpen $0 $PROJECT w
+
+ #Name#
+ FileWrite $0 'Name "$FUNCTION"$\r$\n'
+ FileWrite $0 'OutFile "$PROJECT.exe"$\r$\n$\r$\n'
+
+ #!include#
+ StrCmp $R0$R4 '1. LineFindExample5' 0 TextFuncInclude
+ IfFileExists '$EXEDIR\WordFunc.nsh' 0 +3
+ FileWrite $0 '!include "$EXEDIR\WordFunc.nsh"$\r$\n'
+ goto +2
+ FileWrite $0 '!include "WordFunc.nsh"$\r$\n'
+ FileWrite $0 '!insertmacro WordFind$\r$\n'
+ FileWrite $0 '!insertmacro WordFindS$\r$\n'
+ FileWrite $0 '!insertmacro WordFind2X$\r$\n'
+ FileWrite $0 '!insertmacro WordFind2XS$\r$\n'
+ FileWrite $0 '!insertmacro WordFind3X$\r$\n'
+ FileWrite $0 '!insertmacro WordFind3XS$\r$\n'
+ FileWrite $0 '!insertmacro WordReplace$\r$\n'
+ FileWrite $0 '!insertmacro WordReplaceS$\r$\n'
+ FileWrite $0 '!insertmacro WordAdd$\r$\n'
+ FileWrite $0 '!insertmacro WordAddS$\r$\n'
+ FileWrite $0 '!insertmacro WordInsert$\r$\n'
+ FileWrite $0 '!insertmacro WordInsertS$\r$\n'
+ FileWrite $0 '!insertmacro StrFilter$\r$\n'
+ FileWrite $0 '!insertmacro StrFilterS$\r$\n'
+ TextFuncInclude:
+ IfFileExists '$EXEDIR\TextFunc.nsh' 0 +3
+ FileWrite $0 '!include "$EXEDIR\TextFunc.nsh"$\r$\n'
+ goto +2
+ FileWrite $0 '!include "TextFunc.nsh"$\r$\n'
+ FileWrite $0 '!insertmacro $FUNCTION$\r$\n'
+ StrCmp $FUNCTION TextCompare +2
+ FileWrite $0 '!insertmacro TrimNewLines$\r$\n'
+
+ #Section#
+ FileWrite $0 '$\r$\nSection -empty$\r$\n'
+ FileWrite $0 'SectionEnd$\r$\n$\r$\n'
+
+ #Function .onInit#
+ FileWrite $0 'Function .onInit$\r$\n'
+ StrCmp $R0$R5 "6. TextCompareExample1" 0 TextCompareExample235
+ FileWrite $0 ' StrCpy $$R0 ""$\r$\n'
+ FileWrite $0 ' $7TextCompare} "$R1" "$R2" "$R3" "$R5"$\r$\n'
+ FileWrite $0 ' IfErrors error$\r$\n'
+ FileWrite $0 ' StrCmp $$R0 NotEqual 0 +2$\r$\n'
+ FileWrite $0 ' MessageBox MB_OK " Files differ" IDOK +2$\r$\n'
+ FileWrite $0 ' MessageBox MB_OK " Files identical"$\r$\n'
+ FileWrite $0 ' goto end$\r$\n$\r$\n'
+ goto endoninit
+ TextCompareExample235:
+ StrCmp $R0$R5 "6. TextCompareExample2" +3
+ StrCmp $R0$R5 "6. TextCompareExample3" +2
+ StrCmp $R0$R5 "6. TextCompareExample5" 0 TextCompareExample4
+ FileWrite $0 ' StrCpy $$R0 "$R1"$\r$\n'
+ FileWrite $0 ' StrCpy $$R1 "$R2"$\r$\n$\r$\n'
+ FileWrite $0 ' GetTempFileName $$R2$\r$\n'
+ FileWrite $0 ' FileOpen $$R3 $$R2 w$\r$\n'
+ FileWrite $0 ' FileWrite $$R3 "$$R0 | $$R1$$\$8$$\$9"$\r$\n'
+ FileWrite $0 ' $7TextCompare} "$$R0" "$$R1" "$R3" "$R5"$\r$\n'
+ FileWrite $0 ' IfErrors error$\r$\n'
+ FileWrite $0 ' Exec "notepad.exe $$R2"$\r$\n'
+ FileWrite $0 ' goto end$\r$\n$\r$\n'
+ goto endoninit
+ TextCompareExample4:
+ StrCmp $R0$R5 "6. TextCompareExample4" 0 LineFindExample123456
+ FileWrite $0 ' StrCpy $$R0 "$R1"$\r$\n'
+ FileWrite $0 ' StrCpy $$R1 "$R2"$\r$\n$\r$\n'
+ FileWrite $0 ' GetTempFileName $$R2$\r$\n'
+ FileWrite $0 ' FileOpen $$R3 $$R2 w$\r$\n'
+ FileWrite $0 ' FileWrite $$R3 "$$R0 | $$R1$$\$8$$\$9"$\r$\n'
+ FileWrite $0 ' $7TextCompare} "$$R0" "$$R1" "$R3" "$R5"$\r$\n'
+ FileWrite $0 ' IfErrors error$\r$\n'
+ FileWrite $0 ' FileWrite $$R3 "$$\$8$$\$9$$R1 | $$R0$$\$8$$\$9"$\r$\n'
+ FileWrite $0 ' $7TextCompare} "$$R1" "$$R0" "$R3" "$R5"$\r$\n'
+ FileWrite $0 ' FileClose $$R3$\r$\n'
+ FileWrite $0 ' IfErrors error$\r$\n'
+ FileWrite $0 ' Exec "notepad.exe $$R2"$\r$\n$\r$\n'
+ FileWrite $0 ' goto end$\r$\n$\r$\n'
+ goto endoninit
+ LineFindExample123456:
+ FileWrite $0 ' $7$FUNCTION} "$R1" "$R2" "$R3" "$R4"$\r$\n'
+ FileWrite $0 ' IfErrors error$\r$\n'
+ FileWrite $0 ' MessageBox MB_YESNO " Open output file?" IDNO end$\r$\n'
+ FileWrite $0 ' StrCmp "$R2" "" 0 +3$\r$\n'
+ FileWrite $0 ` Exec 'notepad.exe "$R1"'$\r$\n`
+ FileWrite $0 ' goto end$\r$\n'
+ FileWrite $0 ' SearchPath $$R2 "$R2"$\r$\n'
+ FileWrite $0 ` Exec 'notepad.exe "$$R2"'$\r$\n`
+ FileWrite $0 ' goto end$\r$\n$\r$\n'
+ endoninit:
+ FileWrite $0 ' error:$\r$\n'
+ FileWrite $0 ' MessageBox MB_OK "Error"$\r$\n$\r$\n'
+ FileWrite $0 ' end:$\r$\n'
+ FileWrite $0 ' Quit$\r$\n'
+ FileWrite $0 'FunctionEnd$\r$\n$\r$\n'
+ #FunctionEnd#
+
+
+ #Function CallBack#
+ StrCmp $CALLBACK '' 0 close
+ function:
+ StrCmp $R0 '1. LineFind' 0 +8
+ FileWrite $0 'Function $R4$\r$\n'
+ StrCmp $R4 "Example1" Example1LF
+ StrCmp $R4 "Example2" Example2LF
+ StrCmp $R4 "Example3" Example3LF
+ StrCmp $R4 "Example4" Example4LF
+ StrCmp $R4 "Example5" Example5LF
+ StrCmp $R4 "Example6" Example6LF
+
+ FileWrite $0 'Function $R5$\r$\n'
+ StrCmp $R5 "Example1" Example1TC
+ StrCmp $R5 "Example2" Example2TC
+ StrCmp $R5 "Example3" Example3TC
+ StrCmp $R5 "Example4" Example4TC
+ StrCmp $R5 "Example5" Example3TC
+
+ Example1LF:
+ FileWrite $0 " $7TrimNewLines} '$$R9' $$R9$\r$\n"
+ FileWrite $0 " StrCpy $$R9 $$R9 '' 2 ;delete first two symbols$\r$\n"
+ FileWrite $0 " StrCpy $$R9 '$$R9$$\$8$$\$9'$\r$\n$\r$\n"
+ goto endwrite
+ Example2LF:
+ FileWrite $0 " $7TrimNewLines} '$$R9' $$R9$\r$\n"
+ FileWrite $0 " StrCpy $$R9 '$$R9 ~Changed line ($$R8)~$$\$8$$\$9'$\r$\n$\r$\n"
+ goto endwrite
+ Example3LF:
+ FileWrite $0 " StrCpy $$0 SkipWrite$\r$\n$\r$\n"
+ goto endwrite
+ Example4LF:
+ FileWrite $0 " FileWrite $$R4 '---First Line---$$\$8$$\$9'$\r$\n"
+ FileWrite $0 " FileWrite $$R4 '---Second Line ...---$$\$8$$\$9'$\r$\n$\r$\n"
+ goto endwrite
+ Example5LF:
+ FileWrite $0 " ; You can use:$\r$\n"
+ FileWrite $0 " ; $7WordFind}|$7WordFindS}|$7WordFind2X}|$7WordFind2XS}|$\r$\n"
+ FileWrite $0 " ; $7WordFind3X}|$7WordFind3XS}|$7WordReplace}|$7WordReplaceS}|$\r$\n"
+ FileWrite $0 " ; $7WordAdd}|$7WordAddS}|$7WordInsert}|$7WordInsertS}|$\r$\n"
+ FileWrite $0 " ; $7StrFilter}|$7StrFilterS}$\r$\n$\r$\n"
+ FileWrite $0 " $7WordReplace} '$$R9' ' ' '_' '+*' $$R9$\r$\n$\r$\n"
+ goto endwrite
+ Example6LF:
+ FileWrite $0 ' ;(Cut lines from a line to another line (also including that line))$\r$\n'
+ FileWrite $0 ' StrCmp $$R0 finish stop$\r$\n'
+ FileWrite $0 ' StrCmp $$R0 start finish$\r$\n'
+ FileWrite $0 ' StrCmp $$R9 "Start Line$$\$8$$\$9" 0 skip$\r$\n'
+ FileWrite $0 ' StrCpy $$R0 start$\r$\n'
+ FileWrite $0 ' StrCpy $$R1 $$R9$\r$\n'
+ FileWrite $0 ' goto code$\r$\n'
+ FileWrite $0 ' finish:$\r$\n'
+ FileWrite $0 ' StrCmp $$R9 "Finish Line$$\$8$$\$9" 0 code$\r$\n'
+ FileWrite $0 ' StrCpy $$R0 finish$\r$\n'
+ FileWrite $0 ' StrCpy $$R2 $$R8$\r$\n'
+ FileWrite $0 ' goto code$\r$\n'
+ FileWrite $0 ' skip:$\r$\n'
+ FileWrite $0 ' StrCpy $$0 SkipWrite$\r$\n'
+ FileWrite $0 ' goto output$\r$\n'
+ FileWrite $0 ' stop:$\r$\n'
+ FileWrite $0 ' StrCpy $$0 StopLineFind$\r$\n'
+ FileWrite $0 ' goto output$\r$\n$\r$\n'
+ FileWrite $0 ' ;;(Delete lines from a line to another line (also including that line))$\r$\n'
+ FileWrite $0 ' ; StrCmp $$R0 finish code$\r$\n'
+ FileWrite $0 ' ; StrCmp $$R0 start finish$\r$\n'
+ FileWrite $0 ' ; StrCmp $$R9 "Start Line$$\$8$$\$9" 0 code$\r$\n'
+ FileWrite $0 ' ; StrCpy $$R0 start$\r$\n'
+ FileWrite $0 ' ; StrCpy $$R1 $$R8$\r$\n'
+ FileWrite $0 ' ; goto skip$\r$\n'
+ FileWrite $0 ' ; finish:$\r$\n'
+ FileWrite $0 ' ; StrCmp $$R9 "Finish Line$$\$8$$\$9" 0 skip$\r$\n'
+ FileWrite $0 ' ; StrCpy $$R0 finish$\r$\n'
+ FileWrite $0 ' ; StrCpy $$R2 $$R8$\r$\n'
+ FileWrite $0 ' ; skip:$\r$\n'
+ FileWrite $0 ' ; StrCpy $$0 SkipWrite$\r$\n'
+ FileWrite $0 ' ; goto output$\r$\n$\r$\n'
+ FileWrite $0 ' code:$\r$\n'
+ FileWrite $0 ' ;...$\r$\n$\r$\n'
+ FileWrite $0 ' output:$\r$\n'
+ goto endwrite
+ Example1TC:
+ FileWrite $0 " StrCpy $$R0 NotEqual$\r$\n"
+ FileWrite $0 " StrCpy $$0 StopTextCompare$\r$\n$\r$\n"
+ goto endwrite
+ Example2TC:
+ FileWrite $0 " FileWrite $$R3 '$$8=$$9'$\r$\n"
+ FileWrite $0 " FileWrite $$R3 '$$6=$$7$$\$8$$\$9'$\r$\n$\r$\n"
+ goto endwrite
+ Example3TC:
+ FileWrite $0 " FileWrite $$R3 '$$8|$$6=$$9'$\r$\n$\r$\n"
+ goto endwrite
+ Example4TC:
+ FileWrite $0 " FileWrite $$R3 '$$8=$$9'$\r$\n$\r$\n"
+ goto endwrite
+ endwrite:
+ FileWrite $0 ' Push $$0$\r$\n'
+ FileWrite $0 'FunctionEnd$\r$\n'
+ close:
+ FileClose $0
+ goto $6
+ #FunctionEnd#
+
+ showproject:
+ StrCmp $R0 '1. LineFind' 0 +3
+ ExecWait 'notepad.exe $CALLBACK'
+ goto +4
+ SetFileAttributes $PROJECT READONLY
+ ExecWait 'notepad.exe $PROJECT'
+ SetFileAttributes $PROJECT NORMAL
+ Abort
+
+ MainSend:
+ GetDlgItem $0 $HWND 1210
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $0 $HWND 1203
+ ShowWindow $0 1
+ EnableWindow $0 1
+ GetDlgItem $0 $HWND 1204
+ ShowWindow $0 1
+ EnableWindow $0 1
+ GetDlgItem $0 $HWND 1205
+ EnableWindow $0 1
+ GetDlgItem $0 $HWND 1206
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1207
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1208
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1209
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1211
+ EnableWindow $0 1
+
+ StrCmp $FUNCTION LineFind 0 +5
+ StrCpy $LINEFIND1 $R1
+ StrCpy $LINEFIND2 $R2
+ StrCpy $LINEFIND3 $R3
+ goto LineFindSend
+ StrCmp $FUNCTION LineRead 0 +4
+ StrCpy $LINEREAD1 $R1
+ StrCpy $LINEREAD2 $R2
+ goto LineFindSend
+ StrCmp $FUNCTION FileReadFromEnd 0 +3
+ StrCpy $FILEREADFROMEND1 $R1
+ goto LineFindSend
+ StrCmp $FUNCTION LineSum 0 +3
+ StrCpy $LINESUM1 $R1
+ goto LineFindSend
+ StrCmp $FUNCTION FileJoin 0 +5
+ StrCpy $FILEJOIN1 $R1
+ StrCpy $FILEJOIN2 $R2
+ StrCpy $FILEJOIN3 $R3
+ goto LineFindSend
+ StrCmp $FUNCTION TextCompare 0 +5
+ StrCpy $TEXTCOMPARE1 $R1
+ StrCpy $TEXTCOMPARE2 $R2
+ StrCpy $TEXTCOMPARE3 $R3
+ goto LineFindSend
+ StrCmp $FUNCTION ConfigRead 0 +4
+ StrCpy $CONFIGREAD1 $R1
+ StrCpy $CONFIGREAD2 $R2
+ goto LineFindSend
+ StrCmp $FUNCTION ConfigWrite 0 +5
+ StrCpy $CONFIGWRITE1 $R1
+ StrCpy $CONFIGWRITE2 $R2
+ StrCpy $CONFIGWRITE3 $R3
+ goto LineFindSend
+ StrCmp $FUNCTION FileRecode 0 +3
+ StrCpy $FILERECODE1 $R1
+ StrCpy $FILERECODE2 $R2
+
+ LineFindSend:
+ StrCmp $R0 "1. LineFind" 0 LineReadSend
+ StrCmp $FUNCTION LineFind 0 LineFindSend2
+ StrCmp $R4 "Example1" 0 +3
+ StrCpy $LINEFIND3 "3:-1"
+ goto LineFindSend2
+ StrCmp $R4 "Example2" 0 +3
+ StrCpy $LINEFIND3 "{5:12 15 -6:-5 -1}"
+ goto LineFindSend2
+ StrCmp $R4 "Example3" 0 +3
+ StrCpy $LINEFIND3 "2:3 10:-5 -3:-2"
+ goto LineFindSend2
+ StrCmp $R4 "Example4" 0 +3
+ StrCpy $LINEFIND3 "10"
+ goto LineFindSend2
+ StrCmp $R4 "Example5" 0 +3
+ StrCpy $LINEFIND3 "1:-1"
+ goto LineFindSend2
+ StrCmp $R4 "Example6" 0 +3
+ StrCpy $LINEFIND3 ""
+ goto LineFindSend2
+ StrCmp $R4 "Example7" 0 +2
+ StrCpy $LINEFIND3 "1:-1"
+
+ LineFindSend2:
+ StrCpy $FUNCTION LineFind
+ StrCmp $LINEFIND2 '/NUL' 0 +2
+ StrCpy $LINEFIND2 ''
+ GetDlgItem $0 $HWND 1201
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEFIND1"
+ GetDlgItem $0 $HWND 1203
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEFIND2"
+ GetDlgItem $0 $HWND 1205
+ ShowWindow $0 1
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEFIND3"
+ GetDlgItem $0 $HWND 1207
+ ShowWindow $0 1
+ GetDlgItem $0 $HWND 1211
+ ShowWindow $0 1
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:Edit"
+ GetDlgItem $0 $HWND 1212
+ ShowWindow $0 1
+ StrCmp $LOG '' +2
+ EnableWindow $0 1
+ GetDlgItem $0 $HWND 1213
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile"
+ GetDlgItem $0 $HWND 1214
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:OutputFile"
+ GetDlgItem $0 $HWND 1215
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:Range"
+ GetDlgItem $0 $HWND 1216
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:Function"
+
+ StrCmp $R4 "Example7" 0 +9
+ GetDlgItem $0 $HWND 1203
+ EnableWindow $0 0
+ SendMessage $0 ${WM_ENABLE} 1 0
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:/NUL"
+ GetDlgItem $0 $HWND 1204
+ EnableWindow $0 0
+ GetDlgItem $0 $HWND 1211
+ EnableWindow $0 0
+ abort
+
+
+ LineReadSend:
+ StrCmp $R0 "2. LineRead" 0 FileReadFromEndSend
+ StrCpy $FUNCTION LineRead
+ GetDlgItem $0 $HWND 1201
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEREAD1"
+ GetDlgItem $0 $HWND 1203
+ ShowWindow $0 1
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEREAD2"
+ GetDlgItem $0 $HWND 1204
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1205
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1211
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1212
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1213
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile"
+ GetDlgItem $0 $HWND 1214
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:Line #"
+ GetDlgItem $0 $HWND 1215
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $0 $HWND 1216
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ Abort
+
+ FileReadFromEndSend:
+ StrCmp $R0 "3. FileReadFromEnd" 0 LineSumSend
+ StrCpy $FUNCTION FileReadFromEnd
+ GetDlgItem $0 $HWND 1201
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILEREADFROMEND1"
+ GetDlgItem $0 $HWND 1203
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1204
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1205
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1209
+ ShowWindow $0 1
+ GetDlgItem $0 $HWND 1211
+ ShowWindow $0 1
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:View"
+ GetDlgItem $0 $HWND 1212
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1213
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile"
+ GetDlgItem $0 $HWND 1214
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $0 $HWND 1215
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $0 $HWND 1216
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:Function"
+ Abort
+
+ LineSumSend:
+ StrCmp $R0 "4. LineSum" 0 FileJoinSend
+ StrCpy $FUNCTION LineSum
+ GetDlgItem $0 $HWND 1201
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINESUM1"
+ GetDlgItem $0 $HWND 1203
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1204
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1205
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1211
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1212
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1213
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile"
+ GetDlgItem $0 $HWND 1214
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $0 $HWND 1215
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $0 $HWND 1216
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ Abort
+
+ FileJoinSend:
+ StrCmp $R0 "5. FileJoin" 0 TextCompareSend
+ StrCpy $FUNCTION FileJoin
+ GetDlgItem $0 $HWND 1201
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILEJOIN1"
+ GetDlgItem $0 $HWND 1203
+ ShowWindow $0 1
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILEJOIN2"
+ GetDlgItem $0 $HWND 1204
+ ShowWindow $0 1
+ GetDlgItem $0 $HWND 1205
+ ShowWindow $0 1
+ EnableWindow $0 1
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILEJOIN3"
+ GetDlgItem $0 $HWND 1206
+ ShowWindow $0 1
+ GetDlgItem $0 $HWND 1211
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1212
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1213
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile1"
+ GetDlgItem $0 $HWND 1214
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile2"
+ GetDlgItem $0 $HWND 1215
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:OutputFile"
+ GetDlgItem $0 $HWND 1216
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ Abort
+
+ TextCompareSend:
+ StrCmp $R0 "6. TextCompare" 0 ConfigReadSend
+ StrCmp $FUNCTION TextCompare 0 TextCompareSend2
+ StrCmp $R5 "Example1" 0 +3
+ StrCpy $TEXTCOMPARE3 "FastDiff"
+ goto TextCompareSend2
+ StrCmp $R5 "Example2" 0 +3
+ StrCpy $TEXTCOMPARE3 "FastDiff"
+ goto TextCompareSend2
+ StrCmp $R5 "Example3" 0 +3
+ StrCpy $TEXTCOMPARE3 "FastEqual"
+ goto TextCompareSend2
+ StrCmp $R5 "Example4" 0 +3
+ StrCpy $TEXTCOMPARE3 "SlowDiff"
+ goto TextCompareSend2
+ StrCmp $R5 "Example5" 0 +2
+ StrCpy $TEXTCOMPARE3 "SlowEqual"
+
+ TextCompareSend2:
+ StrCpy $FUNCTION TextCompare
+ GetDlgItem $0 $HWND 1201
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$TEXTCOMPARE1"
+ GetDlgItem $0 $HWND 1203
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$TEXTCOMPARE2"
+ GetDlgItem $0 $HWND 1204
+ ShowWindow $0 1
+ GetDlgItem $0 $HWND 1205
+ ShowWindow $0 1
+ EnableWindow $0 0
+ SendMessage $0 ${WM_ENABLE} 1 0
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$TEXTCOMPARE3"
+ GetDlgItem $0 $HWND 1208
+ ShowWindow $0 1
+ GetDlgItem $0 $HWND 1211
+ ShowWindow $0 1
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:View"
+ GetDlgItem $0 $HWND 1212
+ ShowWindow $0 1
+ GetDlgItem $0 $HWND 1213
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:TextFile1"
+ GetDlgItem $0 $HWND 1214
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:TextFile2"
+ GetDlgItem $0 $HWND 1215
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:Option"
+ GetDlgItem $0 $HWND 1216
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:Function"
+ abort
+
+ ConfigReadSend:
+ StrCmp $R0 "7. ConfigRead" 0 ConfigWriteSend
+ StrCpy $FUNCTION ConfigRead
+ GetDlgItem $0 $HWND 1201
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGREAD1"
+ GetDlgItem $0 $HWND 1203
+ ShowWindow $0 1
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGREAD2"
+ GetDlgItem $0 $HWND 1204
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1205
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1211
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1212
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1213
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile"
+ GetDlgItem $0 $HWND 1214
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:Entry"
+ GetDlgItem $0 $HWND 1215
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $0 $HWND 1216
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ Abort
+
+ ConfigWriteSend:
+ StrCmp $R0 "8. ConfigWrite" 0 FileRecodeSend
+ StrCpy $FUNCTION ConfigWrite
+ GetDlgItem $0 $HWND 1201
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGWRITE1"
+ GetDlgItem $0 $HWND 1203
+ ShowWindow $0 1
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGWRITE2"
+ GetDlgItem $0 $HWND 1204
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1205
+ ShowWindow $0 1
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGWRITE3"
+ GetDlgItem $0 $HWND 1211
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1212
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1213
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile"
+ GetDlgItem $0 $HWND 1214
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:Entry"
+ GetDlgItem $0 $HWND 1215
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:Value"
+ GetDlgItem $0 $HWND 1216
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ Abort
+
+ FileRecodeSend:
+ StrCmp $R0 "9. FileRecode" 0 Abort
+ StrCpy $FUNCTION FileRecode
+ GetDlgItem $0 $HWND 1201
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILERECODE1"
+ GetDlgItem $0 $HWND 1203
+ ShowWindow $0 1
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILERECODE2"
+ GetDlgItem $0 $HWND 1204
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1205
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1211
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1212
+ ShowWindow $0 0
+ GetDlgItem $0 $HWND 1213
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile"
+ GetDlgItem $0 $HWND 1214
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:Format"
+ GetDlgItem $0 $HWND 1215
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $0 $HWND 1216
+ SendMessage $0 ${WM_SETTEXT} 1 "STR:"
+ Abort
+
+;=Enter=
+ Enter:
+ StrCmp $R1 '' 0 +3
+ StrCpy $0 'Choose InputFile'
+ goto send
+ IfFileExists $R1 +3
+ StrCpy $0 'InputFile is not exist'
+ goto send
+
+ StrCmp $R0 "1. LineFind" LineFindRead
+ StrCmp $R0 "2. LineRead" LineRead
+ StrCmp $R0 "3. FileReadFromEnd" FileReadFromEnd
+ StrCmp $R0 "4. LineSum" LineSum
+ StrCmp $R0 "5. FileJoin" FileJoin
+ StrCmp $R0 "6. TextCompare" LineFind-TextCompare
+ StrCmp $R0 "7. ConfigRead" ConfigRead
+ StrCmp $R0 "8. ConfigWrite" ConfigWrite
+ StrCmp $R0 "9. FileRecode" FileRecode
+ Abort
+
+ LineFindRead:
+ StrCmp $R4 "Example7" 0 LineFind-TextCompare
+ ${LineFind} '$R1' '/NUL' '$R3' LineFindCallback
+ IfErrors error
+ StrCmp $R0 StopLineFind 0 done
+ StrCpy $0 'stopped'
+ goto send
+
+ LineFind-TextCompare:
+ GetLabelAddress $6 LineFindBack
+ goto Edit
+ LineFindBack:
+ FileClose $0
+ StrCmp $R0 "6. TextCompare" Compile
+ StrCmp $CALLBACK '' Compile
+ ${FileJoin} "$PROJECT" "$CALLBACK" ""
+
+ Compile:
+ StrCmp $LOG '' 0 +4
+ GetTempFileName $LOG $PLUGINSDIR
+ GetDlgItem $0 $HWND 1212
+ EnableWindow $0 1
+ ReadRegStr $0 HKLM "SOFTWARE\NSIS" ""
+ IfErrors 0 +2
+ StrCpy $0 "${NSISDIR}"
+ nsExec::Exec '"$0\makensis.exe" /O$LOG $PROJECT'
+ Pop $0
+ StrCmp $0 0 0 +6
+ ExecWait '$PROJECT.exe' $0
+ Delete $PROJECT
+ Delete $PROJECT.exe
+ StrCpy $PROJECT ''
+ goto done
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION "Compile error. Open log?" IDNO +2
+ Exec 'notepad.exe $LOG'
+ StrCpy $0 "Compile Error"
+ goto send
+
+ LineRead:
+ ${LineRead} "$R1" "$R2" $0
+ IfErrors error send
+
+ FileReadFromEnd:
+ ${FileReadFromEnd} "$R1" "FileReadFromEndCallback"
+ IfErrors error
+ StrCmp $R0 StopFileReadFromEnd 0 done
+ StrCpy $0 'stopped'
+ goto send
+
+ LineSum:
+ ${LineSum} "$R1" $0
+ IfErrors error send
+
+ FileJoin:
+ ${FileJoin} "$R1" "$R2" "$R3"
+ IfErrors error
+ MessageBox MB_YESNO " Open output file?" IDNO done
+ StrCmp $R3 '' 0 +3
+ Exec '"notepad.exe" "$R1"'
+ goto done
+ Exec '"notepad.exe" "$R3"'
+ goto done
+
+ ConfigRead:
+ ${ConfigRead} "$R1" "$R2" $0
+ IfErrors error send
+
+ ConfigWrite:
+ ${ConfigWrite} "$R1" "$R2" "$R3" $0
+ IfErrors error
+ MessageBox MB_YESNO " Open output file?" IDNO send
+ Exec '"notepad.exe" "$R1"'
+ goto send
+
+ FileRecode:
+ ${FileRecode} "$R1" "$R2"
+ IfErrors error
+ MessageBox MB_YESNO " Open output file?" IDNO done
+ Exec '"notepad.exe" "$R1"'
+ goto done
+
+ error:
+ StrCpy $0 'error'
+ goto send
+
+ done:
+ StrCpy $0 'Done'
+
+ send:
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$0"
+
+ abort:
+ Abort
+FunctionEnd
+
+Function LineFindCallback
+ MessageBox MB_OKCANCEL '$$R9 "Line"=[$R9]$\n$$R8 "#"=[$R8]$\n$$R7 "-#"=[$R7]$\n$$R6 "Range"=[$R6]$\n$$R5 "Read"=[$R5]$\n$$R4 "Write"=[$R4]' IDOK +2
+ StrCpy $R0 StopLineFind
+
+ Push $R0
+FunctionEnd
+
+Function FileReadFromEndCallback
+ MessageBox MB_OKCANCEL '$$9 "Line"=[$9]$\n$$8 "#"=[$8]$\n$$7 "-#"=[$7]' IDOK +2
+ StrCpy $R0 StopFileReadFromEnd
+
+ Push $R0
+FunctionEnd
+
+Function .onInit
+ InitPluginsDir
+ GetTempFileName $INI $PLUGINSDIR
+ File /oname=$INI "TextFunc.ini"
+FunctionEnd
+
+Page instfiles
+
+Section -Empty
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/TextFuncTest.nsi b/Engine/bin/tools/nsis/app/Examples/TextFuncTest.nsi
new file mode 100644
index 000000000..359cdec8b
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/TextFuncTest.nsi
@@ -0,0 +1,414 @@
+;_____________________________________________________________________________
+;
+; Text Functions Test
+;_____________________________________________________________________________
+;
+; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
+
+Name "Text Functions Test"
+OutFile "TextFuncTest.exe"
+Caption "$(^Name)"
+ShowInstDetails show
+XPStyle on
+RequestExecutionLevel user
+
+Var FUNCTION
+Var TEMPFILE1
+Var TEMPFILE2
+Var TEMPFILE3
+Var HANDLE
+Var OUT
+
+!include "TextFunc.nsh"
+
+;############### INSTALL ###############
+
+!define StackVerificationStart `!insertmacro StackVerificationStart`
+!macro StackVerificationStart _FUNCTION
+ StrCpy $FUNCTION ${_FUNCTION}
+ Call StackVerificationStart
+!macroend
+
+!define StackVerificationEnd `!insertmacro StackVerificationEnd`
+!macro StackVerificationEnd
+ Call StackVerificationEnd
+!macroend
+
+Function StackVerificationStart
+ StrCpy $0 !0
+ StrCpy $1 !1
+ StrCpy $2 !2
+ StrCpy $3 !3
+ StrCpy $4 !4
+ StrCpy $5 !5
+ StrCpy $6 !6
+ StrCpy $7 !7
+ StrCpy $8 !8
+ StrCpy $9 !9
+ StrCpy $R0 !R0
+ StrCpy $R1 !R1
+ StrCpy $R2 !R2
+ StrCpy $R3 !R3
+ StrCpy $R4 !R4
+ StrCpy $R5 !R5
+ StrCpy $R6 !R6
+ StrCpy $R7 !R7
+ StrCpy $R8 !R8
+ StrCpy $R9 !R9
+FunctionEnd
+
+Function StackVerificationEnd
+ IfErrors +3
+ DetailPrint 'PASSED $FUNCTION no errors'
+ goto +2
+ DetailPrint 'FAILED $FUNCTION error'
+
+ StrCmp $0 '!0' 0 error
+ StrCmp $1 '!1' 0 error
+ StrCmp $2 '!2' 0 error
+ StrCmp $3 '!3' 0 error
+ StrCmp $4 '!4' 0 error
+ StrCmp $5 '!5' 0 error
+ StrCmp $6 '!6' 0 error
+ StrCmp $7 '!7' 0 error
+ StrCmp $8 '!8' 0 error
+ StrCmp $9 '!9' 0 error
+ StrCmp $R0 '!R0' 0 error
+ StrCmp $R1 '!R1' 0 error
+ StrCmp $R2 '!R2' 0 error
+ StrCmp $R3 '!R3' 0 error
+ StrCmp $R4 '!R4' 0 error
+ StrCmp $R5 '!R5' 0 error
+ StrCmp $R6 '!R6' 0 error
+ StrCmp $R7 '!R7' 0 error
+ StrCmp $R8 '!R8' 0 error
+ StrCmp $R9 '!R9' 0 error
+ DetailPrint 'PASSED $FUNCTION stack'
+ goto end
+
+ error:
+ DetailPrint 'FAILED $FUNCTION stack'
+; MessageBox MB_OKCANCEL '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}' IDOK +2
+; quit
+
+ end:
+FunctionEnd
+
+
+
+Section CreateTestFile
+ GetTempFileName $TEMPFILE1
+ FileOpen $HANDLE $TEMPFILE1 w
+ FileWrite $HANDLE '1A=a$\r$\n'
+ FileWrite $HANDLE '2B=b$\r$\n'
+ FileWrite $HANDLE '3C=c$\r$\n'
+ FileWrite $HANDLE '4D=d$\r$\n'
+ FileWrite $HANDLE '5E=e$\r$\n'
+ FileClose $HANDLE
+ GetTempFileName $TEMPFILE2
+ GetTempFileName $TEMPFILE3
+SectionEnd
+
+
+Section LineFind
+ ${StackVerificationStart} LineFind
+
+ ${LineFind} '$TEMPFILE1' '/NUL' '1:-4 3 -1' 'LineFindCallback1'
+ IfErrors error
+ StrCmp $OUT '|1:2|-5|1|1A=a$\r$\n|1:2|-4|2|2B=b$\r$\n|3:3|-3|3|3C=c$\r$\n' 0 error
+
+ StrCpy $OUT ''
+ SetDetailsPrint none
+ ${LineFind} '$TEMPFILE1' '$TEMPFILE2' '1:-1' 'LineFindCallback2'
+ SetDetailsPrint both
+ IfErrors error
+ StrCmp $OUT '|1:-1||1|1A=a$\r$\n|1:-1||2|4D=d$\r$\n|1:-1||3|3C=c$\r$\n|1:-1||4|2B=B$\r$\n|1:-1||5|5E=e$\r$\n' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+Function LineFindCallback1
+ StrCpy $OUT '$OUT|$R6|$R7|$R8|$R9'
+ StrCmp $R8 3 0 +2
+ StrCpy $0 StopLineFind
+
+ Push $0
+FunctionEnd
+
+Function LineFindCallback2
+ StrCmp $R8 2 0 +2
+ StrCpy $R9 '4D=d$\r$\n'
+ StrCmp $R8 4 0 +2
+ StrCpy $R9 '2B=B$\r$\n'
+
+ StrCpy $OUT '$OUT|$R6|$R7|$R8|$R9'
+
+ Push $0
+FunctionEnd
+
+
+Section LineRead
+ ${StackVerificationStart} LineRead
+
+ ${LineRead} '$TEMPFILE1' '-1' $OUT
+ IfErrors error
+ StrCmp $OUT '5E=e$\r$\n' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section FileReadFromEnd
+ ${StackVerificationStart} FileReadFromEnd
+
+ StrCpy $OUT ''
+ ${FileReadFromEnd} '$TEMPFILE1' 'FileReadFromEndCallback'
+ IfErrors error
+ StrCmp $OUT '|-1|5|5E=e$\r$\n|-2|4|4D=d$\r$\n|-3|3|3C=c$\r$\n|-4|2|2B=b$\r$\n' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+Function FileReadFromEndCallback
+ StrCpy $OUT '$OUT|$7|$8|$9'
+ StrCmp $8 2 0 +2
+ StrCpy $0 StopFileReadFromEnd
+
+ Push $0
+FunctionEnd
+
+
+Section LineSum
+ ${StackVerificationStart} LineSum
+
+ ${LineSum} '$TEMPFILE1' $OUT
+ IfErrors error
+ StrCmp $OUT '5' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section FileJoin
+ ${StackVerificationStart} FileJoin
+
+ SetDetailsPrint none
+ ${FileJoin} '$TEMPFILE1' '$TEMPFILE2' '$TEMPFILE3'
+ SetDetailsPrint both
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section TextCompare
+ ${StackVerificationStart} TextCompare
+
+ StrCpy $OUT ''
+ ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'FastDiff' 'TextCompareCallback'
+ StrCmp $OUT '|2|4D=d$\r$\n|2|2B=b$\r$\n|4|2B=B$\r$\n|4|4D=d$\r$\n' 0 error
+
+ StrCpy $OUT ''
+ ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'FastEqual' 'TextCompareCallback'
+ StrCmp $OUT '|1|1A=a$\r$\n|1|1A=a$\r$\n|3|3C=c$\r$\n|3|3C=c$\r$\n|5|5E=e$\r$\n|5|5E=e$\r$\n' 0 error
+
+ StrCpy $OUT ''
+ ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'SlowDiff' 'TextCompareCallback'
+ StrCmp $OUT '' 0 error
+
+ StrCpy $OUT ''
+ ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'SlowEqual' 'TextCompareCallback'
+ StrCmp $OUT '|1|1A=a$\r$\n|1|1A=a$\r$\n|4|2B=B$\r$\n|2|2B=b$\r$\n|3|3C=c$\r$\n|3|3C=c$\r$\n|2|4D=d$\r$\n|4|4D=d$\r$\n|5|5E=e$\r$\n|5|5E=e$\r$\n' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+Section TextCompareS
+ ${StackVerificationStart} TextCompareS
+
+ StrCpy $OUT ''
+ ${TextCompareS} '$TEMPFILE1' '$TEMPFILE2' 'SlowDiff' 'TextCompareCallback'
+ StrCmp $OUT '|||2|2B=b$\r$\n' 0 error
+
+ StrCpy $OUT ''
+ ${TextCompareS} '$TEMPFILE1' '$TEMPFILE2' 'SlowEqual' 'TextCompareCallback'
+ StrCmp $OUT '|1|1A=a$\r$\n|1|1A=a$\r$\n|3|3C=c$\r$\n|3|3C=c$\r$\n|2|4D=d$\r$\n|4|4D=d$\r$\n|5|5E=e$\r$\n|5|5E=e$\r$\n' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+Function TextCompareCallback
+ StrCpy $OUT '$OUT|$6|$7|$8|$9'
+
+ Push $0
+FunctionEnd
+
+
+Section ConfigRead
+ ${StackVerificationStart} ConfigRead
+
+ ${ConfigRead} '$TEMPFILE1' '3c=' $OUT
+ StrCmp $OUT 'c' 0 error
+
+ ${ConfigRead} '$TEMPFILE1' '6F=' $OUT
+ StrCmp $OUT '' 0 error
+
+ ${ConfigRead} '$TEMPFILE1' 'FF=' $OUT
+ IfErrors 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section ConfigReadS
+ ${StackVerificationStart} ConfigReadS
+
+ ${ConfigReadS} '$TEMPFILE1' '3C=' $OUT
+ StrCmp $OUT 'c' 0 error
+
+ ${ConfigReadS} '$TEMPFILE1' '3c=' $OUT
+ IfErrors 0 error
+ StrCmp $OUT '' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section ConfigWrite
+ ${StackVerificationStart} ConfigWrite
+
+ ${ConfigWrite} '$TEMPFILE1' '5E=' 'e**' $OUT
+ StrCmp $OUT 'CHANGED' 0 error
+
+ ${ConfigWrite} '$TEMPFILE1' '2B=' '' $OUT
+ StrCmp $OUT 'DELETED' 0 error
+
+ ${ConfigWrite} '$TEMPFILE1' '3c=' 'c' $OUT
+ StrCmp $OUT 'SAME' 0 error
+
+ ${ConfigWrite} '$TEMPFILE1' '6F=' '*' $OUT
+ StrCmp $OUT 'ADDED' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section ConfigWriteS
+ ${StackVerificationStart} ConfigWriteS
+
+ ${ConfigWriteS} '$TEMPFILE1' '5e=' 'e**' $OUT
+ StrCmp $OUT 'ADDED' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section FileRecode
+ ${StackVerificationStart} FileRecode
+
+ ${FileRecode} '$TEMPFILE1' 'CharToOem'
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section TrimNewLines
+ ${StackVerificationStart} TrimNewLines
+
+ ${TrimNewLines} 'Text Line$\r$\n' $OUT
+ StrCmp $OUT 'Text Line' 0 error
+
+ ${TrimNewLines} 'Text Line' $OUT
+ StrCmp $OUT 'Text Line' 0 error
+
+ ${TrimNewLines} 'Text Line$\n' $OUT
+ StrCmp $OUT 'Text Line' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WriteUninstaller
+ SetDetailsPrint none
+ Delete $TEMPFILE1
+ Delete $TEMPFILE2
+ Delete $TEMPFILE3
+ SetDetailsPrint both
+ goto +2
+ WriteUninstaller '$EXEDIR\un.TextFuncTest.exe'
+SectionEnd
+
+
+
+;############### UNINSTALL ###############
+
+Section un.Uninstall
+ ${LineFind} '$TEMPFILE1' '/NUL' '1:-1' 'un.LineFindCallback'
+ ${LineRead} '$TEMPFILE1' '-1' $OUT
+ ${FileReadFromEnd} '$TEMPFILE1' 'un.FileReadFromEndCallback'
+ ${LineSum} '$TEMPFILE1' $OUT
+ ${FileJoin} '$TEMPFILE1' '$TEMPFILE2' '$TEMPFILE3'
+ ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'FastDiff' 'un.TextCompareCallback'
+ ${TextCompareS} '$TEMPFILE1' '$TEMPFILE2' 'FastDiff' 'un.TextCompareCallback'
+ ${ConfigRead} '$TEMPFILE1' '3c=' $OUT
+ ${ConfigReadS} '$TEMPFILE1' '3c=' $OUT
+ ${ConfigWrite} '$TEMPFILE1' '5E=' 'e**' $OUT
+ ${ConfigWriteS} '$TEMPFILE1' '5E=' 'e**' $OUT
+ ${FileRecode} '$TEMPFILE1' 'CharToOem'
+ ${TrimNewLines} 'Text Line$\r$\n' $OUT
+SectionEnd
+
+Function un.LineFindCallback
+ Push $0
+FunctionEnd
+
+Function un.FileReadFromEndCallback
+ Push $0
+FunctionEnd
+
+Function un.TextCompareCallback
+ Push $0
+FunctionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/UserInfo/UserInfo.nsi b/Engine/bin/tools/nsis/app/Examples/UserInfo/UserInfo.nsi
new file mode 100644
index 000000000..e05a16176
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/UserInfo/UserInfo.nsi
@@ -0,0 +1,44 @@
+Name "UserInfo.dll test"
+OutFile UserInfo.exe
+
+!define REALMSG "$\nOriginal non-restricted account type: $2"
+
+Section
+ ClearErrors
+ UserInfo::GetName
+ IfErrors Win9x
+ Pop $0
+ UserInfo::GetAccountType
+ Pop $1
+ # GetOriginalAccountType will check the tokens of the original user of the
+ # current thread/process. If the user tokens were elevated or limited for
+ # this process, GetOriginalAccountType will return the non-restricted
+ # account type.
+ # On Vista with UAC, for example, this is not the same value when running
+ # with `RequestExecutionLevel user`. GetOriginalAccountType will return
+ # "admin" while GetAccountType will return "user".
+ UserInfo::GetOriginalAccountType
+ Pop $2
+ StrCmp $1 "Admin" 0 +3
+ MessageBox MB_OK 'User "$0" is in the Administrators group${REALMSG}'
+ Goto done
+ StrCmp $1 "Power" 0 +3
+ MessageBox MB_OK 'User "$0" is in the Power Users group${REALMSG}'
+ Goto done
+ StrCmp $1 "User" 0 +3
+ MessageBox MB_OK 'User "$0" is just a regular user${REALMSG}'
+ Goto done
+ StrCmp $1 "Guest" 0 +3
+ MessageBox MB_OK 'User "$0" is a guest${REALMSG}'
+ Goto done
+ MessageBox MB_OK "Unknown error"
+ Goto done
+
+ Win9x:
+ # This one means you don't need to care about admin or
+ # not admin because Windows 9x doesn't either
+ MessageBox MB_OK "Error! This DLL can't run under Windows 9x!"
+
+ done:
+SectionEnd
+
diff --git a/Engine/bin/tools/nsis/app/Examples/UserVars.nsi b/Engine/bin/tools/nsis/app/Examples/UserVars.nsi
new file mode 100644
index 000000000..784b52bb4
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/UserVars.nsi
@@ -0,0 +1,69 @@
+; UserVars.nsi
+;
+; This script shows you how to declare and user variables.
+
+;--------------------------------
+
+ Name "User Variables Text"
+ OutFile "UserVars.exe"
+
+ InstallDir "$PROGRAMFILES\User Variables Test"
+
+ RequestExecutionLevel admin
+
+;--------------------------------
+
+ ;Pages
+ Page directory
+ Page instfiles
+
+ UninstPage uninstConfirm
+ UninstPage instfiles
+
+;--------------------------------
+; Declaration of user variables (Var command), allowed charaters for variables names : [a-z][A-Z][0-9] and '_'
+
+ Var "Name"
+ Var "Serial"
+ Var "Info"
+
+;--------------------------------
+; Installer
+
+Section "Dummy Section" SecDummy
+
+ StrCpy $0 "Admin"
+ StrCpy "$Name" $0
+ StrCpy "$Serial" "12345"
+ MessageBox MB_OK "User Name: $Name $\n$\nSerial Number: $Serial"
+
+ CreateDirectory $INSTDIR
+ WriteUninstaller "$INSTDIR\Uninst.exe"
+
+SectionEnd
+
+Section "Another Section"
+
+ Var /GLOBAL "AnotherVar"
+
+ StrCpy $AnotherVar "test"
+
+SectionEnd
+
+;--------------------------------
+; Uninstaller
+
+Section "Uninstall"
+
+ StrCpy $Info "User variables test uninstalled successfully."
+ Delete "$INSTDIR\Uninst.exe"
+ RmDir $INSTDIR
+
+SectionEnd
+
+Function un.OnUninstSuccess
+
+ HideWindow
+ MessageBox MB_OK "$Info"
+
+FunctionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/VPatch/example.nsi b/Engine/bin/tools/nsis/app/Examples/VPatch/example.nsi
new file mode 100644
index 000000000..081420e46
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/VPatch/example.nsi
@@ -0,0 +1,62 @@
+;VPatch example
+;Written by Joost Verburg
+
+;--------------------------------
+
+; The name of the installer
+Name "VPatch Test"
+
+; The file to write
+OutFile "vpatchtest.exe"
+
+; The default installation directory
+InstallDir "$PROGRAMFILES\VPatch Test"
+
+; The text to prompt the user to enter a directory
+DirText "Choose a folder in which to install the VPatch Test!"
+
+; Show details
+ShowInstDetails show
+
+;--------------------------------
+; The normal way to use VPatch
+;--------------------------------
+!include "VPatchLib.nsh"
+
+Section "Update file"
+ ; Set output path to the installation directory
+ SetOutPath $INSTDIR
+
+ ; Extract the old file under name 'updatefile.txt'
+ File /oname=updatefile.txt oldfile.txt
+
+ ; Update the file - it will be replaced with the new version
+ DetailPrint "Updating updatefile.txt using patch..."
+ !insertmacro VPatchFile "patch.pat" "$INSTDIR\updatefile.txt" "$INSTDIR\temporaryfile.txt"
+
+SectionEnd
+
+;-------------------------------
+; The hard way to use VPatch
+;-------------------------------
+Section "New version in separate file"
+
+ ; Set output path to the installation directory
+ SetOutPath $INSTDIR
+
+ ; Extract the old file
+ File oldfile.txt
+
+ ; Extract the patch to the plug-ins folder (temporary)
+ InitPluginsDir
+ File /oname=$PLUGINSDIR\patch.pat patch.pat
+
+ ; Update the old file to the new file using the patch
+ DetailPrint "Updating oldfile.txt using patch to newfile.txt..."
+ vpatch::vpatchfile "$PLUGINSDIR\patch.pat" "$INSTDIR\oldfile.txt" "$INSTDIR\newfile.txt"
+
+ ; Show result
+ Pop $R0
+ DetailPrint "Result: $R0"
+
+SectionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/VPatch/newfile.txt b/Engine/bin/tools/nsis/app/Examples/VPatch/newfile.txt
new file mode 100644
index 000000000..2369a7075
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/VPatch/newfile.txt
@@ -0,0 +1,6 @@
+*** THIS IS A TEST FILE FOR THE VPATCH EXAMPLE ***
+*** COMPILE EXAMPLE.NSI TO TEST ***
+
+newfile - vpatch
+
+67890 - GHIJKL
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/VPatch/oldfile.txt b/Engine/bin/tools/nsis/app/Examples/VPatch/oldfile.txt
new file mode 100644
index 000000000..a378cf30f
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/VPatch/oldfile.txt
@@ -0,0 +1,6 @@
+*** THIS IS A TEST FILE FOR THE VPATCH EXAMPLE ***
+*** COMPILE EXAMPLE.NSI TO TEST ***
+
+oldfile - vpatch
+
+12345 - ABCDEF
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/VPatch/patch.pat b/Engine/bin/tools/nsis/app/Examples/VPatch/patch.pat
new file mode 100644
index 000000000..e1e5304ad
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Examples/VPatch/patch.pat differ
diff --git a/Engine/bin/tools/nsis/app/Examples/VersionInfo.nsi b/Engine/bin/tools/nsis/app/Examples/VersionInfo.nsi
new file mode 100644
index 000000000..1ff449d1e
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/VersionInfo.nsi
@@ -0,0 +1,29 @@
+; VersionInfo.nsi
+;
+; This script shows you how to add version information to an installer.
+; Windows shows this information on the Version tab of the File properties.
+
+;--------------------------------
+
+Name "Version Info"
+
+OutFile "VersionInfo.exe"
+
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
+;--------------------------------
+;Version Information
+
+ VIProductVersion "1.2.3.4"
+ VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Test Application"
+ VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "A test comment"
+ VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Fake company"
+ VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "Test Application is a trademark of Fake company"
+ VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "Copyright Fake company"
+ VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Test Application"
+ VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "1.2.3"
+
+;--------------------------------
+
+Section ""
+
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/WordFunc.ini b/Engine/bin/tools/nsis/app/Examples/WordFunc.ini
new file mode 100644
index 000000000..38c748d87
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/WordFunc.ini
@@ -0,0 +1,107 @@
+[Settings]
+NumFields=13
+NextButtonText=&Enter
+
+[Field 1]
+Type=Droplist
+Flags=NOTIFY
+State=1. WordFind (Find word by number)
+ListItems=1. WordFind (Find word by number)| (Delimiter exclude)| (Sum of words)| (Sum of delimiters)| (Find word number)| ( }} )| ( {} )| ( *} )|2. WordFind2X|3. WordReplace (Replace)| (Delete)| (Multiple-replace)|4. WordAdd (Add)| (Delete) |5. WordInsert|6. StrFilter (UpperCase)| (LowerCase)| (Filter)|7. VersionCompare|8. VersionConvert
+Left=44
+Right=190
+Top=10
+Bottom=191
+
+[Field 2]
+Type=Text
+State=C:\io.sys|C:\logo.sys|C:\Program Files|C:\WINDOWS
+Left=44
+Right=-10
+Top=30
+Bottom=41
+
+[Field 3]
+Type=Text
+State=|C:\
+Left=44
+Right=-10
+Top=46
+Bottom=59
+
+[Field 4]
+Type=Text
+Flags=DISABLED
+Left=44
+Right=-10
+Top=62
+Bottom=75
+
+[Field 5]
+Type=Text
+State=-4
+Left=44
+Right=-10
+Top=80
+Bottom=92
+
+[Field 6]
+Type=Text
+Left=10
+Right=-30
+Top=108
+Bottom=120
+
+[Field 7]
+Type=Text
+Left=-22
+Right=-10
+Top=108
+Bottom=120
+
+[Field 8]
+Type=Label
+Text=String
+Left=10
+Right=43
+Top=32
+Bottom=44
+
+[Field 9]
+Type=Label
+Text=Delimiter
+Left=10
+Right=43
+Top=48
+Bottom=60
+
+[Field 10]
+Type=Label
+Left=10
+Right=44
+Top=65
+Bottom=76
+
+[Field 11]
+Type=Label
+Text=Word #
+Left=10
+Right=43
+Top=81
+Bottom=94
+
+[Field 12]
+Type=Label
+Text=Result (Word):
+Left=10
+Right=236
+Top=97
+Bottom=110
+
+[Field 13]
+Type=Label
+Text=EL
+Left=-21
+Right=-10
+Top=97
+Bottom=110
+
diff --git a/Engine/bin/tools/nsis/app/Examples/WordFunc.nsi b/Engine/bin/tools/nsis/app/Examples/WordFunc.nsi
new file mode 100644
index 000000000..a0e9f9972
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/WordFunc.nsi
@@ -0,0 +1,535 @@
+;_____________________________________________________________________________
+;
+; Word Functions
+;_____________________________________________________________________________
+;
+; 2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
+
+Name "Word Functions"
+OutFile "WordFunc.exe"
+Caption "$(^Name)"
+XPStyle on
+RequestExecutionLevel user
+
+Var INI
+Var HWND
+Var STATE
+
+!include "WinMessages.nsh"
+!include "WordFunc.nsh"
+
+Page Custom ShowCustom LeaveCustom
+
+Function ShowCustom
+ InstallOptions::initDialog "$INI"
+ Pop $hwnd
+ InstallOptions::show
+ Pop $0
+FunctionEnd
+
+Function LeaveCustom
+ ReadINIStr $0 $INI "Settings" "State"
+ StrCmp $0 0 Enter
+
+ GetDlgItem $1 $HWND 1202
+ EnableWindow $1 1
+ GetDlgItem $1 $HWND 1203
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1204
+ ShowWindow $1 1
+ GetDlgItem $1 $HWND 1206
+ EnableWindow $1 1
+ GetDlgItem $1 $HWND 1205
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1206
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+
+ ReadINIStr $0 $INI "Field 1" "State"
+ StrCmp $0 "1. WordFind (Find word by number)" 0 WordFind2Send
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:-4"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Word):"
+ goto WordFindSend
+
+ WordFind2Send:
+ StrCmp $0 " (Delimiter exclude)" 0 WordFind3Send
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:E-2{"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Before{ or }after delimiter):"
+ goto WordFindSend
+
+ WordFind3Send:
+ StrCmp $0 " (Sum of words)" 0 WordFind4Send
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:#"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Option"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Sum of words):"
+ goto WordFindSend
+
+ WordFind4Send:
+ StrCmp $0 " (Sum of delimiters)" 0 WordFind5Send
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:|"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:E*"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Option"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Sum of delimiters):"
+ goto WordFindSend
+
+ WordFind5Send:
+ StrCmp $0 " (Find word number)" 0 WordFind6Send
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:/Program Files"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:/Word"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Word #):"
+ goto WordFindSend
+
+ WordFind6Send:
+ StrCmp $0 " ( }} )" 0 WordFind7Send
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:E+2}}"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Before{{ or }}after word):"
+ goto WordFindSend
+
+ WordFind7Send:
+ StrCmp $0 " ( {} )" 0 WordFind8Send
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:+2{}"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Without word):"
+ goto WordFindSend
+
+ WordFind8Send:
+ StrCmp $0 " ( *} )" 0 WordFind2XSend
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:E+2*}"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Before{* or *}after word with word):"
+ goto WordFindSend
+
+ WordFind2XSend:
+ StrCmp $0 "2. WordFind2X" 0 WordReplace1Send
+ GetDlgItem $1 $HWND 1201
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]"
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:[C:\"
+ GetDlgItem $1 $HWND 1203
+ EnableWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:];"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:E+2"
+ GetDlgItem $1 $HWND 1207
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:String"
+ GetDlgItem $1 $HWND 1208
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter1"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter2"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Word):"
+ abort
+
+ WordReplace1Send:
+ StrCmp $0 "3. WordReplace (Replace)" 0 WordReplace2Send
+ GetDlgItem $1 $HWND 1201
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\logo.sys|C:\WINDOWS"
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:SYS"
+ GetDlgItem $1 $HWND 1203
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:bmp"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:+2"
+ goto WordReplaceSend
+
+ WordReplace2Send:
+ StrCmp $0 " (Delete)" 0 WordReplace3Send
+ GetDlgItem $1 $HWND 1201
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\logo.sys|C:\WINDOWS"
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:SYS"
+ GetDlgItem $1 $HWND 1203
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:E+"
+ goto WordReplaceSend
+
+ WordReplace3Send:
+ StrCmp $0 " (Multiple-replace)" 0 WordAdd1Send
+ GetDlgItem $1 $HWND 1201
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys||||||C:\logo.sys|||C:\WINDOWS"
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:|"
+ GetDlgItem $1 $HWND 1203
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:|"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:+1*"
+ goto WordReplaceSend
+
+ WordAdd1Send:
+ StrCmp $0 "4. WordAdd (Add)" 0 WordAdd2Send
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:+C:\WINDOWS|C:\config.sys|C:\IO.SYS"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String1 + String2):"
+ goto WordAddSend
+
+ WordAdd2Send:
+ StrCmp $0 " (Delete) " 0 WordInsertSend
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:E-C:\WINDOWS|C:\config.sys|C:\IO.SYS"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String1 - String2):"
+ goto WordAddSend
+
+ WordInsertSend:
+ StrCmp $0 "5. WordInsert" 0 StrFilter1Send
+ GetDlgItem $1 $HWND 1201
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\WINDOWS"
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:|"
+ GetDlgItem $1 $HWND 1203
+ EnableWindow $1 1
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\logo.sys"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:E+2"
+ GetDlgItem $1 $HWND 1207
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:String"
+ GetDlgItem $1 $HWND 1208
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Word"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result:"
+ abort
+
+ StrFilter1Send:
+ StrCmp $0 "6. StrFilter (UpperCase)" 0 StrFilter2Send
+ GetDlgItem $1 $HWND 1201
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:123abc 456DEF 7890|%#"
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:+"
+ GetDlgItem $1 $HWND 1203
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String in uppercase):"
+ goto StrFilterSend
+
+ StrFilter2Send:
+ StrCmp $0 " (LowerCase)" 0 StrFilter3Send
+ GetDlgItem $1 $HWND 1201
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:123abc 456DEF 7890|%#"
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:-"
+ GetDlgItem $1 $HWND 1203
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:ef"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String in lowercase except EF):"
+ goto StrFilterSend
+
+ StrFilter3Send:
+ StrCmp $0 " (Filter)" 0 VersionCompareSend
+ GetDlgItem $1 $HWND 1201
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:123abc 456DEF 7890|%#"
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:+12"
+ GetDlgItem $1 $HWND 1203
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:b"
+ GetDlgItem $1 $HWND 1204
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:def"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String Digits + Letters + b - def):"
+ goto StrFilterSend
+
+ VersionCompareSend:
+ StrCmp $0 "7. VersionCompare" 0 VersionConvertSend
+ GetDlgItem $1 $HWND 1201
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:1.1.1.9"
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:1.1.1.01"
+ GetDlgItem $1 $HWND 1203
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1204
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1206
+ EnableWindow $1 0
+ GetDlgItem $1 $HWND 1207
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Version1"
+ GetDlgItem $1 $HWND 1208
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Version2"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (0-equal 1-newer 2-older):"
+ abort
+
+ VersionConvertSend:
+ StrCmp $0 "8. VersionConvert" 0 Abort
+ GetDlgItem $1 $HWND 1201
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:9.0c"
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1203
+ ShowWindow $1 0
+ GetDlgItem $1 $HWND 1204
+ ShowWindow $1 0
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1206
+ EnableWindow $1 0
+ GetDlgItem $1 $HWND 1207
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Version"
+ GetDlgItem $1 $HWND 1208
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:CharList"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (numerical version format):"
+ abort
+
+ Abort:
+ Abort
+
+ WordFindSend:
+ GetDlgItem $1 $HWND 1203
+ EnableWindow $1 0
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1201
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\logo.sys|C:\Program Files|C:\WINDOWS"
+ GetDlgItem $1 $HWND 1207
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:String"
+ GetDlgItem $1 $HWND 1208
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ Abort
+
+ WordReplaceSend:
+ GetDlgItem $1 $HWND 1203
+ EnableWindow $1 1
+ GetDlgItem $1 $HWND 1207
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:String"
+ GetDlgItem $1 $HWND 1208
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Replace it"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR: with"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #"
+ GetDlgItem $1 $HWND 1211
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Result:"
+ Abort
+
+ WordAddSend:
+ GetDlgItem $1 $HWND 1203
+ EnableWindow $1 0
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1201
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\logo.sys|C:\WINDOWS"
+ GetDlgItem $1 $HWND 1202
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:|"
+ GetDlgItem $1 $HWND 1207
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:String1"
+ GetDlgItem $1 $HWND 1208
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:String2"
+ Abort
+
+ StrFilterSend:
+ GetDlgItem $1 $HWND 1203
+ EnableWindow $1 1
+ GetDlgItem $1 $HWND 1206
+ EnableWindow $1 0
+ GetDlgItem $1 $HWND 1207
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:String"
+ GetDlgItem $1 $HWND 1208
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Filter"
+ GetDlgItem $1 $HWND 1209
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Include"
+ GetDlgItem $1 $HWND 1210
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:Exclude"
+ Abort
+
+;=Enter=
+ Enter:
+ StrCpy $0 ''
+ ReadINIStr $STATE $INI "Field 1" "State"
+ ReadINIStr $R1 $INI "Field 2" "State"
+ ReadINIStr $R2 $INI "Field 3" "State"
+ ReadINIStr $R3 $INI "Field 4" "State"
+ ReadINIStr $R4 $INI "Field 5" "State"
+
+ StrCmp $STATE "1. WordFind (Find word by number)" WordFind
+ StrCmp $STATE " (Delimiter exclude)" WordFind
+ StrCmp $STATE " (Find in string)" WordFind
+ StrCmp $STATE " (Sum of words)" WordFind
+ StrCmp $STATE " (Sum of delimiters)" WordFind
+ StrCmp $STATE " (Find word number)" WordFind
+ StrCmp $STATE " ( }} )" WordFind
+ StrCmp $STATE " ( {} )" WordFind
+ StrCmp $STATE " ( *} )" WordFind
+ StrCmp $STATE "2. WordFind2X" WordFind2X
+ StrCmp $STATE "3. WordReplace (Replace)" WordReplace
+ StrCmp $STATE " (Delete)" WordReplace
+ StrCmp $STATE " (Multiple-replace)" WordReplace
+ StrCmp $STATE "4. WordAdd (Add)" WordAdd
+ StrCmp $STATE " (Delete) " WordAdd
+ StrCmp $STATE "5. WordInsert" WordInsert
+ StrCmp $STATE "6. StrFilter (UpperCase)" StrFilter
+ StrCmp $STATE " (LowerCase)" StrFilter
+ StrCmp $STATE " (Filter)" StrFilter
+ StrCmp $STATE "7. VersionCompare" VersionCompare
+ StrCmp $STATE "8. VersionConvert" VersionConvert
+ Abort
+
+ WordFind:
+ ${WordFind} "$R1" "$R2" "$R4" $R0
+ IfErrors 0 Send
+ StrCpy $0 $R0
+ StrCmp $R0 3 0 +3
+ StrCpy $3 '"+1" "-1" "+1}" "+1{" "#" "/word"'
+ goto error3
+ StrCmp $R0 2 0 error1
+ StrCpy $R4 $R4 '' 1
+ StrCpy $1 $R4 1
+ StrCmp $1 / 0 error2
+ StrCpy $R4 $R4 '' 1
+ StrCpy $R0 '"$R4" no such word.'
+ goto Send
+
+ WordFind2X:
+ ${WordFind2X} "$R1" "$R2" "$R3" "$R4" $R0
+ IfErrors 0 Send
+ StrCpy $0 $R0
+ StrCmp $R0 3 0 +3
+ StrCpy $3 '"+1" "-1"'
+ goto error3
+ StrCmp $R0 2 +3
+ StrCpy $R0 '"$R2...$R3" no words found.'
+ goto Send
+ StrCpy $R4 $R4 '' 1
+ StrCpy $1 $R4 1
+ StrCmp $1 / 0 +2
+ StrCpy $R4 $R4 '' 1
+ StrCpy $R0 '"$R4" no such word.'
+ goto Send
+
+ WordReplace:
+ ${WordReplace} "$R1" "$R2" "$R3" "$R4" $R0
+ IfErrors 0 Send
+ StrCpy $0 $R0
+ StrCmp $R0 3 0 +3
+ StrCpy $3 '"+1" "+1*" "+" "+*" "{}"'
+ goto error3
+ StrCmp $R0 2 0 error1
+ StrCpy $R4 $R4 '' 1
+ goto error2
+
+ WordAdd:
+ ${WordAdd} "$R1" "$R2" "$R4" $R0
+ IfErrors 0 Send
+ StrCpy $0 $R0
+ StrCmp $R0 3 0 error1empty
+ StrCpy $3 '"+text" "-text"'
+ goto error3
+
+ WordInsert:
+ ${WordInsert} "$R1" "$R2" "$R3" "$R4" $R0
+ IfErrors 0 Send
+ StrCpy $0 $R0
+ StrCmp $R0 3 0 +3
+ StrCpy $3 '"+1" "-1"'
+ goto error3
+ StrCmp $R0 2 0 error1empty
+ StrCpy $R4 $R4 '' 1
+ goto error2
+
+ StrFilter:
+ ${StrFilter} "$R1" "$R2" "$R3" "$R4" $R0
+ IfErrors 0 Send
+ StrCpy $R0 'Syntax error'
+ goto Send
+
+ VersionCompare:
+ ${VersionCompare} "$R1" "$R2" $R0
+ goto Send
+
+ VersionConvert:
+ ${VersionConvert} "$R1" "$R2" $R0
+ goto Send
+
+ error3:
+ StrCpy $R0 '"$R4" syntax error ($3)'
+ goto Send
+ error2:
+ StrCpy $R0 '"$R4" no such word number'
+ goto Send
+ error1empty:
+ StrCpy $R0 '"$R2" delimiter is empty'
+ goto Send
+ error1:
+ StrCpy $R0 '"$R2" delimiter not found in string'
+ goto Send
+
+ Send:
+ GetDlgItem $1 $HWND 1205
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$R0"
+ GetDlgItem $1 $HWND 1206
+ SendMessage $1 ${WM_SETTEXT} 1 "STR:$0"
+ abort
+FunctionEnd
+
+Function .onInit
+ InitPluginsDir
+ GetTempFileName $INI $PLUGINSDIR
+ File /oname=$INI "WordFunc.ini"
+FunctionEnd
+
+Page instfiles
+
+Section "Empty"
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/WordFuncTest.nsi b/Engine/bin/tools/nsis/app/Examples/WordFuncTest.nsi
new file mode 100644
index 000000000..e9d1160bb
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/WordFuncTest.nsi
@@ -0,0 +1,610 @@
+;_____________________________________________________________________________
+;
+; Word Functions Test
+;_____________________________________________________________________________
+;
+; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
+
+Name "Word Functions Test"
+OutFile "WordFuncTest.exe"
+Caption "$(^Name)"
+ShowInstDetails show
+XPStyle on
+RequestExecutionLevel user
+
+Var FUNCTION
+Var OUT
+
+!include "WordFunc.nsh"
+
+;############### INSTALL ###############
+
+!define StackVerificationStart `!insertmacro StackVerificationStart`
+!macro StackVerificationStart _FUNCTION
+ StrCpy $FUNCTION ${_FUNCTION}
+ Call StackVerificationStart
+!macroend
+
+!define StackVerificationEnd `!insertmacro StackVerificationEnd`
+!macro StackVerificationEnd
+ Call StackVerificationEnd
+!macroend
+
+Function StackVerificationStart
+ StrCpy $0 !0
+ StrCpy $1 !1
+ StrCpy $2 !2
+ StrCpy $3 !3
+ StrCpy $4 !4
+ StrCpy $5 !5
+ StrCpy $6 !6
+ StrCpy $7 !7
+ StrCpy $8 !8
+ StrCpy $9 !9
+ StrCpy $R0 !R0
+ StrCpy $R1 !R1
+ StrCpy $R2 !R2
+ StrCpy $R3 !R3
+ StrCpy $R4 !R4
+ StrCpy $R5 !R5
+ StrCpy $R6 !R6
+ StrCpy $R7 !R7
+ StrCpy $R8 !R8
+ StrCpy $R9 !R9
+FunctionEnd
+
+Function StackVerificationEnd
+ IfErrors +3
+ DetailPrint 'PASSED $FUNCTION no errors'
+ goto +2
+ DetailPrint 'FAILED $FUNCTION error'
+
+ StrCmp $0 '!0' 0 error
+ StrCmp $1 '!1' 0 error
+ StrCmp $2 '!2' 0 error
+ StrCmp $3 '!3' 0 error
+ StrCmp $4 '!4' 0 error
+ StrCmp $5 '!5' 0 error
+ StrCmp $6 '!6' 0 error
+ StrCmp $7 '!7' 0 error
+ StrCmp $8 '!8' 0 error
+ StrCmp $9 '!9' 0 error
+ StrCmp $R0 '!R0' 0 error
+ StrCmp $R1 '!R1' 0 error
+ StrCmp $R2 '!R2' 0 error
+ StrCmp $R3 '!R3' 0 error
+ StrCmp $R4 '!R4' 0 error
+ StrCmp $R5 '!R5' 0 error
+ StrCmp $R6 '!R6' 0 error
+ StrCmp $R7 '!R7' 0 error
+ StrCmp $R8 '!R8' 0 error
+ StrCmp $R9 '!R9' 0 error
+ DetailPrint 'PASSED $FUNCTION stack'
+ goto end
+
+ error:
+ DetailPrint 'FAILED $FUNCTION stack'
+; MessageBox MB_OKCANCEL '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}' IDOK +2
+; quit
+
+ end:
+FunctionEnd
+
+
+
+Section WordFind
+ ${StackVerificationStart} WordFind
+
+ ${WordFind} '||io.sys|||Program Files|||WINDOWS' '||' '-02' $OUT
+ StrCmp $OUT '|Program Files' 0 error
+
+ ${WordFind} '||io.sys||||Program Files||||WINDOWS' '||' '-2' $OUT
+ StrCmp $OUT 'Program Files' 0 error
+
+ ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '-2}' $OUT
+ StrCmp $OUT '|logo.sys|||WINDOWS' 0 error
+
+ ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '#' $OUT
+ StrCmp $OUT '3' 0 error
+
+ ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '*' $OUT
+ StrCmp $OUT '2' 0 error
+
+ ${WordFind} 'C:\io.sys|||Program Files|||WINDOWS' '||' '/|Program Files' $OUT
+ StrCmp $OUT '2' 0 error
+
+ ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '+2}}' $OUT
+ StrCmp $OUT '|||WINDOWS' 0 error
+
+ ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '+2{}' $OUT
+ StrCmp $OUT 'C:\io.sys|||WINDOWS' 0 error
+
+ ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '+2*}' $OUT
+ StrCmp $OUT '|logo.sys|||WINDOWS' 0 error
+
+ ${WordFind} 'C:\\Program Files\\NSIS\\NSIS.chm' '\' '-2{*' $OUT
+ StrCmp $OUT 'C:\\Program Files\\NSIS' 0 error
+
+ ${WordFind} 'C:\io.sys|||Program Files|||WINDOWS|||' '||' '-1' $OUT
+ StrCmp $OUT '|' 0 error
+
+ ${WordFind} '||C:\io.sys|||logo.sys|||WINDOWS||' '||' '-1}' $OUT
+ StrCmp $OUT '' 0 error
+
+ ${WordFind} '||C:\io.sys|||logo.sys|||WINDOWS||' '||' '+1{' $OUT
+ StrCmp $OUT '' 0 error
+
+ ${WordFind} 'C:\io.sys|||logo.sys' '_' 'E+1' $OUT
+ IfErrors 0 error
+ StrCmp $OUT 1 0 error
+
+ ${WordFind} 'C:\io.sys|||logo.sys|||' '\' 'E+3' $OUT
+ IfErrors 0 error
+ StrCmp $OUT 2 0 error
+
+ ${WordFind} 'C:\io.sys|||logo.sys' '\' 'E1' $OUT
+ IfErrors 0 error
+ StrCmp $OUT 3 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WordFindS
+ ${StackVerificationStart} WordFindS
+
+ ${WordFindS} 'C:\io.sys|||Program Files|||WINDOWS' '||' '/|PROGRAM FILES' $OUT
+ StrCmp $OUT 'C:\io.sys|||Program Files|||WINDOWS' 0 error
+
+ ${WordFindS} 'C:\io.sys|||Program Files|||WINDOWS' '||' '/|Program Files' $OUT
+ StrCmp $OUT '2' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WordFind2X
+ ${StackVerificationStart} WordFind2X
+
+ ${WordFind2X} '[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]' '[C:\' '];' '+2' $OUT
+ StrCmp $OUT 'logo.sys' 0 error
+
+ ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1' $OUT
+ StrCmp $OUT 'logo' 0 error
+
+ ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1{{' $OUT
+ StrCmp $OUT 'C:\WINDOWS C:\io.sys C:' 0 error
+
+ ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1{}' $OUT
+ StrCmp $OUT 'C:\WINDOWS C:\io.sys C:sys' 0 error
+
+ ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1{*' $OUT
+ StrCmp $OUT 'C:\WINDOWS C:\io.sys C:\logo.' 0 error
+
+ ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '/logo' $OUT
+ StrCmp $OUT '2' 0 error
+
+ ${WordFind2X} '||a||b||c' '||' '||' 'E+1' $OUT
+ StrCmp $OUT 'a' 0 error
+
+ ${WordFind2X} '[io.sys];[C:\logo.sys]' '\' '];' 'E+1' $OUT
+ IfErrors 0 error
+ StrCmp $OUT 1 0 error
+
+ ${WordFind2X} '[io.sys];[C:\logo.sys]' '[' '];' 'E+2' $OUT
+ IfErrors 0 error
+ StrCmp $OUT 2 0 error
+
+ ${WordFind2X} '[io.sys];[C:\logo.sys]' '\' '];' 'E2' $OUT
+ IfErrors 0 error
+ StrCmp $OUT 3 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WordFind2XS
+ ${StackVerificationStart} WordFind2XS
+
+ ${WordFind2XS} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '/LOGO' $OUT
+ StrCmp $OUT 'C:\WINDOWS C:\io.sys C:\logo.sys' 0 error
+
+ ${WordFind2XS} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '/logo' $OUT
+ StrCmp $OUT '2' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WordFind3X
+ ${StackVerificationStart} WordFind3X
+
+ ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT
+ StrCmp $OUT '1.AAB' 0 error
+
+ ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1' $OUT
+ StrCmp $OUT '2.BAA' 0 error
+
+ ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{{' $OUT
+ StrCmp $OUT '[1.AAB];' 0 error
+
+ ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{}' $OUT
+ StrCmp $OUT '[1.AAB];[3.BBB];' 0 error
+
+ ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{*' $OUT
+ StrCmp $OUT '[1.AAB];[2.BAA];' 0 error
+
+ ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.BAA' $OUT
+ StrCmp $OUT '2' 0 error
+
+ ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'XX' '];' 'E+1' $OUT
+ IfErrors 0 error
+ StrCmp $OUT '1' 0 error
+
+ ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' 'E+3' $OUT
+ IfErrors 0 error
+ StrCmp $OUT '2' 0 error
+
+ ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' 'E3' $OUT
+ IfErrors 0 error
+ StrCmp $OUT '3' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WordFind3XS
+ ${StackVerificationStart} WordFind3XS
+
+ ${WordFind3XS} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.baa' $OUT
+ StrCmp $OUT '[1.AAB];[2.BAA];[3.BBB];' 0 error
+
+ ${WordFind3XS} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.BAA' $OUT
+ StrCmp $OUT '2' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WordReplace
+ ${StackVerificationStart} WordReplace
+
+ ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT
+ StrCmp $OUT 'C:\io.sys C:\logo.bmp C:\WINDOWS' 0 error
+
+ ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' '' '+' $OUT
+ StrCmp $OUT 'C:\io. C:\logo. C:\WINDOWS' 0 error
+
+ ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'C:\io.sys' '' '+' $OUT
+ StrCmp $OUT ' C:\logo.sys C:\WINDOWS' 0 error
+
+ ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' ' ' ' ' '+1*' $OUT
+ StrCmp $OUT 'C:\io.sys C:\logo.sys C:\WINDOWS' 0 error
+
+ ${WordReplace} 'C:\io.sys C:\logo.sysSYSsys C:\WINDOWS' 'sys' 'bmp' '+*' $OUT
+ StrCmp $OUT 'C:\io.bmp C:\logo.bmp C:\WINDOWS' 0 error
+
+ ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{' $OUT
+ StrCmp $OUT '||C:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 0 error
+
+ ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '}' $OUT
+ StrCmp $OUT 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWS|||' 0 error
+
+ ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{}' $OUT
+ StrCmp $OUT '||C:\io.sys C:\logo.sys C:\WINDOWS|||' 0 error
+
+ ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{*' $OUT
+ StrCmp $OUT '|C:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 0 error
+
+ ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '}*' $OUT
+ StrCmp $OUT 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWS|' 0 error
+
+ ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{}*' $OUT
+ StrCmp $OUT '|C:\io.sys C:\logo.sys C:\WINDOWS|' 0 error
+
+ ${WordReplace} 'sysSYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{}*' $OUT
+ StrCmp $OUT '|C:\io.sys C:\logo.sys C:\WINDOWS|' 0 error
+
+ ${WordReplace} 'C:\io.sys C:\logo.sys' '#sys' '|sys|' 'E+1' $OUT
+ IfErrors 0 error
+ StrCmp $OUT '1' 0 error
+
+ ${WordReplace} 'C:\io.sys C:\logo.sys' '.sys' '|sys|' 'E+3' $OUT
+ IfErrors 0 error
+ StrCmp $OUT '2' 0 error
+
+ ${WordReplace} 'C:\io.sys C:\logo.sys' '.sys' '|sys|' 'E3' $OUT
+ IfErrors 0 error
+ StrCmp $OUT '3' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WordReplaceS
+ ${StackVerificationStart} WordReplaceS
+
+ ${WordReplaceS} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT
+ StrCmp $OUT 'C:\io.sys C:\logo.sys C:\WINDOWS' 0 error
+
+ ${WordReplaceS} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'sys' 'bmp' '+2' $OUT
+ StrCmp $OUT 'C:\io.sys C:\logo.bmp C:\WINDOWS' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WordAdd
+ ${StackVerificationStart} WordAdd
+
+ ${WordAdd} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT
+ StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\config.sys' 0 error
+
+ ${WordAdd} 'C:\io.sys C:\logo.sys C:\WINDOWS' ' ' '-C:\WINDOWS C:\config.sys C:\IO.SYS' $OUT
+ StrCmp $OUT 'C:\logo.sys' 0 error
+
+ ${WordAdd} 'C:\io.sys' ' ' '+C:\WINDOWS C:\config.sys C:\IO.SYS' $OUT
+ StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\config.sys' 0 error
+
+ ${WordAdd} 'C:\io.sys C:\logo.sys C:\WINDOWS' ' ' '-C:\WINDOWS' $OUT
+ StrCmp $OUT 'C:\io.sys C:\logo.sys' 0 error
+
+ ${WordAdd} 'C:\io.sys C:\logo.sys' ' ' '+C:\logo.sys' $OUT
+ StrCmp $OUT 'C:\io.sys C:\logo.sys' 0 error
+
+ ${WordAdd} 'C:\io.sys C:\logo.sys' ' ' 'E-' $OUT
+ StrCmp $OUT 'C:\io.sys C:\logo.sys' 0 error
+ IfErrors error
+
+ ${WordAdd} 'C:\io.sys C:\logo.sys' '' 'E-C:\logo.sys' $OUT
+ IfErrors 0 error
+ StrCmp $OUT '1' 0 error
+
+ ${WordAdd} 'C:\io.sys C:\logo.sys' '' 'EC:\logo.sys' $OUT
+ IfErrors 0 error
+ StrCmp $OUT '3' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WordAddS
+ ${StackVerificationStart} WordAddS
+
+ ${WordAddS} 'C:\io.sys C:\WINDOWS' ' ' '+C:\windows C:\config.sys' $OUT
+ StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\windows C:\config.sys' 0 error
+
+ ${WordAddS} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT
+ StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\config.sys' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WordInsert
+ ${StackVerificationStart} WordInsert
+
+ ${WordInsert} 'C:\io.sys C:\WINDOWS' ' ' 'C:\logo.sys' '-2' $OUT
+ StrCmp $OUT 'C:\io.sys C:\logo.sys C:\WINDOWS' 0 error
+
+ ${WordInsert} 'C:\io.sys' ' ' 'C:\WINDOWS' '+2' $OUT
+ StrCmp $OUT 'C:\io.sys C:\WINDOWS' 0 error
+
+ ${WordInsert} '' ' ' 'C:\WINDOWS' '+1' $OUT
+ StrCmp $OUT 'C:\WINDOWS ' 0 error
+
+ ${WordInsert} 'C:\io.sys C:\logo.sys' '' 'C:\logo.sys' 'E+1' $OUT
+ IfErrors 0 error
+ StrCmp $OUT '1' 0 error
+
+ ${WordInsert} 'C:\io.sys C:\logo.sys' ' ' 'C:\logo.sys' 'E+4' $OUT
+ IfErrors 0 error
+ StrCmp $OUT '2' 0 error
+
+ ${WordInsert} 'C:\io.sys C:\logo.sys' '' 'C:\logo.sys' 'E1' $OUT
+ IfErrors 0 error
+ StrCmp $OUT '3' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WordInsertS
+ ${StackVerificationStart} WordInsertS
+
+ ${WordInsertS} 'C:\io.sys x C:\logo.sys' ' X ' 'C:\NTLDR' '+2' $OUT
+ StrCmp $OUT 'C:\io.sys x C:\logo.sys X C:\NTLDR' 0 error
+
+ ${WordInsertS} 'C:\io.sys x C:\logo.sys' ' x ' 'C:\NTLDR' '+2' $OUT
+ StrCmp $OUT 'C:\io.sys x C:\NTLDR x C:\logo.sys' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section StrFilter
+ ${StackVerificationStart} StrFilter
+
+ ${StrFilter} '123abc 456DEF 7890|%#' '+' '' '' $OUT
+ IfErrors error
+ StrCmp $OUT '123ABC 456DEF 7890|%#' 0 error
+
+ ${StrFilter} '123abc 456DEF 7890|%#' '-' 'ef' '' $OUT
+ IfErrors error
+ StrCmp $OUT '123abc 456dEF 7890|%#' 0 error
+
+ ${StrFilter} '123abc 456DEF 7890|%#' '2' '|%' '' $OUT
+ IfErrors error
+ StrCmp $OUT 'abcDEF|%' 0 error
+
+ ${StrFilter} '123abc 456DEF 7890|%#' '13' 'af' '4590' $OUT
+ IfErrors error
+ StrCmp $OUT '123a 6F 78|%#' 0 error
+
+ ${StrFilter} '123abc 456DEF 7890|%#' '+12' 'b' 'def' $OUT
+ IfErrors error
+ StrCmp $OUT '123AbC4567890' 0 error
+
+ ${StrFilter} '123abc 456DEF 7890|%#' '+12' 'b' 'def' $OUT
+ IfErrors error
+ StrCmp $OUT '123AbC4567890' 0 error
+
+ ${StrFilter} '123abc 456DEF 7890|%#' '123' 'b' 'def' $OUT
+ IfErrors 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section StrFilterS
+ ${StackVerificationStart} StrFilterS
+
+ ${StrFilterS} '123abc 456DEF 7890|%#' '13' 'af' '4590' $OUT
+ IfErrors error
+ StrCmp $OUT '123a 6 78|%#' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section VersionCompare
+ ${StackVerificationStart} VersionCompare
+
+ ${VersionCompare} '1.1.1.9' '1.1.1.01' $OUT
+ StrCmp $OUT '1' 0 error
+
+ ${VersionCompare} '1.1.1.1' '1.1.1.10' $OUT
+ StrCmp $OUT '2' 0 error
+
+ ${VersionCompare} '91.1.1.1' '101.1.1.9' $OUT
+ StrCmp $OUT '2' 0 error
+
+ ${VersionCompare} '1.1.1.1' '1.1.1.1' $OUT
+ StrCmp $OUT '0' 0 error
+
+ ${VersionCompare} '1.1.1.9' '1.1.1.10' $OUT
+ StrCmp $OUT '2' 0 error
+
+ ${VersionCompare} '1.1.1.0' '1.1.1' $OUT
+ StrCmp $OUT '0' 0 error
+
+ ${VersionCompare} '1.1.0.0' '1.1' $OUT
+ StrCmp $OUT '0' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section VersionConvert
+ ${StackVerificationStart} VersionConvert
+
+ ${VersionConvert} '9.0a' '' $OUT
+ StrCmp $OUT '9.0.01' 0 error
+
+ ${VersionConvert} '9.0c' '' $OUT
+ StrCmp $OUT '9.0.03' 0 error
+
+ ${VersionConvert} '0.15c-9m' '' $OUT
+ StrCmp $OUT '0.15.03.9.13' 0 error
+
+ ${VersionConvert} '0.15c+' 'abcdefghijklmnopqrstuvwxyz+' $OUT
+ StrCmp $OUT '0.15.0327' 0 error
+
+ ${VersionConvert} '0.0xa12.x.ax|.|.|x|a|.3|a.4.||5.|' '' $OUT
+ StrCmp $OUT '0.0.2401.12.24.0124.24.01.3.01.4.5' 0 error
+
+ goto +2
+ error:
+ SetErrors
+
+ ${StackVerificationEnd}
+SectionEnd
+
+
+Section WriteUninstaller
+ goto +2
+ WriteUninstaller '$EXEDIR\un.WordFuncTest.exe'
+SectionEnd
+
+
+
+;############### UNINSTALL ###############
+
+Section un.Uninstall
+ ${WordFind} 'C:\io.sys C:\Program Files C:\WINDOWS' ' C:\' '-02' $OUT
+ ${WordFindS} 'C:\io.sys C:\Program Files C:\WINDOWS' ' C:\' '-02' $OUT
+ ${WordFind2X} '[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]' '[C:\' '];' '+2' $OUT
+ ${WordFind2XS} '[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]' '[C:\' '];' '+2' $OUT
+ ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT
+ ${WordFind3XS} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT
+ ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT
+ ${WordReplaceS} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT
+ ${WordAdd} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT
+ ${WordAddS} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT
+ ${WordInsert} 'C:\io.sys C:\WINDOWS' ' ' 'C:\logo.sys' '-2' $OUT
+ ${WordInsertS} 'C:\io.sys C:\WINDOWS' ' ' 'C:\logo.sys' '-2' $OUT
+ ${StrFilter} '123abc 456DEF 7890|%#' '+' '' '' $OUT
+ ${StrFilterS} '123abc 456DEF 7890|%#' '+' '' '' $OUT
+ ${VersionCompare} '1.1.1.9' '1.1.1.01' $OUT
+ ${VersionConvert} '9.0a' '' $OUT
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/bigtest.nsi b/Engine/bin/tools/nsis/app/Examples/bigtest.nsi
new file mode 100644
index 000000000..62f5211cf
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/bigtest.nsi
@@ -0,0 +1,308 @@
+; bigtest.nsi
+;
+; This script attempts to test most of the functionality of the NSIS exehead.
+
+;--------------------------------
+
+!ifdef HAVE_UPX
+!packhdr tmp.dat "upx\upx -9 tmp.dat"
+!endif
+
+!ifdef NOCOMPRESS
+SetCompress off
+!endif
+
+;--------------------------------
+
+Name "BigNSISTest"
+Caption "NSIS Big Test"
+Icon "${NSISDIR}\Contrib\Graphics\Icons\nsis1-install.ico"
+OutFile "bigtest.exe"
+
+SetDateSave on
+SetDatablockOptimize on
+CRCCheck on
+SilentInstall normal
+BGGradient 000000 800000 FFFFFF
+InstallColors FF8080 000030
+XPStyle on
+
+InstallDir "$PROGRAMFILES\NSISTest\BigNSISTest"
+InstallDirRegKey HKLM "Software\NSISTest\BigNSISTest" "Install_Dir"
+
+CheckBitmap "${NSISDIR}\Contrib\Graphics\Checks\classic-cross.bmp"
+
+LicenseText "A test text, make sure it's all there"
+LicenseData "bigtest.nsi"
+
+RequestExecutionLevel admin
+
+;--------------------------------
+
+Page license
+Page components
+Page directory
+Page instfiles
+
+UninstPage uninstConfirm
+UninstPage instfiles
+
+;--------------------------------
+
+!ifndef NOINSTTYPES ; only if not defined
+ InstType "Most"
+ InstType "Full"
+ InstType "More"
+ InstType "Base"
+ ;InstType /NOCUSTOM
+ ;InstType /COMPONENTSONLYONCUSTOM
+!endif
+
+AutoCloseWindow false
+ShowInstDetails show
+
+;--------------------------------
+
+Section "" ; empty string makes it hidden, so would starting with -
+
+ ; write reg info
+ StrCpy $1 "POOOOOOOOOOOP"
+ DetailPrint "I like to be able to see what is going on (debug) $1"
+ WriteRegStr HKLM SOFTWARE\NSISTest\BigNSISTest "Install_Dir" "$INSTDIR"
+
+ ; write uninstall strings
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest" "DisplayName" "BigNSISTest (remove only)"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest" "UninstallString" '"$INSTDIR\bt-uninst.exe"'
+
+ SetOutPath $INSTDIR
+ File /a "silent.nsi"
+ CreateDirectory "$INSTDIR\MyProjectFamily\MyProject" ; 2 recursively create a directory for fun.
+ WriteUninstaller "bt-uninst.exe"
+
+ Nop ; for fun
+
+SectionEnd
+
+Section "TempTest"
+
+SectionIn 1 2 3
+ Start: MessageBox MB_OK "Start:"
+
+ MessageBox MB_YESNO "Goto MyLabel" IDYES MyLabel
+
+ MessageBox MB_OK "Right before MyLabel:"
+
+ MyLabel: MessageBox MB_OK "MyLabel:"
+
+ MessageBox MB_OK "Right after MyLabel:"
+
+ MessageBox MB_YESNO "Goto Start:?" IDYES Start
+
+SectionEnd
+
+SectionGroup /e SectionGroup1
+
+Section "Test Registry/INI functions"
+
+SectionIn 1 4 3
+
+ WriteRegStr HKLM SOFTWARE\NSISTest\BigNSISTest "StrTest_INSTDIR" "$INSTDIR"
+ WriteRegDword HKLM SOFTWARE\NSISTest\BigNSISTest "DwordTest_0xDEADBEEF" 0xdeadbeef
+ WriteRegDword HKLM SOFTWARE\NSISTest\BigNSISTest "DwordTest_123456" 123456
+ WriteRegDword HKLM SOFTWARE\NSISTest\BigNSISTest "DwordTest_0123" 0123
+ WriteRegBin HKLM SOFTWARE\NSISTest\BigNSISTest "BinTest_deadbeef01f00dbeef" "DEADBEEF01F00DBEEF"
+ StrCpy $8 "$SYSDIR\IniTest"
+ WriteINIStr "$INSTDIR\test.ini" "MySection" "Value1" $8
+ WriteINIStr "$INSTDIR\test.ini" "MySectionIni" "Value1" $8
+ WriteINIStr "$INSTDIR\test.ini" "MySectionIni" "Value2" $8
+ WriteINIStr "$INSTDIR\test.ini" "IniOn" "Value1" $8
+
+ Call MyFunctionTest
+
+ DeleteINIStr "$INSTDIR\test.ini" "IniOn" "Value1"
+ DeleteINISec "$INSTDIR\test.ini" "MySectionIni"
+
+ ReadINIStr $1 "$INSTDIR\test.ini" "MySectionIni" "Value1"
+ StrCmp $1 "" INIDelSuccess
+ MessageBox MB_OK "DeleteINISec failed"
+ INIDelSuccess:
+
+ ClearErrors
+ ReadRegStr $1 HKCR "software\microsoft" xyz_cc_does_not_exist
+ IfErrors 0 NoError
+ MessageBox MB_OK "could not read from HKCR\software\microsoft\xyz_cc_does_not_exist"
+ Goto ErrorYay
+ NoError:
+ MessageBox MB_OK "read '$1' from HKCR\software\microsoft\xyz_cc_does_not_exist"
+ ErrorYay:
+
+SectionEnd
+
+Section "Test CreateShortCut"
+
+ SectionIn 1 2 3
+
+ Call CSCTest
+
+SectionEnd
+
+SectionGroup Group2
+
+Section "Test Branching"
+
+ BeginTestSection:
+ SectionIn 1 2 3
+
+ SetOutPath $INSTDIR
+
+ IfFileExists "$INSTDIR\LogicLib.nsi" 0 BranchTest69
+
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to overwrite $INSTDIR\LogicLib.nsi?" IDNO NoOverwrite ; skipped if file doesn't exist
+
+ BranchTest69:
+
+ SetOverwrite ifnewer ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS
+
+ NoOverwrite:
+
+ File "LogicLib.nsi" ; skipped if answered no
+ SetOverwrite try ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS
+
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to skip the rest of this section?" IDYES EndTestBranch
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to go back to the beginning of this section?" IDYES BeginTestSection
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to hide the installer and wait five seconds?" IDNO NoHide
+
+ HideWindow
+ Sleep 5000
+ BringToFront
+
+ NoHide:
+
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to call the function 5 times?" IDNO NoRecurse
+
+ StrCpy $1 "x"
+
+ LoopTest:
+
+ Call myfunc
+ StrCpy $1 "x$1"
+ StrCmp $1 "xxxxxx" 0 LoopTest
+
+ NoRecurse:
+
+ EndTestBranch:
+
+SectionEnd
+
+SectionGroupEnd
+
+Section "Test CopyFiles"
+
+ SectionIn 1 2 3
+
+ SetOutPath $INSTDIR\cpdest
+ CopyFiles "$WINDIR\*.ini" "$INSTDIR\cpdest" 0
+
+SectionEnd
+
+SectionGroupEnd
+
+Section "Test Exec functions" TESTIDX
+
+ SectionIn 1 2 3
+
+ SearchPath $1 notepad.exe
+
+ MessageBox MB_OK "notepad.exe=$1"
+ Exec '"$1"'
+ ExecShell "open" '"$INSTDIR"'
+ Sleep 500
+ BringToFront
+
+SectionEnd
+
+Section "Test ActiveX control registration"
+
+ SectionIn 2
+
+ UnRegDLL "$SYSDIR\spin32.ocx"
+ Sleep 1000
+ RegDLL "$SYSDIR\spin32.ocx"
+ Sleep 1000
+
+SectionEnd
+
+;--------------------------------
+
+Function "CSCTest"
+
+ CreateDirectory "$SMPROGRAMS\Big NSIS Test"
+ SetOutPath $INSTDIR ; for working directory
+ CreateShortCut "$SMPROGRAMS\Big NSIS Test\Uninstall BIG NSIS Test.lnk" "$INSTDIR\bt-uninst.exe" ; use defaults for parameters, icon, etc.
+ ; this one will use notepad's icon, start it minimized, and give it a hotkey (of Ctrl+Shift+Q)
+ CreateShortCut "$SMPROGRAMS\Big NSIS Test\silent.nsi.lnk" "$INSTDIR\silent.nsi" "" "$WINDIR\notepad.exe" 0 SW_SHOWMINIMIZED CONTROL|SHIFT|Q
+ CreateShortCut "$SMPROGRAMS\Big NSIS Test\TheDir.lnk" "$INSTDIR\" "" "" 0 SW_SHOWMAXIMIZED CONTROL|SHIFT|Z
+
+FunctionEnd
+
+Function myfunc
+
+ StrCpy $2 "MyTestVar=$1"
+ MessageBox MB_OK "myfunc: $2"
+
+FunctionEnd
+
+Function MyFunctionTest
+
+ ReadINIStr $1 "$INSTDIR\test.ini" "MySectionIni" "Value1"
+ StrCmp $1 $8 NoFailedMsg
+ MessageBox MB_OK "WriteINIStr failed"
+
+ NoFailedMsg:
+
+FunctionEnd
+
+Function .onSelChange
+
+ SectionGetText ${TESTIDX} $0
+ StrCmp $0 "" e
+ SectionSetText ${TESTIDX} ""
+ Goto e2
+e:
+ SectionSetText ${TESTIDX} "TextInSection"
+e2:
+
+FunctionEnd
+
+;--------------------------------
+
+; Uninstaller
+
+UninstallText "This will uninstall example2. Hit next to continue."
+UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\nsis1-uninstall.ico"
+
+Section "Uninstall"
+
+ DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest"
+ DeleteRegKey HKLM "SOFTWARE\NSISTest\BigNSISTest"
+ Delete "$INSTDIR\silent.nsi"
+ Delete "$INSTDIR\LogicLib.nsi"
+ Delete "$INSTDIR\bt-uninst.exe"
+ Delete "$INSTDIR\test.ini"
+ Delete "$SMPROGRAMS\Big NSIS Test\*.*"
+ RMDir "$SMPROGRAMS\BiG NSIS Test"
+
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to remove the directory $INSTDIR\cpdest?" IDNO NoDelete
+ Delete "$INSTDIR\cpdest\*.*"
+ RMDir "$INSTDIR\cpdest" ; skipped if no
+ NoDelete:
+
+ RMDir "$INSTDIR\MyProjectFamily\MyProject"
+ RMDir "$INSTDIR\MyProjectFamily"
+ RMDir "$INSTDIR"
+
+ IfFileExists "$INSTDIR" 0 NoErrorMsg
+ MessageBox MB_OK "Note: $INSTDIR could not be removed!" IDOK 0 ; skipped if file doesn't exist
+ NoErrorMsg:
+
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/example1.nsi b/Engine/bin/tools/nsis/app/Examples/example1.nsi
new file mode 100644
index 000000000..fd549c07e
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/example1.nsi
@@ -0,0 +1,40 @@
+; example1.nsi
+;
+; This script is perhaps one of the simplest NSIs you can make. All of the
+; optional settings are left to their default settings. The installer simply
+; prompts the user asking them where to install, and drops a copy of example1.nsi
+; there.
+
+;--------------------------------
+
+; The name of the installer
+Name "Example1"
+
+; The file to write
+OutFile "example1.exe"
+
+; The default installation directory
+InstallDir $DESKTOP\Example1
+
+; Request application privileges for Windows Vista
+RequestExecutionLevel user
+
+;--------------------------------
+
+; Pages
+
+Page directory
+Page instfiles
+
+;--------------------------------
+
+; The stuff to install
+Section "" ;No components page, name is not important
+
+ ; Set output path to the installation directory.
+ SetOutPath $INSTDIR
+
+ ; Put file there
+ File example1.nsi
+
+SectionEnd ; end the section
diff --git a/Engine/bin/tools/nsis/app/Examples/example2.nsi b/Engine/bin/tools/nsis/app/Examples/example2.nsi
new file mode 100644
index 000000000..6798db1bc
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/example2.nsi
@@ -0,0 +1,92 @@
+; example2.nsi
+;
+; This script is based on example1.nsi, but it remember the directory,
+; has uninstall support and (optionally) installs start menu shortcuts.
+;
+; It will install example2.nsi into a directory that the user selects,
+
+;--------------------------------
+
+; The name of the installer
+Name "Example2"
+
+; The file to write
+OutFile "example2.exe"
+
+; The default installation directory
+InstallDir $PROGRAMFILES\Example2
+
+; Registry key to check for directory (so if you install again, it will
+; overwrite the old one automatically)
+InstallDirRegKey HKLM "Software\NSIS_Example2" "Install_Dir"
+
+; Request application privileges for Windows Vista
+RequestExecutionLevel admin
+
+;--------------------------------
+
+; Pages
+
+Page components
+Page directory
+Page instfiles
+
+UninstPage uninstConfirm
+UninstPage instfiles
+
+;--------------------------------
+
+; The stuff to install
+Section "Example2 (required)"
+
+ SectionIn RO
+
+ ; Set output path to the installation directory.
+ SetOutPath $INSTDIR
+
+ ; Put file there
+ File "example2.nsi"
+
+ ; Write the installation path into the registry
+ WriteRegStr HKLM SOFTWARE\NSIS_Example2 "Install_Dir" "$INSTDIR"
+
+ ; Write the uninstall keys for Windows
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "DisplayName" "NSIS Example2"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "UninstallString" '"$INSTDIR\uninstall.exe"'
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoModify" 1
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoRepair" 1
+ WriteUninstaller "uninstall.exe"
+
+SectionEnd
+
+; Optional section (can be disabled by the user)
+Section "Start Menu Shortcuts"
+
+ CreateDirectory "$SMPROGRAMS\Example2"
+ CreateShortCut "$SMPROGRAMS\Example2\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
+ CreateShortCut "$SMPROGRAMS\Example2\Example2 (MakeNSISW).lnk" "$INSTDIR\example2.nsi" "" "$INSTDIR\example2.nsi" 0
+
+SectionEnd
+
+;--------------------------------
+
+; Uninstaller
+
+Section "Uninstall"
+
+ ; Remove registry keys
+ DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2"
+ DeleteRegKey HKLM SOFTWARE\NSIS_Example2
+
+ ; Remove files and uninstaller
+ Delete $INSTDIR\example2.nsi
+ Delete $INSTDIR\uninstall.exe
+
+ ; Remove shortcuts, if any
+ Delete "$SMPROGRAMS\Example2\*.*"
+
+ ; Remove directories used
+ RMDir "$SMPROGRAMS\Example2"
+ RMDir "$INSTDIR"
+
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/gfx.nsi b/Engine/bin/tools/nsis/app/Examples/gfx.nsi
new file mode 100644
index 000000000..7150eafc0
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/gfx.nsi
@@ -0,0 +1,123 @@
+; gfx.nsi
+;
+; This script shows some examples of using all of the new
+; graphic related additions introduced in NSIS 2
+;
+; Written by Amir Szkeley 22nd July 2002
+
+;--------------------------------
+
+!macro BIMAGE IMAGE PARMS
+ Push $0
+ GetTempFileName $0
+ File /oname=$0 "${IMAGE}"
+ SetBrandingImage ${PARMS} $0
+ Delete $0
+ Pop $0
+!macroend
+
+;--------------------------------
+
+Name "Graphical effects"
+
+OutFile "gfx.exe"
+
+; Adds an XP manifest to the installer
+XPStyle on
+
+; Add branding image to the installer (an image placeholder on the side).
+; It is not enough to just add the placeholder, we must set the image too...
+; We will later set the image in every pre-page function.
+; We can also set just one persistent image in .onGUIInit
+AddBrandingImage left 100
+
+; Sets the font of the installer
+SetFont "Comic Sans MS" 8
+
+; Just to make it three pages...
+SubCaption 0 ": Yet another page..."
+SubCaption 2 ": Yet another page..."
+LicenseText "License page"
+LicenseData "gfx.nsi"
+DirText "Lets make a third page!"
+
+; Install dir
+InstallDir "${NSISDIR}\Examples"
+
+; Request application privileges for Windows Vista
+RequestExecutionLevel user
+
+;--------------------------------
+
+; Pages
+Page license licenseImage
+Page custom customPage
+Page directory dirImage
+Page instfiles instImage
+
+;--------------------------------
+
+Section ""
+ ; You can also use the BI_NEXT macro here...
+ MessageBox MB_YESNO "We can change the branding image from within a section too!$\nDo you want me to change it?" IDNO done
+ !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Wizard\nsis.bmp" ""
+ done:
+ WriteUninstaller uninst.exe
+SectionEnd
+
+;--------------------------------
+
+Function licenseImage
+ !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" /RESIZETOFIT
+ MessageBox MB_YESNO 'Would you like to skip the license page?' IDNO no
+ Abort
+ no:
+FunctionEnd
+
+Function customPage
+ !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" /RESIZETOFIT
+ MessageBox MB_OK 'This is a nice custom "page" with yet another image :P'
+ #insert install options/start menu/ here
+FunctionEnd
+
+Function dirImage
+ !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Header\win.bmp" /RESIZETOFIT
+FunctionEnd
+
+Function instImage
+ !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp" /RESIZETOFIT
+FunctionEnd
+
+;--------------------------------
+
+; Uninstall pages
+
+UninstPage uninstConfirm un.uninstImage
+UninstPage custom un.customPage
+UninstPage instfiles un.instImage
+
+Function un.uninstImage
+ !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" /RESIZETOFIT
+FunctionEnd
+
+Function un.customPage
+ !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Header\win.bmp" /RESIZETOFIT
+ MessageBox MB_OK 'This is a nice uninstaller custom "page" with yet another image :P'
+ #insert install options/start menu/ here
+FunctionEnd
+
+Function un.instImage
+ !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp" /RESIZETOFIT
+FunctionEnd
+
+;--------------------------------
+
+; Uninstaller
+
+; Another page for uninstaller
+UninstallText "Another page..."
+
+Section uninstall
+ MessageBox MB_OK "Bla"
+SectionEnd
+
diff --git a/Engine/bin/tools/nsis/app/Examples/languages.nsi b/Engine/bin/tools/nsis/app/Examples/languages.nsi
new file mode 100644
index 000000000..fdf15d141
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/languages.nsi
@@ -0,0 +1,179 @@
+; languages.nsi
+;
+; This is an example of a multilingual installer
+; The user can select the language on startup
+
+;--------------------------------
+
+OutFile languages.exe
+
+XPStyle on
+
+RequestExecutionLevel user
+
+;--------------------------------
+
+Page license
+Page components
+Page instfiles
+
+;--------------------------------
+
+; First is default
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\Dutch.nlf"
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\French.nlf"
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\German.nlf"
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\Korean.nlf"
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\Spanish.nlf"
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\Swedish.nlf"
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\TradChinese.nlf"
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf"
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\Slovak.nlf"
+
+; License data
+; Not exactly translated, but it shows what's needed
+LicenseLangString myLicenseData ${LANG_ENGLISH} "bigtest.nsi"
+LicenseLangString myLicenseData ${LANG_DUTCH} "waplugin.nsi"
+LicenseLangString myLicenseData ${LANG_FRENCH} "example1.nsi"
+LicenseLangString myLicenseData ${LANG_GERMAN} "example2.nsi"
+LicenseLangString myLicenseData ${LANG_KOREAN} "gfx.nsi"
+LicenseLangString myLicenseData ${LANG_RUSSIAN} "languages.nsi"
+LicenseLangString myLicenseData ${LANG_SPANISH} "LogicLib.nsi"
+LicenseLangString myLicenseData ${LANG_SWEDISH} "makensis.nsi"
+LicenseLangString myLicenseData ${LANG_TRADCHINESE} "one-section.nsi"
+LicenseLangString myLicenseData ${LANG_SIMPCHINESE} "primes.nsi"
+LicenseLangString myLicenseData ${LANG_SLOVAK} "silent.nsi"
+
+LicenseData $(myLicenseData)
+
+; Set name using the normal interface (Name command)
+LangString Name ${LANG_ENGLISH} "English"
+LangString Name ${LANG_DUTCH} "Dutch"
+LangString Name ${LANG_FRENCH} "French"
+LangString Name ${LANG_GERMAN} "German"
+LangString Name ${LANG_KOREAN} "Korean"
+LangString Name ${LANG_RUSSIAN} "Russian"
+LangString Name ${LANG_SPANISH} "Spanish"
+LangString Name ${LANG_SWEDISH} "Swedish"
+LangString Name ${LANG_TRADCHINESE} "Traditional Chinese"
+LangString Name ${LANG_SIMPCHINESE} "Simplified Chinese"
+LangString Name ${LANG_SLOVAK} "Slovak"
+
+Name $(Name)
+
+; Directly change the inner lang strings (Same as ComponentText)
+LangString ^ComponentsText ${LANG_ENGLISH} "English component page"
+LangString ^ComponentsText ${LANG_DUTCH} "Dutch component page"
+LangString ^ComponentsText ${LANG_FRENCH} "French component page"
+LangString ^ComponentsText ${LANG_GERMAN} "German component page"
+LangString ^ComponentsText ${LANG_KOREAN} "Korean component page"
+LangString ^ComponentsText ${LANG_RUSSIAN} "Russian component page"
+LangString ^ComponentsText ${LANG_SPANISH} "Spanish component page"
+LangString ^ComponentsText ${LANG_SWEDISH} "Swedish component page"
+LangString ^ComponentsText ${LANG_TRADCHINESE} "Traditional Chinese component page"
+LangString ^ComponentsText ${LANG_SIMPCHINESE} "Simplified Chinese component page"
+LangString ^ComponentsText ${LANG_SLOVAK} "Slovak component page"
+
+; Set one text for all languages (simply don't use a LangString)
+CompletedText "Languages example completed"
+
+; A LangString for the section name
+LangString Sec1Name ${LANG_ENGLISH} "English section #1"
+LangString Sec1Name ${LANG_DUTCH} "Dutch section #1"
+LangString Sec1Name ${LANG_FRENCH} "French section #1"
+LangString Sec1Name ${LANG_GERMAN} "German section #1"
+LangString Sec1Name ${LANG_KOREAN} "Korean section #1"
+LangString Sec1Name ${LANG_RUSSIAN} "Russian section #1"
+LangString Sec1Name ${LANG_SPANISH} "Spanish section #1"
+LangString Sec1Name ${LANG_SWEDISH} "Swedish section #1"
+LangString Sec1Name ${LANG_TRADCHINESE} "Trandional Chinese section #1"
+LangString Sec1Name ${LANG_SIMPCHINESE} "Simplified Chinese section #1"
+LangString Sec1Name ${LANG_SLOVAK} "Slovak section #1"
+
+; A multilingual message
+LangString Message ${LANG_ENGLISH} "English message"
+LangString Message ${LANG_DUTCH} "Dutch message"
+LangString Message ${LANG_FRENCH} "French message"
+LangString Message ${LANG_GERMAN} "German message"
+LangString Message ${LANG_KOREAN} "Korean message"
+LangString Message ${LANG_RUSSIAN} "Russian message"
+LangString Message ${LANG_SPANISH} "Spanish message"
+LangString Message ${LANG_SWEDISH} "Swedish message"
+LangString Message ${LANG_TRADCHINESE} "Trandional Chinese message"
+LangString Message ${LANG_SIMPCHINESE} "Simplified Chinese message"
+LangString Message ${LANG_SLOVAK} "Slovak message"
+
+;--------------------------------
+
+;Section names set by Language strings
+;It works with ! too
+Section !$(Sec1Name) sec1
+ MessageBox MB_OK $(Message)
+SectionEnd
+
+; The old, slow, wasteful way
+; Look at this section and see why LangString is so much easier
+Section "Section number two"
+ StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2
+ MessageBox MB_OK "Installing English stuff"
+ StrCmp $LANGUAGE ${LANG_DUTCH} 0 +2
+ MessageBox MB_OK "Installing Dutch stuff"
+ StrCmp $LANGUAGE ${LANG_FRENCH} 0 +2
+ MessageBox MB_OK "Installing French stuff"
+ StrCmp $LANGUAGE ${LANG_GERMAN} 0 +2
+ MessageBox MB_OK "Installing German stuff"
+ StrCmp $LANGUAGE ${LANG_KOREAN} 0 +2
+ MessageBox MB_OK "Installing Korean stuff"
+ StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +2
+ MessageBox MB_OK "Installing Russian stuff"
+ StrCmp $LANGUAGE ${LANG_SPANISH} 0 +2
+ MessageBox MB_OK "Installing Spanish stuff"
+ StrCmp $LANGUAGE ${LANG_SWEDISH} 0 +2
+ MessageBox MB_OK "Installing Swedish stuff"
+ StrCmp $LANGUAGE ${LANG_TRADCHINESE} 0 +2
+ MessageBox MB_OK "Installing Traditional Chinese stuff"
+ StrCmp $LANGUAGE ${LANG_SIMPCHINESE} 0 +2
+ MessageBox MB_OK "Installing Simplified Chinese stuff"
+ StrCmp $LANGUAGE ${LANG_SLOVAK} 0 +2
+ MessageBox MB_OK "Installing Slovak stuff"
+SectionEnd
+
+;--------------------------------
+
+Function .onInit
+
+ ;Language selection dialog
+
+ Push ""
+ Push ${LANG_ENGLISH}
+ Push English
+ Push ${LANG_DUTCH}
+ Push Dutch
+ Push ${LANG_FRENCH}
+ Push French
+ Push ${LANG_GERMAN}
+ Push German
+ Push ${LANG_KOREAN}
+ Push Korean
+ Push ${LANG_RUSSIAN}
+ Push Russian
+ Push ${LANG_SPANISH}
+ Push Spanish
+ Push ${LANG_SWEDISH}
+ Push Swedish
+ Push ${LANG_TRADCHINESE}
+ Push "Traditional Chinese"
+ Push ${LANG_SIMPCHINESE}
+ Push "Simplified Chinese"
+ Push ${LANG_SLOVAK}
+ Push Slovak
+ Push A ; A means auto count languages
+ ; for the auto count to work the first empty push (Push "") must remain
+ LangDLL::LangDialog "Installer Language" "Please select the language of the installer"
+
+ Pop $LANGUAGE
+ StrCmp $LANGUAGE "cancel" 0 +2
+ Abort
+FunctionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/makensis.nsi b/Engine/bin/tools/nsis/app/Examples/makensis.nsi
new file mode 100644
index 000000000..f07a73e75
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/makensis.nsi
@@ -0,0 +1,1051 @@
+;NSIS Setup Script
+;--------------------------------
+
+!ifndef VERSION
+ !define VERSION 'anonymous-build'
+!endif
+
+;--------------------------------
+;Configuration
+
+!ifdef OUTFILE
+ OutFile "${OUTFILE}"
+!else
+ OutFile ..\nsis-${VERSION}-setup.exe
+!endif
+
+SetCompressor /SOLID lzma
+
+InstType "Full"
+InstType "Lite"
+InstType "Minimal"
+
+InstallDir $PROGRAMFILES\NSIS
+InstallDirRegKey HKLM Software\NSIS ""
+
+RequestExecutionLevel admin
+
+;--------------------------------
+;Header Files
+
+!include "MUI2.nsh"
+!include "Sections.nsh"
+!include "LogicLib.nsh"
+!include "Memento.nsh"
+!include "WordFunc.nsh"
+
+;--------------------------------
+;Functions
+
+!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD
+
+ !insertmacro VersionCompare
+
+!endif
+
+;--------------------------------
+;Definitions
+
+!define SHCNE_ASSOCCHANGED 0x8000000
+!define SHCNF_IDLIST 0
+
+;--------------------------------
+;Configuration
+
+;Names
+Name "NSIS"
+Caption "NSIS ${VERSION} Setup"
+
+;Memento Settings
+!define MEMENTO_REGISTRY_ROOT HKLM
+!define MEMENTO_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS"
+
+;Interface Settings
+!define MUI_ABORTWARNING
+
+!define MUI_HEADERIMAGE
+!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\nsis.bmp"
+
+!define MUI_COMPONENTSPAGE_SMALLDESC
+
+;Pages
+!define MUI_WELCOMEPAGE_TITLE "Welcome to the NSIS ${VERSION} Setup Wizard"
+!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of NSIS (Nullsoft Scriptable Install System) ${VERSION}, the next generation of the Windows installer and uninstaller system that doesn't suck and isn't huge.$\r$\n$\r$\nNSIS 2 includes a new Modern User Interface, LZMA compression, support for multiple languages and an easy plug-in system.$\r$\n$\r$\n$_CLICK"
+
+!insertmacro MUI_PAGE_WELCOME
+!insertmacro MUI_PAGE_LICENSE "..\COPYING"
+!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD
+Page custom PageReinstall PageLeaveReinstall
+!endif
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+
+!define MUI_FINISHPAGE_LINK "Visit the NSIS site for the latest news, FAQs and support"
+!define MUI_FINISHPAGE_LINK_LOCATION "http://nsis.sf.net/"
+
+!define MUI_FINISHPAGE_RUN "$INSTDIR\NSIS.exe"
+!define MUI_FINISHPAGE_NOREBOOTSUPPORT
+
+!define MUI_FINISHPAGE_SHOWREADME
+!define MUI_FINISHPAGE_SHOWREADME_TEXT "Show release notes"
+!define MUI_FINISHPAGE_SHOWREADME_FUNCTION ShowReleaseNotes
+
+!insertmacro MUI_PAGE_FINISH
+
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+
+;--------------------------------
+;Languages
+
+!insertmacro MUI_LANGUAGE "English"
+
+;--------------------------------
+;Installer Sections
+
+${MementoSection} "NSIS Core Files (required)" SecCore
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing NSIS Core Files..."
+ SetDetailsPrint listonly
+
+ SectionIn 1 2 3 RO
+ SetOutPath $INSTDIR
+ RMDir /r $SMPROGRAMS\NSIS
+
+ SetOverwrite on
+ File ..\makensis.exe
+ File ..\makensisw.exe
+ File ..\COPYING
+ File ..\NSIS.chm
+ File ..\NSIS.exe
+ File /nonfatal ..\NSIS.exe.manifest
+
+ IfFileExists $INSTDIR\nsisconf.nsi "" +2
+ Rename $INSTDIR\nsisconf.nsi $INSTDIR\nsisconf.nsh
+ SetOverwrite off
+ File ..\nsisconf.nsh
+ SetOverwrite on
+
+ SetOutPath $INSTDIR\Stubs
+ File ..\Stubs\bzip2
+ File ..\Stubs\bzip2_solid
+ File ..\Stubs\lzma
+ File ..\Stubs\lzma_solid
+ File ..\Stubs\zlib
+ File ..\Stubs\zlib_solid
+ File ..\Stubs\uninst
+
+ SetOutPath $INSTDIR\Include
+ File ..\Include\WinMessages.nsh
+ File ..\Include\Sections.nsh
+ File ..\Include\Library.nsh
+ File ..\Include\UpgradeDLL.nsh
+ File ..\Include\LogicLib.nsh
+ File ..\Include\StrFunc.nsh
+ File ..\Include\Colors.nsh
+ File ..\Include\FileFunc.nsh
+ File ..\Include\TextFunc.nsh
+ File ..\Include\WordFunc.nsh
+ File ..\Include\WinVer.nsh
+ File ..\Include\x64.nsh
+ File ..\Include\Memento.nsh
+ File ..\Include\LangFile.nsh
+ File ..\Include\InstallOptions.nsh
+ File ..\Include\MultiUser.nsh
+ File ..\Include\VB6RunTime.nsh
+ File ..\Include\Util.nsh
+ File ..\Include\WinCore.nsh
+
+ SetOutPath $INSTDIR\Include\Win
+ File ..\Include\Win\WinDef.nsh
+ File ..\Include\Win\WinError.nsh
+ File ..\Include\Win\WinNT.nsh
+ File ..\Include\Win\WinUser.nsh
+
+ SetOutPath $INSTDIR\Docs\StrFunc
+ File ..\Docs\StrFunc\StrFunc.txt
+
+ SetOutPath $INSTDIR\Docs\MultiUser
+ File ..\Docs\MultiUser\Readme.html
+
+ SetOutPath $INSTDIR\Docs\makensisw
+ File ..\Docs\makensisw\*.txt
+
+ SetOutPath $INSTDIR\Menu
+ File ..\Menu\*.html
+ SetOutPath $INSTDIR\Menu\images
+ File ..\Menu\images\header.gif
+ File ..\Menu\images\line.gif
+ File ..\Menu\images\site.gif
+
+ Delete $INSTDIR\makensis.htm
+ Delete $INSTDIR\Docs\*.html
+ Delete $INSTDIR\Docs\style.css
+ RMDir $INSTDIR\Docs
+
+ SetOutPath $INSTDIR\Bin
+ File ..\Bin\LibraryLocal.exe
+ File ..\Bin\RegTool.bin
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\TypeLib.dll
+
+ ReadRegStr $R0 HKCR ".nsi" ""
+ StrCmp $R0 "NSISFile" 0 +2
+ DeleteRegKey HKCR "NSISFile"
+
+ WriteRegStr HKCR ".nsi" "" "NSIS.Script"
+ WriteRegStr HKCR "NSIS.Script" "" "NSIS Script File"
+ WriteRegStr HKCR "NSIS.Script\DefaultIcon" "" "$INSTDIR\makensisw.exe,1"
+ ReadRegStr $R0 HKCR "NSIS.Script\shell\open\command" ""
+ StrCmp $R0 "" 0 no_nsiopen
+ WriteRegStr HKCR "NSIS.Script\shell" "" "open"
+ WriteRegStr HKCR "NSIS.Script\shell\open\command" "" 'notepad.exe "%1"'
+ no_nsiopen:
+ WriteRegStr HKCR "NSIS.Script\shell\compile" "" "Compile NSIS Script"
+ WriteRegStr HKCR "NSIS.Script\shell\compile\command" "" '"$INSTDIR\makensisw.exe" "%1"'
+ WriteRegStr HKCR "NSIS.Script\shell\compile-compressor" "" "Compile NSIS Script (Choose Compressor)"
+ WriteRegStr HKCR "NSIS.Script\shell\compile-compressor\command" "" '"$INSTDIR\makensisw.exe" /ChooseCompressor "%1"'
+
+ ReadRegStr $R0 HKCR ".nsh" ""
+ StrCmp $R0 "NSHFile" 0 +2
+ DeleteRegKey HKCR "NSHFile"
+
+ WriteRegStr HKCR ".nsh" "" "NSIS.Header"
+ WriteRegStr HKCR "NSIS.Header" "" "NSIS Header File"
+ WriteRegStr HKCR "NSIS.Header\DefaultIcon" "" "$INSTDIR\makensisw.exe,1"
+ ReadRegStr $R0 HKCR "NSIS.Header\shell\open\command" ""
+ StrCmp $R0 "" 0 no_nshopen
+ WriteRegStr HKCR "NSIS.Header\shell" "" "open"
+ WriteRegStr HKCR "NSIS.Header\shell\open\command" "" 'notepad.exe "%1"'
+ no_nshopen:
+
+ System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)'
+
+${MementoSectionEnd}
+
+${MementoSection} "Script Examples" SecExample
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Script Examples..."
+ SetDetailsPrint listonly
+
+ SectionIn 1 2
+ SetOutPath $INSTDIR\Examples
+ File ..\Examples\makensis.nsi
+ File ..\Examples\example1.nsi
+ File ..\Examples\example2.nsi
+ File ..\Examples\viewhtml.nsi
+ File ..\Examples\waplugin.nsi
+ File ..\Examples\bigtest.nsi
+ File ..\Examples\primes.nsi
+ File ..\Examples\rtest.nsi
+ File ..\Examples\gfx.nsi
+ File ..\Examples\one-section.nsi
+ File ..\Examples\languages.nsi
+ File ..\Examples\Library.nsi
+ File ..\Examples\VersionInfo.nsi
+ File ..\Examples\UserVars.nsi
+ File ..\Examples\LogicLib.nsi
+ File ..\Examples\silent.nsi
+ File ..\Examples\StrFunc.nsi
+ File ..\Examples\FileFunc.nsi
+ File ..\Examples\FileFunc.ini
+ File ..\Examples\FileFuncTest.nsi
+ File ..\Examples\TextFunc.nsi
+ File ..\Examples\TextFunc.ini
+ File ..\Examples\TextFuncTest.nsi
+ File ..\Examples\WordFunc.nsi
+ File ..\Examples\WordFunc.ini
+ File ..\Examples\WordFuncTest.nsi
+ File ..\Examples\Memento.nsi
+
+ SetOutPath $INSTDIR\Examples\Plugin
+ File ..\Examples\Plugin\exdll.c
+ File ..\Examples\Plugin\exdll.dpr
+ File ..\Examples\Plugin\exdll.dsp
+ File ..\Examples\Plugin\exdll.dsw
+ File ..\Examples\Plugin\exdll_with_unit.dpr
+ File ..\Examples\Plugin\exdll-vs2008.sln
+ File ..\Examples\Plugin\exdll-vs2008.vcproj
+ File ..\Examples\Plugin\extdll.inc
+ File ..\Examples\Plugin\nsis.pas
+
+ SetOutPath $INSTDIR\Examples\Plugin\nsis
+ File ..\Examples\Plugin\nsis\pluginapi.h
+ File ..\Examples\Plugin\nsis\pluginapi.lib
+ File ..\Examples\Plugin\nsis\api.h
+
+${MementoSectionEnd}
+
+!ifndef NO_STARTMENUSHORTCUTS
+${MementoSection} "Start Menu and Desktop Shortcuts" SecShortcuts
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Start Menu and Desktop Shortcuts..."
+ SetDetailsPrint listonly
+
+!else
+${MementoSection} "Desktop Shortcut" SecShortcuts
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Desktop Shortcut..."
+ SetDetailsPrint listonly
+
+!endif
+ SectionIn 1 2
+ SetOutPath $INSTDIR
+!ifndef NO_STARTMENUSHORTCUTS
+ CreateShortCut "$SMPROGRAMS\NSIS.lnk" "$INSTDIR\NSIS.exe"
+!endif
+
+ CreateShortCut "$DESKTOP\NSIS.lnk" "$INSTDIR\NSIS.exe"
+
+${MementoSectionEnd}
+
+SectionGroup "User Interfaces" SecInterfaces
+
+${MementoSection} "Modern User Interface" SecInterfacesModernUI
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing User Interfaces | Modern User Interface..."
+ SetDetailsPrint listonly
+
+ SectionIn 1 2
+
+ SetOutPath "$INSTDIR\Examples\Modern UI"
+ File "..\Examples\Modern UI\Basic.nsi"
+ File "..\Examples\Modern UI\HeaderBitmap.nsi"
+ File "..\Examples\Modern UI\MultiLanguage.nsi"
+ File "..\Examples\Modern UI\StartMenu.nsi"
+ File "..\Examples\Modern UI\WelcomeFinish.nsi"
+
+ SetOutPath "$INSTDIR\Contrib\Modern UI"
+ File "..\Contrib\Modern UI\System.nsh"
+ File "..\Contrib\Modern UI\ioSpecial.ini"
+
+ SetOutPath "$INSTDIR\Docs\Modern UI"
+ File "..\Docs\Modern UI\Readme.html"
+ File "..\Docs\Modern UI\Changelog.txt"
+ File "..\Docs\Modern UI\License.txt"
+
+ SetOutPath "$INSTDIR\Docs\Modern UI\images"
+ File "..\Docs\Modern UI\images\header.gif"
+ File "..\Docs\Modern UI\images\screen1.png"
+ File "..\Docs\Modern UI\images\screen2.png"
+ File "..\Docs\Modern UI\images\open.gif"
+ File "..\Docs\Modern UI\images\closed.gif"
+
+ SetOutPath $INSTDIR\Contrib\UIs
+ File "..\Contrib\UIs\modern.exe"
+ File "..\Contrib\UIs\modern_headerbmp.exe"
+ File "..\Contrib\UIs\modern_headerbmpr.exe"
+ File "..\Contrib\UIs\modern_nodesc.exe"
+ File "..\Contrib\UIs\modern_smalldesc.exe"
+
+ SetOutPath $INSTDIR\Include
+ File "..\Include\MUI.nsh"
+
+ SetOutPath "$INSTDIR\Contrib\Modern UI 2"
+ File "..\Contrib\Modern UI 2\Deprecated.nsh"
+ File "..\Contrib\Modern UI 2\Interface.nsh"
+ File "..\Contrib\Modern UI 2\Localization.nsh"
+ File "..\Contrib\Modern UI 2\MUI2.nsh"
+ File "..\Contrib\Modern UI 2\Pages.nsh"
+
+ SetOutPath "$INSTDIR\Contrib\Modern UI 2\Pages"
+ File "..\Contrib\Modern UI 2\Pages\Components.nsh"
+ File "..\Contrib\Modern UI 2\Pages\Directory.nsh"
+ File "..\Contrib\Modern UI 2\Pages\Finish.nsh"
+ File "..\Contrib\Modern UI 2\Pages\InstallFiles.nsh"
+ File "..\Contrib\Modern UI 2\Pages\License.nsh"
+ File "..\Contrib\Modern UI 2\Pages\StartMenu.nsh"
+ File "..\Contrib\Modern UI 2\Pages\UninstallConfirm.nsh"
+ File "..\Contrib\Modern UI 2\Pages\Welcome.nsh"
+
+ SetOutPath "$INSTDIR\Docs\Modern UI 2"
+ File "..\Docs\Modern UI 2\Readme.html"
+ File "..\Docs\Modern UI 2\License.txt"
+
+ SetOutPath "$INSTDIR\Docs\Modern UI 2\images"
+ File "..\Docs\Modern UI 2\images\header.gif"
+ File "..\Docs\Modern UI 2\images\screen1.png"
+ File "..\Docs\Modern UI 2\images\screen2.png"
+ File "..\Docs\Modern UI 2\images\open.gif"
+ File "..\Docs\Modern UI 2\images\closed.gif"
+
+ SetOutPath $INSTDIR\Include
+ File "..\Include\MUI2.nsh"
+
+${MementoSectionEnd}
+
+${MementoSection} "Default User Interface" SecInterfacesDefaultUI
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing User Interfaces | Default User Interface..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath "$INSTDIR\Contrib\UIs"
+ File "..\Contrib\UIs\default.exe"
+
+${MementoSectionEnd}
+
+${MementoSection} "Tiny User Interface" SecInterfacesTinyUI
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing User Interfaces | Tiny User Interface..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath "$INSTDIR\Contrib\UIs"
+ File "..\Contrib\UIs\sdbarker_tiny.exe"
+
+${MementoSectionEnd}
+
+SectionGroupEnd
+
+${MementoSection} "Graphics" SecGraphics
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Graphics..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ Delete $INSTDIR\Contrib\Icons\*.ico
+ Delete $INSTDIR\Contrib\Icons\*.bmp
+ RMDir $INSTDIR\Contrib\Icons
+ SetOutPath $INSTDIR\Contrib\Graphics
+ File /r "..\Contrib\Graphics\*.ico"
+ File /r "..\Contrib\Graphics\*.bmp"
+${MementoSectionEnd}
+
+${MementoSection} "Language Files" SecLangFiles
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Language Files..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath "$INSTDIR\Contrib\Language files"
+ File "..\Contrib\Language files\*.nlf"
+
+ SetOutPath $INSTDIR\Bin
+ File ..\Bin\MakeLangID.exe
+
+ !insertmacro SectionFlagIsSet ${SecInterfacesModernUI} ${SF_SELECTED} mui nomui
+ mui:
+ SetOutPath "$INSTDIR\Contrib\Language files"
+ File "..\Contrib\Language files\*.nsh"
+ nomui:
+
+${MementoSectionEnd}
+
+SectionGroup "Tools" SecTools
+
+${MementoSection} "Zip2Exe" SecToolsZ2E
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Tools | Zip2Exe..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Bin
+ File ..\Bin\zip2exe.exe
+ SetOutPath $INSTDIR\Contrib\zip2exe
+ File ..\Contrib\zip2exe\Base.nsh
+ File ..\Contrib\zip2exe\Modern.nsh
+ File ..\Contrib\zip2exe\Classic.nsh
+
+${MementoSectionEnd}
+
+SectionGroupEnd
+
+SectionGroup "Plug-ins" SecPluginsPlugins
+
+${MementoSection} "Banner" SecPluginsBanner
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | Banner..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\Banner.dll
+ SetOutPath $INSTDIR\Docs\Banner
+ File ..\Docs\Banner\Readme.txt
+ SetOutPath $INSTDIR\Examples\Banner
+ File ..\Examples\Banner\Example.nsi
+${MementoSectionEnd}
+
+${MementoSection} "Language DLL" SecPluginsLangDLL
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | Language DLL..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\LangDLL.dll
+${MementoSectionEnd}
+
+${MementoSection} "nsExec" SecPluginsnsExec
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | nsExec..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\nsExec.dll
+ SetOutPath $INSTDIR\Docs\nsExec
+ File ..\Docs\nsExec\nsExec.txt
+ SetOutPath $INSTDIR\Examples\nsExec
+ File ..\Examples\nsExec\test.nsi
+${MementoSectionEnd}
+
+${MementoSection} "Splash" SecPluginsSplash
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | Splash..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\splash.dll
+ SetOutPath $INSTDIR\Docs\Splash
+ File ..\Docs\Splash\splash.txt
+ SetOutPath $INSTDIR\Examples\Splash
+ File ..\Examples\Splash\Example.nsi
+${MementoSectionEnd}
+
+${MementoSection} "AdvSplash" SecPluginsSplashT
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | AdvSplash..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\advsplash.dll
+ SetOutPath $INSTDIR\Docs\AdvSplash
+ File ..\Docs\AdvSplash\advsplash.txt
+ SetOutPath $INSTDIR\Examples\AdvSplash
+ File ..\Examples\AdvSplash\Example.nsi
+${MementoSectionEnd}
+
+${MementoSection} "BgImage" SecPluginsBgImage
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | BgImage..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\BgImage.dll
+ SetOutPath $INSTDIR\Docs\BgImage
+ File ..\Docs\BgImage\BgImage.txt
+ SetOutPath $INSTDIR\Examples\BgImage
+ File ..\Examples\BgImage\Example.nsi
+${MementoSectionEnd}
+
+${MementoSection} "InstallOptions" SecPluginsIO
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | InstallOptions..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\InstallOptions.dll
+ SetOutPath $INSTDIR\Docs\InstallOptions
+ File ..\Docs\InstallOptions\Readme.html
+ File ..\Docs\InstallOptions\Changelog.txt
+ SetOutPath $INSTDIR\Examples\InstallOptions
+ File ..\Examples\InstallOptions\test.ini
+ File ..\Examples\InstallOptions\test.nsi
+ File ..\Examples\InstallOptions\testimgs.ini
+ File ..\Examples\InstallOptions\testimgs.nsi
+ File ..\Examples\InstallOptions\testlink.ini
+ File ..\Examples\InstallOptions\testlink.nsi
+ File ..\Examples\InstallOptions\testnotify.ini
+ File ..\Examples\InstallOptions\testnotify.nsi
+${MementoSectionEnd}
+
+${MementoSection} "nsDialogs" SecPluginsDialogs
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | nsDialogs..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\nsDialogs.dll
+ SetOutPath $INSTDIR\Examples\nsDialogs
+ File ..\Examples\nsDialogs\example.nsi
+ File ..\Examples\nsDialogs\InstallOptions.nsi
+ File ..\Examples\nsDialogs\timer.nsi
+ File ..\Examples\nsDialogs\welcome.nsi
+ SetOutPath $INSTDIR\Include
+ File ..\Include\nsDialogs.nsh
+ SetOutPath $INSTDIR\Docs\nsDialogs
+ File ..\Docs\nsDialogs\Readme.html
+${MementoSectionEnd}
+
+${MementoSection} "Math" SecPluginsMath
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | Math..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\Math.dll
+ SetOutPath $INSTDIR\Docs\Math
+ File ..\Docs\Math\Math.txt
+ SetOutPath $INSTDIR\Examples\Math
+ File ..\Examples\Math\math.nsi
+ File ..\Examples\Math\mathtest.txt
+ File ..\Examples\Math\mathtest.nsi
+ File ..\Examples\Math\mathtest.ini
+
+${MementoSectionEnd}
+
+${MementoSection} "NSISdl" SecPluginsNSISDL
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | NSISdl..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\nsisdl.dll
+ SetOutPath $INSTDIR\Docs\NSISdl
+ File ..\Docs\NSISdl\ReadMe.txt
+ File ..\Docs\NSISdl\License.txt
+${MementoSectionEnd}
+
+${MementoSection} "System" SecPluginsSystem
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | System..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\System.dll
+ SetOutPath $INSTDIR\Docs\System
+ File ..\Docs\System\System.html
+ File ..\Docs\System\WhatsNew.txt
+ SetOutPath $INSTDIR\Examples\System
+ File ..\Examples\System\Resource.dll
+ File ..\Examples\System\SysFunc.nsh
+ File ..\Examples\System\System.nsh
+ File ..\Examples\System\System.nsi
+${MementoSectionEnd}
+
+${MementoSection} "StartMenu" SecPluginsStartMenu
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | StartMenu..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\StartMenu.dll
+ SetOutPath $INSTDIR\Docs\StartMenu
+ File ..\Docs\StartMenu\Readme.txt
+ SetOutPath $INSTDIR\Examples\StartMenu
+ File ..\Examples\StartMenu\Example.nsi
+${MementoSectionEnd}
+
+${MementoSection} "UserInfo" SecPluginsUserInfo
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | UserInfo..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\UserInfo.dll
+ SetOutPath $INSTDIR\Examples\UserInfo
+ File ..\Examples\UserInfo\UserInfo.nsi
+${MementoSectionEnd}
+
+${MementoSection} "Dialer" SecPluginsDialer
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | Dialer..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\Dialer.dll
+ SetOutPath $INSTDIR\Docs\Dialer
+ File ..\Docs\Dialer\Dialer.txt
+${MementoSectionEnd}
+
+${MementoSection} "VPatch" SecPluginsVPatch
+
+ SetDetailsPrint textonly
+ DetailPrint "Installing Plug-ins | VPatch..."
+ SetDetailsPrint listonly
+
+ SectionIn 1
+
+ SetOutPath $INSTDIR\Plugins
+ File ..\Plugins\VPatch.dll
+ SetOutPath $INSTDIR\Examples\VPatch
+ File ..\Examples\VPatch\example.nsi
+ File ..\Examples\VPatch\oldfile.txt
+ File ..\Examples\VPatch\newfile.txt
+ File ..\Examples\VPatch\patch.pat
+ SetOutPath $INSTDIR\Docs\VPatch
+ File ..\Docs\VPatch\Readme.html
+ SetOutPath $INSTDIR\Bin
+ File ..\Bin\GenPat.exe
+ SetOutPath $INSTDIR\Include
+ File ..\Include\VPatchLib.nsh
+${MementoSectionEnd}
+
+${MementoSectionDone}
+
+SectionGroupEnd
+
+Section -post
+
+ ; When Modern UI is installed:
+ ; * Always install the English language file
+ ; * Always install default icons / bitmaps
+
+ !insertmacro SectionFlagIsSet ${SecInterfacesModernUI} ${SF_SELECTED} mui nomui
+
+ mui:
+
+ SetDetailsPrint textonly
+ DetailPrint "Configuring Modern UI..."
+ SetDetailsPrint listonly
+
+ !insertmacro SectionFlagIsSet ${SecLangFiles} ${SF_SELECTED} langfiles nolangfiles
+
+ nolangfiles:
+
+ SetOutPath "$INSTDIR\Contrib\Language files"
+ File "..\Contrib\Language files\English.nlf"
+ SetOutPath "$INSTDIR\Contrib\Language files"
+ File "..\Contrib\Language files\English.nsh"
+
+ langfiles:
+
+ !insertmacro SectionFlagIsSet ${SecGraphics} ${SF_SELECTED} graphics nographics
+
+ nographics:
+
+ SetOutPath $INSTDIR\Contrib\Graphics
+ SetOutPath $INSTDIR\Contrib\Graphics\Checks
+ File "..\Contrib\Graphics\Checks\modern.bmp"
+ SetOutPath $INSTDIR\Contrib\Graphics\Icons
+ File "..\Contrib\Graphics\Icons\modern-install.ico"
+ File "..\Contrib\Graphics\Icons\modern-uninstall.ico"
+ SetOutPath $INSTDIR\Contrib\Graphics\Header
+ File "..\Contrib\Graphics\Header\nsis.bmp"
+ SetOutPath $INSTDIR\Contrib\Graphics\Wizard
+ File "..\Contrib\Graphics\Wizard\win.bmp"
+
+ graphics:
+
+ nomui:
+
+ SetDetailsPrint textonly
+ DetailPrint "Creating Registry Keys..."
+ SetDetailsPrint listonly
+
+ SetOutPath $INSTDIR
+
+ WriteRegStr HKLM "Software\NSIS" "" $INSTDIR
+!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD
+ WriteRegDword HKLM "Software\NSIS" "VersionMajor" "${VER_MAJOR}"
+ WriteRegDword HKLM "Software\NSIS" "VersionMinor" "${VER_MINOR}"
+ WriteRegDword HKLM "Software\NSIS" "VersionRevision" "${VER_REVISION}"
+ WriteRegDword HKLM "Software\NSIS" "VersionBuild" "${VER_BUILD}"
+!endif
+
+ WriteRegExpandStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "UninstallString" '"$INSTDIR\uninst-nsis.exe"'
+ WriteRegExpandStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "InstallLocation" "$INSTDIR"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "DisplayName" "Nullsoft Install System"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "DisplayIcon" "$INSTDIR\NSIS.exe,0"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "DisplayVersion" "${VERSION}"
+!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "VersionMajor" "${VER_MAJOR}"
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "VersionMinor" "${VER_MINOR}.${VER_REVISION}"
+!endif
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "URLInfoAbout" "http://nsis.sourceforge.net/"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "HelpLink" "http://nsis.sourceforge.net/Support"
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "NoModify" "1"
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "NoRepair" "1"
+
+ WriteUninstaller $INSTDIR\uninst-nsis.exe
+
+ ${MementoSectionSave}
+
+ SetDetailsPrint both
+
+SectionEnd
+
+;--------------------------------
+;Descriptions
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecCore} "The core files required to use NSIS (compiler etc.)"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecExample} "Example installation scripts that show you how to use NSIS"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecShortcuts} "Adds icons to your start menu and your desktop for easy access"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfaces} "User interface designs that can be used to change the installer look and feel"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfacesModernUI} "A modern user interface like the wizards of recent Windows versions"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfacesDefaultUI} "The default NSIS user interface which you can customize to make your own UI"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfacesTinyUI} "A tiny version of the default user interface"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecTools} "Tools that help you with NSIS development"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecToolsZ2E} "A utility that converts a ZIP file to a NSIS installer"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecGraphics} "Icons, checkbox images and other graphics"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecLangFiles} "Language files used to support multiple languages in an installer"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsPlugins} "Useful plugins that extend NSIS's functionality"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsBanner} "Plugin that lets you show a banner before installation starts"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsLangDLL} "Plugin that lets you add a language select dialog to your installer"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsnsExec} "Plugin that executes console programs and prints its output in the NSIS log window or hides it"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsSplash} "Splash screen add-on that lets you add a splash screen to an installer"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsSplashT} "Splash screen add-on with transparency support that lets you add a splash screen to an installer"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsSystem} "Plugin that lets you call Win32 API or external DLLs"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsMath} "Plugin that lets you evaluate complicated mathematical expressions"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsDialer} "Plugin that provides internet connection functions"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsIO} "Plugin that lets you add custom pages to an installer"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsDialogs} "Plugin that lets you add custom pages to an installer"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsStartMenu} "Plugin that lets the user select the start menu folder"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsBgImage} "Plugin that lets you show a persistent background image plugin and play sounds"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsUserInfo} "Plugin that that gives you the user name and the user account type"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsNSISDL} "Plugin that lets you create a web based installer"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsVPatch} "Plugin that lets you create patches to upgrade older files"
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+;--------------------------------
+;Installer Functions
+
+Function .onInit
+
+ ${MementoSectionRestore}
+
+FunctionEnd
+
+!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD
+
+Var ReinstallPageCheck
+
+Function PageReinstall
+
+ ReadRegStr $R0 HKLM "Software\NSIS" ""
+
+ ${If} $R0 == ""
+ Abort
+ ${EndIf}
+
+ ReadRegDWORD $R0 HKLM "Software\NSIS" "VersionMajor"
+ ReadRegDWORD $R1 HKLM "Software\NSIS" "VersionMinor"
+ ReadRegDWORD $R2 HKLM "Software\NSIS" "VersionRevision"
+ ReadRegDWORD $R3 HKLM "Software\NSIS" "VersionBuild"
+ StrCpy $R0 $R0.$R1.$R2.$R3
+
+ ${VersionCompare} ${VER_MAJOR}.${VER_MINOR}.${VER_REVISION}.${VER_BUILD} $R0 $R0
+ ${If} $R0 == 0
+ StrCpy $R1 "NSIS ${VERSION} is already installed. Select the operation you want to perform and click Next to continue."
+ StrCpy $R2 "Add/Reinstall components"
+ StrCpy $R3 "Uninstall NSIS"
+ !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose the maintenance option to perform."
+ StrCpy $R0 "2"
+ ${ElseIf} $R0 == 1
+ StrCpy $R1 "An older version of NSIS is installed on your system. It's recommended that you uninstall the current version before installing. Select the operation you want to perform and click Next to continue."
+ StrCpy $R2 "Uninstall before installing"
+ StrCpy $R3 "Do not uninstall"
+ !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose how you want to install NSIS."
+ StrCpy $R0 "1"
+ ${ElseIf} $R0 == 2
+ StrCpy $R1 "A newer version of NSIS is already installed! It is not recommended that you install an older version. If you really want to install this older version, it's better to uninstall the current version first. Select the operation you want to perform and click Next to continue."
+ StrCpy $R2 "Uninstall before installing"
+ StrCpy $R3 "Do not uninstall"
+ !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose how you want to install NSIS."
+ StrCpy $R0 "1"
+ ${Else}
+ Abort
+ ${EndIf}
+
+ nsDialogs::Create 1018
+ Pop $R4
+
+ ${NSD_CreateLabel} 0 0 100% 24u $R1
+ Pop $R1
+
+ ${NSD_CreateRadioButton} 30u 50u -30u 8u $R2
+ Pop $R2
+ ${NSD_OnClick} $R2 PageReinstallUpdateSelection
+
+ ${NSD_CreateRadioButton} 30u 70u -30u 8u $R3
+ Pop $R3
+ ${NSD_OnClick} $R3 PageReinstallUpdateSelection
+
+ ${If} $ReinstallPageCheck != 2
+ SendMessage $R2 ${BM_SETCHECK} ${BST_CHECKED} 0
+ ${Else}
+ SendMessage $R3 ${BM_SETCHECK} ${BST_CHECKED} 0
+ ${EndIf}
+
+ ${NSD_SetFocus} $R2
+
+ nsDialogs::Show
+
+FunctionEnd
+
+Function PageReinstallUpdateSelection
+
+ Pop $R1
+
+ ${NSD_GetState} $R2 $R1
+
+ ${If} $R1 == ${BST_CHECKED}
+ StrCpy $ReinstallPageCheck 1
+ ${Else}
+ StrCpy $ReinstallPageCheck 2
+ ${EndIf}
+
+FunctionEnd
+
+Function PageLeaveReinstall
+
+ ${NSD_GetState} $R2 $R1
+
+ StrCmp $R0 "1" 0 +2
+ StrCmp $R1 "1" reinst_uninstall reinst_done
+
+ StrCmp $R0 "2" 0 +3
+ StrCmp $R1 "1" reinst_done reinst_uninstall
+
+ reinst_uninstall:
+ ReadRegStr $R1 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "UninstallString"
+
+ ;Run uninstaller
+ HideWindow
+
+ ClearErrors
+ ExecWait '$R1 _?=$INSTDIR'
+
+ IfErrors no_remove_uninstaller
+ IfFileExists "$INSTDIR\makensis.exe" no_remove_uninstaller
+
+ Delete $R1
+ RMDir $INSTDIR
+
+ no_remove_uninstaller:
+
+ StrCmp $R0 "2" 0 +2
+ Quit
+
+ BringToFront
+
+ reinst_done:
+
+FunctionEnd
+
+!endif # VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD
+
+Function ShowReleaseNotes
+ ${If} ${FileExists} $WINDIR\hh.exe
+ StrCpy $0 $WINDIR\hh.exe
+ Exec '"$0" mk:@MSITStore:$INSTDIR\NSIS.chm::/SectionF.1.html'
+ ${Else}
+ SearchPath $0 hh.exe
+ ${If} ${FileExists} $0
+ Exec '"$0" mk:@MSITStore:$INSTDIR\NSIS.chm::/SectionF.1.html'
+ ${Else}
+ ExecShell "open" "http://nsis.sourceforge.net/Docs/AppendixF.html#F.1"
+ ${EndIf}
+ ${EndIf}
+FunctionEnd
+
+;--------------------------------
+;Uninstaller Section
+
+Section Uninstall
+
+ SetDetailsPrint textonly
+ DetailPrint "Uninstalling NSI Development Shell Extensions..."
+ SetDetailsPrint listonly
+
+ IfFileExists $INSTDIR\makensis.exe nsis_installed
+ MessageBox MB_YESNO "It does not appear that NSIS is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?" IDYES nsis_installed
+ Abort "Uninstall aborted by user"
+ nsis_installed:
+
+ SetDetailsPrint textonly
+ DetailPrint "Deleting Registry Keys..."
+ SetDetailsPrint listonly
+
+ ReadRegStr $R0 HKCR ".nsi" ""
+ StrCmp $R0 "NSIS.Script" 0 +2
+ DeleteRegKey HKCR ".nsi"
+
+ ReadRegStr $R0 HKCR ".nsh" ""
+ StrCmp $R0 "NSIS.Header" 0 +2
+ DeleteRegKey HKCR ".nsh"
+
+ DeleteRegKey HKCR "NSIS.Script"
+ DeleteRegKey HKCR "NSIS.Header"
+
+ System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)'
+
+ DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS"
+ DeleteRegKey HKLM "Software\NSIS"
+
+ SetDetailsPrint textonly
+ DetailPrint "Deleting Files..."
+ SetDetailsPrint listonly
+
+ Delete $SMPROGRAMS\NSIS.lnk
+ Delete $DESKTOP\NSIS.lnk
+ Delete $INSTDIR\makensis.exe
+ Delete $INSTDIR\makensisw.exe
+ Delete $INSTDIR\NSIS.exe
+ Delete $INSTDIR\license.txt
+ Delete $INSTDIR\COPYING
+ Delete $INSTDIR\uninst-nsis.exe
+ Delete $INSTDIR\nsisconf.nsi
+ Delete $INSTDIR\nsisconf.nsh
+ Delete $INSTDIR\NSIS.chm
+ RMDir /r $INSTDIR\Bin
+ RMDir /r $INSTDIR\Contrib
+ RMDir /r $INSTDIR\Docs
+ RMDir /r $INSTDIR\Examples
+ RMDir /r $INSTDIR\Include
+ RMDir /r $INSTDIR\Menu
+ RMDir /r $INSTDIR\Plugins
+ RMDir /r $INSTDIR\Stubs
+ RMDir $INSTDIR
+
+ SetDetailsPrint both
+
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/nsDialogs/InstallOptions.nsi b/Engine/bin/tools/nsis/app/Examples/nsDialogs/InstallOptions.nsi
new file mode 100644
index 000000000..9fe173c51
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/nsDialogs/InstallOptions.nsi
@@ -0,0 +1,47 @@
+!include LogicLib.nsh
+!include WinMessages.nsh
+
+Name "nsDialogs IO"
+OutFile "nsDialogs IO.exe"
+
+Page custom nsDialogsIO UpdateINIState
+Page instfiles
+
+XPStyle on
+
+ShowInstDetails show
+
+!include nsDialogs.nsh
+!insertmacro NSD_FUNCTION_INIFILE
+
+Function nsDialogsIO
+
+ InitPluginsDir
+ File /oname=$PLUGINSDIR\io.ini "${NSISDIR}\Examples\InstallOptions\test.ini"
+
+ ${If} ${Cmd} `MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Test the right-to-left version?" IDYES`
+ WriteINIStr $PLUGINSDIR\io.ini Settings RTL 1
+ ${EndIf}
+
+ StrCpy $0 $PLUGINSDIR\io.ini
+
+ Call CreateDialogFromINI
+
+FunctionEnd
+
+Section
+
+ ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 2" "State"
+ DetailPrint "Install X=$0"
+ ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 3" "State"
+ DetailPrint "Install Y=$0"
+ ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 4" "State"
+ DetailPrint "Install Z=$0"
+ ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 5" "State"
+ DetailPrint "File=$0"
+ ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 6" "State"
+ DetailPrint "Dir=$0"
+ ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 8" "State"
+ DetailPrint "Info=$0"
+
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/nsDialogs/example.nsi b/Engine/bin/tools/nsis/app/Examples/nsDialogs/example.nsi
new file mode 100644
index 000000000..729918a4e
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/nsDialogs/example.nsi
@@ -0,0 +1,82 @@
+!include nsDialogs.nsh
+!include LogicLib.nsh
+
+Name "nsDialogs Example"
+OutFile "nsDialogs Example.exe"
+
+XPStyle on
+
+Page license
+Page custom nsDialogsPage
+
+Var BUTTON
+Var EDIT
+Var CHECKBOX
+
+Function nsDialogsPage
+
+ nsDialogs::Create 1018
+ Pop $0
+
+ GetFunctionAddress $0 OnBack
+ nsDialogs::OnBack $0
+
+ ${NSD_CreateButton} 0 0 100% 12u Test
+ Pop $BUTTON
+ GetFunctionAddress $0 OnClick
+ nsDialogs::OnClick $BUTTON $0
+
+ ${NSD_CreateText} 0 35 100% 12u hello
+ Pop $EDIT
+ GetFunctionAddress $0 OnChange
+ nsDialogs::OnChange $EDIT $0
+
+ ${NSD_CreateCheckbox} 0 -50 100% 8u Test
+ Pop $CHECKBOX
+ GetFunctionAddress $0 OnCheckbox
+ nsDialogs::OnClick $CHECKBOX $0
+
+ ${NSD_CreateLabel} 0 40u 75% 40u "* Type `hello there` above.$\n* Click the button.$\n* Check the checkbox.$\n* Hit the Back button."
+ Pop $0
+
+ nsDialogs::Show
+
+FunctionEnd
+
+Function OnClick
+
+ Pop $0 # HWND
+
+ MessageBox MB_OK clicky
+
+FunctionEnd
+
+Function OnChange
+
+ Pop $0 # HWND
+
+ System::Call user32::GetWindowText(i$EDIT,t.r0,i${NSIS_MAX_STRLEN})
+
+ ${If} $0 == "hello there"
+ MessageBox MB_OK "right back at ya"
+ ${EndIf}
+
+FunctionEnd
+
+Function OnBack
+
+ MessageBox MB_YESNO "are you sure?" IDYES +2
+ Abort
+
+FunctionEnd
+
+Function OnCheckbox
+
+ Pop $0 # HWND
+
+ MessageBox MB_OK "checkbox clicked"
+
+FunctionEnd
+
+Section
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/nsDialogs/timer.nsi b/Engine/bin/tools/nsis/app/Examples/nsDialogs/timer.nsi
new file mode 100644
index 000000000..cb6449f8b
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/nsDialogs/timer.nsi
@@ -0,0 +1,102 @@
+!include LogicLib.nsh
+!include nsDialogs.nsh
+
+Name "nsDialogs Timer Example"
+OutFile "nsDialogs Timer Example.exe"
+XPStyle on
+
+Var DIALOG
+Var TEXT
+Var PROGBAR
+Var PROGBAR2
+Var PROGBAR3
+Var BUTTON
+Var BUTTON2
+
+Page custom nsDialogsPage
+
+Function OnTimer
+
+ SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1
+ ${If} $1 = 100
+ SendMessage $PROGBAR ${PBM_SETPOS} 0 0
+ ${Else}
+ SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0
+ ${EndIf}
+
+FunctionEnd
+
+Function OnTimer2
+
+ SendMessage $PROGBAR2 ${PBM_GETPOS} 0 0 $1
+ ${If} $1 = 100
+ SendMessage $PROGBAR2 ${PBM_SETPOS} 0 0
+ ${Else}
+ SendMessage $PROGBAR2 ${PBM_DELTAPOS} 5 0
+ ${EndIf}
+
+FunctionEnd
+
+Function OnTimer3
+
+ SendMessage $PROGBAR3 ${PBM_GETPOS} 0 0 $1
+ ${If} $1 >= 100
+ ${NSD_KillTimer} OnTimer3
+ MessageBox MB_OK "Timer 3 killed"
+ ${Else}
+ SendMessage $PROGBAR3 ${PBM_DELTAPOS} 2 0
+ ${EndIf}
+
+FunctionEnd
+
+Function OnClick
+
+ Pop $0
+
+ ${NSD_KillTimer} OnTimer
+
+FunctionEnd
+
+Function OnClick2
+
+ Pop $0
+
+ ${NSD_KillTimer} OnTimer2
+
+FunctionEnd
+
+Function nsDialogsPage
+
+ nsDialogs::Create 1018
+ Pop $DIALOG
+
+ ${NSD_CreateLabel} 0u 0u 100% 9u "nsDialogs timer example"
+ Pop $TEXT
+
+ ${NSD_CreateProgressBar} 0u 10u 100% 12u ""
+ Pop $PROGBAR
+
+ ${NSD_CreateButton} 0u 25u 100u 14u "Kill Timer 1"
+ Pop $BUTTON
+ ${NSD_OnClick} $BUTTON OnClick
+
+ ${NSD_CreateProgressBar} 0u 52u 100% 12u ""
+ Pop $PROGBAR2
+
+ ${NSD_CreateButton} 0u 67u 100u 14u "Kill Timer 2"
+ Pop $BUTTON2
+ ${NSD_OnClick} $BUTTON2 OnClick2
+
+ ${NSD_CreateProgressBar} 0u 114u 100% 12u ""
+ Pop $PROGBAR3
+
+ ${NSD_CreateTimer} OnTimer 1000
+ ${NSD_CreateTimer} OnTimer2 100
+ ${NSD_CreateTimer} OnTimer3 200
+
+ nsDialogs::Show
+
+FunctionEnd
+
+Section
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/nsDialogs/welcome.nsi b/Engine/bin/tools/nsis/app/Examples/nsDialogs/welcome.nsi
new file mode 100644
index 000000000..7f0c255a3
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/nsDialogs/welcome.nsi
@@ -0,0 +1,320 @@
+!include MUI.nsh
+!include LogicLib.nsh
+!include WinMessages.nsh
+!include FileFunc.nsh
+
+Name "nsDialogs Welcome"
+OutFile "nsDialogs Welcome.exe"
+
+Page custom nsDialogsWelcome
+Page custom nsDialogsDirectory
+!insertmacro MUI_PAGE_INSTFILES
+
+!insertmacro MUI_LANGUAGE English
+
+!define WS_EX_CLIENTEDGE 0x00000200
+
+!define WS_CHILD 0x40000000
+!define WS_VISIBLE 0x10000000
+!define WS_DISABLED 0x08000000
+!define WS_CLIPSIBLINGS 0x04000000
+!define WS_MAXIMIZE 0x01000000
+!define WS_VSCROLL 0x00200000
+!define WS_HSCROLL 0x00100000
+!define WS_GROUP 0x00020000
+!define WS_TABSTOP 0x00010000
+
+!define ES_LEFT 0x00000000
+!define ES_CENTER 0x00000001
+!define ES_RIGHT 0x00000002
+!define ES_MULTILINE 0x00000004
+!define ES_UPPERCASE 0x00000008
+!define ES_LOWERCASE 0x00000010
+!define ES_PASSWORD 0x00000020
+!define ES_AUTOVSCROLL 0x00000040
+!define ES_AUTOHSCROLL 0x00000080
+!define ES_NOHIDESEL 0x00000100
+!define ES_OEMCONVERT 0x00000400
+!define ES_READONLY 0x00000800
+!define ES_WANTRETURN 0x00001000
+!define ES_NUMBER 0x00002000
+
+!define SS_LEFT 0x00000000
+!define SS_CENTER 0x00000001
+!define SS_RIGHT 0x00000002
+!define SS_ICON 0x00000003
+!define SS_BLACKRECT 0x00000004
+!define SS_GRAYRECT 0x00000005
+!define SS_WHITERECT 0x00000006
+!define SS_BLACKFRAME 0x00000007
+!define SS_GRAYFRAME 0x00000008
+!define SS_WHITEFRAME 0x00000009
+!define SS_USERITEM 0x0000000A
+!define SS_SIMPLE 0x0000000B
+!define SS_LEFTNOWORDWRAP 0x0000000C
+!define SS_OWNERDRAW 0x0000000D
+!define SS_BITMAP 0x0000000E
+!define SS_ENHMETAFILE 0x0000000F
+!define SS_ETCHEDHORZ 0x00000010
+!define SS_ETCHEDVERT 0x00000011
+!define SS_ETCHEDFRAME 0x00000012
+!define SS_TYPEMASK 0x0000001F
+!define SS_REALSIZECONTROL 0x00000040
+!define SS_NOPREFIX 0x00000080
+!define SS_NOTIFY 0x00000100
+!define SS_CENTERIMAGE 0x00000200
+!define SS_RIGHTJUST 0x00000400
+!define SS_REALSIZEIMAGE 0x00000800
+!define SS_SUNKEN 0x00001000
+!define SS_EDITCONTROL 0x00002000
+!define SS_ENDELLIPSIS 0x00004000
+!define SS_PATHELLIPSIS 0x00008000
+!define SS_WORDELLIPSIS 0x0000C000
+!define SS_ELLIPSISMASK 0x0000C000
+
+!define BS_PUSHBUTTON 0x00000000
+!define BS_DEFPUSHBUTTON 0x00000001
+!define BS_CHECKBOX 0x00000002
+!define BS_AUTOCHECKBOX 0x00000003
+!define BS_RADIOBUTTON 0x00000004
+!define BS_3STATE 0x00000005
+!define BS_AUTO3STATE 0x00000006
+!define BS_GROUPBOX 0x00000007
+!define BS_USERBUTTON 0x00000008
+!define BS_AUTORADIOBUTTON 0x00000009
+!define BS_PUSHBOX 0x0000000A
+!define BS_OWNERDRAW 0x0000000B
+!define BS_TYPEMASK 0x0000000F
+!define BS_LEFTTEXT 0x00000020
+!define BS_TEXT 0x00000000
+!define BS_ICON 0x00000040
+!define BS_BITMAP 0x00000080
+!define BS_LEFT 0x00000100
+!define BS_RIGHT 0x00000200
+!define BS_CENTER 0x00000300
+!define BS_TOP 0x00000400
+!define BS_BOTTOM 0x00000800
+!define BS_VCENTER 0x00000C00
+!define BS_PUSHLIKE 0x00001000
+!define BS_MULTILINE 0x00002000
+!define BS_NOTIFY 0x00004000
+!define BS_FLAT 0x00008000
+!define BS_RIGHTBUTTON ${BS_LEFTTEXT}
+
+!define LR_DEFAULTCOLOR 0x0000
+!define LR_MONOCHROME 0x0001
+!define LR_COLOR 0x0002
+!define LR_COPYRETURNORG 0x0004
+!define LR_COPYDELETEORG 0x0008
+!define LR_LOADFROMFILE 0x0010
+!define LR_LOADTRANSPARENT 0x0020
+!define LR_DEFAULTSIZE 0x0040
+!define LR_VGACOLOR 0x0080
+!define LR_LOADMAP3DCOLORS 0x1000
+!define LR_CREATEDIBSECTION 0x2000
+!define LR_COPYFROMRESOURCE 0x4000
+!define LR_SHARED 0x8000
+
+!define IMAGE_BITMAP 0
+!define IMAGE_ICON 1
+!define IMAGE_CURSOR 2
+!define IMAGE_ENHMETAFILE 3
+
+Var DIALOG
+Var HEADLINE
+Var TEXT
+Var IMAGECTL
+Var IMAGE
+Var DIRECTORY
+Var FREESPACE
+
+Var HEADLINE_FONT
+
+Function .onInit
+
+ CreateFont $HEADLINE_FONT "$(^Font)" "14" "700"
+
+ InitPluginsDir
+ File /oname=$PLUGINSDIR\welcome.bmp "${NSISDIR}\Contrib\Graphics\Wizard\orange-nsis.bmp"
+
+FunctionEnd
+
+Function HideControls
+
+ LockWindow on
+ GetDlgItem $0 $HWNDPARENT 1028
+ ShowWindow $0 ${SW_HIDE}
+
+ GetDlgItem $0 $HWNDPARENT 1256
+ ShowWindow $0 ${SW_HIDE}
+
+ GetDlgItem $0 $HWNDPARENT 1035
+ ShowWindow $0 ${SW_HIDE}
+
+ GetDlgItem $0 $HWNDPARENT 1037
+ ShowWindow $0 ${SW_HIDE}
+
+ GetDlgItem $0 $HWNDPARENT 1038
+ ShowWindow $0 ${SW_HIDE}
+
+ GetDlgItem $0 $HWNDPARENT 1039
+ ShowWindow $0 ${SW_HIDE}
+
+ GetDlgItem $0 $HWNDPARENT 1045
+ ShowWindow $0 ${SW_NORMAL}
+ LockWindow off
+
+FunctionEnd
+
+Function ShowControls
+
+ LockWindow on
+ GetDlgItem $0 $HWNDPARENT 1028
+ ShowWindow $0 ${SW_NORMAL}
+
+ GetDlgItem $0 $HWNDPARENT 1256
+ ShowWindow $0 ${SW_NORMAL}
+
+ GetDlgItem $0 $HWNDPARENT 1035
+ ShowWindow $0 ${SW_NORMAL}
+
+ GetDlgItem $0 $HWNDPARENT 1037
+ ShowWindow $0 ${SW_NORMAL}
+
+ GetDlgItem $0 $HWNDPARENT 1038
+ ShowWindow $0 ${SW_NORMAL}
+
+ GetDlgItem $0 $HWNDPARENT 1039
+ ShowWindow $0 ${SW_NORMAL}
+
+ GetDlgItem $0 $HWNDPARENT 1045
+ ShowWindow $0 ${SW_HIDE}
+ LockWindow off
+
+FunctionEnd
+
+Function nsDialogsWelcome
+
+ nsDialogs::Create 1044
+ Pop $DIALOG
+
+ nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_BITMAP} 0 0 0 109u 193u ""
+ Pop $IMAGECTL
+
+ StrCpy $0 $PLUGINSDIR\welcome.bmp
+ System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
+ Pop $IMAGE
+
+ SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE
+
+ nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 120u 10u -130u 20u "Welcome to nsDialogs!"
+ Pop $HEADLINE
+
+ SendMessage $HEADLINE ${WM_SETFONT} $HEADLINE_FONT 0
+
+ nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 120u 32u -130u -32u "nsDialogs is the next generation of user interfaces in NSIS. It gives the developer full control over custom pages. Some of the features include control text containing variables, callbacks directly into script functions and creation of any type of control. Create boring old edit boxes or load some external library and create custom controls with no need of creating your own plug-in.$\r$\n$\r$\nUnlike InstallOptions, nsDialogs doesn't use INI files to communicate with the script. By interacting directly with the script, nsDialogs can perform much faster without the need of costly, old and inefficient INI operations. Direct interaction also allows direct calls to functions defined in the script and removes the need of conversion functions like Io2Nsis.$\r$\n$\r$\nHit the Next button to see how it all fits into a mock directory page."
+ Pop $TEXT
+
+ SetCtlColors $DIALOG "" 0xffffff
+ SetCtlColors $HEADLINE "" 0xffffff
+ SetCtlColors $TEXT "" 0xffffff
+
+ Call HideControls
+
+ nsDialogs::Show
+
+ Call ShowControls
+
+ System::Call gdi32::DeleteObject(i$IMAGE)
+
+FunctionEnd
+
+!define SHACF_FILESYSTEM 1
+
+Function nsDialogsDirectory
+
+ !insertmacro MUI_HEADER_TEXT "Choose Install Location" "Choose the folder in which to install $(^NameDA)."
+
+ GetDlgItem $0 $HWNDPARENT 1
+ EnableWindow $0 0
+
+ nsDialogs::Create 1018
+ Pop $DIALOG
+
+ nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_CENTER} 0 0 0 100% 30 "Directory page"
+ Pop $HEADLINE
+
+ SendMessage $HEADLINE ${WM_SETFONT} $HEADLINE_FONT 0
+
+ nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 0 30 100% 40 "Select the installation directory of NSIS to continue. $_CLICK"
+ Pop $TEXT
+
+ nsDialogs::CreateControl EDIT ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${ES_AUTOHSCROLL}|${WS_TABSTOP} ${WS_EX_CLIENTEDGE} 0 75 100% 12u ""
+ Pop $DIRECTORY
+
+ SendMessage $HWNDPARENT ${WM_NEXTDLGCTL} $DIRECTORY 1
+
+ GetFunctionAddress $0 DirChange
+ nsDialogs::OnChange $DIRECTORY $0
+
+ System::Call shlwapi::SHAutoComplete(i$DIRECTORY,i${SHACF_FILESYSTEM})
+
+ nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 0 -10u 100% 10u ""
+ Pop $FREESPACE
+
+ Call UpdateFreeSpace
+
+ nsDialogs::Show
+
+FunctionEnd
+
+Function UpdateFreeSpace
+
+ ${GetRoot} $INSTDIR $0
+ StrCpy $1 " bytes"
+
+ System::Call kernel32::GetDiskFreeSpaceEx(tr0,*l,*l,*l.r0)
+
+ ${If} $0 > 1024
+ ${OrIf} $0 < 0
+ System::Int64Op $0 / 1024
+ Pop $0
+ StrCpy $1 "kb"
+ ${If} $0 > 1024
+ ${OrIf} $0 < 0
+ System::Int64Op $0 / 1024
+ Pop $0
+ StrCpy $1 "mb"
+ ${If} $0 > 1024
+ ${OrIf} $0 < 0
+ System::Int64Op $0 / 1024
+ Pop $0
+ StrCpy $1 "gb"
+ ${EndIf}
+ ${EndIf}
+ ${EndIf}
+
+ SendMessage $FREESPACE ${WM_SETTEXT} 0 "STR:Free space: $0$1"
+
+FunctionEnd
+
+Function DirChange
+
+ Pop $0 # dir hwnd
+
+ GetDlgItem $0 $HWNDPARENT 1
+
+ System::Call user32::GetWindowText(i$DIRECTORY,t.d,i${NSIS_MAX_STRLEN})
+
+ ${If} ${FileExists} $INSTDIR\makensis.exe
+ EnableWindow $0 1
+ ${Else}
+ EnableWindow $0 0
+ ${EndIf}
+
+ Call UpdateFreeSpace
+
+FunctionEnd
+
+Section
+SectionEnd
diff --git a/Engine/bin/tools/nsis/app/Examples/nsExec/test.nsi b/Engine/bin/tools/nsis/app/Examples/nsExec/test.nsi
new file mode 100644
index 000000000..5a0c9317d
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/nsExec/test.nsi
@@ -0,0 +1,31 @@
+Name "nsExec Test"
+
+OutFile "nsExec Test.exe"
+
+ShowInstDetails show
+
+Section "Silent MakeNSIS"
+ nsExec::Exec '"${NSISDIR}\makensis.exe"'
+ Pop $0 # return value/error/timeout
+ DetailPrint ""
+ DetailPrint " Return value: $0"
+ DetailPrint ""
+SectionEnd
+
+Section "MakeNSIS commands help"
+ nsExec::ExecToLog '"${NSISDIR}\makensis.exe" /CMDHELP'
+ Pop $0 # return value/error/timeout
+ DetailPrint ""
+ DetailPrint " Return value: $0"
+ DetailPrint ""
+SectionEnd
+
+Section "Output to variable"
+ nsExec::ExecToStack '"${NSISDIR}\makensis.exe" /VERSION'
+ Pop $0 # return value/error/timeout
+ Pop $1 # printed text, up to ${NSIS_MAX_STRLEN}
+ DetailPrint '"${NSISDIR}\makensis.exe" /VERSION printed: $1'
+ DetailPrint ""
+ DetailPrint " Return value: $0"
+ DetailPrint ""
+SectionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/one-section.nsi b/Engine/bin/tools/nsis/app/Examples/one-section.nsi
new file mode 100644
index 000000000..033ea0a65
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/one-section.nsi
@@ -0,0 +1,79 @@
+; one-section.nsi
+;
+; This example demonstrates how to control section selection.
+; It allows only one of the sections of a group to be selected.
+
+;--------------------------------
+
+; Section define/macro header file
+; See this header file for more info
+
+!include "Sections.nsh"
+
+;--------------------------------
+
+Name "One Section"
+OutFile "one-section.exe"
+RequestExecutionLevel user
+
+;--------------------------------
+
+; Pages
+
+Page components
+
+;--------------------------------
+
+; Sections
+
+Section !Required
+ SectionIn RO
+SectionEnd
+
+Section "Group 1 - Option 1" g1o1
+SectionEnd
+
+Section /o "Group 1 - Option 2" g1o2
+SectionEnd
+
+Section /o "Group 1 - Option 3" g1o3
+SectionEnd
+
+Section "Group 2 - Option 1" g2o1
+SectionEnd
+
+Section /o "Group 2 - Option 2" g2o2
+SectionEnd
+
+Section /o "Group 2 - Option 3" g2o3
+SectionEnd
+
+;--------------------------------
+
+; Functions
+
+; $1 stores the status of group 1
+; $2 stores the status of group 2
+
+Function .onInit
+
+ StrCpy $1 ${g1o1} ; Group 1 - Option 1 is selected by default
+ StrCpy $2 ${g2o1} ; Group 2 - Option 1 is selected by default
+
+FunctionEnd
+
+Function .onSelChange
+
+ !insertmacro StartRadioButtons $1
+ !insertmacro RadioButton ${g1o1}
+ !insertmacro RadioButton ${g1o2}
+ !insertmacro RadioButton ${g1o3}
+ !insertmacro EndRadioButtons
+
+ !insertmacro StartRadioButtons $2
+ !insertmacro RadioButton ${g2o1}
+ !insertmacro RadioButton ${g2o2}
+ !insertmacro RadioButton ${g2o3}
+ !insertmacro EndRadioButtons
+
+FunctionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/primes.nsi b/Engine/bin/tools/nsis/app/Examples/primes.nsi
new file mode 100644
index 000000000..08a2062d7
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/primes.nsi
@@ -0,0 +1,70 @@
+; primes.nsi
+;
+; This is an example of the possibities of the NSIS Script language.
+; It calculates prime numbers.
+
+;--------------------------------
+
+Name "primes"
+AllowRootDirInstall true
+OutFile "primes.exe"
+Caption "Prime number generator"
+ShowInstDetails show
+AllowRootDirInstall true
+InstallDir "$EXEDIR"
+RequestExecutionLevel user
+
+DirText "Select a directory to write primes.txt. $_CLICK"
+
+;--------------------------------
+
+;Pages
+
+Page directory
+Page instfiles
+
+;--------------------------------
+
+Section ""
+ SetOutPath $INSTDIR
+ Call DoPrimes
+SectionEnd
+
+;--------------------------------
+
+Function DoPrimes
+
+; we put this in here so it doesn't update the progress bar (faster)
+
+!define PPOS $0 ; position in prime searching
+!define PDIV $1 ; divisor
+!define PMOD $2 ; the result of the modulus
+!define PCNT $3 ; count of how many we've printed
+ FileOpen $9 $INSTDIR\primes.txt w
+
+ DetailPrint "2 is prime!"
+ FileWrite $9 "2 is prime!$\r$\n"
+ DetailPrint "3 is prime!"
+ FileWrite $9 "3 is prime!$\r$\n"
+ Strcpy ${PPOS} 3
+ Strcpy ${PCNT} 2
+outerloop:
+ StrCpy ${PDIV} 3
+ innerloop:
+ IntOp ${PMOD} ${PPOS} % ${PDIV}
+ IntCmp ${PMOD} 0 notprime
+ IntOp ${PDIV} ${PDIV} + 2
+ IntCmp ${PDIV} ${PPOS} 0 innerloop 0
+ DetailPrint "${PPOS} is prime!"
+ FileWrite $9 "${PPOS} is prime!$\r$\n"
+ IntOp ${PCNT} ${PCNT} + 1
+ IntCmp ${PCNT} 100 0 innerloop
+ StrCpy ${PCNT} 0
+ MessageBox MB_YESNO "Process more?" IDNO stop
+ notprime:
+ IntOp ${PPOS} ${PPOS} + 2
+ Goto outerloop
+ stop:
+ FileClose $9
+
+FunctionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/rtest.nsi b/Engine/bin/tools/nsis/app/Examples/rtest.nsi
new file mode 100644
index 000000000..e64cd72ef
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/rtest.nsi
@@ -0,0 +1,93 @@
+; rtest.nsi
+;
+; This script tests some advanced NSIS functions.
+
+;--------------------------------
+
+Name "rtest"
+OutFile "rtest.exe"
+
+ComponentText "Select tests!"
+ShowInstDetails show
+
+RequestExecutionLevel user
+
+;--------------------------------
+
+Section "Test 1"
+
+ StrCpy $R0 "a"
+
+ GetFunctionAddress $R1 test1
+ Call $R1
+
+ StrCmp $R0 "a182345678" success
+
+ DetailPrint "Test 1 failed (output: $R0)"
+ Goto end
+
+ success:
+ DetailPrint "Test 1 succeded (output: $R0)"
+
+ end:
+
+SectionEnd
+
+Function test1
+
+ GetLabelAddress $9 skip
+
+ IntOp $9 $9 - 1
+ StrCpy $R0 $R01
+
+ Call $9
+
+ StrCpy $R0 $R02
+ StrCpy $R0 $R03
+ StrCpy $R0 $R04
+ StrCpy $R0 $R05
+ StrCpy $R0 $R06
+ StrCpy $R0 $R07
+ StrCpy $R0 $R08
+
+ skip:
+
+FunctionEnd
+
+;--------------------------------
+
+Section "Test 2"
+
+ StrCpy $R0 "0"
+ StrCpy $R1 "11"
+
+ Call test2
+
+ StrCmp $R1 "11,10,9,8,7,6,5,4,3,2,1" success
+
+ DetailPrint "Test 2 failed (output: $R1)"
+ Goto end
+
+ success:
+ DetailPrint "Test 2 succeded (output: $R1)"
+
+ end:
+
+SectionEnd
+
+Function test2
+
+ IntOp $R0 $R0 + 1
+ IntCmp $R0 10 done
+
+ Push $R0
+
+ GetFunctionAddress $R2 test2
+ Call $R2
+
+ Pop $R0
+
+ done:
+ StrCpy $R1 "$R1,$R0"
+
+FunctionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/silent.nsi b/Engine/bin/tools/nsis/app/Examples/silent.nsi
new file mode 100644
index 000000000..d0492ce14
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/silent.nsi
@@ -0,0 +1,63 @@
+# This example shows how to handle silent installers.
+# In short, you need IfSilent and the /SD switch for MessageBox to make your installer
+# really silent when the /S switch is used.
+
+Name "Silent"
+OutFile "silent.exe"
+RequestExecutionLevel user
+
+# uncomment the following line to make the installer silent by default.
+; SilentInstall silent
+
+Function .onInit
+ # `/SD IDYES' tells MessageBox to automatically choose IDYES if the installer is silent
+ # in this case, the installer can only be silent if the user used the /S switch or if
+ # you've uncommented line number 5
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like the installer to be silent from now on?" \
+ /SD IDYES IDNO no IDYES yes
+
+ # SetSilent can only be used in .onInit and doesn't work well along with `SetSilent silent'
+
+ yes:
+ SetSilent silent
+ Goto done
+ no:
+ SetSilent normal
+ done:
+FunctionEnd
+
+Section
+ IfSilent 0 +2
+ MessageBox MB_OK|MB_ICONINFORMATION 'This is a "silent" installer'
+
+ # there is no need to use IfSilent for this one because the /SD switch takes care of that
+ MessageBox MB_OK|MB_ICONINFORMATION "This is not a silent installer" /SD IDOK
+
+ # when `SetOverwrite on' (which is the default) is used, the installer will show a message
+ # if it can't open a file for writing. On silent installers, the ignore option will be
+ # automatically selected. if `AllowSkipFiles off' (default is on) was used, there is no
+ # ignore option and the cancel option will be automatically selected.
+
+ # on is default
+ ; AllowSkipFiles on
+
+ # lock file
+ FileOpen $0 $TEMP\silentOverwrite w
+ # try to extract - will fail
+ File /oname=$TEMP\silentOverwrite silent.nsi
+ # unlcok
+ FileClose $0
+
+ # this will always show on silent installers because ignore is the option automatically
+ # selected when a file can't be opened for writing on a silent installer
+ MessageBox MB_OK|MB_ICONINFORMATION "This message box always shows if the installer is silent"
+
+ AllowSkipFiles off
+
+ # lock file
+ FileOpen $0 $TEMP\silentOverwrite w
+ # try to extract - will fail
+ File /oname=$TEMP\silentOverwrite silent.nsi
+ # unlcok
+ FileClose $0
+SectionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/viewhtml.nsi b/Engine/bin/tools/nsis/app/Examples/viewhtml.nsi
new file mode 100644
index 000000000..a3dc042c4
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/viewhtml.nsi
@@ -0,0 +1,53 @@
+; viewhtml.nsi
+;
+; This script creates a silent installer which extracts one (or more) HTML
+; files to a temporary directory, opens Internet Explorer to view the file(s),
+; and when Internet Explorer has quit, deletes the file(s).
+
+;--------------------------------
+
+; The name of the installer (not really used in a silent install)
+Name "ViewHTML"
+
+; Set to silent mode
+SilentInstall silent
+
+; The file to write
+OutFile "viewhtml.exe"
+
+; Request application privileges for Windows Vista
+RequestExecutionLevel user
+
+;--------------------------------
+
+; The stuff to install
+Section ""
+
+ ; Get a temporary filename (in the Windows Temp directory)
+ GetTempFileName $R0
+
+ ; Extract file
+ ; Lets skip this one, it's not built to be showin in IE
+ ; File /oname=$R0 "..\Menu\compiler.html"
+ ; and write our own! :)
+ FileOpen $0 $R0 "w"
+ FileWrite $0 "HTML page for viewhtml.nsi
"
+ FileClose $0
+
+ ; View file
+ ExecWait '"$PROGRAMFILES\Internet Explorer\iexplore.exe" "$R0"'
+
+ ; Note: another way of doing this would be to use ExecShell, but then you
+ ; really couldn't get away with deleting the files. Here is the ExecShell
+ ; line that you would want to use:
+ ;
+ ; ExecShell "open" '"$R0"'
+ ;
+ ; The advantage of this way is that it would use the default browser to
+ ; open the HTML.
+ ;
+
+ ; Delete the files (on reboot if file is in use)
+ Delete /REBOOTOK $R0
+
+SectionEnd
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Examples/waplugin.nsi b/Engine/bin/tools/nsis/app/Examples/waplugin.nsi
new file mode 100644
index 000000000..1c0c2928d
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Examples/waplugin.nsi
@@ -0,0 +1,205 @@
+; waplugin.nsi
+;
+; This script will generate an installer that installs a Winamp 2 plug-in.
+;
+; This installer will automatically alert the user that installation was
+; successful, and ask them whether or not they would like to make the
+; plug-in the default and run Winamp.
+
+;--------------------------------
+
+; Uncomment the next line to enable auto Winamp download
+; !define WINAMP_AUTOINSTALL
+
+; The name of the installer
+Name "TinyVis Plug-in"
+
+; The file to write
+OutFile "waplugin.exe"
+
+; The default installation directory
+InstallDir $PROGRAMFILES\Winamp
+
+; detect winamp path from uninstall string if available
+InstallDirRegKey HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" \
+ "UninstallString"
+
+; The text to prompt the user to enter a directory
+DirText "Please select your Winamp path below (you will be able to proceed when Winamp is detected):"
+# currently doesn't work - DirShow hide
+
+; automatically close the installer when done.
+AutoCloseWindow true
+
+; hide the "show details" box
+ShowInstDetails nevershow
+
+; Request application privileges for Windows Vista
+RequestExecutionLevel admin
+
+;--------------------------------
+
+;Pages
+
+Page directory
+Page instfiles
+
+;--------------------------------
+
+; The stuff to install
+
+Section ""
+
+!ifdef WINAMP_AUTOINSTALL
+ Call MakeSureIGotWinamp
+!endif
+
+ Call QueryWinampVisPath
+ SetOutPath $1
+
+ ; File to extract
+ #File "C:\program files\winamp\plugins\vis_nsfs.dll"
+ File /oname=vis_nsfs.dll "${NSISDIR}\Plugins\TypeLib.dll" # dummy plug-in
+
+ ; prompt user, and if they select no, go to NoWinamp
+ MessageBox MB_YESNO|MB_ICONQUESTION \
+ "The plug-in was installed. Would you like to run Winamp now with TinyVis as the default plug-in?" \
+ IDNO NoWinamp
+ WriteINIStr "$INSTDIR\Winamp.ini" "Winamp" "visplugin_name" "vis_nsfs.dll"
+ WriteINIStr "$INSTDIR\Winamp.ini" "Winamp" "visplugin_num" "0"
+ Exec '"$INSTDIR\Winamp.exe"'
+ NoWinamp:
+
+SectionEnd
+
+;--------------------------------
+
+Function .onVerifyInstDir
+
+!ifndef WINAMP_AUTOINSTALL
+
+ ;Check for Winamp installation
+
+ IfFileExists $INSTDIR\Winamp.exe Good
+ Abort
+ Good:
+
+!endif ; WINAMP_AUTOINSTALL
+
+FunctionEnd
+
+Function QueryWinampVisPath ; sets $1 with vis path
+
+ StrCpy $1 $INSTDIR\Plugins
+ ; use DSPDir instead of VISDir to get DSP plugins directory
+ ReadINIStr $9 $INSTDIR\winamp.ini Winamp VisDir
+ StrCmp $9 "" End
+ IfFileExists $9 0 End
+ StrCpy $1 $9 ; update dir
+ End:
+
+FunctionEnd
+
+!ifdef WINAMP_AUTOINSTALL
+
+Function GetWinampInstPath
+
+ Push $0
+ Push $1
+ Push $2
+ ReadRegStr $0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" \
+ "UninstallString"
+ StrCmp $0 "" fin
+
+ StrCpy $1 $0 1 0 ; get firstchar
+ StrCmp $1 '"' "" getparent
+ ; if first char is ", let's remove "'s first.
+ StrCpy $0 $0 "" 1
+ StrCpy $1 0
+ rqloop:
+ StrCpy $2 $0 1 $1
+ StrCmp $2 '"' rqdone
+ StrCmp $2 "" rqdone
+ IntOp $1 $1 + 1
+ Goto rqloop
+ rqdone:
+ StrCpy $0 $0 $1
+ getparent:
+ ; the uninstall string goes to an EXE, let's get the directory.
+ StrCpy $1 -1
+ gploop:
+ StrCpy $2 $0 1 $1
+ StrCmp $2 "" gpexit
+ StrCmp $2 "\" gpexit
+ IntOp $1 $1 - 1
+ Goto gploop
+ gpexit:
+ StrCpy $0 $0 $1
+
+ StrCmp $0 "" fin
+ IfFileExists $0\winamp.exe fin
+ StrCpy $0 ""
+ fin:
+ Pop $2
+ Pop $1
+ Exch $0
+
+FunctionEnd
+
+Function MakeSureIGotWinamp
+
+ Call GetWinampInstPath
+
+ Pop $0
+ StrCmp $0 "" getwinamp
+ Return
+
+ getwinamp:
+
+ Call ConnectInternet ;Make an internet connection (if no connection available)
+
+ StrCpy $2 "$TEMP\Winamp Installer.exe"
+ NSISdl::download http://download.nullsoft.com/winamp/client/winamp281_lite.exe $2
+ Pop $0
+ StrCmp $0 success success
+ SetDetailsView show
+ DetailPrint "download failed: $0"
+ Abort
+ success:
+ ExecWait '"$2" /S'
+ Delete $2
+ Call GetWinampInstPath
+ Pop $0
+ StrCmp $0 "" skip
+ StrCpy $INSTDIR $0
+ skip:
+
+FunctionEnd
+
+Function ConnectInternet
+
+ Push $R0
+
+ ClearErrors
+ Dialer::AttemptConnect
+ IfErrors noie3
+
+ Pop $R0
+ StrCmp $R0 "online" connected
+ MessageBox MB_OK|MB_ICONSTOP "Cannot connect to the internet."
+ Quit
+
+ noie3:
+
+ ; IE3 not installed
+ MessageBox MB_OK|MB_ICONINFORMATION "Please connect to the internet now."
+
+ connected:
+
+ Pop $R0
+
+FunctionEnd
+
+!endif ; WINAMP_AUTOINSTALL
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Include/Colors.nsh b/Engine/bin/tools/nsis/app/Include/Colors.nsh
new file mode 100644
index 000000000..64ca3a1e3
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/Colors.nsh
@@ -0,0 +1,75 @@
+!ifndef COLORS_NSH
+!define COLORS_NSH
+
+!verbose push
+!verbose 3
+
+# Squad
+# Rob Segal
+# Joel
+# Yathosho
+
+
+# Predefined HTML Hex colors
+!define WHITE "FFFFFF"
+!define BLACK "000000"
+!define YELLOW "FFFF00"
+!define RED "FF0000"
+!define GREEN "00FF00"
+!define BLUE "0000FF"
+!define MAGENTA "FF00FF"
+!define CYAN "00FFFF"
+
+# Function to convert red , green and blue integer values to HTML Hex format
+!define RGB '!insertmacro rgb2hex'
+
+# Function to convert red, green and blue integer values to Hexadecimal (0xRRGGBB) format
+!define HEX '!insertmacro rgb2hex2'
+
+# Function to get the r value from a RGB number
+!define GetRvalue '!insertmacro redvalue'
+
+# Function to get the g value from a RGB number
+!define GetGvalue '!insertmacro greenvalue'
+
+# Function to get the b value from a RGB number
+!define GetBvalue '!insertmacro bluevalue'
+
+# Function to get the r value from a Hex number
+!define GetRvalueX '!insertmacro bluevalue'
+
+# Function to get the g value from a Hex number
+!define GetGvalueX '!insertmacro greenvalue'
+
+# Function to get the r value from a HEX number
+!define GetBvalueX '!insertmacro redvalue'
+
+!macro rgb2hex output R G B
+IntFmt "${output}" "%02X" "${R}"
+IntFmt "${output}" "${output}%02X" "${G}"
+IntFmt "${output}" "${output}%02X" "${B}"
+!macroend
+
+!macro rgb2hex2 output R G B
+IntFmt "${output}" "%02X" "${B}"
+IntFmt "${output}" "${output}%02X" "${G}"
+IntFmt "${output}" "${output}%02X" "${R}"
+!macroend
+
+!macro redvalue output hexval
+StrCpy ${output} ${hexval} 2 0
+IntFmt "${output}" "%02i" "0x${output}"
+!macroend
+
+!macro greenvalue output hexval
+StrCpy ${output} ${hexval} 2 2
+IntFmt "${output}" "%02i" "0x${output}"
+!macroend
+
+!macro bluevalue output hexval
+StrCpy ${output} ${hexval} 2 4
+IntFmt "${output}" "%02i" "0x${output}"
+!macroend
+
+!verbose pop
+!endif
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Include/FileFunc.nsh b/Engine/bin/tools/nsis/app/Include/FileFunc.nsh
new file mode 100644
index 000000000..87195b8c4
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/FileFunc.nsh
@@ -0,0 +1,2017 @@
+/*
+_____________________________________________________________________________
+
+ File Functions Header v3.4
+_____________________________________________________________________________
+
+ 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
+
+ See documentation for more information about the following functions.
+
+ Usage in script:
+ 1. !include "FileFunc.nsh"
+ 2. [Section|Function]
+ ${FileFunction} "Param1" "Param2" "..." $var
+ [SectionEnd|FunctionEnd]
+
+
+ FileFunction=[Locate|GetSize|DriveSpace|GetDrives|GetTime|GetFileAttributes|
+ GetFileVersion|GetExeName|GetExePath|GetParameters|GetOptions|
+ GetOptionsS|GetRoot|GetParent|GetFileName|GetBaseName|GetFileExt|
+ BannerTrimPath|DirState|RefreshShellIcons]
+
+_____________________________________________________________________________
+
+ Thanks to:
+_____________________________________________________________________________
+
+GetSize
+ KiCHiK (Function "FindFiles")
+DriveSpace
+ sunjammer (Function "CheckSpaceFree")
+GetDrives
+ deguix (Based on his idea of Function "DetectDrives")
+GetTime
+ Takhir (Script "StatTest") and deguix (Function "FileModifiedDate")
+GetFileVersion
+ KiCHiK (Based on his example for command "GetDLLVersion")
+GetParameters
+ sunjammer (Based on his Function "GetParameters")
+GetRoot
+ KiCHiK (Based on his Function "GetRoot")
+GetParent
+ sunjammer (Based on his Function "GetParent")
+GetFileName
+ KiCHiK (Based on his Function "GetFileName")
+GetBaseName
+ comperio (Based on his idea of Function "GetBaseName")
+GetFileExt
+ opher (author)
+RefreshShellIcons
+ jerome tremblay (author)
+*/
+
+
+;_____________________________________________________________________________
+;
+; Macros
+;_____________________________________________________________________________
+;
+; Change log window verbosity (default: 3=no script)
+;
+; Example:
+; !include "FileFunc.nsh"
+; !insertmacro Locate
+; ${FILEFUNC_VERBOSE} 4 # all verbosity
+; !insertmacro VersionCompare
+; ${FILEFUNC_VERBOSE} 3 # no script
+
+!ifndef FILEFUNC_INCLUDED
+!define FILEFUNC_INCLUDED
+
+!include Util.nsh
+
+!verbose push
+!verbose 3
+!ifndef _FILEFUNC_VERBOSE
+ !define _FILEFUNC_VERBOSE 3
+!endif
+!verbose ${_FILEFUNC_VERBOSE}
+!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`
+!verbose pop
+
+!macro FILEFUNC_VERBOSE _VERBOSE
+ !verbose push
+ !verbose 3
+ !undef _FILEFUNC_VERBOSE
+ !define _FILEFUNC_VERBOSE ${_VERBOSE}
+ !verbose pop
+!macroend
+
+!macro LocateCall _PATH _OPTIONS _FUNC
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push $0
+ Push `${_PATH}`
+ Push `${_OPTIONS}`
+ GetFunctionAddress $0 `${_FUNC}`
+ Push `$0`
+ ${CallArtificialFunction} Locate_
+ Pop $0
+ !verbose pop
+!macroend
+
+!macro GetSizeCall _PATH _OPTIONS _RESULT1 _RESULT2 _RESULT3
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_PATH}`
+ Push `${_OPTIONS}`
+ ${CallArtificialFunction} GetSize_
+ Pop ${_RESULT1}
+ Pop ${_RESULT2}
+ Pop ${_RESULT3}
+ !verbose pop
+!macroend
+
+!macro DriveSpaceCall _DRIVE _OPTIONS _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_DRIVE}`
+ Push `${_OPTIONS}`
+ ${CallArtificialFunction} DriveSpace_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro GetDrivesCall _DRV _FUNC
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push $0
+ Push `${_DRV}`
+ GetFunctionAddress $0 `${_FUNC}`
+ Push `$0`
+ ${CallArtificialFunction} GetDrives_
+ Pop $0
+ !verbose pop
+!macroend
+
+!macro GetTimeCall _FILE _OPTION _RESULT1 _RESULT2 _RESULT3 _RESULT4 _RESULT5 _RESULT6 _RESULT7
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_FILE}`
+ Push `${_OPTION}`
+ ${CallArtificialFunction} GetTime_
+ Pop ${_RESULT1}
+ Pop ${_RESULT2}
+ Pop ${_RESULT3}
+ Pop ${_RESULT4}
+ Pop ${_RESULT5}
+ Pop ${_RESULT6}
+ Pop ${_RESULT7}
+ !verbose pop
+!macroend
+
+!macro GetFileAttributesCall _PATH _ATTR _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_PATH}`
+ Push `${_ATTR}`
+ ${CallArtificialFunction} GetFileAttributes_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro GetFileVersionCall _FILE _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_FILE}`
+ ${CallArtificialFunction} GetFileVersion_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro GetExeNameCall _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ ${CallArtificialFunction} GetExeName_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro GetExePathCall _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ ${CallArtificialFunction} GetExePath_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro GetParametersCall _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ ${CallArtificialFunction} GetParameters_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro GetOptionsCall _PARAMETERS _OPTION _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_PARAMETERS}`
+ Push `${_OPTION}`
+ ${CallArtificialFunction} GetOptions_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro GetOptionsSCall _PARAMETERS _OPTION _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_PARAMETERS}`
+ Push `${_OPTION}`
+ ${CallArtificialFunction} GetOptionsS_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro GetRootCall _FULLPATH _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_FULLPATH}`
+ ${CallArtificialFunction} GetRoot_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro GetParentCall _PATHSTRING _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_PATHSTRING}`
+ ${CallArtificialFunction} GetParent_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro GetFileNameCall _PATHSTRING _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_PATHSTRING}`
+ ${CallArtificialFunction} GetFileName_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro GetBaseNameCall _FILESTRING _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_FILESTRING}`
+ ${CallArtificialFunction} GetBaseName_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro GetFileExtCall _FILESTRING _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_FILESTRING}`
+ ${CallArtificialFunction} GetFileExt_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro BannerTrimPathCall _PATH _LENGHT _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_PATH}`
+ Push `${_LENGHT}`
+ ${CallArtificialFunction} BannerTrimPath_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro DirStateCall _PATH _RESULT
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ Push `${_PATH}`
+ ${CallArtificialFunction} DirState_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro RefreshShellIconsCall
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+ ${CallArtificialFunction} RefreshShellIcons_
+ !verbose pop
+!macroend
+
+!define Locate `!insertmacro LocateCall`
+!define un.Locate `!insertmacro LocateCall`
+
+!macro Locate
+!macroend
+
+!macro un.Locate
+!macroend
+
+!macro Locate_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $2
+ Exch
+ Exch $1
+ Exch
+ Exch 2
+ Exch $0
+ Exch 2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ Push $R6
+ Push $R7
+ Push $R8
+ Push $R9
+ ClearErrors
+
+ StrCpy $3 ''
+ StrCpy $4 ''
+ StrCpy $5 ''
+ StrCpy $6 ''
+ StrCpy $7 ''
+ StrCpy $8 0
+ StrCpy $R7 ''
+
+ StrCpy $R9 $0 1 -1
+ StrCmp $R9 '\' 0 +3
+ StrCpy $0 $0 -1
+ goto -3
+ IfFileExists '$0\*.*' 0 FileFunc_Locate_error
+
+ FileFunc_Locate_option:
+ StrCpy $R9 $1 1
+ StrCpy $1 $1 '' 1
+ StrCmp $R9 ' ' -2
+ StrCmp $R9 '' FileFunc_Locate_sizeset
+ StrCmp $R9 '/' 0 -4
+ StrCpy $9 -1
+ IntOp $9 $9 + 1
+ StrCpy $R9 $1 1 $9
+ StrCmp $R9 '' +2
+ StrCmp $R9 '/' 0 -3
+ StrCpy $R8 $1 $9
+ StrCpy $R8 $R8 '' 2
+ StrCpy $R9 $R8 '' -1
+ StrCmp $R9 ' ' 0 +3
+ StrCpy $R8 $R8 -1
+ goto -3
+ StrCpy $R9 $1 2
+ StrCpy $1 $1 '' $9
+
+ StrCmp $R9 'L=' 0 FileFunc_Locate_mask
+ StrCpy $3 $R8
+ StrCmp $3 '' +6
+ StrCmp $3 'FD' +5
+ StrCmp $3 'F' +4
+ StrCmp $3 'D' +3
+ StrCmp $3 'DE' +2
+ StrCmp $3 'FDE' 0 FileFunc_Locate_error
+ goto FileFunc_Locate_option
+
+ FileFunc_Locate_mask:
+ StrCmp $R9 'M=' 0 FileFunc_Locate_size
+ StrCpy $4 $R8
+ goto FileFunc_Locate_option
+
+ FileFunc_Locate_size:
+ StrCmp $R9 'S=' 0 FileFunc_Locate_gotosubdir
+ StrCpy $6 $R8
+ goto FileFunc_Locate_option
+
+ FileFunc_Locate_gotosubdir:
+ StrCmp $R9 'G=' 0 FileFunc_Locate_banner
+ StrCpy $7 $R8
+ StrCmp $7 '' +3
+ StrCmp $7 '1' +2
+ StrCmp $7 '0' 0 FileFunc_Locate_error
+ goto FileFunc_Locate_option
+
+ FileFunc_Locate_banner:
+ StrCmp $R9 'B=' 0 FileFunc_Locate_error
+ StrCpy $R7 $R8
+ StrCmp $R7 '' +3
+ StrCmp $R7 '1' +2
+ StrCmp $R7 '0' 0 FileFunc_Locate_error
+ goto FileFunc_Locate_option
+
+ FileFunc_Locate_sizeset:
+ StrCmp $6 '' FileFunc_Locate_default
+ StrCpy $9 0
+ StrCpy $R9 $6 1 $9
+ StrCmp $R9 '' +4
+ StrCmp $R9 ':' +3
+ IntOp $9 $9 + 1
+ goto -4
+ StrCpy $5 $6 $9
+ IntOp $9 $9 + 1
+ StrCpy $1 $6 1 -1
+ StrCpy $6 $6 -1 $9
+ StrCmp $5 '' +2
+ IntOp $5 $5 + 0
+ StrCmp $6 '' +2
+ IntOp $6 $6 + 0
+
+ StrCmp $1 'B' 0 +3
+ StrCpy $1 1
+ goto FileFunc_Locate_default
+ StrCmp $1 'K' 0 +3
+ StrCpy $1 1024
+ goto FileFunc_Locate_default
+ StrCmp $1 'M' 0 +3
+ StrCpy $1 1048576
+ goto FileFunc_Locate_default
+ StrCmp $1 'G' 0 FileFunc_Locate_error
+ StrCpy $1 1073741824
+
+ FileFunc_Locate_default:
+ StrCmp $3 '' 0 +2
+ StrCpy $3 'FD'
+ StrCmp $4 '' 0 +2
+ StrCpy $4 '*.*'
+ StrCmp $7 '' 0 +2
+ StrCpy $7 '1'
+ StrCmp $R7 '' 0 +2
+ StrCpy $R7 '0'
+ StrCpy $7 'G$7B$R7'
+
+ StrCpy $8 1
+ Push $0
+ SetDetailsPrint textonly
+
+ FileFunc_Locate_nextdir:
+ IntOp $8 $8 - 1
+ Pop $R8
+
+ StrCpy $9 $7 2 2
+ StrCmp $9 'B0' +3
+ GetLabelAddress $9 FileFunc_Locate_findfirst
+ goto call
+ DetailPrint 'Search in: $R8'
+
+ FileFunc_Locate_findfirst:
+ FindFirst $0 $R7 '$R8\$4'
+ IfErrors FileFunc_Locate_subdir
+ StrCmp $R7 '.' 0 FileFunc_Locate_dir
+ FindNext $0 $R7
+ StrCmp $R7 '..' 0 FileFunc_Locate_dir
+ FindNext $0 $R7
+ IfErrors 0 FileFunc_Locate_dir
+ FindClose $0
+ goto FileFunc_Locate_subdir
+
+ FileFunc_Locate_dir:
+ IfFileExists '$R8\$R7\*.*' 0 FileFunc_Locate_file
+ StrCpy $R6 ''
+ StrCmp $3 'DE' +4
+ StrCmp $3 'FDE' +3
+ StrCmp $3 'FD' FileFunc_Locate_precall
+ StrCmp $3 'F' FileFunc_Locate_findnext FileFunc_Locate_precall
+ FindFirst $9 $R9 '$R8\$R7\*.*'
+ StrCmp $R9 '.' 0 +4
+ FindNext $9 $R9
+ StrCmp $R9 '..' 0 +2
+ FindNext $9 $R9
+ FindClose $9
+ IfErrors FileFunc_Locate_precall FileFunc_Locate_findnext
+
+ FileFunc_Locate_file:
+ StrCmp $3 'FDE' +3
+ StrCmp $3 'FD' +2
+ StrCmp $3 'F' 0 FileFunc_Locate_findnext
+ StrCpy $R6 0
+ StrCmp $5$6 '' FileFunc_Locate_precall
+ FileOpen $9 '$R8\$R7' r
+ IfErrors +3
+ FileSeek $9 0 END $R6
+ FileClose $9
+ System::Int64Op $R6 / $1
+ Pop $R6
+ StrCmp $5 '' +2
+ IntCmp $R6 $5 0 FileFunc_Locate_findnext
+ StrCmp $6 '' +2
+ IntCmp $R6 $6 0 0 FileFunc_Locate_findnext
+
+ FileFunc_Locate_precall:
+ StrCpy $9 0
+ StrCpy $R9 '$R8\$R7'
+
+ call:
+ Push $0
+ Push $1
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ Push $R7
+ Push $R8
+ StrCmp $9 0 +4
+ StrCpy $R6 ''
+ StrCpy $R7 ''
+ StrCpy $R9 ''
+ Call $2
+ Pop $R9
+ Pop $R8
+ Pop $R7
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+
+ IfErrors 0 +3
+ FindClose $0
+ goto FileFunc_Locate_error
+ StrCmp $R9 'StopLocate' 0 +3
+ FindClose $0
+ goto FileFunc_Locate_clearstack
+ goto $9
+
+ FileFunc_Locate_findnext:
+ FindNext $0 $R7
+ IfErrors 0 FileFunc_Locate_dir
+ FindClose $0
+
+ FileFunc_Locate_subdir:
+ StrCpy $9 $7 2
+ StrCmp $9 'G0' FileFunc_Locate_end
+ FindFirst $0 $R7 '$R8\*.*'
+ StrCmp $R7 '.' 0 FileFunc_Locate_pushdir
+ FindNext $0 $R7
+ StrCmp $R7 '..' 0 FileFunc_Locate_pushdir
+ FindNext $0 $R7
+ IfErrors 0 FileFunc_Locate_pushdir
+ FindClose $0
+ StrCmp $8 0 FileFunc_Locate_end FileFunc_Locate_nextdir
+
+ FileFunc_Locate_pushdir:
+ IfFileExists '$R8\$R7\*.*' 0 +3
+ Push '$R8\$R7'
+ IntOp $8 $8 + 1
+ FindNext $0 $R7
+ IfErrors 0 FileFunc_Locate_pushdir
+ FindClose $0
+ StrCmp $8 0 FileFunc_Locate_end FileFunc_Locate_nextdir
+
+ FileFunc_Locate_error:
+ SetErrors
+
+ FileFunc_Locate_clearstack:
+ StrCmp $8 0 FileFunc_Locate_end
+ IntOp $8 $8 - 1
+ Pop $R8
+ goto FileFunc_Locate_clearstack
+
+ FileFunc_Locate_end:
+ SetDetailsPrint both
+ Pop $R9
+ Pop $R8
+ Pop $R7
+ Pop $R6
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+
+ !verbose pop
+!macroend
+
+!define GetSize `!insertmacro GetSizeCall`
+!define un.GetSize `!insertmacro GetSizeCall`
+
+!macro GetSize
+!macroend
+
+!macro un.GetSize
+!macroend
+
+!macro GetSize_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ Push $R3
+ Push $R4
+ Push $R5
+ Push $R6
+ Push $R7
+ Push $R8
+ Push $R9
+ ClearErrors
+
+ StrCpy $R9 $0 1 -1
+ StrCmp $R9 '\' 0 +3
+ StrCpy $0 $0 -1
+ goto -3
+ IfFileExists '$0\*.*' 0 FileFunc_GetSize_error
+
+ StrCpy $3 ''
+ StrCpy $4 ''
+ StrCpy $5 ''
+ StrCpy $6 ''
+ StrCpy $8 0
+ StrCpy $R3 ''
+ StrCpy $R4 ''
+ StrCpy $R5 ''
+
+ FileFunc_GetSize_option:
+ StrCpy $R9 $1 1
+ StrCpy $1 $1 '' 1
+ StrCmp $R9 ' ' -2
+ StrCmp $R9 '' FileFunc_GetSize_sizeset
+ StrCmp $R9 '/' 0 -4
+
+ StrCpy $9 -1
+ IntOp $9 $9 + 1
+ StrCpy $R9 $1 1 $9
+ StrCmp $R9 '' +2
+ StrCmp $R9 '/' 0 -3
+ StrCpy $8 $1 $9
+ StrCpy $8 $8 '' 2
+ StrCpy $R9 $8 '' -1
+ StrCmp $R9 ' ' 0 +3
+ StrCpy $8 $8 -1
+ goto -3
+ StrCpy $R9 $1 2
+ StrCpy $1 $1 '' $9
+
+ StrCmp $R9 'M=' 0 FileFunc_GetSize_size
+ StrCpy $4 $8
+ goto FileFunc_GetSize_option
+
+ FileFunc_GetSize_size:
+ StrCmp $R9 'S=' 0 FileFunc_GetSize_gotosubdir
+ StrCpy $6 $8
+ goto FileFunc_GetSize_option
+
+ FileFunc_GetSize_gotosubdir:
+ StrCmp $R9 'G=' 0 FileFunc_GetSize_error
+ StrCpy $7 $8
+ StrCmp $7 '' +3
+ StrCmp $7 '1' +2
+ StrCmp $7 '0' 0 FileFunc_GetSize_error
+ goto FileFunc_GetSize_option
+
+ FileFunc_GetSize_sizeset:
+ StrCmp $6 '' FileFunc_GetSize_default
+ StrCpy $9 0
+ StrCpy $R9 $6 1 $9
+ StrCmp $R9 '' +4
+ StrCmp $R9 ':' +3
+ IntOp $9 $9 + 1
+ goto -4
+ StrCpy $5 $6 $9
+ IntOp $9 $9 + 1
+ StrCpy $1 $6 1 -1
+ StrCpy $6 $6 -1 $9
+ StrCmp $5 '' +2
+ IntOp $5 $5 + 0
+ StrCmp $6 '' +2
+ IntOp $6 $6 + 0
+
+ StrCmp $1 'B' 0 +4
+ StrCpy $1 1
+ StrCpy $2 bytes
+ goto FileFunc_GetSize_default
+ StrCmp $1 'K' 0 +4
+ StrCpy $1 1024
+ StrCpy $2 Kb
+ goto FileFunc_GetSize_default
+ StrCmp $1 'M' 0 +4
+ StrCpy $1 1048576
+ StrCpy $2 Mb
+ goto FileFunc_GetSize_default
+ StrCmp $1 'G' 0 FileFunc_GetSize_error
+ StrCpy $1 1073741824
+ StrCpy $2 Gb
+
+ FileFunc_GetSize_default:
+ StrCmp $4 '' 0 +2
+ StrCpy $4 '*.*'
+ StrCmp $7 '' 0 +2
+ StrCpy $7 '1'
+
+ StrCpy $8 1
+ Push $0
+ SetDetailsPrint textonly
+
+ FileFunc_GetSize_nextdir:
+ IntOp $8 $8 - 1
+ Pop $R8
+ FindFirst $0 $R7 '$R8\$4'
+ IfErrors FileFunc_GetSize_show
+ StrCmp $R7 '.' 0 FileFunc_GetSize_dir
+ FindNext $0 $R7
+ StrCmp $R7 '..' 0 FileFunc_GetSize_dir
+ FindNext $0 $R7
+ IfErrors 0 FileFunc_GetSize_dir
+ FindClose $0
+ goto FileFunc_GetSize_show
+
+ FileFunc_GetSize_dir:
+ IfFileExists '$R8\$R7\*.*' 0 FileFunc_GetSize_file
+ IntOp $R5 $R5 + 1
+ goto FileFunc_GetSize_findnext
+
+ FileFunc_GetSize_file:
+ StrCpy $R6 0
+ StrCmp $5$6 '' 0 +3
+ IntOp $R4 $R4 + 1
+ goto FileFunc_GetSize_findnext
+ FileOpen $9 '$R8\$R7' r
+ IfErrors +3
+ FileSeek $9 0 END $R6
+ FileClose $9
+ StrCmp $5 '' +2
+ IntCmp $R6 $5 0 FileFunc_GetSize_findnext
+ StrCmp $6 '' +2
+ IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext
+ IntOp $R4 $R4 + 1
+ System::Int64Op $R3 + $R6
+ Pop $R3
+
+ FileFunc_GetSize_findnext:
+ FindNext $0 $R7
+ IfErrors 0 FileFunc_GetSize_dir
+ FindClose $0
+
+ FileFunc_GetSize_show:
+ StrCmp $5$6 '' FileFunc_GetSize_nosize
+ System::Int64Op $R3 / $1
+ Pop $9
+ DetailPrint 'Size:$9 $2 Files:$R4 Folders:$R5'
+ goto FileFunc_GetSize_subdir
+ FileFunc_GetSize_nosize:
+ DetailPrint 'Files:$R4 Folders:$R5'
+
+ FileFunc_GetSize_subdir:
+ StrCmp $7 0 FileFunc_GetSize_preend
+ FindFirst $0 $R7 '$R8\*.*'
+ StrCmp $R7 '.' 0 FileFunc_GetSize_pushdir
+ FindNext $0 $R7
+ StrCmp $R7 '..' 0 FileFunc_GetSize_pushdir
+ FindNext $0 $R7
+ IfErrors 0 FileFunc_GetSize_pushdir
+ FindClose $0
+ StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir
+
+ FileFunc_GetSize_pushdir:
+ IfFileExists '$R8\$R7\*.*' 0 +3
+ Push '$R8\$R7'
+ IntOp $8 $8 + 1
+ FindNext $0 $R7
+ IfErrors 0 FileFunc_GetSize_pushdir
+ FindClose $0
+ StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir
+
+ FileFunc_GetSize_preend:
+ StrCmp $R3 '' FileFunc_GetSize_nosizeend
+ System::Int64Op $R3 / $1
+ Pop $R3
+ FileFunc_GetSize_nosizeend:
+ StrCpy $2 $R4
+ StrCpy $1 $R5
+ StrCpy $0 $R3
+ goto FileFunc_GetSize_end
+
+ FileFunc_GetSize_error:
+ SetErrors
+ StrCpy $0 ''
+ StrCpy $1 ''
+ StrCpy $2 ''
+
+ FileFunc_GetSize_end:
+ SetDetailsPrint both
+ Pop $R9
+ Pop $R8
+ Pop $R7
+ Pop $R6
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Exch $2
+ Exch
+ Exch $1
+ Exch 2
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define DriveSpace `!insertmacro DriveSpaceCall`
+!define un.DriveSpace `!insertmacro DriveSpaceCall`
+
+!macro DriveSpace
+!macroend
+
+!macro un.DriveSpace
+!macroend
+
+!macro DriveSpace_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ ClearErrors
+
+ StrCpy $2 $0 1 -1
+ StrCmp $2 '\' 0 +3
+ StrCpy $0 $0 -1
+ goto -3
+ IfFileExists '$0\NUL' 0 FileFunc_DriveSpace_error
+
+ StrCpy $5 ''
+ StrCpy $6 ''
+
+ FileFunc_DriveSpace_option:
+ StrCpy $2 $1 1
+ StrCpy $1 $1 '' 1
+ StrCmp $2 ' ' -2
+ StrCmp $2 '' FileFunc_DriveSpace_default
+ StrCmp $2 '/' 0 -4
+ StrCpy $3 -1
+ IntOp $3 $3 + 1
+ StrCpy $2 $1 1 $3
+ StrCmp $2 '' +2
+ StrCmp $2 '/' 0 -3
+ StrCpy $4 $1 $3
+ StrCpy $4 $4 '' 2
+ StrCpy $2 $4 1 -1
+ StrCmp $2 ' ' 0 +3
+ StrCpy $4 $4 -1
+ goto -3
+ StrCpy $2 $1 2
+ StrCpy $1 $1 '' $3
+
+ StrCmp $2 'D=' 0 FileFunc_DriveSpace_unit
+ StrCpy $5 $4
+ StrCmp $5 '' +4
+ StrCmp $5 'T' +3
+ StrCmp $5 'O' +2
+ StrCmp $5 'F' 0 FileFunc_DriveSpace_error
+ goto FileFunc_DriveSpace_option
+
+ FileFunc_DriveSpace_unit:
+ StrCmp $2 'S=' 0 FileFunc_DriveSpace_error
+ StrCpy $6 $4
+ goto FileFunc_DriveSpace_option
+
+ FileFunc_DriveSpace_default:
+ StrCmp $5 '' 0 +2
+ StrCpy $5 'T'
+ StrCmp $6 '' 0 +3
+ StrCpy $6 '1'
+ goto FileFunc_DriveSpace_getspace
+
+ StrCmp $6 'B' 0 +3
+ StrCpy $6 1
+ goto FileFunc_DriveSpace_getspace
+ StrCmp $6 'K' 0 +3
+ StrCpy $6 1024
+ goto FileFunc_DriveSpace_getspace
+ StrCmp $6 'M' 0 +3
+ StrCpy $6 1048576
+ goto FileFunc_DriveSpace_getspace
+ StrCmp $6 'G' 0 FileFunc_DriveSpace_error
+ StrCpy $6 1073741824
+
+ FileFunc_DriveSpace_getspace:
+ System::Call 'kernel32::GetDiskFreeSpaceExA(t, *l, *l, *l)i(r0,.r2,.r3,.)'
+
+ StrCmp $5 T 0 +3
+ StrCpy $0 $3
+ goto FileFunc_DriveSpace_getsize
+ StrCmp $5 O 0 +4
+ System::Int64Op $3 - $2
+ Pop $0
+ goto FileFunc_DriveSpace_getsize
+ StrCmp $5 F 0 +2
+ StrCpy $0 $2
+
+ FileFunc_DriveSpace_getsize:
+ System::Int64Op $0 / $6
+ Pop $0
+ goto FileFunc_DriveSpace_end
+
+ FileFunc_DriveSpace_error:
+ SetErrors
+ StrCpy $0 ''
+
+ FileFunc_DriveSpace_end:
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define GetDrives `!insertmacro GetDrivesCall`
+!define un.GetDrives `!insertmacro GetDrivesCall`
+
+!macro GetDrives
+!macroend
+
+!macro un.GetDrives
+!macroend
+
+!macro GetDrives_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $8
+ Push $9
+
+ System::Alloc 1024
+ Pop $2
+ System::Call 'kernel32::GetLogicalDriveStringsA(i,i) i(1024, r2)'
+
+ StrCmp $0 ALL FileFunc_GetDrives_drivestring
+ StrCmp $0 '' 0 FileFunc_GetDrives_typeset
+ StrCpy $0 ALL
+ goto FileFunc_GetDrives_drivestring
+
+ FileFunc_GetDrives_typeset:
+ StrCpy $6 -1
+ IntOp $6 $6 + 1
+ StrCpy $8 $0 1 $6
+ StrCmp $8$0 '' FileFunc_GetDrives_enumex
+ StrCmp $8 '' +2
+ StrCmp $8 '+' 0 -4
+ StrCpy $8 $0 $6
+ IntOp $6 $6 + 1
+ StrCpy $0 $0 '' $6
+
+ StrCmp $8 'FDD' 0 +3
+ StrCpy $6 2
+ goto FileFunc_GetDrives_drivestring
+ StrCmp $8 'HDD' 0 +3
+ StrCpy $6 3
+ goto FileFunc_GetDrives_drivestring
+ StrCmp $8 'NET' 0 +3
+ StrCpy $6 4
+ goto FileFunc_GetDrives_drivestring
+ StrCmp $8 'CDROM' 0 +3
+ StrCpy $6 5
+ goto FileFunc_GetDrives_drivestring
+ StrCmp $8 'RAM' 0 FileFunc_GetDrives_typeset
+ StrCpy $6 6
+
+ FileFunc_GetDrives_drivestring:
+ StrCpy $3 $2
+
+ FileFunc_GetDrives_enumok:
+ System::Call 'kernel32::lstrlenA(t) i(i r3) .r4'
+ StrCmp $4$0 '0ALL' FileFunc_GetDrives_enumex
+ StrCmp $4 0 FileFunc_GetDrives_typeset
+ System::Call 'kernel32::GetDriveTypeA(t) i(i r3) .r5'
+
+ StrCmp $0 ALL +2
+ StrCmp $5 $6 FileFunc_GetDrives_letter FileFunc_GetDrives_enumnext
+ StrCmp $5 2 0 +3
+ StrCpy $8 FDD
+ goto FileFunc_GetDrives_letter
+ StrCmp $5 3 0 +3
+ StrCpy $8 HDD
+ goto FileFunc_GetDrives_letter
+ StrCmp $5 4 0 +3
+ StrCpy $8 NET
+ goto FileFunc_GetDrives_letter
+ StrCmp $5 5 0 +3
+ StrCpy $8 CDROM
+ goto FileFunc_GetDrives_letter
+ StrCmp $5 6 0 FileFunc_GetDrives_enumex
+ StrCpy $8 RAM
+
+ FileFunc_GetDrives_letter:
+ System::Call '*$3(&t1024 .r9)'
+
+ Push $0
+ Push $1
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $8
+ Call $1
+ Pop $9
+ Pop $8
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+ StrCmp $9 'StopGetDrives' FileFunc_GetDrives_enumex
+
+ FileFunc_GetDrives_enumnext:
+ IntOp $3 $3 + $4
+ IntOp $3 $3 + 1
+ goto FileFunc_GetDrives_enumok
+
+ FileFunc_GetDrives_enumex:
+ System::Free $2
+
+ Pop $9
+ Pop $8
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+
+ !verbose pop
+!macroend
+
+!define GetTime `!insertmacro GetTimeCall`
+!define un.GetTime `!insertmacro GetTimeCall`
+
+!macro GetTime
+!macroend
+
+!macro un.GetTime
+!macroend
+
+!macro GetTime_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ ClearErrors
+
+ StrCmp $1 'L' FileFunc_GetTime_gettime
+ StrCmp $1 'A' FileFunc_GetTime_getfile
+ StrCmp $1 'C' FileFunc_GetTime_getfile
+ StrCmp $1 'M' FileFunc_GetTime_getfile
+ StrCmp $1 'LS' FileFunc_GetTime_gettime
+ StrCmp $1 'AS' FileFunc_GetTime_getfile
+ StrCmp $1 'CS' FileFunc_GetTime_getfile
+ StrCmp $1 'MS' FileFunc_GetTime_getfile
+ goto FileFunc_GetTime_error
+
+ FileFunc_GetTime_getfile:
+ IfFileExists $0 0 FileFunc_GetTime_error
+ System::Call '*(i,l,l,l,i,i,i,i,&t260,&t14) i .r6'
+ System::Call 'kernel32::FindFirstFileA(t,i)i(r0,r6) .r2'
+ System::Call 'kernel32::FindClose(i)i(r2)'
+
+ FileFunc_GetTime_gettime:
+ System::Call '*(&i2,&i2,&i2,&i2,&i2,&i2,&i2,&i2) i .r7'
+ StrCmp $1 'L' 0 FileFunc_GetTime_systemtime
+ System::Call 'kernel32::GetLocalTime(i)i(r7)'
+ goto FileFunc_GetTime_convert
+ FileFunc_GetTime_systemtime:
+ StrCmp $1 'LS' 0 FileFunc_GetTime_filetime
+ System::Call 'kernel32::GetSystemTime(i)i(r7)'
+ goto FileFunc_GetTime_convert
+
+ FileFunc_GetTime_filetime:
+ System::Call '*$6(i,l,l,l,i,i,i,i,&t260,&t14)i(,.r4,.r3,.r2)'
+ System::Free $6
+ StrCmp $1 'A' 0 +3
+ StrCpy $2 $3
+ goto FileFunc_GetTime_tolocal
+ StrCmp $1 'C' 0 +3
+ StrCpy $2 $4
+ goto FileFunc_GetTime_tolocal
+ StrCmp $1 'M' FileFunc_GetTime_tolocal
+
+ StrCmp $1 'AS' FileFunc_GetTime_tosystem
+ StrCmp $1 'CS' 0 +3
+ StrCpy $3 $4
+ goto FileFunc_GetTime_tosystem
+ StrCmp $1 'MS' 0 +3
+ StrCpy $3 $2
+ goto FileFunc_GetTime_tosystem
+
+ FileFunc_GetTime_tolocal:
+ System::Call 'kernel32::FileTimeToLocalFileTime(*l,*l)i(r2,.r3)'
+ FileFunc_GetTime_tosystem:
+ System::Call 'kernel32::FileTimeToSystemTime(*l,i)i(r3,r7)'
+
+ FileFunc_GetTime_convert:
+ System::Call '*$7(&i2,&i2,&i2,&i2,&i2,&i2,&i2,&i2)i(.r5,.r6,.r4,.r0,.r3,.r2,.r1,)'
+ System::Free $7
+
+ IntCmp $0 9 0 0 +2
+ StrCpy $0 '0$0'
+ IntCmp $1 9 0 0 +2
+ StrCpy $1 '0$1'
+ IntCmp $2 9 0 0 +2
+ StrCpy $2 '0$2'
+ IntCmp $6 9 0 0 +2
+ StrCpy $6 '0$6'
+
+ StrCmp $4 0 0 +3
+ StrCpy $4 Sunday
+ goto FileFunc_GetTime_end
+ StrCmp $4 1 0 +3
+ StrCpy $4 Monday
+ goto FileFunc_GetTime_end
+ StrCmp $4 2 0 +3
+ StrCpy $4 Tuesday
+ goto FileFunc_GetTime_end
+ StrCmp $4 3 0 +3
+ StrCpy $4 Wednesday
+ goto FileFunc_GetTime_end
+ StrCmp $4 4 0 +3
+ StrCpy $4 Thursday
+ goto FileFunc_GetTime_end
+ StrCmp $4 5 0 +3
+ StrCpy $4 Friday
+ goto FileFunc_GetTime_end
+ StrCmp $4 6 0 FileFunc_GetTime_error
+ StrCpy $4 Saturday
+ goto FileFunc_GetTime_end
+
+ FileFunc_GetTime_error:
+ SetErrors
+ StrCpy $0 ''
+ StrCpy $1 ''
+ StrCpy $2 ''
+ StrCpy $3 ''
+ StrCpy $4 ''
+ StrCpy $5 ''
+ StrCpy $6 ''
+
+ FileFunc_GetTime_end:
+ Pop $7
+ Exch $6
+ Exch
+ Exch $5
+ Exch 2
+ Exch $4
+ Exch 3
+ Exch $3
+ Exch 4
+ Exch $2
+ Exch 5
+ Exch $1
+ Exch 6
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define GetFileAttributes `!insertmacro GetFileAttributesCall`
+!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`
+
+!macro GetFileAttributes
+!macroend
+
+!macro un.GetFileAttributes
+!macroend
+
+!macro GetFileAttributes_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+
+ System::Call 'kernel32::GetFileAttributes(t r0)i .r2'
+ StrCmp $2 -1 FileFunc_GetFileAttributes_error
+ StrCpy $3 ''
+
+ IntOp $0 $2 & 0x4000
+ IntCmp $0 0 +2
+ StrCpy $3 'ENCRYPTED|'
+
+ IntOp $0 $2 & 0x2000
+ IntCmp $0 0 +2
+ StrCpy $3 'NOT_CONTENT_INDEXED|$3'
+
+ IntOp $0 $2 & 0x1000
+ IntCmp $0 0 +2
+ StrCpy $3 'OFFLINE|$3'
+
+ IntOp $0 $2 & 0x0800
+ IntCmp $0 0 +2
+ StrCpy $3 'COMPRESSED|$3'
+
+ IntOp $0 $2 & 0x0400
+ IntCmp $0 0 +2
+ StrCpy $3 'REPARSE_POINT|$3'
+
+ IntOp $0 $2 & 0x0200
+ IntCmp $0 0 +2
+ StrCpy $3 'SPARSE_FILE|$3'
+
+ IntOp $0 $2 & 0x0100
+ IntCmp $0 0 +2
+ StrCpy $3 'TEMPORARY|$3'
+
+ IntOp $0 $2 & 0x0080
+ IntCmp $0 0 +2
+ StrCpy $3 'NORMAL|$3'
+
+ IntOp $0 $2 & 0x0040
+ IntCmp $0 0 +2
+ StrCpy $3 'DEVICE|$3'
+
+ IntOp $0 $2 & 0x0020
+ IntCmp $0 0 +2
+ StrCpy $3 'ARCHIVE|$3'
+
+ IntOp $0 $2 & 0x0010
+ IntCmp $0 0 +2
+ StrCpy $3 'DIRECTORY|$3'
+
+ IntOp $0 $2 & 0x0004
+ IntCmp $0 0 +2
+ StrCpy $3 'SYSTEM|$3'
+
+ IntOp $0 $2 & 0x0002
+ IntCmp $0 0 +2
+ StrCpy $3 'HIDDEN|$3'
+
+ IntOp $0 $2 & 0x0001
+ IntCmp $0 0 +2
+ StrCpy $3 'READONLY|$3'
+
+ StrCpy $0 $3 -1
+ StrCmp $1 '' FileFunc_GetFileAttributes_end
+ StrCmp $1 'ALL' FileFunc_GetFileAttributes_end
+
+ FileFunc_GetFileAttributes_attrcmp:
+ StrCpy $5 0
+ IntOp $5 $5 + 1
+ StrCpy $4 $1 1 $5
+ StrCmp $4 '' +2
+ StrCmp $4 '|' 0 -3
+ StrCpy $2 $1 $5
+ IntOp $5 $5 + 1
+ StrCpy $1 $1 '' $5
+ StrLen $3 $2
+ StrCpy $5 -1
+ IntOp $5 $5 + 1
+ StrCpy $4 $0 $3 $5
+ StrCmp $4 '' FileFunc_GetFileAttributes_notfound
+ StrCmp $4 $2 0 -3
+ StrCmp $1 '' 0 FileFunc_GetFileAttributes_attrcmp
+ StrCpy $0 1
+ goto FileFunc_GetFileAttributes_end
+
+ FileFunc_GetFileAttributes_notfound:
+ StrCpy $0 0
+ goto FileFunc_GetFileAttributes_end
+
+ FileFunc_GetFileAttributes_error:
+ SetErrors
+ StrCpy $0 ''
+
+ FileFunc_GetFileAttributes_end:
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define GetFileVersion `!insertmacro GetFileVersionCall`
+!define un.GetFileVersion `!insertmacro GetFileVersionCall`
+
+!macro GetFileVersion
+!macroend
+
+!macro un.GetFileVersion
+!macroend
+
+!macro GetFileVersion_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $0
+ Push $1
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ ClearErrors
+
+ GetDllVersion '$0' $1 $2
+ IfErrors FileFunc_GetFileVersion_error
+ IntOp $3 $1 >> 16
+ IntOp $3 $3 & 0x0000FFFF
+ IntOp $4 $1 & 0x0000FFFF
+ IntOp $5 $2 >> 16
+ IntOp $5 $5 & 0x0000FFFF
+ IntOp $6 $2 & 0x0000FFFF
+ StrCpy $0 '$3.$4.$5.$6'
+ goto FileFunc_GetFileVersion_end
+
+ FileFunc_GetFileVersion_error:
+ SetErrors
+ StrCpy $0 ''
+
+ FileFunc_GetFileVersion_end:
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define GetExeName `!insertmacro GetExeNameCall`
+!define un.GetExeName `!insertmacro GetExeNameCall`
+
+!macro GetExeName
+!macroend
+
+!macro un.GetExeName
+!macroend
+
+!macro GetExeName_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Push $0
+ Push $1
+ Push $2
+ System::Call 'kernel32::GetModuleFileNameA(i 0, t .r0, i 1024)'
+ System::Call 'kernel32::GetLongPathNameA(t r0, t .r1, i 1024)i .r2'
+ StrCmp $2 error +2
+ StrCpy $0 $1
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define GetExePath `!insertmacro GetExePathCall`
+!define un.GetExePath `!insertmacro GetExePathCall`
+
+!macro GetExePath
+!macroend
+
+!macro un.GetExePath
+!macroend
+
+!macro GetExePath_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Push $0
+ Push $1
+ Push $2
+ StrCpy $0 $EXEDIR
+ System::Call 'kernel32::GetLongPathNameA(t r0, t .r1, i 1024)i .r2'
+ StrCmp $2 error +2
+ StrCpy $0 $1
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define GetParameters `!insertmacro GetParametersCall`
+!define un.GetParameters `!insertmacro GetParametersCall`
+
+!macro GetParameters
+!macroend
+
+!macro un.GetParameters
+!macroend
+
+!macro GetParameters_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ ;cmdline-check
+ StrCmp $CMDLINE "" 0 +3
+ Push ""
+ Return
+
+ ;vars
+ Push $0 ;tmp
+ Push $1 ;length
+ Push $2 ;parameter offset
+ Push $3 ;separator
+
+ ;length/offset
+ StrLen $1 $CMDLINE
+ StrCpy $2 2 ;start with third character
+
+ ;separator
+ StrCpy $3 $CMDLINE 1 ;first character
+ StrCmp $3 '"' +2
+ StrCpy $3 ' '
+
+ FileFunc_GetParameters_token: ;finding second separator
+ IntCmp $2 $1 FileFunc_GetParameters_strip 0 FileFunc_GetParameters_strip
+ StrCpy $0 $CMDLINE 1 $2
+ IntOp $2 $2 + 1
+ StrCmp $3 $0 0 FileFunc_GetParameters_token
+
+ FileFunc_GetParameters_strip: ;strip white space
+ IntCmp $2 $1 FileFunc_GetParameters_copy 0 FileFunc_GetParameters_copy
+ StrCpy $0 $CMDLINE 1 $2
+ StrCmp $0 ' ' 0 FileFunc_GetParameters_copy
+ IntOp $2 $2 + 1
+ Goto FileFunc_GetParameters_strip
+
+ FileFunc_GetParameters_copy:
+ StrCpy $0 $CMDLINE "" $2
+
+ ;strip white spaces from end
+ FileFunc_GetParameters_rstrip:
+ StrCpy $1 $0 1 -1
+ StrCmp $1 ' ' 0 FileFunc_GetParameters_done
+ StrCpy $0 $0 -1
+ Goto FileFunc_GetParameters_rstrip
+
+ FileFunc_GetParameters_done:
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!macro GetOptionsBody _FILEFUNC_S
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ ClearErrors
+
+ StrCpy $2 $1 '' 1
+ StrCpy $1 $1 1
+ StrLen $3 $2
+ StrCpy $7 0
+
+ FileFunc_GetOptions${_FILEFUNC_S}_begin:
+ StrCpy $4 -1
+ StrCpy $6 ''
+
+ FileFunc_GetOptions${_FILEFUNC_S}_quote:
+ IntOp $4 $4 + 1
+ StrCpy $5 $0 1 $4
+ StrCmp${_FILEFUNC_S} $5$7 '0' FileFunc_GetOptions${_FILEFUNC_S}_notfound
+ StrCmp${_FILEFUNC_S} $5 '' FileFunc_GetOptions${_FILEFUNC_S}_trimright
+ StrCmp${_FILEFUNC_S} $5 '"' 0 +7
+ StrCmp${_FILEFUNC_S} $6 '' 0 +3
+ StrCpy $6 '"'
+ goto FileFunc_GetOptions${_FILEFUNC_S}_quote
+ StrCmp${_FILEFUNC_S} $6 '"' 0 +3
+ StrCpy $6 ''
+ goto FileFunc_GetOptions${_FILEFUNC_S}_quote
+ StrCmp${_FILEFUNC_S} $5 `'` 0 +7
+ StrCmp${_FILEFUNC_S} $6 `` 0 +3
+ StrCpy $6 `'`
+ goto FileFunc_GetOptions${_FILEFUNC_S}_quote
+ StrCmp${_FILEFUNC_S} $6 `'` 0 +3
+ StrCpy $6 ``
+ goto FileFunc_GetOptions${_FILEFUNC_S}_quote
+ StrCmp${_FILEFUNC_S} $5 '`' 0 +7
+ StrCmp${_FILEFUNC_S} $6 '' 0 +3
+ StrCpy $6 '`'
+ goto FileFunc_GetOptions${_FILEFUNC_S}_quote
+ StrCmp${_FILEFUNC_S} $6 '`' 0 +3
+ StrCpy $6 ''
+ goto FileFunc_GetOptions${_FILEFUNC_S}_quote
+ StrCmp${_FILEFUNC_S} $6 '"' FileFunc_GetOptions${_FILEFUNC_S}_quote
+ StrCmp${_FILEFUNC_S} $6 `'` FileFunc_GetOptions${_FILEFUNC_S}_quote
+ StrCmp${_FILEFUNC_S} $6 '`' FileFunc_GetOptions${_FILEFUNC_S}_quote
+ StrCmp${_FILEFUNC_S} $5 $1 0 FileFunc_GetOptions${_FILEFUNC_S}_quote
+ StrCmp${_FILEFUNC_S} $7 0 FileFunc_GetOptions${_FILEFUNC_S}_trimleft FileFunc_GetOptions${_FILEFUNC_S}_trimright
+
+ FileFunc_GetOptions${_FILEFUNC_S}_trimleft:
+ IntOp $4 $4 + 1
+ StrCpy $5 $0 $3 $4
+ StrCmp${_FILEFUNC_S} $5 '' FileFunc_GetOptions${_FILEFUNC_S}_notfound
+ StrCmp${_FILEFUNC_S} $5 $2 0 FileFunc_GetOptions${_FILEFUNC_S}_quote
+ IntOp $4 $4 + $3
+ StrCpy $0 $0 '' $4
+ StrCpy $4 $0 1
+ StrCmp${_FILEFUNC_S} $4 ' ' 0 +3
+ StrCpy $0 $0 '' 1
+ goto -3
+ StrCpy $7 1
+ goto FileFunc_GetOptions${_FILEFUNC_S}_begin
+
+ FileFunc_GetOptions${_FILEFUNC_S}_trimright:
+ StrCpy $0 $0 $4
+ StrCpy $4 $0 1 -1
+ StrCmp${_FILEFUNC_S} $4 ' ' 0 +3
+ StrCpy $0 $0 -1
+ goto -3
+ StrCpy $3 $0 1
+ StrCpy $4 $0 1 -1
+ StrCmp${_FILEFUNC_S} $3 $4 0 FileFunc_GetOptions${_FILEFUNC_S}_end
+ StrCmp${_FILEFUNC_S} $3 '"' +3
+ StrCmp${_FILEFUNC_S} $3 `'` +2
+ StrCmp${_FILEFUNC_S} $3 '`' 0 FileFunc_GetOptions${_FILEFUNC_S}_end
+ StrCpy $0 $0 -1 1
+ goto FileFunc_GetOptions${_FILEFUNC_S}_end
+
+ FileFunc_GetOptions${_FILEFUNC_S}_notfound:
+ SetErrors
+ StrCpy $0 ''
+
+ FileFunc_GetOptions${_FILEFUNC_S}_end:
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+!macroend
+
+!define GetOptions `!insertmacro GetOptionsCall`
+!define un.GetOptions `!insertmacro GetOptionsCall`
+
+!macro GetOptions
+!macroend
+
+!macro un.GetOptions
+!macroend
+
+!macro GetOptions_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ !insertmacro GetOptionsBody ''
+
+ !verbose pop
+!macroend
+
+!define GetOptionsS `!insertmacro GetOptionsSCall`
+!define un.GetOptionsS `!insertmacro GetOptionsSCall`
+
+!macro GetOptionsS
+!macroend
+
+!macro un.GetOptionsS
+!macroend
+
+!macro GetOptionsS_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ !insertmacro GetOptionsBody 'S'
+
+ !verbose pop
+!macroend
+
+!define GetRoot `!insertmacro GetRootCall`
+!define un.GetRoot `!insertmacro GetRootCall`
+
+!macro GetRoot
+!macroend
+
+!macro un.GetRoot
+!macroend
+
+!macro GetRoot_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $0
+ Push $1
+ Push $2
+ Push $3
+
+ StrCpy $1 $0 2
+ StrCmp $1 '\\' FileFunc_GetRoot_UNC
+ StrCpy $2 $1 1 1
+ StrCmp $2 ':' 0 FileFunc_GetRoot_empty
+ StrCpy $0 $1
+ goto FileFunc_GetRoot_end
+
+ FileFunc_GetRoot_UNC:
+ StrCpy $2 1
+ StrCpy $3 ''
+
+ FileFunc_GetRoot_loop:
+ IntOp $2 $2 + 1
+ StrCpy $1 $0 1 $2
+ StrCmp $1$3 '' FileFunc_GetRoot_empty
+ StrCmp $1 '' +5
+ StrCmp $1 '\' 0 FileFunc_GetRoot_loop
+ StrCmp $3 '1' +3
+ StrCpy $3 '1'
+ goto FileFunc_GetRoot_loop
+ StrCpy $0 $0 $2
+ StrCpy $2 $0 1 -1
+ StrCmp $2 '\' 0 FileFunc_GetRoot_end
+
+ FileFunc_GetRoot_empty:
+ StrCpy $0 ''
+
+ FileFunc_GetRoot_end:
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define GetParent `!insertmacro GetParentCall`
+!define un.GetParent `!insertmacro GetParentCall`
+
+!macro GetParent
+!macroend
+
+!macro un.GetParent
+!macroend
+
+!macro GetParent_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $0
+ Push $1
+ Push $2
+
+ StrCpy $2 $0 1 -1
+ StrCmp $2 '\' 0 +3
+ StrCpy $0 $0 -1
+ goto -3
+
+ StrCpy $1 0
+ IntOp $1 $1 - 1
+ StrCpy $2 $0 1 $1
+ StrCmp $2 '\' +2
+ StrCmp $2 '' 0 -3
+ StrCpy $0 $0 $1
+
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define GetFileName `!insertmacro GetFileNameCall`
+!define un.GetFileName `!insertmacro GetFileNameCall`
+
+!macro GetFileName
+!macroend
+
+!macro un.GetFileName
+!macroend
+
+!macro GetFileName_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $0
+ Push $1
+ Push $2
+
+ StrCpy $2 $0 1 -1
+ StrCmp $2 '\' 0 +3
+ StrCpy $0 $0 -1
+ goto -3
+
+ StrCpy $1 0
+ IntOp $1 $1 - 1
+ StrCpy $2 $0 1 $1
+ StrCmp $2 '' FileFunc_GetFileName_end
+ StrCmp $2 '\' 0 -3
+ IntOp $1 $1 + 1
+ StrCpy $0 $0 '' $1
+
+ FileFunc_GetFileName_end:
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define GetBaseName `!insertmacro GetBaseNameCall`
+!define un.GetBaseName `!insertmacro GetBaseNameCall`
+
+!macro GetBaseName
+!macroend
+
+!macro un.GetBaseName
+!macroend
+
+!macro GetBaseName_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $0
+ Push $1
+ Push $2
+ Push $3
+
+ StrCpy $1 0
+ StrCpy $3 ''
+
+ FileFunc_GetBaseName_loop:
+ IntOp $1 $1 - 1
+ StrCpy $2 $0 1 $1
+ StrCmp $2 '' FileFunc_GetBaseName_trimpath
+ StrCmp $2 '\' FileFunc_GetBaseName_trimpath
+ StrCmp $3 'noext' FileFunc_GetBaseName_loop
+ StrCmp $2 '.' 0 FileFunc_GetBaseName_loop
+ StrCpy $0 $0 $1
+ StrCpy $3 'noext'
+ StrCpy $1 0
+ goto FileFunc_GetBaseName_loop
+
+ FileFunc_GetBaseName_trimpath:
+ StrCmp $1 -1 FileFunc_GetBaseName_empty
+ IntOp $1 $1 + 1
+ StrCpy $0 $0 '' $1
+ goto FileFunc_GetBaseName_end
+
+ FileFunc_GetBaseName_empty:
+ StrCpy $0 ''
+
+ FileFunc_GetBaseName_end:
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define GetFileExt `!insertmacro GetFileExtCall`
+!define un.GetFileExt `!insertmacro GetFileExtCall`
+
+!macro GetFileExt
+!macroend
+
+!macro un.GetFileExt
+!macroend
+
+!macro GetFileExt_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $0
+ Push $1
+ Push $2
+
+ StrCpy $1 0
+
+ FileFunc_GetFileExt_loop:
+ IntOp $1 $1 - 1
+ StrCpy $2 $0 1 $1
+ StrCmp $2 '' FileFunc_GetFileExt_empty
+ StrCmp $2 '\' FileFunc_GetFileExt_empty
+ StrCmp $2 '.' 0 FileFunc_GetFileExt_loop
+
+ StrCmp $1 -1 FileFunc_GetFileExt_empty
+ IntOp $1 $1 + 1
+ StrCpy $0 $0 '' $1
+ goto FileFunc_GetFileExt_end
+
+ FileFunc_GetFileExt_empty:
+ StrCpy $0 ''
+
+ FileFunc_GetFileExt_end:
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define BannerTrimPath `!insertmacro BannerTrimPathCall`
+!define un.BannerTrimPath `!insertmacro BannerTrimPathCall`
+
+!macro BannerTrimPath
+!macroend
+
+!macro un.BannerTrimPath
+!macroend
+
+!macro BannerTrimPath_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+
+ StrCpy $3 $1 1 -1
+ IntOp $1 $1 + 0
+ StrLen $2 $0
+ IntCmp $2 $1 FileFunc_BannerTrimPath_end FileFunc_BannerTrimPath_end
+ IntOp $1 $1 - 3
+ IntCmp $1 0 FileFunc_BannerTrimPath_empty FileFunc_BannerTrimPath_empty
+ StrCmp $3 'A' FileFunc_BannerTrimPath_A-trim
+ StrCmp $3 'B' FileFunc_BannerTrimPath_B-trim
+ StrCmp $3 'C' FileFunc_BannerTrimPath_C-trim
+ StrCmp $3 'D' FileFunc_BannerTrimPath_D-trim
+
+ FileFunc_BannerTrimPath_A-trim:
+ StrCpy $3 $0 1 1
+ StrCpy $2 0
+ StrCmp $3 ':' 0 +2
+ IntOp $2 $2 + 2
+
+ FileFunc_BannerTrimPath_loopleft:
+ IntOp $2 $2 + 1
+ StrCpy $3 $0 1 $2
+ StrCmp $2 $1 FileFunc_BannerTrimPath_C-trim
+ StrCmp $3 '\' 0 FileFunc_BannerTrimPath_loopleft
+ StrCpy $3 $0 $2
+ IntOp $2 $2 - $1
+ IntCmp $2 0 FileFunc_BannerTrimPath_B-trim 0 FileFunc_BannerTrimPath_B-trim
+
+ FileFunc_BannerTrimPath_loopright:
+ IntOp $2 $2 + 1
+ StrCpy $4 $0 1 $2
+ StrCmp $2 0 FileFunc_BannerTrimPath_B-trim
+ StrCmp $4 '\' 0 FileFunc_BannerTrimPath_loopright
+ StrCpy $4 $0 '' $2
+ StrCpy $0 '$3\...$4'
+ goto FileFunc_BannerTrimPath_end
+
+ FileFunc_BannerTrimPath_B-trim:
+ StrCpy $2 $1
+ IntOp $2 $2 - 1
+ StrCmp $2 -1 FileFunc_BannerTrimPath_C-trim
+ StrCpy $3 $0 1 $2
+ StrCmp $3 '\' 0 -3
+ StrCpy $0 $0 $2
+ StrCpy $0 '$0\...'
+ goto FileFunc_BannerTrimPath_end
+
+ FileFunc_BannerTrimPath_C-trim:
+ StrCpy $0 $0 $1
+ StrCpy $0 '$0...'
+ goto FileFunc_BannerTrimPath_end
+
+ FileFunc_BannerTrimPath_D-trim:
+ StrCpy $3 -1
+ IntOp $3 $3 - 1
+ StrCmp $3 -$2 FileFunc_BannerTrimPath_C-trim
+ StrCpy $4 $0 1 $3
+ StrCmp $4 '\' 0 -3
+ StrCpy $4 $0 '' $3
+ IntOp $3 $1 + $3
+ IntCmp $3 2 FileFunc_BannerTrimPath_C-trim FileFunc_BannerTrimPath_C-trim
+ StrCpy $0 $0 $3
+ StrCpy $0 '$0...$4'
+ goto FileFunc_BannerTrimPath_end
+
+ FileFunc_BannerTrimPath_empty:
+ StrCpy $0 ''
+
+ FileFunc_BannerTrimPath_end:
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define DirState `!insertmacro DirStateCall`
+!define un.DirState `!insertmacro DirStateCall`
+
+!macro DirState
+!macroend
+
+!macro un.DirState
+!macroend
+
+!macro DirState_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ Exch $0
+ Push $1
+ ClearErrors
+
+ FindFirst $1 $0 '$0\*.*'
+ IfErrors 0 +3
+ StrCpy $0 -1
+ goto FileFunc_DirState_end
+ StrCmp $0 '.' 0 +4
+ FindNext $1 $0
+ StrCmp $0 '..' 0 +2
+ FindNext $1 $0
+ FindClose $1
+ IfErrors 0 +3
+ StrCpy $0 0
+ goto FileFunc_DirState_end
+ StrCpy $0 1
+
+ FileFunc_DirState_end:
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define RefreshShellIcons `!insertmacro RefreshShellIconsCall`
+!define un.RefreshShellIcons `!insertmacro RefreshShellIconsCall`
+
+!macro RefreshShellIcons
+!macroend
+
+!macro un.RefreshShellIcons
+!macroend
+
+!macro RefreshShellIcons_
+ !verbose push
+ !verbose ${_FILEFUNC_VERBOSE}
+
+ System::Call 'shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)'
+
+ !verbose pop
+!macroend
+
+!endif
diff --git a/Engine/bin/tools/nsis/app/Include/InstallOptions.nsh b/Engine/bin/tools/nsis/app/Include/InstallOptions.nsh
new file mode 100644
index 000000000..9d0c15b31
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/InstallOptions.nsh
@@ -0,0 +1,240 @@
+/*
+
+InstallOptions.nsh
+Macros and conversion functions for InstallOptions
+
+*/
+
+!ifndef ___NSIS__INSTALL_OPTIONS__NSH___
+!define ___NSIS__INSTALL_OPTIONS__NSH___
+
+!include LogicLib.nsh
+
+!macro INSTALLOPTIONS_FUNCTION_READ_CONVERT
+ !insertmacro INSTALLOPTIONS_FUNCTION_IO2NSIS ""
+!macroend
+
+!macro INSTALLOPTIONS_UNFUNCTION_READ_CONVERT
+ !insertmacro INSTALLOPTIONS_FUNCTION_IO2NSIS un.
+!macroend
+
+!macro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT
+ !insertmacro INSTALLOPTIONS_FUNCTION_NSIS2IO ""
+!macroend
+
+!macro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT
+ !insertmacro INSTALLOPTIONS_FUNCTION_NSIS2IO un.
+!macroend
+
+!macro INSTALLOPTIONS_FUNCTION_NSIS2IO UNINSTALLER_FUNCPREFIX
+
+ ; Convert an NSIS string to a form suitable for use by InstallOptions
+ ; Usage:
+ ; Push
+ ; Call Nsis2Io
+ ; Pop
+
+ Function ${UNINSTALLER_FUNCPREFIX}Nsis2Io
+
+ Exch $0 ; The source
+ Push $1 ; The output
+ Push $2 ; Temporary char
+ Push $3 ; Length
+ Push $4 ; Loop index
+ StrCpy $1 "" ; Initialise the output
+
+ StrLen $3 $0
+ IntOp $3 $3 - 1
+
+ ${For} $4 0 $3
+ StrCpy $2 $0 1 $4
+ ${If} $2 == '\'
+ StrCpy $2 '\\'
+ ${ElseIf} $2 == '$\r'
+ StrCpy $2 '\r'
+ ${ElseIf} $2 == '$\n'
+ StrCpy $2 '\n'
+ ${ElseIf} $2 == '$\t'
+ StrCpy $2 '\t'
+ ${EndIf}
+ StrCpy $1 $1$2
+ ${Next}
+
+ StrCpy $0 $1
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+ FunctionEnd
+
+!macroend
+
+!macro INSTALLOPTIONS_FUNCTION_IO2NSIS UNINSTALLER_FUNCPREFIX
+
+ ; Convert an InstallOptions string to a form suitable for use by NSIS
+ ; Usage:
+ ; Push
+ ; Call Io2Nsis
+ ; Pop
+
+ Function ${UNINSTALLER_FUNCPREFIX}Io2Nsis
+
+ Exch $0 ; The source
+ Push $1 ; The output
+ Push $2 ; Temporary char
+ Push $3 ; Length
+ Push $4 ; Loop index
+ StrCpy $1 "" ; Initialise the output
+
+ StrLen $3 $0
+ IntOp $3 $3 - 1
+
+ ${For} $4 0 $3
+ StrCpy $2 $0 2 $4
+ ${If} $2 == '\\'
+ StrCpy $2 '\'
+ IntOp $4 $4 + 1
+ ${ElseIf} $2 == '\r'
+ StrCpy $2 '$\r'
+ IntOp $4 $4 + 1
+ ${ElseIf} $2 == '\n'
+ StrCpy $2 '$\n'
+ IntOp $4 $4 + 1
+ ${ElseIf} $2 == '\t'
+ StrCpy $2 '$\t'
+ IntOp $4 $4 + 1
+ ${EndIf}
+ StrCpy $2 $2 1
+ StrCpy $1 $1$2
+ ${Next}
+
+ StrCpy $0 $1
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+ FunctionEnd
+
+!macroend
+
+!macro INSTALLOPTIONS_EXTRACT FILE
+
+ InitPluginsDir
+ File "/oname=$PLUGINSDIR\${FILE}" "${FILE}"
+ !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "Settings" "RTL" "$(^RTL)"
+
+ !verbose pop
+
+!macroend
+
+!macro INSTALLOPTIONS_EXTRACT_AS FILE FILENAME
+
+ InitPluginsDir
+ File "/oname=$PLUGINSDIR\${FILENAME}" "${FILE}"
+ !insertmacro INSTALLOPTIONS_WRITE "${FILENAME}" "Settings" "RTL" "$(^RTL)"
+
+!macroend
+
+!macro INSTALLOPTIONS_DISPLAY FILE
+
+ Push $0
+
+ InstallOptions::dialog "$PLUGINSDIR\${FILE}"
+ Pop $0
+
+ Pop $0
+
+!macroend
+
+!macro INSTALLOPTIONS_DISPLAY_RETURN FILE
+
+ InstallOptions::dialog "$PLUGINSDIR\${FILE}"
+
+!macroend
+
+!macro INSTALLOPTIONS_INITDIALOG FILE
+
+ InstallOptions::initDialog "$PLUGINSDIR\${FILE}"
+
+!macroend
+
+!macro INSTALLOPTIONS_SHOW
+
+ Push $0
+
+ InstallOptions::show
+ Pop $0
+
+ Pop $0
+
+!macroend
+
+!macro INSTALLOPTIONS_SHOW_RETURN
+
+ InstallOptions::show
+
+!macroend
+
+!macro INSTALLOPTIONS_READ VAR FILE SECTION KEY
+
+ ReadIniStr ${VAR} "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}"
+
+!macroend
+
+!macro INSTALLOPTIONS_WRITE FILE SECTION KEY VALUE
+
+ WriteIniStr "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" "${VALUE}"
+
+!macroend
+
+!macro INSTALLOPTIONS_READ_CONVERT VAR FILE SECTION KEY
+
+ ReadIniStr ${VAR} "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}"
+ Push ${VAR}
+ Call Io2Nsis
+ Pop ${VAR}
+
+!macroend
+
+!macro INSTALLOPTIONS_READ_UNCONVERT VAR FILE SECTION KEY
+
+ ReadIniStr ${VAR} "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}"
+ Push ${VAR}
+ Call un.Io2Nsis
+ Pop ${VAR}
+
+!macroend
+
+!macro INSTALLOPTIONS_WRITE_CONVERT FILE SECTION KEY VALUE
+
+ Push $0
+ StrCpy $0 "${VALUE}"
+ Push $0
+ Call Nsis2Io
+ Pop $0
+
+ WriteIniStr "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" $0
+
+ Pop $0
+
+!macroend
+
+!macro INSTALLOPTIONS_WRITE_UNCONVERT FILE SECTION KEY VALUE
+
+ Push $0
+ StrCpy $0 "${VALUE}"
+ Push $0
+ Call un.Nsis2Io
+ Pop $0
+
+ WriteIniStr "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" $0
+
+ Pop $0
+
+!macroend
+
+!endif # ___NSIS__INSTALL_OPTIONS__NSH___
diff --git a/Engine/bin/tools/nsis/app/Include/LangFile.nsh b/Engine/bin/tools/nsis/app/Include/LangFile.nsh
new file mode 100644
index 000000000..821bb2947
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/LangFile.nsh
@@ -0,0 +1,133 @@
+/*
+
+LangFile.nsh
+
+Header file to create langauge files that can be
+included with a single command.
+
+Copyright 2008-2009 Joost Verburg
+
+* Either LANGFILE_INCLUDE or LANGFILE_INCLUDE_WITHDEFAULT
+ can be called from the script to include a language
+ file.
+
+ - LANGFILE_INCLUDE takes the language file name as parameter.
+ - LANGFILE_INCLUDE_WITHDEFAULT takes as additional second
+ parameter the default language file to load missing strings
+ from.
+
+* A language file start with:
+ !insertmacro LANGFILE_EXT "English"
+ using the same name as the standard NSIS language file.
+
+* Language strings in the language file have the format:
+ ${LangFileString} LANGSTRING_NAME "Text"
+
+*/
+
+!ifndef LANGFILE_INCLUDED
+!define LANGFILE_INCLUDED
+
+!macro LANGFILE_INCLUDE FILENAME
+
+ ;Called from script: include a langauge file
+
+ !ifdef LangFileString
+ !undef LangFileString
+ !endif
+
+ !define LangFileString "!insertmacro LANGFILE_SETSTRING"
+
+ !define LANGFILE_SETNAMES
+ !include "${FILENAME}"
+ !undef LANGFILE_SETNAMES
+
+ ;Create language strings
+
+ !undef LangFileString
+ !define LangFileString "!insertmacro LANGFILE_LANGSTRING"
+ !include "${FILENAME}"
+
+!macroend
+
+!macro LANGFILE_INCLUDE_WITHDEFAULT FILENAME FILENAME_DEFAULT
+
+ ;Called from script: include a langauge file
+ ;Obtains missing strings from a default file
+
+ !ifdef LangFileString
+ !undef LangFileString
+ !endif
+
+ !define LangFileString "!insertmacro LANGFILE_SETSTRING"
+
+ !define LANGFILE_SETNAMES
+ !include "${FILENAME}"
+ !undef LANGFILE_SETNAMES
+
+ ;Include default language for missing strings
+ !include "${FILENAME_DEFAULT}"
+
+ ;Create language strings
+ !undef LangFileString
+ !define LangFileString "!insertmacro LANGFILE_LANGSTRING"
+ !include "${FILENAME_DEFAULT}"
+
+!macroend
+
+!macro LANGFILE IDNAME NAME
+
+ ;Start of standard NSIS language file
+
+ !ifdef LANGFILE_SETNAMES
+
+ !ifdef LANGFILE_IDNAME
+ !undef LANGFILE_IDNAME
+ !endif
+
+ !define LANGFILE_IDNAME "${IDNAME}"
+
+ !ifndef "LANGFILE_${IDNAME}_NAME"
+ !define "LANGFILE_${IDNAME}_NAME" "${NAME}"
+ !endif
+
+ !endif
+
+!macroend
+
+!macro LANGFILE_EXT IDNAME
+
+ ;Start of installer language file
+
+ !ifdef LANGFILE_SETNAMES
+
+ !ifdef LANGFILE_IDNAME
+ !undef LANGFILE_IDNAME
+ !endif
+
+ !define LANGFILE_IDNAME "${IDNAME}"
+
+ !endif
+
+!macroend
+
+!macro LANGFILE_SETSTRING NAME VALUE
+
+ ;Set define with translated string
+
+ !ifndef ${NAME}
+ !define "${NAME}" "${VALUE}"
+ !endif
+
+!macroend
+
+!macro LANGFILE_LANGSTRING NAME DUMMY
+
+ ;Create a language string from a define and undefine
+
+ LangString "${NAME}" "${LANG_${LANGFILE_IDNAME}}" "${${NAME}}"
+ !undef "${NAME}"
+
+!macroend
+
+!endif
diff --git a/Engine/bin/tools/nsis/app/Include/Library.nsh b/Engine/bin/tools/nsis/app/Include/Library.nsh
new file mode 100644
index 000000000..e316c954d
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/Library.nsh
@@ -0,0 +1,870 @@
+#
+# Library.nsh
+#
+# A system for the installation and uninstallation of dynamic
+# link libraries (DLL) and type libraries (TLB). Using this
+# system you can handle the complete setup with one single
+# line of code:
+#
+# * File copying
+# * File copying on reboot
+# * Version checks
+# * Registration and unregistration
+# * Registration and unregistration on reboot
+# * Shared DLL counting
+# * Windows File Protection checks
+#
+# For more information, read appendix B in the documentation.
+#
+
+!verbose push
+!verbose 3
+
+!ifndef LIB_INCLUDED
+
+!define LIB_INCLUDED
+
+!ifndef SHCNE_ASSOCCHANGED
+ !define SHCNE_ASSOCCHANGED 0x08000000
+!endif
+!ifndef SHCNF_IDLIST
+ !define SHCNF_IDLIST 0x0000
+!endif
+
+!define REGTOOL_VERSION v3
+!define REGTOOL_KEY NSIS.Library.RegTool.${REGTOOL_VERSION}
+
+!include LogicLib.nsh
+!include x64.nsh
+
+### GetParent macro, don't pass $1 or $2 as INTPUT or OUTPUT
+!macro __InstallLib_Helper_GetParent INPUT OUTPUT
+
+ # Copied from FileFunc.nsh
+
+ StrCpy ${OUTPUT} ${INPUT}
+
+ Push $1
+ Push $2
+
+ StrCpy $2 ${OUTPUT} 1 -1
+ StrCmp $2 '\' 0 +3
+ StrCpy ${OUTPUT} ${OUTPUT} -1
+ goto -3
+
+ StrCpy $1 0
+ IntOp $1 $1 - 1
+ StrCpy $2 ${OUTPUT} 1 $1
+ StrCmp $2 '\' +2
+ StrCmp $2 '' 0 -3
+ StrCpy ${OUTPUT} ${OUTPUT} $1
+
+ Pop $2
+ Pop $1
+
+!macroend
+
+### Initialize session id (GUID)
+!macro __InstallLib_Helper_InitSession
+
+ !ifndef __InstallLib_SessionGUID_Defined
+
+ !define __InstallLib_SessionGUID_Defined
+
+ Var /GLOBAL __INSTALLLLIB_SESSIONGUID
+
+ !endif
+
+ !define __InstallLib_Helper_InitSession_Label "Library_${__FILE__}${__LINE__}"
+
+ StrCmp $__INSTALLLLIB_SESSIONGUID '' 0 "${__InstallLib_Helper_InitSession_Label}"
+
+ System::Call 'ole32::CoCreateGuid(g .s)'
+ Pop $__INSTALLLLIB_SESSIONGUID
+
+ "${__InstallLib_Helper_InitSession_Label}:"
+
+ !undef __InstallLib_Helper_InitSession_Label
+
+!macroend
+
+### Add a RegTool entry to register after reboot
+!macro __InstallLib_Helper_AddRegToolEntry mode filename tempdir
+
+ Push $R0
+ Push $R1
+ Push $R2
+ Push $R3
+
+ ;------------------------
+ ;Copy the parameters
+
+ Push "${filename}"
+ Push "${tempdir}"
+
+ Pop $R2 ; temporary directory
+ Pop $R1 ; file name to register
+
+ ;------------------------
+ ;Initialize session id
+
+ !insertmacro __InstallLib_Helper_InitSession
+
+ ;------------------------
+ ;Advance counter
+
+ StrCpy $R0 0
+ ReadRegDWORD $R0 HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "count"
+ IntOp $R0 $R0 + 1
+ WriteRegDWORD HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "count" "$R0"
+
+ ;------------------------
+ ;Setup RegTool
+
+ ReadRegStr $R3 HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" "${REGTOOL_KEY}"
+ StrCpy $R3 $R3 -4 1
+ IfFileExists $R3 +3
+
+ File /oname=$R2\${REGTOOL_KEY}.$__INSTALLLLIB_SESSIONGUID.exe "${NSISDIR}\Bin\RegTool.bin"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \
+ "${REGTOOL_KEY}" '"$R2\${REGTOOL_KEY}.$__INSTALLLLIB_SESSIONGUID.exe" /S'
+
+ ;------------------------
+ ;Add RegTool entry
+
+ WriteRegStr HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "$R0.file" "$R1"
+ WriteRegStr HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "$R0.mode" "${mode}"
+
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $R0
+
+!macroend
+
+### Get library version
+!macro __InstallLib_Helper_GetVersion TYPE FILE
+
+ !tempfile LIBRARY_TEMP_NSH
+
+ !ifdef NSIS_WIN32_MAKENSIS
+
+ !execute '"${NSISDIR}\Bin\LibraryLocal.exe" "${TYPE}" "${FILE}" "${LIBRARY_TEMP_NSH}"'
+
+ !else
+
+ !execute 'LibraryLocal "${TYPE}" "${FILE}" "${LIBRARY_TEMP_NSH}"'
+
+ !if ${TYPE} == 'T'
+
+ !warning "LibraryLocal currently supports TypeLibs version detection on Windows only"
+
+ !endif
+
+ !endif
+
+ !include "${LIBRARY_TEMP_NSH}"
+ !delfile "${LIBRARY_TEMP_NSH}"
+ !undef LIBRARY_TEMP_NSH
+
+!macroend
+
+### Install library
+!macro InstallLib libtype shared install localfile destfile tempbasedir
+
+ !verbose push
+ !verbose 3
+
+ Push $R0
+ Push $R1
+ Push $R2
+ Push $R3
+ Push $R4
+ Push $R5
+
+ ;------------------------
+ ;Define
+
+ !define INSTALLLIB_UNIQUE "${__FILE__}${__LINE__}"
+
+ !define INSTALLLIB_LIBTYPE_${libtype}
+ !define INSTALLLIB_LIBTYPE_SET INSTALLLIB_LIBTYPE_${libtype}
+ !define INSTALLLIB_SHARED_${shared}
+ !define INSTALLLIB_SHARED_SET INSTALLLIB_SHARED_${shared}
+ !define INSTALLLIB_INSTALL_${install}
+ !define INSTALLLIB_INSTALL_SET INSTALLLIB_INSTALL_${install}
+
+ ;------------------------
+ ;Validate
+
+ !ifndef INSTALLLIB_LIBTYPE_DLL & INSTALLLIB_LIBTYPE_REGDLL & INSTALLLIB_LIBTYPE_TLB & \
+ INSTALLLIB_LIBTYPE_REGDLLTLB & INSTALLLIB_LIBTYPE_REGEXE
+ !error "InstallLib: Incorrect setting for parameter: libtype"
+ !endif
+
+ !ifndef INSTALLLIB_INSTALL_REBOOT_PROTECTED & INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED & \
+ INSTALLLIB_INSTALL_NOREBOOT_PROTECTED & INSTALLLIB_INSTALL_NOREBOOT_NOTPROTECTED
+ !error "InstallLib: Incorrect setting for parameter: install"
+ !endif
+
+ ;------------------------
+ ;x64 settings
+
+ !ifdef LIBRARY_X64
+
+ ${DisableX64FSRedirection}
+
+ !endif
+
+ ;------------------------
+ ;Copy the parameters used on run-time to a variable
+ ;This allows the usage of variables as parameter
+
+ StrCpy $R4 "${destfile}"
+ StrCpy $R5 "${tempbasedir}"
+
+ ;------------------------
+ ;Shared library count
+
+ !ifndef INSTALLLIB_SHARED_NOTSHARED
+
+ StrCmp ${shared} "" 0 "installlib.noshareddllincrease_${INSTALLLIB_UNIQUE}"
+
+ !ifdef LIBRARY_X64
+
+ SetRegView 64
+
+ !endif
+
+ ReadRegDword $R0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R4
+ ClearErrors
+ IntOp $R0 $R0 + 1
+ WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R4 $R0
+
+ !ifdef LIBRARY_X64
+
+ SetRegView lastused
+
+ !endif
+
+ "installlib.noshareddllincrease_${INSTALLLIB_UNIQUE}:"
+
+ !endif
+
+ ;------------------------
+ ;Check Windows File Protection
+
+ !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_NOREBOOT_PROTECTED
+
+ !define LIBRARY_DEFINE_DONE_LABEL
+
+ System::Call "sfc::SfcIsFileProtected(i 0, w R4) i.R0"
+
+ StrCmp $R0 "error" "installlib.notprotected_${INSTALLLIB_UNIQUE}"
+ StrCmp $R0 "0" "installlib.notprotected_${INSTALLLIB_UNIQUE}"
+
+ Goto "installlib.done_${INSTALLLIB_UNIQUE}"
+
+ "installlib.notprotected_${INSTALLLIB_UNIQUE}:"
+
+ !endif
+
+ ;------------------------
+ ;Check file
+
+ IfFileExists $R4 0 "installlib.copy_${INSTALLLIB_UNIQUE}"
+
+ ;------------------------
+ ;Get version information
+
+ !ifndef LIBRARY_IGNORE_VERSION
+
+ !insertmacro __InstallLib_Helper_GetVersion D "${LOCALFILE}"
+
+ !ifdef LIBRARY_VERSION_FILENOTFOUND
+ !error "InstallLib: The library ${LOCALFILE} could not be found."
+ !endif
+
+ !ifndef LIBRARY_VERSION_NONE
+
+ !define LIBRARY_DEFINE_UPGRADE_LABEL
+ !define LIBRARY_DEFINE_REGISTER_LABEL
+
+ StrCpy $R0 ${LIBRARY_VERSION_HIGH}
+ StrCpy $R1 ${LIBRARY_VERSION_LOW}
+
+ GetDLLVersion $R4 $R2 $R3
+
+ !undef LIBRARY_VERSION_HIGH
+ !undef LIBRARY_VERSION_LOW
+
+ !ifndef INSTALLLIB_LIBTYPE_TLB & INSTALLLIB_LIBTYPE_REGDLLTLB
+
+ IntCmpU $R0 $R2 0 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}"
+ IntCmpU $R1 $R3 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.register_${INSTALLLIB_UNIQUE}" \
+ "installlib.upgrade_${INSTALLLIB_UNIQUE}"
+
+ !else
+
+ !insertmacro __InstallLib_Helper_GetVersion T "${LOCALFILE}"
+
+ !ifdef LIBRARY_VERSION_FILENOTFOUND
+ !error "InstallLib: The library ${LOCALFILE} could not be found."
+ !endif
+
+ !ifndef LIBRARY_VERSION_NONE
+
+ IntCmpU $R0 $R2 0 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}"
+ IntCmpU $R1 $R3 0 "installlib.register_${INSTALLLIB_UNIQUE}" \
+ "installlib.upgrade_${INSTALLLIB_UNIQUE}"
+
+ !else
+
+ IntCmpU $R0 $R2 0 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}"
+ IntCmpU $R1 $R3 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.register_${INSTALLLIB_UNIQUE}" \
+ "installlib.upgrade_${INSTALLLIB_UNIQUE}"
+
+ !endif
+
+ !endif
+
+ !else
+
+ !undef LIBRARY_VERSION_NONE
+
+ !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB
+
+ !insertmacro __InstallLib_Helper_GetVersion T "${LOCALFILE}"
+
+ !endif
+
+ !endif
+
+ !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB
+
+ !ifndef LIBRARY_VERSION_NONE
+
+ !ifndef LIBRARY_DEFINE_UPGRADE_LABEL
+
+ !define LIBRARY_DEFINE_UPGRADE_LABEL
+
+ !endif
+
+ !ifndef LIBRARY_DEFINE_REGISTER_LABEL
+
+ !define LIBRARY_DEFINE_REGISTER_LABEL
+
+ !endif
+
+ StrCpy $R0 ${LIBRARY_VERSION_HIGH}
+ StrCpy $R1 ${LIBRARY_VERSION_LOW}
+
+ TypeLib::GetLibVersion $R4
+ Pop $R3
+ Pop $R2
+
+ IntCmpU $R0 $R2 0 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}"
+ IntCmpU $R1 $R3 "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.register_${INSTALLLIB_UNIQUE}" \
+ "installlib.upgrade_${INSTALLLIB_UNIQUE}"
+
+ !undef LIBRARY_VERSION_HIGH
+ !undef LIBRARY_VERSION_LOW
+
+ !else
+
+ !undef LIBRARY_VERSION_NONE
+
+ !endif
+
+ !endif
+
+ !endif
+
+ ;------------------------
+ ;Upgrade
+
+ !ifdef LIBRARY_DEFINE_UPGRADE_LABEL
+
+ !undef LIBRARY_DEFINE_UPGRADE_LABEL
+
+ "installlib.upgrade_${INSTALLLIB_UNIQUE}:"
+
+ !endif
+
+ ;------------------------
+ ;Copy
+
+ !ifdef INSTALLLIB_INSTALL_NOREBOOT_PROTECTED | INSTALLLIB_INSTALL_NOREBOOT_NOTPROTECTED
+
+ "installlib.copy_${INSTALLLIB_UNIQUE}:"
+
+ StrCpy $R0 $R4
+ Call ":installlib.file_${INSTALLLIB_UNIQUE}"
+
+ !else
+
+ !ifndef LIBRARY_DEFINE_REGISTER_LABEL
+
+ !define LIBRARY_DEFINE_REGISTER_LABEL
+
+ !endif
+
+ !ifndef LIBRARY_DEFINE_DONE_LABEL
+
+ !define LIBRARY_DEFINE_DONE_LABEL
+
+ !endif
+
+ ClearErrors
+
+ StrCpy $R0 $R4
+ Call ":installlib.file_${INSTALLLIB_UNIQUE}"
+
+ IfErrors 0 "installlib.register_${INSTALLLIB_UNIQUE}"
+
+ SetOverwrite lastused
+
+ ;------------------------
+ ;Copy on reboot
+
+ GetTempFileName $R0 $R5
+ Call ":installlib.file_${INSTALLLIB_UNIQUE}"
+ Rename /REBOOTOK $R0 $R4
+
+ ;------------------------
+ ;Register on reboot
+
+ Call ":installlib.regonreboot_${INSTALLLIB_UNIQUE}"
+
+ Goto "installlib.done_${INSTALLLIB_UNIQUE}"
+
+ "installlib.copy_${INSTALLLIB_UNIQUE}:"
+ StrCpy $R0 $R4
+ Call ":installlib.file_${INSTALLLIB_UNIQUE}"
+
+ !endif
+
+ ;------------------------
+ ;Register
+
+ !ifdef LIBRARY_DEFINE_REGISTER_LABEL
+
+ !undef LIBRARY_DEFINE_REGISTER_LABEL
+
+ "installlib.register_${INSTALLLIB_UNIQUE}:"
+
+ !endif
+
+ !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB | INSTALLLIB_LIBTYPE_REGEXE
+
+ !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED
+
+ IfRebootFlag 0 "installlib.regnoreboot_${INSTALLLIB_UNIQUE}"
+
+ Call ":installlib.regonreboot_${INSTALLLIB_UNIQUE}"
+
+ Goto "installlib.registerfinish_${INSTALLLIB_UNIQUE}"
+
+ "installlib.regnoreboot_${INSTALLLIB_UNIQUE}:"
+
+ !endif
+
+ !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB
+
+ TypeLib::Register $R4
+
+ !endif
+
+ !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB
+
+ !ifndef LIBRARY_X64
+
+ RegDll $R4
+
+ !else
+
+ ExecWait '"$SYSDIR\regsvr32.exe" /s "$R4"'
+
+ !endif
+
+ !endif
+
+ !ifdef INSTALLLIB_LIBTYPE_REGEXE
+
+ ExecWait '"$R4" /regserver'
+
+ !endif
+
+ !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED
+
+ "installlib.registerfinish_${INSTALLLIB_UNIQUE}:"
+
+ !endif
+
+ !endif
+
+ !ifdef LIBRARY_SHELL_EXTENSION
+
+ System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)'
+
+ !endif
+
+ !ifdef LIBRARY_COM
+
+ System::Call 'Ole32::CoFreeUnusedLibraries()'
+
+ !endif
+
+ ;------------------------
+ ;Done
+
+ !ifdef LIBRARY_DEFINE_DONE_LABEL
+
+ !undef LIBRARY_DEFINE_DONE_LABEL
+
+ "installlib.done_${INSTALLLIB_UNIQUE}:"
+
+ !endif
+
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $R0
+
+ ;------------------------
+ ;End
+
+ Goto "installlib.end_${INSTALLLIB_UNIQUE}"
+
+ ;------------------------
+ ;Extract
+
+ !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED
+
+ SetOverwrite try
+
+ !else
+
+ SetOverwrite on
+
+ !endif
+
+ "installlib.file_${INSTALLLIB_UNIQUE}:"
+ SetFileAttributes $R0 FILE_ATTRIBUTE_NORMAL
+ ClearErrors
+ File /oname=$R0 "${LOCALFILE}"
+ Return
+
+ SetOverwrite lastused
+
+ ;------------------------
+ ;Register on reboot
+
+ !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED
+
+ "installlib.regonreboot_${INSTALLLIB_UNIQUE}:"
+
+ !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB
+ !ifndef LIBRARY_X64
+ !insertmacro __InstallLib_Helper_AddRegToolEntry 'D' "$R4" "$R5"
+ !else
+ !insertmacro __InstallLib_Helper_AddRegToolEntry 'DX' "$R4" "$R5"
+ !endif
+ !endif
+
+ !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB
+ !insertmacro __InstallLib_Helper_AddRegToolEntry 'T' "$R4" "$R5"
+ !endif
+
+ !ifdef INSTALLLIB_LIBTYPE_REGEXE
+ !insertmacro __InstallLib_Helper_AddRegToolEntry 'E' "$R4" "$R5"
+ !endif
+
+ Return
+
+ !endif
+
+ ;------------------------
+ ;End label
+
+ "installlib.end_${INSTALLLIB_UNIQUE}:"
+
+ !ifdef LIBRARY_X64
+
+ ${EnableX64FSRedirection}
+
+ !endif
+
+ ;------------------------
+ ;Undefine
+
+ !undef INSTALLLIB_UNIQUE
+
+ !undef ${INSTALLLIB_LIBTYPE_SET}
+ !undef INSTALLLIB_LIBTYPE_SET
+ !undef ${INSTALLLIB_SHARED_SET}
+ !undef INSTALLLIB_SHARED_SET
+ !undef ${INSTALLLIB_INSTALL_SET}
+ !undef INSTALLLIB_INSTALL_SET
+
+ !verbose pop
+
+!macroend
+
+### Uninstall library
+!macro UnInstallLib libtype shared uninstall file
+
+ !verbose push
+ !verbose 3
+
+ Push $R0
+ Push $R1
+
+ ;------------------------
+ ;Define
+
+ !define UNINSTALLLIB_UNIQUE "${__FILE__}${__LINE__}"
+
+ !define UNINSTALLLIB_LIBTYPE_${libtype}
+ !define UNINSTALLLIB_LIBTYPE_SET UNINSTALLLIB_LIBTYPE_${libtype}
+ !define UNINSTALLLIB_SHARED_${shared}
+ !define UNINSTALLLIB_SHARED_SET UNINSTALLLIB_SHARED_${shared}
+ !define UNINSTALLLIB_UNINSTALL_${uninstall}
+ !define UNINSTALLLIB_UNINSTALL_SET UNINSTALLLIB_UNINSTALL_${uninstall}
+
+ ;------------------------
+ ;Validate
+
+ !ifndef UNINSTALLLIB_LIBTYPE_DLL & UNINSTALLLIB_LIBTYPE_REGDLL & UNINSTALLLIB_LIBTYPE_TLB & \
+ UNINSTALLLIB_LIBTYPE_REGDLLTLB & UNINSTALLLIB_LIBTYPE_REGEXE
+ !error "UnInstallLib: Incorrect setting for parameter: libtype"
+ !endif
+
+ !ifndef UNINSTALLLIB_SHARED_NOTSHARED & UNINSTALLLIB_SHARED_SHARED
+ !error "UnInstallLib: Incorrect setting for parameter: shared"
+ !endif
+
+ !ifndef UNINSTALLLIB_UNINSTALL_NOREMOVE & UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED & \
+ UNINSTALLLIB_UNINSTALL_REBOOT_NOTPROTECTED & UNINSTALLLIB_UNINSTALL_NOREBOOT_PROTECTED & \
+ UNINSTALLLIB_UNINSTALL_NOREBOOT_NOTPROTECTED
+ !error "UnInstallLib: Incorrect setting for parameter: uninstall"
+ !endif
+
+ ;------------------------
+ ;x64 settings
+
+ !ifdef LIBRARY_X64
+
+ ${DisableX64FSRedirection}
+
+ !endif
+
+ ;------------------------
+ ;Copy the parameters used on run-time to a variable
+ ;This allows the usage of variables as parameter
+
+ StrCpy $R1 "${file}"
+
+ ;------------------------
+ ;Shared library count
+
+ !ifdef UNINSTALLLIB_SHARED_SHARED
+
+ !define UNINSTALLLIB_DONE_LABEL
+
+ !ifdef LIBRARY_X64
+
+ SetRegView 64
+
+ !endif
+
+ ReadRegDword $R0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1
+ StrCmp $R0 "" "uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}"
+
+ IntOp $R0 $R0 - 1
+ IntCmp $R0 0 "uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}" \
+ "uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}" "uninstalllib.shareddllinuse_${UNINSTALLLIB_UNIQUE}"
+
+ "uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}:"
+ DeleteRegValue HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1
+ !ifndef UNINSTALLLIB_SHARED_SHAREDNOREMOVE
+ Goto "uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}"
+ !endif
+
+ "uninstalllib.shareddllinuse_${UNINSTALLLIB_UNIQUE}:"
+ WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 $R0
+
+ !ifdef LIBRARY_X64
+
+ SetRegView lastused
+
+ !endif
+
+ Goto "uninstalllib.done_${UNINSTALLLIB_UNIQUE}"
+
+ "uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}:"
+
+ !ifdef LIBRARY_X64
+
+ SetRegView lastused
+
+ !endif
+
+ !endif
+
+ ;------------------------
+ ;Remove
+
+ !ifndef UNINSTALLLIB_UNINSTALL_NOREMOVE
+
+ ;------------------------
+ ;Check Windows File Protection
+
+ !ifdef UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED | UNINSTALLLIB_UNINSTALL_NOREBOOT_PROTECTED
+
+ !ifndef UNINSTALLLIB_DONE_LABEL
+
+ !define UNINSTALLLIB_DONE_LABEL
+
+ !endif
+
+ System::Call "sfc::SfcIsFileProtected(i 0, w $R1) i.R0"
+
+ StrCmp $R0 "error" "uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}"
+ StrCmp $R0 "0" "uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}"
+
+ Goto "uninstalllib.done_${UNINSTALLLIB_UNIQUE}"
+
+ "uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}:"
+
+ !endif
+
+ ;------------------------
+ ;Unregister
+
+ !ifdef UNINSTALLLIB_LIBTYPE_REGDLL | UNINSTALLLIB_LIBTYPE_REGDLLTLB
+
+ !ifndef LIBRARY_X64
+
+ UnRegDLL $R1
+
+ !else
+
+ ExecWait '"$SYSDIR\regsvr32.exe" /s /u "$R1"'
+
+ !endif
+
+ !endif
+
+ !ifdef UNINSTALLLIB_LIBTYPE_REGEXE
+
+ ExecWait '"$R1" /unregserver'
+
+ !endif
+
+ !ifdef UNINSTALLLIB_LIBTYPE_TLB | UNINSTALLLIB_LIBTYPE_REGDLLTLB
+
+ TypeLib::UnRegister $R1
+
+ !endif
+
+ !ifdef LIBRARY_SHELL_EXTENSION
+
+ System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)'
+
+ !endif
+
+ !ifdef LIBRARY_COM
+
+ System::Call 'Ole32::CoFreeUnusedLibraries()'
+
+ !endif
+
+ ;------------------------
+ ;Delete
+
+ Delete $R1
+
+ !ifdef UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED | UNINSTALLLIB_UNINSTALL_REBOOT_NOTPROTECTED
+
+ ${If} ${FileExists} $R1
+ # File is in use, can't just delete.
+ # Move file to another location before using Delete /REBOOTOK. This way, if
+ # the user installs a new version of the DLL, it won't be deleted after
+ # reboot. See bug #1097642 for more information on this.
+
+ # Try moving to $TEMP.
+ GetTempFileName $R0
+ Delete $R0
+ Rename $R1 $R0
+
+ ${If} ${FileExists} $R1
+ # Still here, delete temporary file, in case the file was copied
+ # and not deleted. This happens when moving from network drives,
+ # for example.
+ Delete $R0
+
+ # Try moving to directory containing the file.
+ !insertmacro __InstallLib_Helper_GetParent $R1 $R0
+ GetTempFileName $R0 $R0
+ Delete $R0
+ Rename $R1 $R0
+
+ ${If} ${FileExists} $R1
+ # Still here, delete temporary file.
+ Delete $R0
+
+ # Give up moving, simply Delete /REBOOTOK the file.
+ StrCpy $R0 $R1
+ ${EndIf}
+ ${EndIf}
+
+ # Delete the moved file.
+ Delete /REBOOTOK $R0
+ ${EndIf}
+
+ !endif
+
+ !endif
+
+ ;------------------------
+ ;Done
+
+ !ifdef UNINSTALLLIB_DONE_LABEL
+
+ !undef UNINSTALLLIB_DONE_LABEL
+
+ "uninstalllib.done_${UNINSTALLLIB_UNIQUE}:"
+
+ !endif
+
+ !ifdef LIBRARY_X64
+
+ ${EnableX64FSRedirection}
+
+ !endif
+
+ Pop $R1
+ Pop $R0
+
+ ;------------------------
+ ;Undefine
+
+ !undef UNINSTALLLIB_UNIQUE
+
+ !undef ${UNINSTALLLIB_LIBTYPE_SET}
+ !undef UNINSTALLLIB_LIBTYPE_SET
+ !undef ${UNINSTALLLIB_SHARED_SET}
+ !undef UNINSTALLLIB_SHARED_SET
+ !undef ${UNINSTALLLIB_UNINSTALL_SET}
+ !undef UNINSTALLLIB_UNINSTALL_SET
+
+ !verbose pop
+
+!macroend
+
+!endif
+
+!verbose pop
diff --git a/Engine/bin/tools/nsis/app/Include/LogicLib.nsh b/Engine/bin/tools/nsis/app/Include/LogicLib.nsh
new file mode 100644
index 000000000..326417a21
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/LogicLib.nsh
@@ -0,0 +1,791 @@
+; NSIS LOGIC LIBRARY - LogicLib.nsh
+; Version 2.6 - 08/12/2007
+; By dselkirk@hotmail.com
+; and eccles@users.sf.net
+; with IfNot support added by Message
+;
+; Questions/Comments -
+; See http://forums.winamp.com/showthread.php?s=&postid=1116241
+;
+; Description:
+; Provides the use of various logic statements within NSIS.
+;
+; Usage:
+; The following "statements" are available:
+; If|IfNot|Unless..{ElseIf|ElseIfNot|ElseUnless}..[Else]..EndIf|EndUnless
+; - Conditionally executes a block of statements, depending on the value
+; of an expression. IfNot and Unless are equivalent and
+; interchangeable, as are ElseIfNot and ElseUnless.
+; AndIf|AndIfNot|AndUnless|OrIf|OrIfNot|OrUnless
+; - Adds any number of extra conditions to If, IfNot, Unless, ElseIf,
+; ElseIfNot and ElseUnless statements.
+; IfThen|IfNotThen..|..|
+; - Conditionally executes an inline statement, depending on the value
+; of an expression.
+; IfCmd..||..|
+; - Conditionally executes an inline statement, depending on a true
+; value of the provided NSIS function.
+; Select..{Case[2|3|4|5]}..[CaseElse|Default]..EndSelect
+; - Executes one of several blocks of statements, depending on the value
+; of an expression.
+; Switch..{Case|CaseElse|Default}..EndSwitch
+; - Jumps to one of several labels, depending on the value of an
+; expression.
+; Do[While|Until]..{ExitDo|Continue|Break}..Loop[While|Until]
+; - Repeats a block of statements until stopped, or depending on the
+; value of an expression.
+; While..{ExitWhile|Continue|Break}..EndWhile
+; - An alias for DoWhile..Loop (for backwards-compatibility)
+; For[Each]..{ExitFor|Continue|Break}..Next
+; - Repeats a block of statements varying the value of a variable.
+;
+; The following "expressions" are available:
+; Standard (built-in) string tests (which are case-insensitive):
+; a == b; a != b
+; Additional case-insensitive string tests (using System.dll):
+; a S< b; a S>= b; a S> b; a S<= b
+; Case-sensitive string tests:
+; a S== b; a S!= b
+; Standard (built-in) signed integer tests:
+; a = b; a <> b; a < b; a >= b; a > b; a <= b
+; Standard (built-in) unsigned integer tests:
+; a U< b; a U>= b; a U> b; a U<= b
+; 64-bit integer tests (using System.dll):
+; a L= b; a L<> b; a L< b; a L>= b; a L> b; a L<= b
+; Built-in NSIS flag tests:
+; ${Abort}; ${Errors}; ${RebootFlag}; ${Silent}
+; Built-in NSIS other tests:
+; ${FileExists} a
+; Any conditional NSIS instruction test:
+; ${Cmd} a
+; Section flag tests:
+; ${SectionIsSelected} a; ${SectionIsSectionGroup} a;
+; ${SectionIsSectionGroupEnd} a; ${SectionIsBold} a;
+; ${SectionIsReadOnly} a; ${SectionIsExpanded} a;
+; ${SectionIsPartiallySelected} a
+;
+; Examples:
+; See LogicLib.nsi in the Examples folder for lots of example usage.
+
+!verbose push
+!verbose 3
+!ifndef LOGICLIB_VERBOSITY
+ !define LOGICLIB_VERBOSITY 3
+!endif
+!define _LOGICLIB_VERBOSITY ${LOGICLIB_VERBOSITY}
+!undef LOGICLIB_VERBOSITY
+!verbose ${_LOGICLIB_VERBOSITY}
+
+!ifndef LOGICLIB
+ !define LOGICLIB
+ !define | "'"
+ !define || "' '"
+ !define LOGICLIB_COUNTER 0
+
+ !include Sections.nsh
+
+ !macro _LOGICLIB_TEMP
+ !ifndef _LOGICLIB_TEMP
+ !define _LOGICLIB_TEMP
+ Var /GLOBAL _LOGICLIB_TEMP ; Temporary variable to aid the more elaborate logic tests
+ !endif
+ !macroend
+
+ !macro _IncreaseCounter
+ !define _LOGICLIB_COUNTER ${LOGICLIB_COUNTER}
+ !undef LOGICLIB_COUNTER
+ !define /math LOGICLIB_COUNTER ${_LOGICLIB_COUNTER} + 1
+ !undef _LOGICLIB_COUNTER
+ !macroend
+
+ !macro _PushLogic
+ !insertmacro _PushScope Logic _LogicLib_Label_${LOGICLIB_COUNTER}
+ !insertmacro _IncreaseCounter
+ !macroend
+
+ !macro _PopLogic
+ !insertmacro _PopScope Logic
+ !macroend
+
+ !macro _PushScope Type label
+ !ifdef _${Type} ; If we already have a statement
+ !define _Cur${Type} ${_${Type}}
+ !undef _${Type}
+ !define _${Type} ${label}
+ !define ${_${Type}}Prev${Type} ${_Cur${Type}} ; Save the current logic
+ !undef _Cur${Type}
+ !else
+ !define _${Type} ${label} ; Initialise for first statement
+ !endif
+ !macroend
+
+ !macro _PopScope Type
+ !ifndef _${Type}
+ !error "Cannot use _Pop${Type} without a preceding _Push${Type}"
+ !endif
+ !ifdef ${_${Type}}Prev${Type} ; If a previous statment was active then restore it
+ !define _Cur${Type} ${_${Type}}
+ !undef _${Type}
+ !define _${Type} ${${_Cur${Type}}Prev${Type}}
+ !undef ${_Cur${Type}}Prev${Type}
+ !undef _Cur${Type}
+ !else
+ !undef _${Type}
+ !endif
+ !macroend
+
+ ; String tests
+ !macro _== _a _b _t _f
+ StrCmp `${_a}` `${_b}` `${_t}` `${_f}`
+ !macroend
+
+ !macro _!= _a _b _t _f
+ !insertmacro _== `${_a}` `${_b}` `${_f}` `${_t}`
+ !macroend
+
+ ; Case-sensitive string tests
+ !macro _S== _a _b _t _f
+ StrCmpS `${_a}` `${_b}` `${_t}` `${_f}`
+ !macroend
+
+ !macro _S!= _a _b _t _f
+ !insertmacro _S== `${_a}` `${_b}` `${_f}` `${_t}`
+ !macroend
+
+ ; Extra string tests (cannot do these case-sensitively - I tried and lstrcmp still ignored the case)
+ !macro _StrCmpI _a _b _e _l _m
+ !insertmacro _LOGICLIB_TEMP
+ System::Call `kernel32::lstrcmpiA(ts, ts) i.s` `${_a}` `${_b}`
+ Pop $_LOGICLIB_TEMP
+ IntCmp $_LOGICLIB_TEMP 0 `${_e}` `${_l}` `${_m}`
+ !macroend
+
+ !macro _S< _a _b _t _f
+ !insertmacro _StrCmpI `${_a}` `${_b}` `${_f}` `${_t}` `${_f}`
+ !macroend
+
+ !macro _S>= _a _b _t _f
+ !insertmacro _S< `${_a}` `${_b}` `${_f}` `${_t}`
+ !macroend
+
+ !macro _S> _a _b _t _f
+ !insertmacro _StrCmpI `${_a}` `${_b}` `${_f}` `${_f}` `${_t}`
+ !macroend
+
+ !macro _S<= _a _b _t _f
+ !insertmacro _S> `${_a}` `${_b}` `${_f}` `${_t}`
+ !macroend
+
+ ; Integer tests
+ !macro _= _a _b _t _f
+ IntCmp `${_a}` `${_b}` `${_t}` `${_f}` `${_f}`
+ !macroend
+
+ !macro _<> _a _b _t _f
+ !insertmacro _= `${_a}` `${_b}` `${_f}` `${_t}`
+ !macroend
+
+ !macro _< _a _b _t _f
+ IntCmp `${_a}` `${_b}` `${_f}` `${_t}` `${_f}`
+ !macroend
+
+ !macro _>= _a _b _t _f
+ !insertmacro _< `${_a}` `${_b}` `${_f}` `${_t}`
+ !macroend
+
+ !macro _> _a _b _t _f
+ IntCmp `${_a}` `${_b}` `${_f}` `${_f}` `${_t}`
+ !macroend
+
+ !macro _<= _a _b _t _f
+ !insertmacro _> `${_a}` `${_b}` `${_f}` `${_t}`
+ !macroend
+
+ ; Unsigned integer tests (NB: no need for extra equality tests)
+ !macro _U< _a _b _t _f
+ IntCmpU `${_a}` `${_b}` `${_f}` `${_t}` `${_f}`
+ !macroend
+
+ !macro _U>= _a _b _t _f
+ !insertmacro _U< `${_a}` `${_b}` `${_f}` `${_t}`
+ !macroend
+
+ !macro _U> _a _b _t _f
+ IntCmpU `${_a}` `${_b}` `${_f}` `${_f}` `${_t}`
+ !macroend
+
+ !macro _U<= _a _b _t _f
+ !insertmacro _U> `${_a}` `${_b}` `${_f}` `${_t}`
+ !macroend
+
+ ; Int64 tests
+ !macro _Int64Cmp _a _o _b _t _f
+ !insertmacro _LOGICLIB_TEMP
+ System::Int64Op `${_a}` `${_o}` `${_b}`
+ Pop $_LOGICLIB_TEMP
+ !insertmacro _= $_LOGICLIB_TEMP 0 `${_f}` `${_t}`
+ !macroend
+
+ !macro _L= _a _b _t _f
+ !insertmacro _Int64Cmp `${_a}` = `${_b}` `${_t}` `${_f}`
+ !macroend
+
+ !macro _L<> _a _b _t _f
+ !insertmacro _L= `${_a}` `${_b}` `${_f}` `${_t}`
+ !macroend
+
+ !macro _L< _a _b _t _f
+ !insertmacro _Int64Cmp `${_a}` < `${_b}` `${_t}` `${_f}`
+ !macroend
+
+ !macro _L>= _a _b _t _f
+ !insertmacro _L< `${_a}` `${_b}` `${_f}` `${_t}`
+ !macroend
+
+ !macro _L> _a _b _t _f
+ !insertmacro _Int64Cmp `${_a}` > `${_b}` `${_t}` `${_f}`
+ !macroend
+
+ !macro _L<= _a _b _t _f
+ !insertmacro _L> `${_a}` `${_b}` `${_f}` `${_t}`
+ !macroend
+
+ ; Flag tests
+ !macro _Abort _a _b _t _f
+ IfAbort `${_t}` `${_f}`
+ !macroend
+ !define Abort `"" Abort ""`
+
+ !macro _Errors _a _b _t _f
+ IfErrors `${_t}` `${_f}`
+ !macroend
+ !define Errors `"" Errors ""`
+
+ !macro _FileExists _a _b _t _f
+ IfFileExists `${_b}` `${_t}` `${_f}`
+ !macroend
+ !define FileExists `"" FileExists`
+
+ !macro _RebootFlag _a _b _t _f
+ IfRebootFlag `${_t}` `${_f}`
+ !macroend
+ !define RebootFlag `"" RebootFlag ""`
+
+ !macro _Silent _a _b _t _f
+ IfSilent `${_t}` `${_f}`
+ !macroend
+ !define Silent `"" Silent ""`
+
+ ; "Any instruction" test
+ !macro _Cmd _a _b _t _f
+ !define _t=${_t}
+ !ifdef _t= ; If no true label then make one
+ !define __t _LogicLib_Label_${LOGICLIB_COUNTER}
+ !insertmacro _IncreaseCounter
+ !else
+ !define __t ${_t}
+ !endif
+ ${_b} ${__t}
+ !define _f=${_f}
+ !ifndef _f= ; If a false label then go there
+ Goto ${_f}
+ !endif
+ !undef _f=${_f}
+ !ifdef _t= ; If we made our own true label then place it
+ ${__t}:
+ !endif
+ !undef __t
+ !undef _t=${_t}
+ !macroend
+ !define Cmd `"" Cmd`
+
+ ; Section flag test
+ !macro _SectionFlagIsSet _a _b _t _f
+ !insertmacro _LOGICLIB_TEMP
+ SectionGetFlags `${_b}` $_LOGICLIB_TEMP
+ IntOp $_LOGICLIB_TEMP $_LOGICLIB_TEMP & `${_a}`
+ !insertmacro _= $_LOGICLIB_TEMP `${_a}` `${_t}` `${_f}`
+ !macroend
+ !define SectionIsSelected `${SF_SELECTED} SectionFlagIsSet`
+ !define SectionIsSubSection `${SF_SUBSEC} SectionFlagIsSet`
+ !define SectionIsSubSectionEnd `${SF_SUBSECEND} SectionFlagIsSet`
+ !define SectionIsSectionGroup `${SF_SECGRP} SectionFlagIsSet`
+ !define SectionIsSectionGroupEnd `${SF_SECGRPEND} SectionFlagIsSet`
+ !define SectionIsBold `${SF_BOLD} SectionFlagIsSet`
+ !define SectionIsReadOnly `${SF_RO} SectionFlagIsSet`
+ !define SectionIsExpanded `${SF_EXPAND} SectionFlagIsSet`
+ !define SectionIsPartiallySelected `${SF_PSELECTED} SectionFlagIsSet`
+
+ !define IfCmd `!insertmacro _IfThen "" Cmd ${|}`
+
+ !macro _If _c _a _o _b
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !insertmacro _PushLogic
+ !define ${_Logic}If
+ !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the Else
+ !insertmacro _IncreaseCounter
+ !define _c=${_c}
+ !ifdef _c=true ; If is true
+ !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else}
+ !else ; If condition is false
+ !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} ""
+ !endif
+ !undef _c=${_c}
+ !verbose pop
+ !macroend
+ !define If `!insertmacro _If true`
+ !define Unless `!insertmacro _If false`
+ !define IfNot `!insertmacro _If false`
+
+ !macro _And _c _a _o _b
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !ifndef _Logic | ${_Logic}If
+ !error "Cannot use And without a preceding If or IfNot/Unless"
+ !endif
+ !ifndef ${_Logic}Else
+ !error "Cannot use And following an Else"
+ !endif
+ !define _c=${_c}
+ !ifdef _c=true ; If is true
+ !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else}
+ !else ; If condition is false
+ !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} ""
+ !endif
+ !undef _c=${_c}
+ !verbose pop
+ !macroend
+ !define AndIf `!insertmacro _And true`
+ !define AndUnless `!insertmacro _And false`
+ !define AndIfNot `!insertmacro _And false`
+
+ !macro _Or _c _a _o _b
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !ifndef _Logic | ${_Logic}If
+ !error "Cannot use Or without a preceding If or IfNot/Unless"
+ !endif
+ !ifndef ${_Logic}Else
+ !error "Cannot use Or following an Else"
+ !endif
+ !define _label _LogicLib_Label_${LOGICLIB_COUNTER} ; Skip this test as we already
+ !insertmacro _IncreaseCounter
+ Goto ${_label} ; have a successful result
+ ${${_Logic}Else}: ; Place the Else label
+ !undef ${_Logic}Else ; and remove it
+ !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new If
+ !insertmacro _IncreaseCounter
+ !define _c=${_c}
+ !ifdef _c=true ; If is true
+ !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else}
+ !else ; If condition is false
+ !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} ""
+ !endif
+ !undef _c=${_c}
+ ${_label}:
+ !undef _label
+ !verbose pop
+ !macroend
+ !define OrIf `!insertmacro _Or true`
+ !define OrUnless `!insertmacro _Or false`
+ !define OrIfNot `!insertmacro _Or false`
+
+ !macro _Else
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !ifndef _Logic | ${_Logic}If
+ !error "Cannot use Else without a preceding If or IfNot/Unless"
+ !endif
+ !ifndef ${_Logic}Else
+ !error "Cannot use Else following an Else"
+ !endif
+ !ifndef ${_Logic}EndIf ; First Else for this If?
+ !define ${_Logic}EndIf _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the EndIf
+ !insertmacro _IncreaseCounter
+ !endif
+ Goto ${${_Logic}EndIf} ; Go to the EndIf
+ ${${_Logic}Else}: ; Place the Else label
+ !undef ${_Logic}Else ; and remove it
+ !verbose pop
+ !macroend
+ !define Else `!insertmacro _Else`
+
+ !macro _ElseIf _c _a _o _b
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ ${Else} ; Perform the Else
+ !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new If
+ !insertmacro _IncreaseCounter
+ !define _c=${_c}
+ !ifdef _c=true ; If is true
+ !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else}
+ !else ; If condition is false
+ !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} ""
+ !endif
+ !undef _c=${_c}
+ !verbose pop
+ !macroend
+ !define ElseIf `!insertmacro _ElseIf true`
+ !define ElseUnless `!insertmacro _ElseIf false`
+ !define ElseIfNot `!insertmacro _ElseIf false`
+
+ !macro _EndIf _n
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !ifndef _Logic | ${_Logic}If
+ !error "Cannot use End${_n} without a preceding If or IfNot/Unless"
+ !endif
+ !ifdef ${_Logic}Else
+ ${${_Logic}Else}: ; Place the Else label
+ !undef ${_Logic}Else ; and remove it
+ !endif
+ !ifdef ${_Logic}EndIf
+ ${${_Logic}EndIf}: ; Place the EndIf
+ !undef ${_Logic}EndIf ; and remove it
+ !endif
+ !undef ${_Logic}If
+ !insertmacro _PopLogic
+ !verbose pop
+ !macroend
+ !define EndIf `!insertmacro _EndIf If`
+ !define EndUnless `!insertmacro _EndIf Unless`
+
+ !macro _IfThen _a _o _b _t
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ ${If} `${_a}` `${_o}` `${_b}`
+ ${_t}
+ ${EndIf}
+ !verbose pop
+ !macroend
+ !define IfThen `!insertmacro _IfThen`
+
+ !macro _IfNotThen _a _o _b _t
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ ${IfNot} `${_a}` `${_o}` `${_b}`
+ ${_t}
+ ${EndIf}
+ !verbose pop
+ !macroend
+ !define IfNotThen `!insertmacro _IfNotThen`
+
+ !macro _ForEach _v _f _t _o _s
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ StrCpy "${_v}" "${_f}" ; Assign the initial value
+ Goto +2 ; Skip the loop expression for the first iteration
+ !define _DoLoopExpression `IntOp "${_v}" "${_v}" "${_o}" "${_s}"` ; Define the loop expression
+ !define _o=${_o}
+ !ifdef _o=+ ; Check the loop expression operator
+ !define __o > ; to determine the correct loop condition
+ !else ifdef _o=-
+ !define __o <
+ !else
+ !error "Unsupported ForEach step operator (must be + or -)"
+ !endif
+ !undef _o=${_o}
+ !insertmacro _Do For false `${_v}` `${__o}` `${_t}` ; Let Do do the rest
+ !undef __o
+ !verbose pop
+ !macroend
+ !define ForEach `!insertmacro _ForEach`
+
+ !macro _For _v _f _t
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ ${ForEach} `${_v}` `${_f}` `${_t}` + 1 ; Pass on to ForEach
+ !verbose pop
+ !macroend
+ !define For `!insertmacro _For`
+
+ !define ExitFor `!insertmacro _Goto ExitFor For`
+
+ !define Next `!insertmacro _Loop For Next "" "" "" ""`
+
+ !define While `!insertmacro _Do While true`
+
+ !define ExitWhile `!insertmacro _Goto ExitWhile While`
+
+ !define EndWhile `!insertmacro _Loop While EndWhile "" "" "" ""`
+
+ !macro _Do _n _c _a _o _b
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !insertmacro _PushLogic
+ !define ${_Logic}${_n} _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the start of the loop
+ !insertmacro _IncreaseCounter
+ ${${_Logic}${_n}}:
+ !insertmacro _PushScope Exit${_n} _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the end of the loop
+ !insertmacro _IncreaseCounter
+ !insertmacro _PushScope Break ${_Exit${_n}} ; Break goes to the end of the loop
+ !ifdef _DoLoopExpression
+ ${_DoLoopExpression} ; Special extra parameter for inserting code
+ !undef _DoLoopExpression ; between the Continue label and the loop condition
+ !endif
+ !define _c=${_c}
+ !ifdef _c= ; No starting condition
+ !insertmacro _PushScope Continue _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for Continue at the end of the loop
+ !insertmacro _IncreaseCounter
+ !else
+ !insertmacro _PushScope Continue ${${_Logic}${_n}} ; Continue goes to the start of the loop
+ !ifdef _c=true ; If is true
+ !insertmacro _${_o} `${_a}` `${_b}` "" ${_Exit${_n}}
+ !else ; If condition is false
+ !insertmacro _${_o} `${_a}` `${_b}` ${_Exit${_n}} ""
+ !endif
+ !endif
+ !undef _c=${_c}
+ !define ${_Logic}Condition ${_c} ; Remember the condition used
+ !verbose pop
+ !macroend
+ !define Do `!insertmacro _Do Do "" "" "" ""`
+ !define DoWhile `!insertmacro _Do Do true`
+ !define DoUntil `!insertmacro _Do Do false`
+
+ !macro _Goto _n _s
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !ifndef _${_n}
+ !error "Cannot use ${_n} without a preceding ${_s}"
+ !endif
+ Goto ${_${_n}}
+ !verbose pop
+ !macroend
+ !define ExitDo `!insertmacro _Goto ExitDo Do`
+
+ !macro _Loop _n _e _c _a _o _b
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !ifndef _Logic | ${_Logic}${_n}
+ !error "Cannot use ${_e} without a preceding ${_n}"
+ !endif
+ !define _c=${${_Logic}Condition}
+ !ifdef _c= ; If Do had no condition place the Continue label
+ ${_Continue}:
+ !endif
+ !undef _c=${${_Logic}Condition}
+ !define _c=${_c}
+ !ifdef _c= ; No ending condition
+ Goto ${${_Logic}${_n}}
+ !else ifdef _c=true ; If condition is true
+ !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}${_n}} ${_Exit${_n}}
+ !else ; If condition is false
+ !insertmacro _${_o} `${_a}` `${_b}` ${_Exit${_n}} ${${_Logic}${_n}}
+ !endif
+ !undef _c=${_c}
+ Goto ${_Continue} ; Just to ensure it is referenced at least once
+ ${_Exit${_n}}: ; Place the loop exit point
+ !undef ${_Logic}Condition
+ !insertmacro _PopScope Continue
+ !insertmacro _PopScope Break
+ !insertmacro _PopScope Exit${_n}
+ !undef ${_Logic}${_n}
+ !insertmacro _PopLogic
+ !verbose pop
+ !macroend
+ !define Loop `!insertmacro _Loop Do Loop "" "" "" ""`
+ !define LoopWhile `!insertmacro _Loop Do LoopWhile true`
+ !define LoopUntil `!insertmacro _Loop Do LoopUntil false`
+
+ !define Continue `!insertmacro _Goto Continue "For or Do or While"`
+ !define Break `!insertmacro _Goto Break "For or Do or While"`
+
+ !macro _Select _a
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !insertmacro _PushLogic
+ !define ${_Logic}Select `${_a}` ; Remember the left hand side of the comparison
+ !verbose pop
+ !macroend
+ !define Select `!insertmacro _Select`
+
+ !macro _Select_CaseElse
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !ifndef _Logic | ${_Logic}Select
+ !error "Cannot use Case without a preceding Select"
+ !endif
+ !ifdef ${_Logic}EndSelect ; This is set only after the first case
+ !ifndef ${_Logic}Else
+ !error "Cannot use Case following a CaseElse"
+ !endif
+ Goto ${${_Logic}EndSelect} ; Go to the EndSelect
+ ${${_Logic}Else}: ; Place the Else label
+ !undef ${_Logic}Else ; and remove it
+ !else
+ !define ${_Logic}EndSelect _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the EndSelect
+ !insertmacro _IncreaseCounter
+ !endif
+ !verbose pop
+ !macroend
+ !define CaseElse `!insertmacro _CaseElse`
+ !define Case_Else `!insertmacro _CaseElse` ; Compatibility with 2.2 and earlier
+ !define Default `!insertmacro _CaseElse` ; For the C-minded
+
+ !macro _Select_Case _a
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ ${CaseElse} ; Perform the CaseElse
+ !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case
+ !insertmacro _IncreaseCounter
+ !insertmacro _== `${${_Logic}Select}` `${_a}` "" ${${_Logic}Else}
+ !verbose pop
+ !macroend
+ !define Case `!insertmacro _Case`
+
+ !macro _Case2 _a _b
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ ${CaseElse} ; Perform the CaseElse
+ !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case
+ !insertmacro _IncreaseCounter
+ !insertmacro _== `${${_Logic}Select}` `${_a}` +2 ""
+ !insertmacro _== `${${_Logic}Select}` `${_b}` "" ${${_Logic}Else}
+ !verbose pop
+ !macroend
+ !define Case2 `!insertmacro _Case2`
+
+ !macro _Case3 _a _b _c
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ ${CaseElse} ; Perform the CaseElse
+ !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case
+ !insertmacro _IncreaseCounter
+ !insertmacro _== `${${_Logic}Select}` `${_a}` +3 ""
+ !insertmacro _== `${${_Logic}Select}` `${_b}` +2 ""
+ !insertmacro _== `${${_Logic}Select}` `${_c}` "" ${${_Logic}Else}
+ !verbose pop
+ !macroend
+ !define Case3 `!insertmacro _Case3`
+
+ !macro _Case4 _a _b _c _d
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ ${CaseElse} ; Perform the CaseElse
+ !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case
+ !insertmacro _IncreaseCounter
+ !insertmacro _== `${${_Logic}Select}` `${_a}` +4 ""
+ !insertmacro _== `${${_Logic}Select}` `${_b}` +3 ""
+ !insertmacro _== `${${_Logic}Select}` `${_c}` +2 ""
+ !insertmacro _== `${${_Logic}Select}` `${_d}` "" ${${_Logic}Else}
+ !verbose pop
+ !macroend
+ !define Case4 `!insertmacro _Case4`
+
+ !macro _Case5 _a _b _c _d _e
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ ${CaseElse} ; Perform the CaseElse
+ !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case
+ !insertmacro _IncreaseCounter
+ !insertmacro _== `${${_Logic}Select}` `${_a}` +5 ""
+ !insertmacro _== `${${_Logic}Select}` `${_b}` +4 ""
+ !insertmacro _== `${${_Logic}Select}` `${_c}` +3 ""
+ !insertmacro _== `${${_Logic}Select}` `${_d}` +2 ""
+ !insertmacro _== `${${_Logic}Select}` `${_e}` "" ${${_Logic}Else}
+ !verbose pop
+ !macroend
+ !define Case5 `!insertmacro _Case5`
+
+ !macro _EndSelect
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !ifndef _Logic | ${_Logic}Select
+ !error "Cannot use EndSelect without a preceding Select"
+ !endif
+ !ifdef ${_Logic}Else
+ ${${_Logic}Else}: ; Place the Else label
+ !undef ${_Logic}Else ; and remove it
+ !endif
+ !ifdef ${_Logic}EndSelect ; This won't be set if there weren't any cases
+ ${${_Logic}EndSelect}: ; Place the EndSelect
+ !undef ${_Logic}EndSelect ; and remove it
+ !endif
+ !undef ${_Logic}Select
+ !insertmacro _PopLogic
+ !verbose pop
+ !macroend
+ !define EndSelect `!insertmacro _EndSelect`
+
+ !macro _Switch _a
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !insertmacro _PushLogic
+ !insertmacro _PushScope Switch ${_Logic} ; Keep a separate stack for switch data
+ !insertmacro _PushScope Break _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a lable for beyond the end of the switch
+ !insertmacro _IncreaseCounter
+ !define ${_Switch}Var `${_a}` ; Remember the left hand side of the comparison
+ !tempfile ${_Switch}Tmp ; Create a temporary file
+ !define ${_Logic}Switch _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the end of the switch
+ !insertmacro _IncreaseCounter
+ Goto ${${_Logic}Switch} ; and go there
+ !verbose pop
+ !macroend
+ !define Switch `!insertmacro _Switch`
+
+ !macro _Case _a
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !ifdef _Logic & ${_Logic}Select ; Check for an active Select
+ !insertmacro _Select_Case `${_a}`
+ !else ifndef _Switch ; If not then check for an active Switch
+ !error "Cannot use Case without a preceding Select or Switch"
+ !else
+ !define _label _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for this case,
+ !insertmacro _IncreaseCounter
+ ${_label}: ; place it and add it's check to the temp file
+ !appendfile "${${_Switch}Tmp}" `!insertmacro _== $\`${${_Switch}Var}$\` $\`${_a}$\` ${_label} ""$\n`
+ !undef _label
+ !endif
+ !verbose pop
+ !macroend
+
+ !macro _CaseElse
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !ifdef _Logic & ${_Logic}Select ; Check for an active Select
+ !insertmacro _Select_CaseElse
+ !else ifndef _Switch ; If not then check for an active Switch
+ !error "Cannot use Case without a preceding Select or Switch"
+ !else ifdef ${_Switch}Else ; Already had a default case?
+ !error "Cannot use CaseElse following a CaseElse"
+ !else
+ !define ${_Switch}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the default case,
+ !insertmacro _IncreaseCounter
+ ${${_Switch}Else}: ; and place it
+ !endif
+ !verbose pop
+ !macroend
+
+ !macro _EndSwitch
+ !verbose push
+ !verbose ${LOGICLIB_VERBOSITY}
+ !ifndef _Logic | ${_Logic}Switch
+ !error "Cannot use EndSwitch without a preceding Switch"
+ !endif
+ Goto ${_Break} ; Skip the jump table
+ ${${_Logic}Switch}: ; Place the end of the switch
+ !undef ${_Logic}Switch
+ !include "${${_Switch}Tmp}" ; Include the jump table
+ !delfile "${${_Switch}Tmp}" ; and clear it up
+ !ifdef ${_Switch}Else ; Was there a default case?
+ Goto ${${_Switch}Else} ; then go there if all else fails
+ !undef ${_Switch}Else
+ !endif
+ !undef ${_Switch}Tmp
+ !undef ${_Switch}Var
+ ${_Break}: ; Place the break label
+ !insertmacro _PopScope Break
+ !insertmacro _PopScope Switch
+ !insertmacro _PopLogic
+ !verbose pop
+ !macroend
+ !define EndSwitch `!insertmacro _EndSwitch`
+
+!endif ; LOGICLIB
+!verbose 3
+!define LOGICLIB_VERBOSITY ${_LOGICLIB_VERBOSITY}
+!undef _LOGICLIB_VERBOSITY
+!verbose pop
diff --git a/Engine/bin/tools/nsis/app/Include/MUI.nsh b/Engine/bin/tools/nsis/app/Include/MUI.nsh
new file mode 100644
index 000000000..c2b2a71cd
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/MUI.nsh
@@ -0,0 +1 @@
+!include "${NSISDIR}\Contrib\Modern UI\System.nsh"
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Include/MUI2.nsh b/Engine/bin/tools/nsis/app/Include/MUI2.nsh
new file mode 100644
index 000000000..0e76adbf2
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/MUI2.nsh
@@ -0,0 +1 @@
+!include "${NSISDIR}\Contrib\Modern UI 2\MUI2.nsh"
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Include/Memento.nsh b/Engine/bin/tools/nsis/app/Include/Memento.nsh
new file mode 100644
index 000000000..6aa184392
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/Memento.nsh
@@ -0,0 +1,526 @@
+!verbose push
+!verbose 3
+
+!include LogicLib.nsh
+!include Sections.nsh
+
+!ifndef ___MEMENTO_NSH___
+!define ___MEMENTO_NSH___
+
+#####################################
+### Memento ###
+#####################################
+
+/*
+
+Memento is a set of macros that allow installers to remember user selection
+across separate runs of the installer. Currently, it can remember the state
+of sections and mark new sections as bold. In the future, it'll integrate
+InstallOptions and maybe even the Modern UI.
+
+A usage example can be found in `Examples\Memento.nsi`.
+
+*/
+
+#####################################
+### Usage Instructions ###
+#####################################
+
+/*
+
+1. Declare usage of Memento by including Memento.nsh at the top of the script.
+
+ !include Memento.nsh
+
+2. Define MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY with the a registry key
+ where sections' state should be saved.
+
+ !define MEMENTO_REGISTRY_ROOT HKLM
+ !define MEMENTO_REGISTRY_KEY \
+ Software\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram
+
+3. Replace Section with ${MementoSection} and SectionEnd with ${MementoSectionEnd}
+ for sections that whose state should be remembered by Memento.
+
+ For sections that should be unselected by default, use ${MementoSection}'s
+ brother - ${MementoUnselectedSection}.
+
+ Sections that don't already have an identifier must be assigned one.
+
+ Section identifiers must stay the same across different versions of the
+ installer or their state will be forgotten.
+
+4. Use ${MementoSectionDone} after the last ${MementoSection}.
+
+5. Add a call to ${MementoSectionRestore} to .onInit to restore the state
+ of all sections from the registry.
+
+ Function .onInit
+
+ ${MementoSectionRestore}
+
+ FunctionEnd
+
+6. Add a call to ${MementoSectionSave} to .onInstSuccess to save the state
+ of all sections to the registry.
+
+ Function .onInstSuccess
+
+ ${MementoSectionSave}
+
+ FunctionEnd
+
+7. Tattoo the location of the chosen registry key on your arm.
+
+*/
+
+#####################################
+### User API ###
+#####################################
+
+;
+; ${MementoSection}
+;
+; Defines a section whose state is remembered by Memento.
+;
+; Usage is similar to Section.
+;
+; ${MementoSection} "name" "some_id"
+;
+
+!define MementoSection "!insertmacro MementoSection"
+
+;
+; ${MementoSectionEnd}
+;
+; Ends a section previously opened using ${MementoSection}.
+;
+; Usage is similar to SectionEnd.
+;
+; ${MementoSection} "name" "some_id"
+; # some code...
+; ${MementoSectionEnd}
+;
+
+;
+; ${MementoUnselectedSection}
+;
+; Defines a section whose state is remembered by Memento and is
+; unselected by default.
+;
+; Usage is similar to Section with the /o switch.
+;
+; ${MementoUnselectedSection} "name" "some_id"
+;
+
+!define MementoUnselectedSection "!insertmacro MementoUnselectedSection"
+
+;
+; ${MementoSectionEnd}
+;
+; Ends a section previously opened using ${MementoSection}.
+;
+; Usage is similar to SectionEnd.
+;
+; ${MementoSection} "name" "some_id"
+; # some code...
+; ${MementoSectionEnd}
+;
+
+!define MementoSectionEnd "!insertmacro MementoSectionEnd"
+
+;
+; ${MementoSectionDone}
+;
+; Used after all ${MementoSection} have been set.
+;
+; ${MementoSection} "name1" "some_id1"
+; # some code...
+; ${MementoSectionEnd}
+;
+; ${MementoSection} "name2" "some_id2"
+; # some code...
+; ${MementoSectionEnd}
+;
+; ${MementoSection} "name3" "some_id3"
+; # some code...
+; ${MementoSectionEnd}
+;
+; ${MementoSectionDone}
+;
+
+!define MementoSectionDone "!insertmacro MementoSectionDone"
+
+;
+; ${MementoSectionRestore}
+;
+; Restores the state of all Memento sections from the registry.
+;
+; Commonly used in .onInit.
+;
+; Function .onInit
+;
+; ${MementoSectionRestore}
+;
+; FunctionEnd
+;
+
+!define MementoSectionRestore "!insertmacro MementoSectionRestore"
+
+;
+; ${MementoSectionSave}
+;
+; Saves the state of all Memento sections to the registry.
+;
+; Commonly used in .onInstSuccess.
+;
+; Function .onInstSuccess
+;
+; ${MementoSectionSave}
+;
+; FunctionEnd
+;
+
+!define MementoSectionSave "!insertmacro MementoSectionSave"
+
+
+#####################################
+### Internal Defines ###
+#####################################
+
+!define __MementoSectionIndex 1
+
+#####################################
+### Internal Macros ###
+#####################################
+
+!macro __MementoCheckSettings
+
+ !ifndef MEMENTO_REGISTRY_ROOT | MEMENTO_REGISTRY_KEY
+
+ !error "MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY must be defined before using any of Memento's macros"
+
+ !endif
+
+!macroend
+
+!macro __MementoSection flags name id
+
+ !insertmacro __MementoCheckSettings
+
+ !ifndef __MementoSectionIndex
+
+ !error "MementoSectionDone already used!"
+
+ !endif
+
+ !define __MementoSectionLastSectionId `${id}`
+
+ !verbose pop
+
+ Section ${flags} `${name}` `${id}`
+
+ !verbose push
+ !verbose 3
+
+!macroend
+
+#####################################
+### User Macros ###
+#####################################
+
+!macro MementoSection name id
+
+ !verbose push
+ !verbose 3
+
+ !insertmacro __MementoSection "" `${name}` `${id}`
+
+ !verbose pop
+
+!macroend
+
+!macro MementoUnselectedSection name id
+
+ !verbose push
+ !verbose 3
+
+ !insertmacro __MementoSection /o `${name}` `${id}`
+
+ !define __MementoSectionUnselected
+
+ !verbose pop
+
+!macroend
+
+!macro MementoSectionEnd
+
+ SectionEnd
+
+ !verbose push
+ !verbose 3
+
+ !insertmacro __MementoCheckSettings
+
+ !ifndef __MementoSectionIndex
+
+ !error "MementoSectionDone already used!"
+
+ !endif
+
+ !define /MATH __MementoSectionIndexNext \
+ ${__MementoSectionIndex} + 1
+
+ Function __MementoSectionMarkNew${__MementoSectionIndex}
+
+ ClearErrors
+ ReadRegDWORD $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}`
+
+ ${If} ${Errors}
+
+ !insertmacro SetSectionFlag `${${__MementoSectionLastSectionId}}` ${SF_BOLD}
+
+ ${EndIf}
+
+ GetFunctionAddress $0 __MementoSectionMarkNew${__MementoSectionIndexNext}
+ Goto $0
+
+ FunctionEnd
+
+ Function __MementoSectionRestoreStatus${__MementoSectionIndex}
+
+ ClearErrors
+ ReadRegDWORD $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}`
+
+ !ifndef __MementoSectionUnselected
+
+ ${If} ${Errors}
+ ${OrIf} $0 != 0
+
+ !insertmacro SelectSection `${${__MementoSectionLastSectionId}}`
+
+ ${Else}
+
+ !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}`
+
+ ${EndIf}
+
+ !else
+
+ !undef __MementoSectionUnselected
+
+ ${If} ${Errors}
+ ${OrIf} $0 == 0
+
+ !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}`
+
+ ${Else}
+
+ !insertmacro SelectSection `${${__MementoSectionLastSectionId}}`
+
+ ${EndIf}
+
+ !endif
+
+ GetFunctionAddress $0 __MementoSectionRestoreStatus${__MementoSectionIndexNext}
+ Goto $0
+
+ FunctionEnd
+
+ Function __MementoSectionSaveStatus${__MementoSectionIndex}
+
+ ${If} ${SectionIsSelected} `${${__MementoSectionLastSectionId}}`
+
+ WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}` 1
+
+ ${Else}
+
+ WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}` 0
+
+ ${EndIf}
+
+ GetFunctionAddress $0 __MementoSectionSaveStatus${__MementoSectionIndexNext}
+ Goto $0
+
+ FunctionEnd
+
+ !undef __MementoSectionIndex
+ !define __MementoSectionIndex ${__MementoSectionIndexNext}
+ !undef __MementoSectionIndexNext
+
+ !undef __MementoSectionLastSectionId
+
+ !verbose pop
+
+!macroend
+
+!macro MementoSectionDone
+
+ !verbose push
+ !verbose 3
+
+ !insertmacro __MementoCheckSettings
+
+ Function __MementoSectionMarkNew${__MementoSectionIndex}
+ FunctionEnd
+
+ Function __MementoSectionRestoreStatus${__MementoSectionIndex}
+ FunctionEnd
+
+ Function __MementoSectionSaveStatus${__MementoSectionIndex}
+ FunctionEnd
+
+ !undef __MementoSectionIndex
+
+ !verbose pop
+
+!macroend
+
+!macro MementoSectionRestore
+
+ !verbose push
+ !verbose 3
+
+ !insertmacro __MementoCheckSettings
+
+ Push $0
+ Push $1
+ Push $2
+ Push $3
+
+ # check for first usage
+
+ ClearErrors
+
+ ReadRegStr $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` MementoSectionUsed
+
+ ${If} ${Errors}
+
+ # use script defaults on first run
+ Goto done
+
+ ${EndIf}
+
+ # mark new components in bold
+
+ Call __MementoSectionMarkNew1
+
+ # mark section groups in bold
+
+ StrCpy $0 0
+ StrCpy $1 ""
+ StrCpy $2 ""
+ StrCpy $3 ""
+
+ loop:
+
+ ClearErrors
+
+ ${If} ${SectionIsBold} $0
+
+ ${If} $1 != ""
+
+ !insertmacro SetSectionFlag $1 ${SF_BOLD}
+
+ ${EndIf}
+
+ ${If} $2 != ""
+
+ !insertmacro SetSectionFlag $2 ${SF_BOLD}
+
+ ${EndIf}
+
+ ${If} $3 != ""
+
+ !insertmacro SetSectionFlag $3 ${SF_BOLD}
+
+ ${EndIf}
+
+ ${ElseIf} ${Errors}
+
+ Goto loop_end
+
+ ${EndIf}
+
+ ${If} ${SectionIsSectionGroup} $0
+
+ ${If} $1 == ""
+
+ StrCpy $1 $0
+
+ ${ElseIf} $2 == ""
+
+ StrCpy $2 $0
+
+ ${ElseIf} $3 == ""
+
+ StrCpy $3 $0
+
+ ${EndIf}
+
+ ${EndIf}
+
+ ${If} ${SectionIsSectionGroupEnd} $0
+
+ ${If} $3 != ""
+
+ StrCpy $3 ""
+
+ ${ElseIf} $2 != ""
+
+ StrCpy $2 ""
+
+ ${ElseIf} $1 != ""
+
+ StrCpy $1 ""
+
+ ${EndIf}
+
+ ${EndIf}
+
+ IntOp $0 $0 + 1
+
+ Goto loop
+ loop_end:
+
+ # restore sections' status
+
+ Call __MementoSectionRestoreStatus1
+
+ # all done
+
+ done:
+
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+
+ !verbose pop
+
+!macroend
+
+!macro MementoSectionSave
+
+ !verbose push
+ !verbose 3
+
+ !insertmacro __MementoCheckSettings
+
+ Push $0
+
+ WriteRegStr ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` MementoSectionUsed ""
+
+ Call __MementoSectionSaveStatus1
+
+ Pop $0
+
+ !verbose pop
+
+!macroend
+
+
+
+!endif # ___MEMENTO_NSH___
+
+!verbose pop
diff --git a/Engine/bin/tools/nsis/app/Include/MultiUser.nsh b/Engine/bin/tools/nsis/app/Include/MultiUser.nsh
new file mode 100644
index 000000000..c584fb5c5
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/MultiUser.nsh
@@ -0,0 +1,469 @@
+/*
+
+MultiUser.nsh
+
+Installer configuration for multi-user Windows environments
+
+Copyright 2008-2009 Joost Verburg
+
+*/
+
+!ifndef MULTIUSER_INCLUDED
+!define MULTIUSER_INCLUDED
+!verbose push
+!verbose 3
+
+;Standard NSIS header files
+
+!ifdef MULTIUSER_MUI
+ !include MUI2.nsh
+!endif
+!include nsDialogs.nsh
+!include LogicLib.nsh
+!include WinVer.nsh
+!include FileFunc.nsh
+
+;Variables
+
+Var MultiUser.Privileges
+Var MultiUser.InstallMode
+
+;Command line installation mode setting
+
+!ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
+ !include StrFunc.nsh
+ !ifndef StrStr_INCLUDED
+ ${StrStr}
+ !endif
+ !ifndef MULTIUSER_NOUNINSTALL
+ !ifndef UnStrStr_INCLUDED
+ ${UnStrStr}
+ !endif
+ !endif
+
+ Var MultiUser.Parameters
+ Var MultiUser.Result
+!endif
+
+;Installation folder stored in registry
+
+!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
+ Var MultiUser.InstDir
+!endif
+
+!ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
+ Var MultiUser.DefaultKeyValue
+!endif
+
+;Windows Vista UAC setting
+
+!if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
+ RequestExecutionLevel admin
+ !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
+!else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
+ RequestExecutionLevel admin
+ !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
+!else if "${MULTIUSER_EXECUTIONLEVEL}" == Highest
+ RequestExecutionLevel highest
+ !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
+!else
+ RequestExecutionLevel user
+!endif
+
+/*
+
+Install modes
+
+*/
+
+!macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
+
+ ;Install mode initialization - per-machine
+
+ ${ifnot} ${IsNT}
+ ${orif} $MultiUser.Privileges == "Admin"
+ ${orif} $MultiUser.Privileges == "Power"
+
+ StrCpy $MultiUser.InstallMode AllUsers
+
+ SetShellVarContext all
+
+ !if "${UNINSTALLER_PREFIX}" != UN
+ ;Set default installation location for installer
+ !ifdef MULTIUSER_INSTALLMODE_INSTDIR
+ StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}"
+ !endif
+ !endif
+
+ !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
+
+ ReadRegStr $MultiUser.InstDir HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
+
+ ${if} $MultiUser.InstDir != ""
+ StrCpy $INSTDIR $MultiUser.InstDir
+ ${endif}
+
+ !endif
+
+ !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
+ Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
+ !endif
+
+ ${endif}
+
+!macroend
+
+!macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
+
+ ;Install mode initialization - per-user
+
+ ${if} ${IsNT}
+
+ StrCpy $MultiUser.InstallMode CurrentUser
+
+ SetShellVarContext current
+
+ !if "${UNINSTALLER_PREFIX}" != UN
+ ;Set default installation location for installer
+ !ifdef MULTIUSER_INSTALLMODE_INSTDIR
+ ${if} ${AtLeastWin2000}
+ StrCpy $INSTDIR "$LOCALAPPDATA\${MULTIUSER_INSTALLMODE_INSTDIR}"
+ ${else}
+ StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}"
+ ${endif}
+ !endif
+ !endif
+
+ !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
+
+ ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
+
+ ${if} $MultiUser.InstDir != ""
+ StrCpy $INSTDIR $MultiUser.InstDir
+ ${endif}
+
+ !endif
+
+ !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
+ Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
+ !endif
+
+ ${endif}
+
+!macroend
+
+Function MultiUser.InstallMode.AllUsers
+ !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS "" ""
+FunctionEnd
+
+Function MultiUser.InstallMode.CurrentUser
+ !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER "" ""
+FunctionEnd
+
+!ifndef MULTIUSER_NOUNINSTALL
+
+Function un.MultiUser.InstallMode.AllUsers
+ !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN .un
+FunctionEnd
+
+Function un.MultiUser.InstallMode.CurrentUser
+ !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN .un
+FunctionEnd
+
+!endif
+
+/*
+
+Installer/uninstaller initialization
+
+*/
+
+!macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX
+
+ !ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT
+ Call "${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUCTIONQUIT}
+ !else
+ Quit
+ !endif
+
+!macroend
+
+!macro MULTIUSER_INIT_TEXTS
+
+ !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED
+ !define MULTIUSER_INIT_TEXT_ADMINREQUIRED "$(^Caption) requires administrator priviledges."
+ !endif
+
+ !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED
+ !define MULTIUSER_INIT_TEXT_POWERREQUIRED "$(^Caption) requires at least Power User priviledges."
+ !endif
+
+ !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE
+ !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this compuetr."
+ !endif
+
+!macroend
+
+!macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
+
+ ;Installer initialization - check privileges and set install mode
+
+ !insertmacro MULTIUSER_INIT_TEXTS
+
+ UserInfo::GetAccountType
+ Pop $MultiUser.Privileges
+
+ ${if} ${IsNT}
+
+ ;Check privileges
+
+ !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
+
+ ${if} $MultiUser.Privileges != "Admin"
+ MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
+ !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
+ ${endif}
+
+ !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
+
+ ${if} $MultiUser.Privileges != "Power"
+ ${andif} $MultiUser.Privileges != "Admin"
+ ${if} ${AtMostWinXP}
+ MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_POWERREQUIRED}"
+ ${else}
+ MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
+ ${endif}
+ !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
+ ${endif}
+
+ !endif
+
+ !ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
+
+ ;Default to per-machine installation if possible
+
+ ${if} $MultiUser.Privileges == "Admin"
+ ${orif} $MultiUser.Privileges == "Power"
+ !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
+ !else
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
+ !endif
+
+ !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
+
+ ;Set installation mode to setting from a previous installation
+
+ !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
+ ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
+ ${if} $MultiUser.DefaultKeyValue == ""
+ ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
+ ${if} $MultiUser.DefaultKeyValue != ""
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
+ ${endif}
+ ${endif}
+ !else
+ ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
+ ${if} $MultiUser.DefaultKeyValue == ""
+ ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
+ ${if} $MultiUser.DefaultKeyValue != ""
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
+ ${endif}
+ ${endif}
+ !endif
+
+ !endif
+
+ ${else}
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
+ ${endif}
+
+ !else
+
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
+
+ !endif
+
+ !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
+
+ ;Check for install mode setting on command line
+
+ ${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters
+
+ ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser"
+
+ ${if} $MultiUser.Result != ""
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
+ ${endif}
+
+ ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/AllUsers"
+
+ ${if} $MultiUser.Result != ""
+ ${if} $MultiUser.Privileges == "Admin"
+ ${orif} $MultiUser.Privileges == "Power"
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
+ ${else}
+ MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE}"
+ ${endif}
+ ${endif}
+
+ !endif
+
+ ${else}
+
+ ;Not running Windows NT, per-user installation not supported
+
+ Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
+
+ ${endif}
+
+!macroend
+
+!macro MULTIUSER_INIT
+ !verbose push
+ !verbose 3
+
+ !insertmacro MULTIUSER_INIT_CHECKS "" ""
+
+ !verbose pop
+!macroend
+
+!ifndef MULTIUSER_NOUNINSTALL
+
+!macro MULTIUSER_UNINIT
+ !verbose push
+ !verbose 3
+
+ !insertmacro MULTIUSER_INIT_CHECKS Un un.
+
+ !verbose pop
+!macroend
+
+!endif
+
+/*
+
+Modern UI 2 page
+
+*/
+
+!ifdef MULTIUSER_MUI
+
+!macro MULTIUSER_INSTALLMODEPAGE_INTERFACE
+
+ !ifndef MULTIUSER_INSTALLMODEPAGE_INTERFACE
+ !define MULTIUSER_INSTALLMODEPAGE_INTERFACE
+ Var MultiUser.InstallModePage
+
+ Var MultiUser.InstallModePage.Text
+
+ Var MultiUser.InstallModePage.AllUsers
+ Var MultiUser.InstallModePage.CurrentUser
+
+ Var MultiUser.InstallModePage.ReturnValue
+ !endif
+
+!macroend
+
+!macro MULTIUSER_PAGEDECLARATION_INSTALLMODE
+
+ !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE ""
+ !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE
+
+ !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)"
+ !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)"
+ !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)"
+
+ PageEx custom
+
+ PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
+
+ Caption " "
+
+ PageExEnd
+
+ !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
+
+ !undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP
+ !undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS
+ !undef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER
+
+!macroend
+
+!macro MULTIUSER_PAGE_INSTALLMODE
+
+ ;Modern UI page for install mode
+
+ !verbose push
+ !verbose 3
+
+ !ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
+ !error "A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest."
+ !endif
+
+ !insertmacro MUI_PAGE_INIT
+ !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE
+
+ !verbose pop
+
+!macroend
+
+!macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE
+
+ ;Page functions of Modern UI page
+
+ Function "${PRE}"
+
+ ${ifnot} ${IsNT}
+ Abort
+ ${endif}
+
+ ${if} $MultiUser.Privileges != "Power"
+ ${andif} $MultiUser.Privileges != "Admin"
+ Abort
+ ${endif}
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
+ !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE)
+
+ nsDialogs::Create 1018
+ Pop $MultiUser.InstallModePage
+
+ ${NSD_CreateLabel} 0u 0u 300u 20u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}"
+ Pop $MultiUser.InstallModePage.Text
+
+ ${NSD_CreateRadioButton} 20u 50u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}"
+ Pop $MultiUser.InstallModePage.AllUsers
+
+ ${NSD_CreateRadioButton} 20u 70u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}"
+ Pop $MultiUser.InstallModePage.CurrentUser
+
+ ${if} $MultiUser.InstallMode == "AllUsers"
+ SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0
+ ${else}
+ SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0
+ ${endif}
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
+ nsDialogs::Show
+
+ FunctionEnd
+
+ Function "${LEAVE}"
+ SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue
+
+ ${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED}
+ Call MultiUser.InstallMode.AllUsers
+ ${else}
+ Call MultiUser.InstallMode.CurrentUser
+ ${endif}
+
+ !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
+ FunctionEnd
+
+!macroend
+
+!endif
+
+!verbose pop
+!endif
diff --git a/Engine/bin/tools/nsis/app/Include/Sections.nsh b/Engine/bin/tools/nsis/app/Include/Sections.nsh
new file mode 100644
index 000000000..07aa47f93
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/Sections.nsh
@@ -0,0 +1,273 @@
+; Sections.nsh
+;
+; Defines and macros for section control
+;
+; Include in your script using:
+; !include "Sections.nsh"
+
+;--------------------------------
+
+!ifndef SECTIONS_INCLUDED
+
+!define SECTIONS_INCLUDED
+
+;--------------------------------
+
+; Generic section defines
+
+# section or section group is selected
+!define SF_SELECTED 1
+# section group
+!define SF_SECGRP 2
+!define SF_SUBSEC 2 # deprecated
+# section group end marker
+!define SF_SECGRPEND 4
+!define SF_SUBSECEND 4 # deprecated
+# bold text (Section !blah)
+!define SF_BOLD 8
+# read only (SectionIn RO)
+!define SF_RO 16
+# expanded section group (SectionGroup /e blah)
+!define SF_EXPAND 32
+# section group is partially selected
+!define SF_PSELECTED 64 # internal
+# internal
+!define SF_TOGGLED 128 # internal
+!define SF_NAMECHG 256 # internal
+
+# mask to toggle off the selected flag
+!define SECTION_OFF 0xFFFFFFFE
+
+;--------------------------------
+
+; Select / unselect / reserve section
+
+!macro SelectSection SECTION
+
+ Push $0
+ Push $1
+ StrCpy $1 "${SECTION}"
+ SectionGetFlags $1 $0
+ IntOp $0 $0 | ${SF_SELECTED}
+ SectionSetFlags $1 $0
+ Pop $1
+ Pop $0
+
+!macroend
+
+!macro UnselectSection SECTION
+
+ Push $0
+ Push $1
+ StrCpy $1 "${SECTION}"
+ SectionGetFlags $1 $0
+ IntOp $0 $0 & ${SECTION_OFF}
+ SectionSetFlags $1 $0
+ Pop $1
+ Pop $0
+
+!macroend
+
+; If section selected, will unselect, if unselected, will select
+
+!macro ReverseSection SECTION
+
+ Push $0
+ Push $1
+ StrCpy $1 "${SECTION}"
+ SectionGetFlags $1 $0
+ IntOp $0 $0 ^ ${SF_SELECTED}
+ SectionSetFlags $1 $0
+ Pop $1
+ Pop $0
+
+!macroend
+
+;--------------------------------
+
+; Macros for mutually exclusive section selection
+; Written by Tim Gallagher
+;
+; See one-section.nsi for an example of usage
+
+; Starts the Radio Button Block
+; You should pass a variable that keeps the selected section
+; as the first parameter for this macro. This variable should
+; be initialized to the default section's index.
+;
+; As this macro uses $R0 and $R1 you can't use those two as the
+; varible which will keep the selected section.
+
+!macro StartRadioButtons var
+
+ !define StartRadioButtons_Var "${var}"
+
+ Push $R0
+
+ SectionGetFlags "${StartRadioButtons_Var}" $R0
+ IntOp $R0 $R0 & ${SECTION_OFF}
+ SectionSetFlags "${StartRadioButtons_Var}" $R0
+
+ Push $R1
+
+ StrCpy $R1 "${StartRadioButtons_Var}"
+
+!macroend
+
+; A radio button
+
+!macro RadioButton SECTION_NAME
+
+ SectionGetFlags ${SECTION_NAME} $R0
+ IntOp $R0 $R0 & ${SF_SELECTED}
+ IntCmp $R0 ${SF_SELECTED} 0 +2 +2
+ StrCpy "${StartRadioButtons_Var}" ${SECTION_NAME}
+
+!macroend
+
+; Ends the radio button block
+
+!macro EndRadioButtons
+
+ StrCmp $R1 "${StartRadioButtons_Var}" 0 +4 ; selection hasn't changed
+ SectionGetFlags "${StartRadioButtons_Var}" $R0
+ IntOp $R0 $R0 | ${SF_SELECTED}
+ SectionSetFlags "${StartRadioButtons_Var}" $R0
+
+ Pop $R1
+ Pop $R0
+
+ !undef StartRadioButtons_Var
+
+!macroend
+
+;--------------------------------
+
+; These are two macros you can use to set a Section in an InstType
+; or clear it from an InstType.
+;
+; Written by Robert Kehl
+;
+; For details, see http://nsis.sourceforge.net/wiki/SetSectionInInstType%2C_ClearSectionInInstType
+;
+; Use the defines below for the WANTED_INSTTYPE paramter.
+
+!define INSTTYPE_1 1
+!define INSTTYPE_2 2
+!define INSTTYPE_3 4
+!define INSTTYPE_4 8
+!define INSTTYPE_5 16
+!define INSTTYPE_6 32
+!define INSTTYPE_7 64
+!define INSTTYPE_8 128
+!define INSTTYPE_9 256
+!define INSTTYPE_10 512
+!define INSTTYPE_11 1024
+!define INSTTYPE_12 2048
+!define INSTTYPE_13 4096
+!define INSTTYPE_14 8192
+!define INSTTYPE_15 16384
+!define INSTTYPE_16 32768
+!define INSTTYPE_17 65536
+!define INSTTYPE_18 131072
+!define INSTTYPE_19 262144
+!define INSTTYPE_20 524288
+!define INSTTYPE_21 1048576
+!define INSTTYPE_22 2097152
+!define INSTTYPE_23 4194304
+!define INSTTYPE_24 8388608
+!define INSTTYPE_25 16777216
+!define INSTTYPE_26 33554432
+!define INSTTYPE_27 67108864
+!define INSTTYPE_28 134217728
+!define INSTTYPE_29 268435456
+!define INSTTYPE_30 536870912
+!define INSTTYPE_31 1073741824
+!define INSTTYPE_32 2147483648
+
+!macro SetSectionInInstType SECTION_NAME WANTED_INSTTYPE
+
+ Push $0
+ Push $1
+ StrCpy $1 "${SECTION_NAME}"
+ SectionGetInstTypes $1 $0
+ IntOp $0 $0 | ${WANTED_INSTTYPE}
+ SectionSetInstTypes $1 $0
+ Pop $1
+ Pop $0
+
+!macroend
+
+!macro ClearSectionInInstType SECTION_NAME WANTED_INSTTYPE
+
+ Push $0
+ Push $1
+ Push $2
+ StrCpy $2 "${SECTION_NAME}"
+ SectionGetInstTypes $2 $0
+ StrCpy $1 ${WANTED_INSTTYPE}
+ IntOp $1 $1 ~
+ IntOp $0 $0 & $1
+ SectionSetInstTypes $2 $0
+ Pop $2
+ Pop $1
+ Pop $0
+
+!macroend
+
+;--------------------------------
+
+; Set / clear / check bits in a section's flags
+; Written by derekrprice
+
+; Set one or more bits in a sections's flags
+
+!macro SetSectionFlag SECTION BITS
+
+ Push $R0
+ Push $R1
+ StrCpy $R1 "${SECTION}"
+ SectionGetFlags $R1 $R0
+ IntOp $R0 $R0 | "${BITS}"
+ SectionSetFlags $R1 $R0
+ Pop $R1
+ Pop $R0
+
+!macroend
+
+; Clear one or more bits in section's flags
+
+!macro ClearSectionFlag SECTION BITS
+
+ Push $R0
+ Push $R1
+ Push $R2
+ StrCpy $R2 "${SECTION}"
+ SectionGetFlags $R2 $R0
+ IntOp $R1 "${BITS}" ~
+ IntOp $R0 $R0 & $R1
+ SectionSetFlags $R2 $R0
+ Pop $R2
+ Pop $R1
+ Pop $R0
+
+!macroend
+
+; Check if one or more bits in section's flags are set
+; If they are, jump to JUMPIFSET
+; If not, jump to JUMPIFNOTSET
+
+!macro SectionFlagIsSet SECTION BITS JUMPIFSET JUMPIFNOTSET
+ Push $R0
+ SectionGetFlags "${SECTION}" $R0
+ IntOp $R0 $R0 & "${BITS}"
+ IntCmp $R0 "${BITS}" +3
+ Pop $R0
+ StrCmp "" "${JUMPIFNOTSET}" +3 "${JUMPIFNOTSET}"
+ Pop $R0
+ Goto "${JUMPIFSET}"
+!macroend
+
+;--------------------------------
+
+!endif
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Include/StrFunc.nsh b/Engine/bin/tools/nsis/app/Include/StrFunc.nsh
new file mode 100644
index 000000000..f6c4b3e4e
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/StrFunc.nsh
@@ -0,0 +1,1784 @@
+/*
+o-----------------------------------------------------------------------------o
+|String Functions Header File 1.09 |
+(-----------------------------------------------------------------------------)
+| By deguix / A Header file for NSIS 2.01 |
+| -------------------------------|
+| |
+| This header file contains NSIS functions for string manipulation. |
+o-----------------------------------------------------------------------------o
+*/
+
+!verbose push
+!verbose 3
+!ifndef STRFUNC_VERBOSITY
+ !define STRFUNC_VERBOSITY 3
+!endif
+!define _STRFUNC_VERBOSITY ${STRFUNC_VERBOSITY}
+!undef STRFUNC_VERBOSITY
+!verbose ${_STRFUNC_VERBOSITY}
+
+!include LogicLib.nsh
+
+!ifndef STRFUNC
+
+ !define FALSE 0
+ !define TRUE 1
+
+ ;Header File Identification
+
+ !define STRFUNC `String Functions Header File`
+ !define STRFUNC_SHORT `StrFunc`
+ !define STRFUNC_CREDITS `2004 Diego Pedroso`
+
+ ;Header File Version
+
+ !define STRFUNC_VERMAJ 1
+ !define STRFUNC_VERMED 09
+ ;!define STRFUNC_VERMIN 0
+ ;!define STRFUNC_VERBLD 0
+
+ !define STRFUNC_VER `${STRFUNC_VERMAJ}.${STRFUNC_VERMED}`
+
+ ;Header File Init Message Prefix and Postfix
+
+ !define STRFUNC_INITMSGPRE `----------------------------------------------------------------------$\r$\n`
+ !define STRFUNC_INITMSGPOST `$\r$\n----------------------------------------------------------------------$\r$\n`
+
+ ;Header File Init Message
+
+ !verbose push
+ !verbose 4
+ !echo `${STRFUNC_INITMSGPRE}NSIS ${STRFUNC} ${STRFUNC_VER} - Copyright ${STRFUNC_CREDITS}${STRFUNC_INITMSGPOST}`
+ !verbose pop
+
+ ;Header File Function Init Message Prefix and Postfix
+
+ !define STRFUNC_FUNCMSGPRE ``
+ !define STRFUNC_FUNCMSGPOST ``
+
+ ;Header File Function Macros
+
+ !macro STRFUNC_FUNCLIST_INSERT Name
+ !ifdef StrFunc_List
+ !define StrFunc_List2 `${StrFunc_List}`
+ !undef StrFunc_List
+ !define StrFunc_List `${StrFunc_List2}|${Name}`
+ !undef StrFunc_List2
+ !else
+ !define StrFunc_List `${Name}`
+ !endif
+ !macroend
+
+ !macro STRFUNC_DEFFUNC Name
+ !insertmacro STRFUNC_FUNCLIST_INSERT ${Name}
+
+ !define `${Name}` `!insertmacro FUNCTION_STRING_${Name}`
+ !define `Un${Name}` `!insertmacro FUNCTION_STRING_Un${Name}`
+ !macroend
+
+ !macro STRFUNC_FUNC ShortName Credits
+ !verbose push
+ !verbose 4
+
+ !ifndef `Un${ShortName}`
+ !echo `${STRFUNC_FUNCMSGPRE}$ {Un${ShortName}} - Copyright ${Credits}${STRFUNC_FUNCMSGPOST}`
+ !verbose pop
+ !define `Un${ShortName}` `!insertmacro FUNCTION_STRING_Un${ShortName}_Call`
+ !define `Un${ShortName}_INCLUDED`
+ Function `un.${ShortName}`
+ !else
+ !echo `${STRFUNC_FUNCMSGPRE}$ {${ShortName}} - Copyright ${Credits}${STRFUNC_FUNCMSGPOST}`
+ !verbose pop
+ !undef `${ShortName}`
+ !define `${ShortName}` `!insertmacro FUNCTION_STRING_${ShortName}_Call`
+ !define `${ShortName}_INCLUDED`
+ Function `${ShortName}`
+ !endif
+ !macroend
+
+ ;Function Names Startup Definition
+
+ !insertmacro STRFUNC_DEFFUNC StrCase
+ !define StrCase_List `ResultVar|String|Type`
+ !define StrCase_TypeList `Output|Text|Option U L T S <>`
+ !macro `FUNCTION_STRING_UnStrCase`
+ !undef UnStrCase
+ !insertmacro FUNCTION_STRING_StrCase
+ !macroend
+
+ !insertmacro STRFUNC_DEFFUNC StrClb
+ !define StrClb_List `ResultVar|String|Action`
+ !define StrClb_TypeList `Output|Text|Option > < <>`
+ !macro `FUNCTION_STRING_UnStrClb`
+ !undef UnStrClb
+ !insertmacro FUNCTION_STRING_StrClb
+ !macroend
+
+ !insertmacro STRFUNC_DEFFUNC StrIOToNSIS
+ !define StrIOToNSIS_List `ResultVar|String`
+ !define StrIOToNSIS_TypeList `Output|Text`
+ !macro `FUNCTION_STRING_UnStrIOToNSIS`
+ !undef UnStrIOToNSIS
+ !insertmacro FUNCTION_STRING_StrIOToNSIS
+ !macroend
+
+ !insertmacro STRFUNC_DEFFUNC StrLoc
+ !define StrLoc_List `ResultVar|String|StrToSearchFor|CounterDirection`
+ !define StrLoc_TypeList `Output|Text|Text|Option > <`
+ !macro `FUNCTION_STRING_UnStrLoc`
+ !undef UnStrLoc
+ !insertmacro FUNCTION_STRING_StrLoc
+ !macroend
+
+ !insertmacro STRFUNC_DEFFUNC StrNSISToIO
+ !define StrNSISToIO_List `ResultVar|String`
+ !define StrNSISToIO_TypeList `Output|Text`
+ !macro `FUNCTION_STRING_UnStrNSISToIO`
+ !undef UnStrNSISToIO
+ !insertmacro FUNCTION_STRING_StrNSISToIO
+ !macroend
+
+ !insertmacro STRFUNC_DEFFUNC StrRep
+ !define StrRep_List `ResultVar|String|StrToReplace|ReplacementString`
+ !define StrRep_TypeList `Output|Text|Text|Text`
+ !macro `FUNCTION_STRING_UnStrRep`
+ !undef UnStrRep
+ !insertmacro FUNCTION_STRING_StrRep
+ !macroend
+
+ !insertmacro STRFUNC_DEFFUNC StrSort
+ !define StrSort_List `ResultVar|String|LeftStr|CenterStr|RightStr|IncludeLeftStr|IncludeCenterStr|IncludeRightStr`
+ !define StrSort_TypeList `Output|Text|Text|Text|Text|Option 1 0|Option 1 0|Option 1 0`
+ !macro `FUNCTION_STRING_UnStrSort`
+ !undef UnStrSort
+ !insertmacro FUNCTION_STRING_StrSort
+ !macroend
+
+ !insertmacro STRFUNC_DEFFUNC StrStr
+ !define StrStr_List `ResultVar|String|StrToSearchFor`
+ !define StrStr_TypeList `Output|Text|Text`
+ !macro `FUNCTION_STRING_UnStrStr`
+ !undef UnStrStr
+ !insertmacro FUNCTION_STRING_StrStr
+ !macroend
+
+ !insertmacro STRFUNC_DEFFUNC StrStrAdv
+ !define StrStrAdv_List `ResultVar|String|StrToSearchFor|SearchDirection|ResultStrDirection|DisplayStrToSearch|Loops|CaseSensitive`
+ !define StrStrAdv_TypeList `Output|Text|Text|Option > <|Option > <|Option 1 0|Text|Option 0 1`
+ !macro `FUNCTION_STRING_UnStrStrAdv`
+ !undef UnStrStrAdv
+ !insertmacro FUNCTION_STRING_StrStrAdv
+ !macroend
+
+ !insertmacro STRFUNC_DEFFUNC StrTok
+ !define StrTok_List `ResultVar|String|Separators|ResultPart|SkipEmptyParts`
+ !define StrTok_TypeList `Output|Text|Text|Mixed L|Option 1 0`
+ !macro `FUNCTION_STRING_UnStrTok`
+ !undef UnStrTok
+ !insertmacro FUNCTION_STRING_StrTok
+ !macroend
+
+ !insertmacro STRFUNC_DEFFUNC StrTrimNewLines
+ !define StrTrimNewLines_List `ResultVar|String`
+ !define StrTrimNewLines_TypeList `Output|Text`
+ !macro `FUNCTION_STRING_UnStrTrimNewLines`
+ !undef UnStrTrimNewLines
+ !insertmacro FUNCTION_STRING_StrTrimNewLines
+ !macroend
+
+ ;Function Codes for Install and Uninstall
+
+ # Function StrCase
+ ################
+
+ !macro FUNCTION_STRING_StrCase
+ !insertmacro STRFUNC_FUNC `StrCase` `2004 Diego Pedroso - Based on functions by Dave Laundon`
+
+ /*After this point:
+ ------------------------------------------
+ $0 = String (input)
+ $1 = Type (input)
+ $2 = StrLength (temp)
+ $3 = StartChar (temp)
+ $4 = EndChar (temp)
+ $5 = ResultStr (temp)
+ $6 = CurrentChar (temp)
+ $7 = LastChar (temp)
+ $8 = Temp (temp)*/
+
+ ;Get input from user
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+
+ ;Initialize variables
+ StrCpy $2 ""
+ StrCpy $3 ""
+ StrCpy $4 ""
+ StrCpy $5 ""
+ StrCpy $6 ""
+ StrCpy $7 ""
+ StrCpy $8 ""
+
+ ;Upper and lower cases are simple to use
+ ${If} $1 == "U"
+
+ ;Upper Case System:
+ ;------------------
+ ; Convert all characters to upper case.
+
+ System::Call "User32::CharUpper(t r0 r5)i"
+ Goto StrCase_End
+ ${ElseIf} $1 == "L"
+
+ ;Lower Case System:
+ ;------------------
+ ; Convert all characters to lower case.
+
+ System::Call "User32::CharLower(t r0 r5)i"
+ Goto StrCase_End
+ ${EndIf}
+
+ ;For the rest of cases:
+ ;Get "String" length
+ StrLen $2 $0
+
+ ;Make a loop until the end of "String"
+ ${For} $3 0 $2
+ ;Add 1 to "EndChar" counter also
+ IntOp $4 $3 + 1
+
+ # Step 1: Detect one character at a time
+
+ ;Remove characters before "StartChar" except when
+ ;"StartChar" is the first character of "String"
+ ${If} $3 <> 0
+ StrCpy $6 $0 `` $3
+ ${EndIf}
+
+ ;Remove characters after "EndChar" except when
+ ;"EndChar" is the last character of "String"
+ ${If} $4 <> $2
+ ${If} $3 = 0
+ StrCpy $6 $0 1
+ ${Else}
+ StrCpy $6 $6 1
+ ${EndIf}
+ ${EndIf}
+
+ # Step 2: Convert to the advanced case user chose:
+
+ ${If} $1 == "T"
+
+ ;Title Case System:
+ ;------------------
+ ; Convert all characters after a non-alphabetic character to upper case.
+ ; Else convert to lower case.
+
+ ;Use "IsCharAlpha" for the job
+ System::Call "*(&t1 r7) i .r8"
+ System::Call "*$8(&i1 .r7)"
+ System::Free $8
+ System::Call "user32::IsCharAlpha(i r7) i .r8"
+
+ ;Verify "IsCharAlpha" result and convert the character
+ ${If} $8 = 0
+ System::Call "User32::CharUpper(t r6 r6)i"
+ ${Else}
+ System::Call "User32::CharLower(t r6 r6)i"
+ ${EndIf}
+ ${ElseIf} $1 == "S"
+
+ ;Sentence Case System:
+ ;------------------
+ ; Convert all characters after a ".", "!" or "?" character to upper case.
+ ; Else convert to lower case. Spaces or tabs after these marks are ignored.
+
+ ;Detect current characters and ignore if necessary
+ ${If} $6 == " "
+ ${OrIf} $6 == "$\t"
+ Goto IgnoreLetter
+ ${EndIf}
+
+ ;Detect last characters and convert
+ ${If} $7 == "."
+ ${OrIf} $7 == "!"
+ ${OrIf} $7 == "?"
+ ${OrIf} $7 == ""
+ System::Call "User32::CharUpper(t r6 r6)i"
+ ${Else}
+ System::Call "User32::CharLower(t r6 r6)i"
+ ${EndIf}
+ ${ElseIf} $1 == "<>"
+
+ ;Switch Case System:
+ ;------------------
+ ; Switch all characters cases to their inverse case.
+
+ ;Use "IsCharUpper" for the job
+ System::Call "*(&t1 r6) i .r8"
+ System::Call "*$8(&i1 .r7)"
+ System::Free $8
+ System::Call "user32::IsCharUpper(i r7) i .r8"
+
+ ;Verify "IsCharUpper" result and convert the character
+ ${If} $8 = 0
+ System::Call "User32::CharUpper(t r6 r6)i"
+ ${Else}
+ System::Call "User32::CharLower(t r6 r6)i"
+ ${EndIf}
+ ${EndIf}
+
+ ;Write the character to "LastChar"
+ StrCpy $7 $6
+
+ IgnoreLetter:
+ ;Add this character to "ResultStr"
+ StrCpy $5 `$5$6`
+ ${Next}
+
+ StrCase_End:
+
+ /*After this point:
+ ------------------------------------------
+ $0 = OutVar (output)*/
+
+ ; Copy "ResultStr" to "OutVar"
+ StrCpy $0 $5
+
+ ;Return output to user
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+ FunctionEnd
+
+ !macroend
+
+ !macro FUNCTION_STRING_StrClb
+ !insertmacro STRFUNC_FUNC `StrClb` `2004 Diego Pedroso - Based on functions by Nik Medved`
+
+ /*After this point:
+ ------------------------------------------
+ $0 = String (input)
+ $1 = Action (input)
+ $2 = Lock/Unlock (temp)
+ $3 = Temp (temp)
+ $4 = Temp2 (temp)*/
+
+ ;Get input from user
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+
+ StrCpy $2 ""
+ StrCpy $3 ""
+ StrCpy $4 ""
+
+ ;Open the clipboard to do the operations the user chose (kichik's fix)
+ System::Call 'user32::OpenClipboard(i $HWNDPARENT)'
+
+ ${If} $1 == ">" ;Set
+
+ ;Step 1: Clear the clipboard
+ System::Call 'user32::EmptyClipboard()'
+
+ ;Step 2: Allocate global heap
+ StrLen $2 $0
+ IntOp $2 $2 + 1
+ System::Call 'kernel32::GlobalAlloc(i 2, i r2) i.r2'
+
+ ;Step 3: Lock the handle
+ System::Call 'kernel32::GlobalLock(i r2) i.r3'
+
+ ;Step 4: Copy the text to locked clipboard buffer
+ System::Call 'kernel32::lstrcpyA(i r3, t r0)'
+
+ ;Step 5: Unlock the handle again
+ System::Call 'kernel32::GlobalUnlock(i r2)'
+
+ ;Step 6: Set the information to the clipboard
+ System::Call 'user32::SetClipboardData(i 1, i r2)'
+
+ StrCpy $0 ""
+
+ ${ElseIf} $1 == "<" ;Get
+
+ ;Step 1: Get clipboard data
+ System::Call 'user32::GetClipboardData(i 1) i .r2'
+
+ ;Step 2: Lock and copy data (kichik's fix)
+ System::Call 'kernel32::GlobalLock(i r2) t .r0'
+
+ ;Step 3: Unlock (kichik's fix)
+ System::Call 'kernel32::GlobalUnlock(i r2)'
+
+ ${ElseIf} $1 == "<>" ;Swap
+
+ ;Step 1: Get clipboard data
+ System::Call 'user32::GetClipboardData(i 1) i .r2'
+
+ ;Step 2: Lock and copy data (kichik's fix)
+ System::Call 'kernel32::GlobalLock(i r2) t .r4'
+
+ ;Step 3: Unlock (kichik's fix)
+ System::Call 'kernel32::GlobalUnlock(i r2)'
+
+ ;Step 4: Clear the clipboard
+ System::Call 'user32::EmptyClipboard()'
+
+ ;Step 5: Allocate global heap
+ StrLen $2 $0
+ IntOp $2 $2 + 1
+ System::Call 'kernel32::GlobalAlloc(i 2, i r2) i.r2'
+
+ ;Step 6: Lock the handle
+ System::Call 'kernel32::GlobalLock(i r2) i.r3'
+
+ ;Step 7: Copy the text to locked clipboard buffer
+ System::Call 'kernel32::lstrcpyA(i r3, t r0)'
+
+ ;Step 8: Unlock the handle again
+ System::Call 'kernel32::GlobalUnlock(i r2)'
+
+ ;Step 9: Set the information to the clipboard
+ System::Call 'user32::SetClipboardData(i 1, i r2)'
+
+ StrCpy $0 $4
+ ${Else} ;Clear
+
+ ;Step 1: Clear the clipboard
+ System::Call 'user32::EmptyClipboard()'
+
+ StrCpy $0 ""
+ ${EndIf}
+
+ ;Close the clipboard
+ System::Call 'user32::CloseClipboard()'
+
+ /*After this point:
+ ------------------------------------------
+ $0 = OutVar (output)*/
+
+ ;Return result to user
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+ FunctionEnd
+
+ !macroend
+
+ # Function StrIOToNSIS
+ ####################
+
+ !macro FUNCTION_STRING_StrIOToNSIS
+ !insertmacro STRFUNC_FUNC `StrIOToNSIS` `2004 "bluenet" - Based on functions by Amir Szekely, Joost Verburg, Dave Laundon and Diego Pedroso`
+
+ /*After this point:
+ ------------------------------------------
+ $R0 = String (input/output)
+ $R1 = StartCharPos (temp)
+ $R2 = StrLen (temp)
+ $R3 = TempStr (temp)
+ $R4 = TempRepStr (temp)*/
+
+ ;Get input from user
+ Exch $R0
+ Push $R1
+ Push $R2
+ Push $R3
+ Push $R4
+
+ ;Get "String" length
+ StrLen $R2 $R0
+
+ ;Loop until "String" end is reached
+ ${For} $R1 0 $R2
+ ;Get the next "String" characters
+ StrCpy $R3 $R0 2 $R1
+
+ ;Detect if current character is:
+ ${If} $R3 == "\\" ;Back-slash
+ StrCpy $R4 "\"
+ ${ElseIf} $R3 == "\r" ;Carriage return
+ StrCpy $R4 "$\r"
+ ${ElseIf} $R3 == "\n" ;Line feed
+ StrCpy $R4 "$\n"
+ ${ElseIf} $R3 == "\t" ;Tab
+ StrCpy $R4 "$\t"
+ ${Else} ;Anything else
+ StrCpy $R4 ""
+ ${EndIf}
+
+ ;Detect if "TempRepStr" is not empty
+ ${If} $R4 != ""
+ ;Replace the old characters with the new one
+ StrCpy $R3 $R0 $R1
+ IntOp $R1 $R1 + 2
+ StrCpy $R0 $R0 "" $R1
+ StrCpy $R0 "$R3$R4$R0"
+ IntOp $R2 $R2 - 1 ;Decrease "StrLen"
+ IntOp $R1 $R1 - 2 ;Go back to the next character
+ ${EndIf}
+ ${Next}
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Exch $R0
+ FunctionEnd
+ !macroend
+
+ # Function StrLoc
+ ###############
+
+ !macro FUNCTION_STRING_StrLoc
+ !insertmacro STRFUNC_FUNC `StrLoc` `2004 Diego Pedroso - Based on functions by Ximon Eighteen`
+
+ /*After this point:
+ ------------------------------------------
+ $R0 = OffsetDirection (input)
+ $R1 = StrToSearch (input)
+ $R2 = String (input)
+ $R3 = StrToSearchLen (temp)
+ $R4 = StrLen (temp)
+ $R5 = StartCharPos (temp)
+ $R6 = TempStr (temp)*/
+
+ ;Get input from user
+ Exch $R0
+ Exch
+ Exch $R1
+ Exch 2
+ Exch $R2
+ Push $R3
+ Push $R4
+ Push $R5
+ Push $R6
+
+ ;Get "String" and "StrToSearch" length
+ StrLen $R3 $R1
+ StrLen $R4 $R2
+ ;Start "StartCharPos" counter
+ StrCpy $R5 0
+
+ ;Loop until "StrToSearch" is found or "String" reaches its end
+ ${Do}
+ ;Remove everything before and after the searched part ("TempStr")
+ StrCpy $R6 $R2 $R3 $R5
+
+ ;Compare "TempStr" with "StrToSearch"
+ ${If} $R6 == $R1
+ ${If} $R0 == `<`
+ IntOp $R6 $R3 + $R5
+ IntOp $R0 $R4 - $R6
+ ${Else}
+ StrCpy $R0 $R5
+ ${EndIf}
+ ${ExitDo}
+ ${EndIf}
+ ;If not "StrToSearch", this could be "String" end
+ ${If} $R5 >= $R4
+ StrCpy $R0 ``
+ ${ExitDo}
+ ${EndIf}
+ ;If not, continue the loop
+ IntOp $R5 $R5 + 1
+ ${Loop}
+
+ ;Return output to user
+ Pop $R6
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Exch
+ Pop $R1
+ Exch $R0
+ FunctionEnd
+
+ !macroend
+
+ # Function StrNSISToIO
+ ####################
+
+ !macro FUNCTION_STRING_StrNSISToIO
+ !insertmacro STRFUNC_FUNC `StrNSISToIO` `2004 "bluenet" - Based on functions by Amir Szekely, Joost Verburg, Dave Laundon and Diego Pedroso`
+
+ /*After this point:
+ ------------------------------------------
+ $R0 = String (input/output)
+ $R1 = StartCharPos (temp)
+ $R2 = StrLen (temp)
+ $R3 = TempStr (temp)
+ $R4 = TempRepStr (temp)*/
+
+ ;Get input from user
+ Exch $R0
+ Push $R1
+ Push $R2
+ Push $R3
+ Push $R4
+
+ ;Get "String" length
+ StrLen $R2 $R0
+
+ ;Loop until "String" end is reached
+ ${For} $R1 0 $R2
+ ;Get the next "String" character
+ StrCpy $R3 $R0 1 $R1
+
+ ;Detect if current character is:
+ ${If} $R3 == "$\r" ;Back-slash
+ StrCpy $R4 "\r"
+ ${ElseIf} $R3 == "$\n" ;Carriage return
+ StrCpy $R4 "\n"
+ ${ElseIf} $R3 == "$\t" ;Line feed
+ StrCpy $R4 "\t"
+ ${ElseIf} $R3 == "\" ;Tab
+ StrCpy $R4 "\\"
+ ${Else} ;Anything else
+ StrCpy $R4 ""
+ ${EndIf}
+
+ ;Detect if "TempRepStr" is not empty
+ ${If} $R4 != ""
+ ;Replace the old character with the new ones
+ StrCpy $R3 $R0 $R1
+ IntOp $R1 $R1 + 1
+ StrCpy $R0 $R0 "" $R1
+ StrCpy $R0 "$R3$R4$R0"
+ IntOp $R2 $R2 + 1 ;Increase "StrLen"
+ ${EndIf}
+ ${Next}
+
+ ;Return output to user
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Exch $R0
+ FunctionEnd
+ !macroend
+
+ # Function StrRep
+ ###############
+
+ !macro FUNCTION_STRING_StrRep
+ !insertmacro STRFUNC_FUNC `StrRep` `2004 Diego Pedroso - Based on functions by Hendri Adriaens`
+
+ /*After this point:
+ ------------------------------------------
+ $R0 = ReplacementString (input)
+ $R1 = StrToSearch (input)
+ $R2 = String (input)
+ $R3 = RepStrLen (temp)
+ $R4 = StrToSearchLen (temp)
+ $R5 = StrLen (temp)
+ $R6 = StartCharPos (temp)
+ $R7 = TempStrL (temp)
+ $R8 = TempStrR (temp)*/
+
+ ;Get input from user
+ Exch $R0
+ Exch
+ Exch $R1
+ Exch
+ Exch 2
+ Exch $R2
+ Push $R3
+ Push $R4
+ Push $R5
+ Push $R6
+ Push $R7
+ Push $R8
+
+ ;Return "String" if "StrToSearch" is ""
+ ${IfThen} $R1 == "" ${|} Goto Done ${|}
+
+ ;Get "ReplacementString", "String" and "StrToSearch" length
+ StrLen $R3 $R0
+ StrLen $R4 $R1
+ StrLen $R5 $R2
+ ;Start "StartCharPos" counter
+ StrCpy $R6 0
+
+ ;Loop until "StrToSearch" is found or "String" reaches its end
+ ${Do}
+ ;Remove everything before and after the searched part ("TempStrL")
+ StrCpy $R7 $R2 $R4 $R6
+
+ ;Compare "TempStrL" with "StrToSearch"
+ ${If} $R7 == $R1
+ ;Split "String" to replace the string wanted
+ StrCpy $R7 $R2 $R6 ;TempStrL
+
+ ;Calc: "StartCharPos" + "StrToSearchLen" = EndCharPos
+ IntOp $R8 $R6 + $R4
+
+ StrCpy $R8 $R2 "" $R8 ;TempStrR
+
+ ;Insert the new string between the two separated parts of "String"
+ StrCpy $R2 $R7$R0$R8
+ ;Now calculate the new "StrLen" and "StartCharPos"
+ StrLen $R5 $R2
+ IntOp $R6 $R6 + $R3
+ ${Continue}
+ ${EndIf}
+
+ ;If not "StrToSearch", this could be "String" end
+ ${IfThen} $R6 >= $R5 ${|} ${ExitDo} ${|}
+ ;If not, continue the loop
+ IntOp $R6 $R6 + 1
+ ${Loop}
+
+ Done:
+
+ /*After this point:
+ ------------------------------------------
+ $R0 = OutVar (output)*/
+
+ ;Return output to user
+ StrCpy $R0 $R2
+ Pop $R8
+ Pop $R7
+ Pop $R6
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Exch $R0
+ FunctionEnd
+
+ !macroend
+
+ # Function StrSort
+ ################
+
+ !macro FUNCTION_STRING_StrSort
+ !insertmacro STRFUNC_FUNC `StrSort` `2004 Diego Pedroso - Based on functions by Stuart Welch`
+
+ /*After this point:
+ ------------------------------------------
+ $R0 = String (input)
+ $R1 = LeftStr (input)
+ $R2 = CenterStr (input)
+ $R3 = RightStr (input)
+ $R4 = IncludeLeftStr (input)
+ $R5 = IncludeCenterStr (input)
+ $R6 = IncludeRightStr (input)
+
+ $0 = StrLen (temp)
+ $1 = LeftStrLen (temp)
+ $2 = CenterStrLen (temp)
+ $3 = RightStrLen (temp)
+ $4 = StartPos (temp)
+ $5 = EndPos (temp)
+ $6 = StartCharPos (temp)
+ $7 = EndCharPos (temp)
+ $8 = TempStr (temp)*/
+
+ ;Get input from user
+ Exch $R6
+ Exch
+ Exch $R5
+ Exch
+ Exch 2
+ Exch $R4
+ Exch 2
+ Exch 3
+ Exch $R3
+ Exch 3
+ Exch 4
+ Exch $R2
+ Exch 4
+ Exch 5
+ Exch $R1
+ Exch 5
+ Exch 6
+ Exch $R0
+ Exch 6
+ Push $0
+ Push $1
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+
+ ;Parameter defaults
+ ${IfThen} $R4 == `` ${|} StrCpy $R4 `1` ${|}
+ ${IfThen} $R5 == `` ${|} StrCpy $R5 `1` ${|}
+ ${IfThen} $R6 == `` ${|} StrCpy $R6 `1` ${|}
+
+ ;Get "String", "CenterStr", "LeftStr" and "RightStr" length
+ StrLen $0 $R0
+ StrLen $1 $R1
+ StrLen $2 $R2
+ StrLen $3 $R3
+ ;Start "StartCharPos" counter
+ StrCpy $6 0
+ ;Start "EndCharPos" counter based on "CenterStr" length
+ IntOp $7 $6 + $2
+
+ ;Loop until "CenterStr" is found or "String" reaches its end
+ ${Do}
+ ;Remove everything before and after the searched part ("TempStr")
+ StrCpy $8 $R0 $2 $6
+
+ ;Compare "TempStr" with "CenterStr"
+ ${IfThen} $8 == $R2 ${|} ${ExitDo} ${|}
+ ;If not, this could be "String" end
+ ${IfThen} $7 >= $0 ${|} Goto Done ${|}
+ ;If not, continue the loop
+ IntOp $6 $6 + 1
+ IntOp $7 $7 + 1
+ ${Loop}
+
+ # "CenterStr" was found
+
+ ;Remove "CenterStr" from "String" if the user wants
+ ${If} $R5 = ${FALSE}
+ StrCpy $8 $R0 $6
+ StrCpy $R0 $R0 `` $7
+ StrCpy $R0 $8$R0
+ ${EndIf}
+
+ ;"StartPos" and "EndPos" will record "CenterStr" coordinates for now
+ StrCpy $4 $6
+ StrCpy $5 $7
+ ;"StartCharPos" and "EndCharPos" should be before "CenterStr"
+ IntOp $6 $6 - $1
+ IntOp $7 $6 + $1
+
+ ;Loop until "LeftStr" is found or "String" reaches its start
+ ${Do}
+ ;Remove everything before and after the searched part ("TempStr")
+ StrCpy $8 $R0 $1 $6
+
+ ;If "LeftStr" is empty
+ ${If} $R1 == ``
+ StrCpy $6 0
+ StrCpy $7 0
+ ${ExitDo}
+ ${EndIf}
+
+ ;Compare "TempStr" with "LeftStr"
+ ${IfThen} $8 == $R1 ${|} ${ExitDo} ${|}
+ ;If not, this could be "String" start
+ ${IfThen} $6 <= 0 ${|} ${ExitDo} ${|}
+ ;If not, continue the loop
+ IntOp $6 $6 - 1
+ IntOp $7 $7 - 1
+ ${Loop}
+
+ # "LeftStr" is found or "String" start was reached
+
+ ;Remove "LeftStr" from "String" if the user wants
+ ${If} $R4 = ${FALSE}
+ IntOp $6 $6 + $1
+ ${EndIf}
+
+ ;Record "LeftStr" first character position on "TempStr" (temporarily)
+ StrCpy $8 $6
+
+ ;"StartCharPos" and "EndCharPos" should be after "CenterStr"
+ ${If} $R5 = ${FALSE}
+ StrCpy $6 $4
+ ${Else}
+ IntOp $6 $4 + $2
+ ${EndIf}
+ IntOp $7 $6 + $3
+
+ ;Record "LeftStr" first character position on "StartPos"
+ StrCpy $4 $8
+
+ ;Loop until "RightStr" is found or "String" reaches its end
+ ${Do}
+ ;Remove everything before and after the searched part ("TempStr")
+ StrCpy $8 $R0 $3 $6
+
+ ;If "RightStr" is empty
+ ${If} $R3 == ``
+ StrCpy $6 $0
+ StrCpy $7 $0
+ ${ExitDo}
+ ${EndIf}
+
+ ;Compare "TempStr" with "RightStr"
+ ${IfThen} $8 == $R3 ${|} ${ExitDo} ${|}
+ ;If not, this could be "String" end
+ ${IfThen} $7 >= $0 ${|} ${ExitDo} ${|}
+ ;If not, continue the loop
+ IntOp $6 $6 + 1
+ IntOp $7 $7 + 1
+ ${Loop}
+
+ ;Remove "RightStr" from "String" if the user wants
+ ${If} $R6 = ${FALSE}
+ IntOp $7 $7 - $3
+ ${EndIf}
+
+ ;Record "RightStr" last character position on "StartPos"
+ StrCpy $5 $7
+
+ ;As the positionment is relative...
+ IntOp $5 $5 - $4
+
+ ;Write the string and finish the job
+ StrCpy $R0 $R0 $5 $4
+ Goto +2
+
+ Done:
+ StrCpy $R0 ``
+
+ /*After this point:
+ ------------------------------------------
+ $R0 = OutVar (output)*/
+
+ ;Return output to user
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+ Pop $R6
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Exch $R0
+ FunctionEnd
+
+ !macroend
+
+ # Function StrStr
+ ###############
+
+ !macro FUNCTION_STRING_StrStr
+ !insertmacro STRFUNC_FUNC `StrStr` `2004 Diego Pedroso - Based on functions by Ximon Eighteen`
+
+ /*After this point:
+ ------------------------------------------
+ $R0 = StrToSearch (input)
+ $R1 = String (input)
+ $R2 = StrToSearchLen (temp)
+ $R3 = StrLen (temp)
+ $R4 = StartCharPos (temp)
+ $R5 = TempStr (temp)*/
+
+ ;Get input from user
+ Exch $R0
+ Exch
+ Exch $R1
+ Push $R2
+ Push $R3
+ Push $R4
+ Push $R5
+
+ ;Get "String" and "StrToSearch" length
+ StrLen $R2 $R0
+ StrLen $R3 $R1
+ ;Start "StartCharPos" counter
+ StrCpy $R4 0
+
+ ;Loop until "StrToSearch" is found or "String" reaches its end
+ ${Do}
+ ;Remove everything before and after the searched part ("TempStr")
+ StrCpy $R5 $R1 $R2 $R4
+
+ ;Compare "TempStr" with "StrToSearch"
+ ${IfThen} $R5 == $R0 ${|} ${ExitDo} ${|}
+ ;If not "StrToSearch", this could be "String" end
+ ${IfThen} $R4 >= $R3 ${|} ${ExitDo} ${|}
+ ;If not, continue the loop
+ IntOp $R4 $R4 + 1
+ ${Loop}
+
+ /*After this point:
+ ------------------------------------------
+ $R0 = OutVar (output)*/
+
+ ;Remove part before "StrToSearch" on "String" (if there has one)
+ StrCpy $R0 $R1 `` $R4
+
+ ;Return output to user
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Exch $R0
+ FunctionEnd
+
+ !macroend
+
+ # Function StrStrAdv
+ ##################
+
+ !macro FUNCTION_STRING_StrStrAdv
+ !insertmacro STRFUNC_FUNC `StrStrAdv` `2003-2004 Diego Pedroso`
+
+ /*After this point:
+ ------------------------------------------
+ $0 = String (input)
+ $1 = StringToSearch (input)
+ $2 = DirectionOfSearch (input)
+ $3 = DirectionOfReturn (input)
+ $4 = ShowStrToSearch (input)
+ $5 = NumLoops (input)
+ $6 = CaseSensitive (input)
+ $7 = StringLength (temp)
+ $8 = StrToSearchLength (temp)
+ $9 = CurrentLoop (temp)
+ $R0 = EndCharPos (temp)
+ $R1 = StartCharPos (temp)
+ $R2 = OutVar (output)
+ $R3 = Temp (temp)*/
+
+ ;Get input from user
+
+ Exch $6
+ Exch
+ Exch $5
+ Exch
+ Exch 2
+ Exch $4
+ Exch 2
+ Exch 3
+ Exch $3
+ Exch 3
+ Exch 4
+ Exch $2
+ Exch 4
+ Exch 5
+ Exch $1
+ Exch 5
+ Exch 6
+ Exch $0
+ Exch 6
+ Push $7
+ Push $8
+ Push $9
+ Push $R3
+ Push $R2
+ Push $R1
+ Push $R0
+
+ ; Clean $R0-$R3 variables
+ StrCpy $R0 ""
+ StrCpy $R1 ""
+ StrCpy $R2 ""
+ StrCpy $R3 ""
+
+ ; Verify if we have the correct values on the variables
+ ${If} $0 == ``
+ SetErrors ;AdvStrStr_StrToSearch not found
+ Goto AdvStrStr_End
+ ${EndIf}
+
+ ${If} $1 == ``
+ SetErrors ;No text to search
+ Goto AdvStrStr_End
+ ${EndIf}
+
+ ${If} $2 != <
+ StrCpy $2 >
+ ${EndIf}
+
+ ${If} $3 != <
+ StrCpy $3 >
+ ${EndIf}
+
+ ${If} $4 <> 0
+ StrCpy $4 1
+ ${EndIf}
+
+ ${If} $5 <= 0
+ StrCpy $5 0
+ ${EndIf}
+
+ ${If} $6 <> 1
+ StrCpy $6 0
+ ${EndIf}
+
+ ; Find "AdvStrStr_String" length
+ StrLen $7 $0
+
+ ; Then find "AdvStrStr_StrToSearch" length
+ StrLen $8 $1
+
+ ; Now set up basic variables
+
+ ${If} $2 == <
+ IntOp $R1 $7 - $8
+ StrCpy $R2 $7
+ ${Else}
+ StrCpy $R1 0
+ StrCpy $R2 $8
+ ${EndIf}
+
+ StrCpy $9 0 ; First loop
+
+ ;Let's begin the search
+
+ ${Do}
+ ; Step 1: If the starting or ending numbers are negative
+ ; or more than AdvStrStr_StringLen, we return
+ ; error
+
+ ${If} $R1 < 0
+ StrCpy $R1 ``
+ StrCpy $R2 ``
+ StrCpy $R3 ``
+ SetErrors ;AdvStrStr_StrToSearch not found
+ Goto AdvStrStr_End
+ ${ElseIf} $R2 > $7
+ StrCpy $R1 ``
+ StrCpy $R2 ``
+ StrCpy $R3 ``
+ SetErrors ;AdvStrStr_StrToSearch not found
+ Goto AdvStrStr_End
+ ${EndIf}
+
+ ; Step 2: Start the search depending on
+ ; AdvStrStr_DirectionOfSearch. Chop down not needed
+ ; characters.
+
+ ${If} $R1 <> 0
+ StrCpy $R3 $0 `` $R1
+ ${EndIf}
+
+ ${If} $R2 <> $7
+ ${If} $R1 = 0
+ StrCpy $R3 $0 $8
+ ${Else}
+ StrCpy $R3 $R3 $8
+ ${EndIf}
+ ${EndIf}
+
+ ; Step 3: Make sure that's the string we want
+
+ ; Case-Sensitive Support <- Use "AdvStrStr_Temp"
+ ; variable because it won't be used anymore
+
+ ${If} $6 == 1
+ System::Call `kernel32::lstrcmpA(ts, ts) i.s` `$R3` `$1`
+ Pop $R3
+ ${If} $R3 = 0
+ StrCpy $R3 1 ; Continue
+ ${Else}
+ StrCpy $R3 0 ; Break
+ ${EndIf}
+ ${Else}
+ ${If} $R3 == $1
+ StrCpy $R3 1 ; Continue
+ ${Else}
+ StrCpy $R3 0 ; Break
+ ${EndIf}
+ ${EndIf}
+
+ ; After the comparasion, confirm that it is the
+ ; value we want.
+
+ ${If} $R3 = 1
+
+ ;We found it, return except if the user has set up to
+ ;search for another one:
+ ${If} $9 >= $5
+
+ ;Now, let's see if the user wants
+ ;AdvStrStr_StrToSearch to appear:
+ ${If} $4 == 0
+ ;Return depends on AdvStrStr_DirectionOfReturn
+ ${If} $3 == <
+ ; RTL
+ StrCpy $R0 $0 $R1
+ ${Else}
+ ; LTR
+ StrCpy $R0 $0 `` $R2
+ ${EndIf}
+ ${Break}
+ ${Else}
+ ;Return depends on AdvStrStr_DirectionOfReturn
+ ${If} $3 == <
+ ; RTL
+ StrCpy $R0 $0 $R2
+ ${Else}
+ ; LTR
+ StrCpy $R0 $0 `` $R1
+ ${EndIf}
+ ${Break}
+ ${EndIf}
+ ${Else}
+ ;If the user wants to have more loops, let's do it so!
+ IntOp $9 $9 + 1
+
+ ${If} $2 == <
+ IntOp $R1 $R1 - 1
+ IntOp $R2 $R2 - 1
+ ${Else}
+ IntOp $R1 $R1 + 1
+ IntOp $R2 $R2 + 1
+ ${EndIf}
+ ${EndIf}
+ ${Else}
+ ; Step 4: We didn't find it, so do steps 1 thru 3 again
+
+ ${If} $2 == <
+ IntOp $R1 $R1 - 1
+ IntOp $R2 $R2 - 1
+ ${Else}
+ IntOp $R1 $R1 + 1
+ IntOp $R2 $R2 + 1
+ ${EndIf}
+ ${EndIf}
+ ${Loop}
+
+ AdvStrStr_End:
+
+ ;Add 1 to AdvStrStr_EndCharPos to be supportable
+ ;by "StrCpy"
+
+ IntOp $R2 $R2 - 1
+
+ ;Return output to user
+
+ Exch $R0
+ Exch
+ Pop $R1
+ Exch
+ Pop $R2
+ Exch
+ Pop $R3
+ Exch
+ Pop $9
+ Exch
+ Pop $8
+ Exch
+ Pop $7
+ Exch
+ Pop $6
+ Exch
+ Pop $5
+ Exch
+ Pop $4
+ Exch
+ Pop $3
+ Exch
+ Pop $2
+ Exch
+ Pop $1
+ Exch
+ Pop $0
+
+ FunctionEnd
+
+ !macroend
+
+ # Function StrTok
+ ###############
+
+ !macro FUNCTION_STRING_StrTok
+ !insertmacro STRFUNC_FUNC `StrTok` `2004 Diego Pedroso - Based on functions by "bigmac666"`
+ /*After this point:
+ ------------------------------------------
+ $0 = SkipEmptyParts (input)
+ $1 = ResultPart (input)
+ $2 = Separators (input)
+ $3 = String (input)
+ $4 = StrToSearchLen (temp)
+ $5 = StrLen (temp)
+ $6 = StartCharPos (temp)
+ $7 = TempStr (temp)
+ $8 = CurrentLoop
+ $9 = CurrentSepChar
+ $R0 = CurrentSepCharNum
+ */
+
+ ;Get input from user
+ Exch $0
+ Exch
+ Exch $1
+ Exch
+ Exch 2
+ Exch $2
+ Exch 2
+ Exch 3
+ Exch $3
+ Exch 3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ Push $R0
+
+ ;Parameter defaults
+ ${IfThen} $2 == `` ${|} StrCpy $2 `|` ${|}
+ ${IfThen} $1 == `` ${|} StrCpy $1 `L` ${|}
+ ${IfThen} $0 == `` ${|} StrCpy $0 `0` ${|}
+
+ ;Get "String" and "StrToSearch" length
+ StrLen $4 $2
+ StrLen $5 $3
+ ;Start "StartCharPos" and "ResultPart" counters
+ StrCpy $6 0
+ StrCpy $8 -1
+
+ ;Loop until "ResultPart" is met, "StrToSearch" is found or
+ ;"String" reaches its end
+ ResultPartLoop: ;"CurrentLoop" Loop
+
+ ;Increase "CurrentLoop" counter
+ IntOp $8 $8 + 1
+
+ StrSearchLoop:
+ ${Do} ;"String" Loop
+ ;Remove everything before and after the searched part ("TempStr")
+ StrCpy $7 $3 1 $6
+
+ ;Verify if it's the "String" end
+ ${If} $6 >= $5
+ ;If "CurrentLoop" is what the user wants, remove the part
+ ;after "TempStr" and itself and get out of here
+ ${If} $8 == $1
+ ${OrIf} $1 == `L`
+ StrCpy $3 $3 $6
+ ${Else} ;If not, empty "String" and get out of here
+ StrCpy $3 ``
+ ${EndIf}
+ StrCpy $R0 `End`
+ ${ExitDo}
+ ${EndIf}
+
+ ;Start "CurrentSepCharNum" counter (for "Separators" Loop)
+ StrCpy $R0 0
+
+ ${Do} ;"Separators" Loop
+ ;Use one "Separators" character at a time
+ ${If} $R0 <> 0
+ StrCpy $9 $2 1 $R0
+ ${Else}
+ StrCpy $9 $2 1
+ ${EndIf}
+
+ ;Go to the next "String" char if it's "Separators" end
+ ${IfThen} $R0 >= $4 ${|} ${ExitDo} ${|}
+
+ ;Or, if "TempStr" equals "CurrentSepChar", then...
+ ${If} $7 == $9
+ StrCpy $7 $3 $6
+
+ ;If "String" is empty because this result part doesn't
+ ;contain data, verify if "SkipEmptyParts" is activated,
+ ;so we don't return the output to user yet
+
+ ${If} $7 == ``
+ ${AndIf} $0 = ${TRUE}
+ IntOp $6 $6 + 1
+ StrCpy $3 $3 `` $6
+ StrCpy $6 0
+ Goto StrSearchLoop
+ ${ElseIf} $8 == $1
+ StrCpy $3 $3 $6
+ StrCpy $R0 "End"
+ ${ExitDo}
+ ${EndIf} ;If not, go to the next result part
+ IntOp $6 $6 + 1
+ StrCpy $3 $3 `` $6
+ StrCpy $6 0
+ Goto ResultPartLoop
+ ${EndIf}
+
+ ;Increase "CurrentSepCharNum" counter
+ IntOp $R0 $R0 + 1
+ ${Loop}
+ ${IfThen} $R0 == "End" ${|} ${ExitDo} ${|}
+
+ ;Increase "StartCharPos" counter
+ IntOp $6 $6 + 1
+ ${Loop}
+
+ /*After this point:
+ ------------------------------------------
+ $3 = OutVar (output)*/
+
+ ;Return output to user
+
+ Pop $R0
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $0
+ Pop $1
+ Pop $2
+ Exch $3
+ FunctionEnd
+
+ !macroend
+
+ # Function StrTrimNewLines
+ ########################
+
+ !macro FUNCTION_STRING_StrTrimNewLines
+ !insertmacro STRFUNC_FUNC `StrTrimNewLines` `2004 Diego Pedroso - Based on functions by Ximon Eighteen`
+
+ /*After this point:
+ ------------------------------------------
+ $R0 = String (input)
+ $R1 = TrimCounter (temp)
+ $R2 = Temp (temp)*/
+
+ ;Get input from user
+ Exch $R0
+ Push $R1
+ Push $R2
+
+ ;Initialize trim counter
+ StrCpy $R1 0
+
+ loop:
+ ;Subtract to get "String"'s last characters
+ IntOp $R1 $R1 - 1
+
+ ;Verify if they are either $\r or $\n
+ StrCpy $R2 $R0 1 $R1
+ ${If} $R2 == `$\r`
+ ${OrIf} $R2 == `$\n`
+ Goto loop
+ ${EndIf}
+
+ ;Trim characters (if needed)
+ IntOp $R1 $R1 + 1
+ ${If} $R1 < 0
+ StrCpy $R0 $R0 $R1
+ ${EndIf}
+
+ /*After this point:
+ ------------------------------------------
+ $R0 = OutVar (output)*/
+
+ ;Return output to user
+ Pop $R2
+ Pop $R1
+ Exch $R0
+ FunctionEnd
+
+ !macroend
+
+ ;Function Calls for Install and Uninstall
+
+ !macro FUNCTION_STRING_StrCase_Call ResultVar String Type
+ !verbose push
+ !verbose 4
+ !echo `$ {StrCase} "${ResultVar}" "${String}" "${Type}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${Type}`
+ Call StrCase
+ Pop `${ResultVar}`
+ !macroend
+ !macro FUNCTION_STRING_UnStrCase_Call ResultVar String Type
+ !verbose push
+ !verbose 4
+ !echo `$ {UnStrCase} "${ResultVar}" "${String}" "${Type}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${Type}`
+ Call un.StrCase
+ Pop `${ResultVar}`
+ !macroend
+
+ !macro FUNCTION_STRING_StrClb_Call ResultVar String Action
+ !verbose push
+ !verbose 4
+ !echo `$ {StrClb} "${ResultVar}" "${String}" "${Action}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${Action}`
+ Call StrClb
+ Pop `${ResultVar}`
+ !macroend
+ !macro FUNCTION_STRING_UnStrClb_Call ResultVar String Action
+ !verbose push
+ !verbose 4
+ !echo `$ {UnStrClb} "${ResultVar}" "${String}" "${Action}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${Action}`
+ Call un.StrClb
+ Pop `${ResultVar}`
+ !macroend
+
+ !macro FUNCTION_STRING_StrIOToNSIS_Call ResultVar String
+ !verbose push
+ !verbose 4
+ !echo `$ {StrIOToNSIS} "${ResultVar}" "${String}"`
+ !verbose pop
+
+ Push `${String}`
+ Call StrIOToNSIS
+ Pop `${ResultVar}`
+ !macroend
+ !macro FUNCTION_STRING_UnStrIOToNSIS_Call ResultVar String
+ !verbose push
+ !verbose 4
+ !echo `$ {UnStrIOToNSIS} "${ResultVar}" "${String}"`
+ !verbose pop
+
+ Push `${String}`
+ Call un.StrIOToNSIS
+ Pop `${ResultVar}`
+ !macroend
+
+ !macro FUNCTION_STRING_StrLoc_Call ResultVar String StrToSearchFor OffsetDirection
+ !verbose push
+ !verbose 4
+ !echo `$ {StrLoc} "${ResultVar}" "${String}" "${StrToSearchFor}" "${OffsetDirection}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${StrToSearchFor}`
+ Push `${OffsetDirection}`
+ Call StrLoc
+ Pop `${ResultVar}`
+ !macroend
+ !macro FUNCTION_STRING_UnStrLoc_Call ResultVar String StrToSearchFor OffsetDirection
+ !verbose push
+ !verbose 4
+ !echo `$ {UnStrLoc} "${ResultVar}" "${String}" "${StrToSearchFor}" "${OffsetDirection}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${StrToSearchFor}`
+ Push `${OffsetDirection}`
+ Call un.StrLoc
+ Pop `${ResultVar}`
+ !macroend
+
+ !macro FUNCTION_STRING_StrNSISToIO_Call ResultVar String
+ !verbose push
+ !verbose 4
+ !echo `$ {StrNSISToIO} "${ResultVar}" "${String}"`
+ !verbose pop
+
+ Push `${String}`
+ Call StrNSISToIO
+ Pop `${ResultVar}`
+ !macroend
+ !macro FUNCTION_STRING_UnStrNSISToIO_Call ResultVar String
+ !verbose push
+ !verbose 4
+ !echo `$ {UnStrNSISToIO} "${ResultVar}" "${String}"`
+ !verbose pop
+
+ Push `${String}`
+ Call un.StrNSISToIO
+ Pop `${ResultVar}`
+ !macroend
+
+ !macro FUNCTION_STRING_StrRep_Call ResultVar String StringToReplace ReplacementString
+ !verbose push
+ !verbose 4
+ !echo `$ {StrRep} "${ResultVar}" "${String}" "${StringToReplace}" "${ReplacementString}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${StringToReplace}`
+ Push `${ReplacementString}`
+ Call StrRep
+ Pop `${ResultVar}`
+ !macroend
+ !macro FUNCTION_STRING_UnStrRep_Call ResultVar String StringToReplace ReplacementString
+ !verbose push
+ !verbose 4
+ !echo `$ {UnStrRep} "${ResultVar}" "${String}" "${StringToReplace}" "${ReplacementString}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${StringToReplace}`
+ Push `${ReplacementString}`
+ Call un.StrRep
+ Pop `${ResultVar}`
+ !macroend
+
+ !macro FUNCTION_STRING_StrSort_Call ResultVar String CenterStr LeftStr RightStr IncludeCenterStr IncludeLeftStr IncludeRightStr
+ !verbose push
+ !verbose 4
+ !echo `$ {StrSort} "${ResultVar}" "${String}" "${CenterStr}" "${LeftStr}" "${RightStr}" "${IncludeCenterStr}" "${IncludeLeftStr}" "${IncludeRightStr}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${CenterStr}`
+ Push `${LeftStr}`
+ Push `${RightStr}`
+ Push `${IncludeCenterStr}`
+ Push `${IncludeLeftStr}`
+ Push `${IncludeRightStr}`
+ Call StrSort
+ Pop `${ResultVar}`
+ !macroend
+ !macro FUNCTION_STRING_UnStrSort_Call ResultVar String CenterStr LeftStr RightStr IncludeCenterStr IncludeLeftStr IncludeRightStr
+ !verbose push
+ !verbose 4
+ !echo `$ {UnStrSort} "${ResultVar}" "${String}" "${CenterStr}" "${LeftStr}" "${RightStr}" "${IncludeCenterStr}" "${IncludeLeftStr}" "${IncludeRightStr}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${CenterStr}`
+ Push `${LeftStr}`
+ Push `${RightStr}`
+ Push `${IncludeCenterStr}`
+ Push `${IncludeLeftStr}`
+ Push `${IncludeRightStr}`
+ Call un.StrSort
+ Pop `${ResultVar}`
+ !macroend
+
+ !macro FUNCTION_STRING_StrStr_Call ResultVar String StrToSearchFor
+ !verbose push
+ !verbose 4
+ !echo `$ {StrStr} "${ResultVar}" "${String}" "${StrToSearchFor}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${StrToSearchFor}`
+ Call StrStr
+ Pop `${ResultVar}`
+ !macroend
+ !macro FUNCTION_STRING_UnStrStr_Call ResultVar String StrToSearchFor
+ !verbose push
+ !verbose 4
+ !echo `$ {UnStrStr} "${ResultVar}" "${String}" "${StrToSearchFor}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${StrToSearchFor}`
+ Call un.StrStr
+ Pop `${ResultVar}`
+ !macroend
+
+ !macro FUNCTION_STRING_StrStrAdv_Call ResultVar String StrToSearchFor SearchDirection ResultStrDirection DisplayStrToSearch Loops CaseSensitive
+ !verbose push
+ !verbose 4
+ !echo `$ {StrStrAdv} "${ResultVar}" "${String}" "${StrToSearchFor}" "${SearchDirection}" "${ResultStrDirection}" "${DisplayStrToSearch}" "${Loops}" "${CaseSensitive}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${StrToSearchFor}`
+ Push `${SearchDirection}`
+ Push `${ResultStrDirection}`
+ Push `${DisplayStrToSearch}`
+ Push `${Loops}`
+ Push `${CaseSensitive}`
+ Call StrStrAdv
+ Pop `${ResultVar}`
+ !macroend
+ !macro FUNCTION_STRING_UnStrStrAdv_Call ResultVar String StrToSearchFor SearchDirection ResultStrDirection DisplayStrToSearch Loops CaseSensitive
+ !verbose push
+ !verbose 4
+ !echo `$ {UnStrStrAdv} "${ResultVar}" "${String}" "${StrToSearchFor}" "${SearchDirection}" "${ResultStrDirection}" "${DisplayStrToSearch}" "${Loops}" "${CaseSensitive}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${StrToSearchFor}`
+ Push `${SearchDirection}`
+ Push `${ResultStrDirection}`
+ Push `${DisplayStrToSearch}`
+ Push `${Loops}`
+ Push `${CaseSensitive}`
+ Call un.StrStrAdv
+ Pop `${ResultVar}`
+ !macroend
+
+ !macro FUNCTION_STRING_StrTok_Call ResultVar String Separators ResultPart SkipEmptyParts
+ !verbose push
+ !verbose 4
+ !echo `$ {StrTok} "${ResultVar}" "${String}" "${Separators}" "${ResultPart}" "${SkipEmptyParts}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${Separators}`
+ Push `${ResultPart}`
+ Push `${SkipEmptyParts}`
+ Call StrTok
+ Pop `${ResultVar}`
+ !macroend
+ !macro FUNCTION_STRING_UnStrTok_Call ResultVar String Separators ResultPart SkipEmptyParts
+ !verbose push
+ !verbose 4
+ !echo `$ {UnStrTok} "${ResultVar}" "${String}" "${Separators}" "${ResultPart}" "${SkipEmptyParts}"`
+ !verbose pop
+
+ Push `${String}`
+ Push `${Separators}`
+ Push `${ResultPart}`
+ Push `${SkipEmptyParts}`
+ Call un.StrTok
+ Pop `${ResultVar}`
+ !macroend
+
+ !macro FUNCTION_STRING_StrTrimNewLines_Call ResultVar String
+ !verbose push
+ !verbose 4
+ !echo `$ {StrTrimNewLines} "${ResultVar}" "${String}"`
+ !verbose pop
+
+ Push `${String}`
+ Call StrTrimNewLines
+ Pop `${ResultVar}`
+ !macroend
+ !macro FUNCTION_STRING_UnStrTrimNewLines_Call ResultVar String
+ !verbose push
+ !verbose 4
+ !echo `$ {UnStrTrimNewLines} "${ResultVar}" "${String}"`
+ !verbose pop
+
+ Push `${String}`
+ Call un.StrTrimNewLines
+ Pop `${ResultVar}`
+ !macroend
+
+!endif
+!verbose 3
+!define STRFUNC_VERBOSITY ${_STRFUNC_VERBOSITY}
+!undef _STRFUNC_VERBOSITY
+!verbose pop
diff --git a/Engine/bin/tools/nsis/app/Include/TextFunc.nsh b/Engine/bin/tools/nsis/app/Include/TextFunc.nsh
new file mode 100644
index 000000000..2a9c459a1
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/TextFunc.nsh
@@ -0,0 +1,1214 @@
+/*
+_____________________________________________________________________________
+
+ Text Functions Header v2.4
+_____________________________________________________________________________
+
+ 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
+
+ See documentation for more information about the following functions.
+
+ Usage in script:
+ 1. !include "TextFunc.nsh"
+ 2. [Section|Function]
+ ${TextFunction} "File" "..." $var
+ [SectionEnd|FunctionEnd]
+
+
+ TextFunction=[LineFind|LineRead|FileReadFromEnd|LineSum|FileJoin|
+ TextCompare|TextCompareS|ConfigRead|ConfigReadS|
+ ConfigWrite|ConfigWriteS|FileRecode|TrimNewLines]
+
+_____________________________________________________________________________
+
+ Thanks to:
+_____________________________________________________________________________
+
+LineRead
+ Afrow UK (Based on his idea of Function "ReadFileLine")
+LineSum
+ Afrow UK (Based on his idea of Function "LineCount")
+FileJoin
+ Afrow UK (Based on his idea of Function "JoinFiles")
+ConfigRead
+ vbgunz (His idea)
+ConfigWrite
+ vbgunz (His idea)
+TrimNewLines
+ sunjammer (Based on his Function "TrimNewLines")
+*/
+
+
+;_____________________________________________________________________________
+;
+; Macros
+;_____________________________________________________________________________
+;
+; Change log window verbosity (default: 3=no script)
+;
+; Example:
+; !include "TextFunc.nsh"
+; !insertmacro LineFind
+; ${TEXTFUNC_VERBOSE} 4 # all verbosity
+; !insertmacro LineSum
+; ${TEXTFUNC_VERBOSE} 3 # no script
+
+!ifndef TEXTFUNC_INCLUDED
+!define TEXTFUNC_INCLUDED
+
+!include FileFunc.nsh
+!include Util.nsh
+
+!verbose push
+!verbose 3
+!ifndef _TEXTFUNC_VERBOSE
+ !define _TEXTFUNC_VERBOSE 3
+!endif
+!verbose ${_TEXTFUNC_VERBOSE}
+!define TEXTFUNC_VERBOSE `!insertmacro TEXTFUNC_VERBOSE`
+!verbose pop
+
+!macro TEXTFUNC_VERBOSE _VERBOSE
+ !verbose push
+ !verbose 3
+ !undef _TEXTFUNC_VERBOSE
+ !define _TEXTFUNC_VERBOSE ${_VERBOSE}
+ !verbose pop
+!macroend
+
+!macro LineFindCall _INPUT _OUTPUT _RANGE _FUNC
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push $0
+ Push `${_INPUT}`
+ Push `${_OUTPUT}`
+ Push `${_RANGE}`
+ GetFunctionAddress $0 `${_FUNC}`
+ Push `$0`
+ ${CallArtificialFunction} LineFind_
+ Pop $0
+ !verbose pop
+!macroend
+
+!macro LineReadCall _FILE _NUMBER _RESULT
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push `${_FILE}`
+ Push `${_NUMBER}`
+ ${CallArtificialFunction} LineRead_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro FileReadFromEndCall _FILE _FUNC
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push $0
+ Push `${_FILE}`
+ GetFunctionAddress $0 `${_FUNC}`
+ Push `$0`
+ ${CallArtificialFunction} FileReadFromEnd_
+ Pop $0
+ !verbose pop
+!macroend
+
+!macro LineSumCall _FILE _RESULT
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push `${_FILE}`
+ ${CallArtificialFunction} LineSum_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro FileJoinCall _FILE1 _FILE2 _FILE3
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push `${_FILE1}`
+ Push `${_FILE2}`
+ Push `${_FILE3}`
+ ${CallArtificialFunction} FileJoin_
+ !verbose pop
+!macroend
+
+!macro TextCompareCall _FILE1 _FILE2 _OPTION _FUNC
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push $0
+ Push `${_FILE1}`
+ Push `${_FILE2}`
+ Push `${_OPTION}`
+ GetFunctionAddress $0 `${_FUNC}`
+ Push `$0`
+ ${CallArtificialFunction} TextCompare_
+ Pop $0
+ !verbose pop
+!macroend
+
+!macro TextCompareSCall _FILE1 _FILE2 _OPTION _FUNC
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push $0
+ Push `${_FILE1}`
+ Push `${_FILE2}`
+ Push `${_OPTION}`
+ GetFunctionAddress $0 `${_FUNC}`
+ Push `$0`
+ ${CallArtificialFunction} TextCompareS_
+ Pop $0
+ !verbose pop
+!macroend
+
+!macro ConfigReadCall _FILE _ENTRY _RESULT
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push `${_FILE}`
+ Push `${_ENTRY}`
+ ${CallArtificialFunction} ConfigRead_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro ConfigReadSCall _FILE _ENTRY _RESULT
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push `${_FILE}`
+ Push `${_ENTRY}`
+ ${CallArtificialFunction} ConfigReadS_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro ConfigWriteCall _FILE _ENTRY _VALUE _RESULT
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push `${_FILE}`
+ Push `${_ENTRY}`
+ Push `${_VALUE}`
+ ${CallArtificialFunction} ConfigWrite_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro ConfigWriteSCall _FILE _ENTRY _VALUE _RESULT
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push `${_FILE}`
+ Push `${_ENTRY}`
+ Push `${_VALUE}`
+ ${CallArtificialFunction} ConfigWriteS_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro FileRecodeCall _FILE _FORMAT
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push `${_FILE}`
+ Push `${_FORMAT}`
+ ${CallArtificialFunction} FileRecode_
+ !verbose pop
+!macroend
+
+!macro TrimNewLinesCall _FILE _RESULT
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+ Push `${_FILE}`
+ ${CallArtificialFunction} TrimNewLines_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro _TextFunc_TempFileForFile _FILE _RESULT
+ # XXX replace with GetParent
+ Push `${_FILE}`
+ Exch $0
+ Push $1
+ Push $2
+
+ StrCpy $2 $0 1 -1
+ StrCmp $2 '\' 0 +3
+ StrCpy $0 $0 -1
+ goto -3
+
+ StrCpy $1 0
+ IntOp $1 $1 - 1
+ StrCpy $2 $0 1 $1
+ StrCmp $2 '\' +2
+ StrCmp $2 '' 0 -3
+ StrCpy $0 $0 $1
+
+ Pop $2
+ Pop $1
+ Exch $0
+ Pop ${_RESULT}
+ # XXX
+ StrCmp ${_RESULT} "" 0 +2
+ StrCpy ${_RESULT} $EXEDIR
+ GetTempFileName ${_RESULT} ${_RESULT}
+ StrCmp ${_RESULT} "" 0 +2
+ GetTempFileName ${_RESULT}
+ ClearErrors
+!macroend
+
+!define LineFind `!insertmacro LineFindCall`
+!define un.LineFind `!insertmacro LineFindCall`
+
+!macro LineFind
+!macroend
+
+!macro un.LineFind
+!macroend
+
+!macro LineFind_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ Exch $3
+ Exch
+ Exch $2
+ Exch
+ Exch 2
+ Exch $1
+ Exch 2
+ Exch 3
+ Exch $0
+ Exch 3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ Push $R4
+ Push $R5
+ Push $R6
+ Push $R7
+ Push $R8
+ Push $R9
+ ClearErrors
+
+ IfFileExists '$0' 0 TextFunc_LineFind_error
+ StrCmp $1 '/NUL' TextFunc_LineFind_begin
+ StrCpy $8 0
+ IntOp $8 $8 - 1
+ StrCpy $9 $1 1 $8
+ StrCmp $9 \ +2
+ StrCmp $9 '' +3 -3
+ StrCpy $9 $1 $8
+ IfFileExists '$9\*.*' 0 TextFunc_LineFind_error
+
+ TextFunc_LineFind_begin:
+ StrCpy $4 1
+ StrCpy $5 -1
+ StrCpy $6 0
+ StrCpy $7 0
+ StrCpy $R4 ''
+ StrCpy $R6 ''
+ StrCpy $R7 ''
+ StrCpy $R8 0
+
+ StrCpy $8 $2 1
+ StrCmp $8 '{' 0 TextFunc_LineFind_delspaces
+ StrCpy $2 $2 '' 1
+ StrCpy $8 $2 1 -1
+ StrCmp $8 '}' 0 TextFunc_LineFind_delspaces
+ StrCpy $2 $2 -1
+ StrCpy $R6 TextFunc_LineFind_cut
+
+ TextFunc_LineFind_delspaces:
+ StrCpy $8 $2 1
+ StrCmp $8 ' ' 0 +3
+ StrCpy $2 $2 '' 1
+ goto -3
+ StrCmp $2$7 '0' TextFunc_LineFind_file
+ StrCpy $4 ''
+ StrCpy $5 ''
+ StrCmp $2 '' TextFunc_LineFind_writechk
+
+ TextFunc_LineFind_range:
+ StrCpy $8 0
+ StrCpy $9 $2 1 $8
+ StrCmp $9 '' +5
+ StrCmp $9 ' ' +4
+ StrCmp $9 ':' +3
+ IntOp $8 $8 + 1
+ goto -5
+ StrCpy $5 $2 $8
+ IntOp $5 $5 + 0
+ IntOp $8 $8 + 1
+ StrCpy $2 $2 '' $8
+ StrCmp $4 '' 0 +2
+ StrCpy $4 $5
+ StrCmp $9 ':' TextFunc_LineFind_range
+
+ IntCmp $4 0 0 +2
+ IntCmp $5 -1 TextFunc_LineFind_goto 0 TextFunc_LineFind_growthcmp
+ StrCmp $R7 '' 0 TextFunc_LineFind_minus2plus
+ StrCpy $R7 0
+ FileOpen $8 $0 r
+ FileRead $8 $9
+ IfErrors +3
+ IntOp $R7 $R7 + 1
+ Goto -3
+ FileClose $8
+
+ TextFunc_LineFind_minus2plus:
+ IntCmp $4 0 +5 0 +5
+ IntOp $4 $R7 + $4
+ IntOp $4 $4 + 1
+ IntCmp $4 0 +2 0 +2
+ StrCpy $4 0
+ IntCmp $5 -1 TextFunc_LineFind_goto 0 TextFunc_LineFind_growthcmp
+ IntOp $5 $R7 + $5
+ IntOp $5 $5 + 1
+ TextFunc_LineFind_growthcmp:
+ IntCmp $4 $5 TextFunc_LineFind_goto TextFunc_LineFind_goto
+ StrCpy $5 $4
+ TextFunc_LineFind_goto:
+ goto $7
+
+ TextFunc_LineFind_file:
+ StrCmp $1 '/NUL' TextFunc_LineFind_notemp
+ !insertmacro _TextFunc_TempFileForFile $1 $R4
+ Push $R4
+ FileOpen $R4 $R4 w
+ TextFunc_LineFind_notemp:
+ FileOpen $R5 $0 r
+ IfErrors TextFunc_LineFind_preerror
+
+ TextFunc_LineFind_loop:
+ IntOp $R8 $R8 + 1
+ FileRead $R5 $R9
+ IfErrors TextFunc_LineFind_handleclose
+
+ TextFunc_LineFind_cmp:
+ StrCmp $2$4$5 '' TextFunc_LineFind_writechk
+ IntCmp $4 $R8 TextFunc_LineFind_call 0 TextFunc_LineFind_writechk
+ StrCmp $5 -1 TextFunc_LineFind_call
+ IntCmp $5 $R8 TextFunc_LineFind_call 0 TextFunc_LineFind_call
+
+ GetLabelAddress $7 TextFunc_LineFind_cmp
+ goto TextFunc_LineFind_delspaces
+
+ TextFunc_LineFind_call:
+ StrCpy $7 $R9
+ Push $0
+ Push $1
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $R4
+ Push $R5
+ Push $R6
+ Push $R7
+ Push $R8
+ StrCpy $R6 '$4:$5'
+ StrCmp $R7 '' +3
+ IntOp $R7 $R8 - $R7
+ IntOp $R7 $R7 - 1
+ Call $3
+ Pop $9
+ Pop $R8
+ Pop $R7
+ Pop $R6
+ Pop $R5
+ Pop $R4
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+ IfErrors TextFunc_LineFind_preerror
+ StrCmp $9 'StopLineFind' 0 +3
+ IntOp $6 $6 + 1
+ goto TextFunc_LineFind_handleclose
+ StrCmp $1 '/NUL' TextFunc_LineFind_loop
+ StrCmp $9 'SkipWrite' 0 +3
+ IntOp $6 $6 + 1
+ goto TextFunc_LineFind_loop
+ StrCmp $7 $R9 TextFunc_LineFind_write
+ IntOp $6 $6 + 1
+ goto TextFunc_LineFind_write
+
+ TextFunc_LineFind_writechk:
+ StrCmp $1 '/NUL' TextFunc_LineFind_loop
+ StrCmp $R6 TextFunc_LineFind_cut 0 TextFunc_LineFind_write
+ IntOp $6 $6 + 1
+ goto TextFunc_LineFind_loop
+
+ TextFunc_LineFind_write:
+ FileWrite $R4 $R9
+ goto TextFunc_LineFind_loop
+
+ TextFunc_LineFind_preerror:
+ SetErrors
+
+ TextFunc_LineFind_handleclose:
+ StrCmp $1 '/NUL' +3
+ FileClose $R4
+ Pop $R4
+ FileClose $R5
+ IfErrors TextFunc_LineFind_error
+
+ StrCmp $1 '/NUL' TextFunc_LineFind_end
+ StrCmp $1 '' 0 +2
+ StrCpy $1 $0
+ StrCmp $6 0 0 TextFunc_LineFind_rename
+ FileOpen $7 $0 r
+ FileSeek $7 0 END $8
+ FileClose $7
+ FileOpen $7 $R4 r
+ FileSeek $7 0 END $9
+ FileClose $7
+ IntCmp $8 $9 0 TextFunc_LineFind_rename
+ Delete $R4
+ StrCmp $1 $0 TextFunc_LineFind_end
+ CopyFiles /SILENT $0 $1
+ goto TextFunc_LineFind_end
+
+ TextFunc_LineFind_rename:
+ Delete '$EXEDIR\$1'
+ Rename $R4 '$EXEDIR\$1'
+ IfErrors 0 TextFunc_LineFind_end
+ Delete $1
+ Rename $R4 $1
+ IfErrors 0 TextFunc_LineFind_end
+
+ TextFunc_LineFind_error:
+ SetErrors
+
+ TextFunc_LineFind_end:
+ Pop $R9
+ Pop $R8
+ Pop $R7
+ Pop $R6
+ Pop $R5
+ Pop $R4
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+
+ !verbose pop
+!macroend
+
+!define LineRead `!insertmacro LineReadCall`
+!define un.LineRead `!insertmacro LineReadCall`
+
+!macro LineRead
+!macroend
+
+!macro un.LineRead
+!macroend
+
+!macro LineRead_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+ ClearErrors
+
+ IfFileExists $0 0 TextFunc_LineRead_error
+ IntOp $1 $1 + 0
+ IntCmp $1 0 TextFunc_LineRead_error 0 TextFunc_LineRead_plus
+ StrCpy $4 0
+ FileOpen $2 $0 r
+ IfErrors TextFunc_LineRead_error
+ FileRead $2 $3
+ IfErrors +3
+ IntOp $4 $4 + 1
+ Goto -3
+ FileClose $2
+ IntOp $1 $4 + $1
+ IntOp $1 $1 + 1
+ IntCmp $1 0 TextFunc_LineRead_error TextFunc_LineRead_error
+
+ TextFunc_LineRead_plus:
+ FileOpen $2 $0 r
+ IfErrors TextFunc_LineRead_error
+ StrCpy $3 0
+ IntOp $3 $3 + 1
+ FileRead $2 $0
+ IfErrors +4
+ StrCmp $3 $1 0 -3
+ FileClose $2
+ goto TextFunc_LineRead_end
+ FileClose $2
+
+ TextFunc_LineRead_error:
+ SetErrors
+ StrCpy $0 ''
+
+ TextFunc_LineRead_end:
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define FileReadFromEnd `!insertmacro FileReadFromEndCall`
+!define un.FileReadFromEnd `!insertmacro FileReadFromEndCall`
+
+!macro FileReadFromEnd
+!macroend
+
+!macro un.FileReadFromEnd
+!macroend
+
+!macro FileReadFromEnd_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $7
+ Push $8
+ Push $9
+ ClearErrors
+
+ StrCpy $7 -1
+ StrCpy $8 0
+ IfFileExists $0 0 TextFunc_FileReadFromEnd_error
+ FileOpen $0 $0 r
+ IfErrors TextFunc_FileReadFromEnd_error
+ FileRead $0 $9
+ IfErrors +4
+ Push $9
+ IntOp $8 $8 + 1
+ goto -4
+ FileClose $0
+
+ TextFunc_FileReadFromEnd_nextline:
+ StrCmp $8 0 TextFunc_FileReadFromEnd_end
+ Pop $9
+ Push $1
+ Push $7
+ Push $8
+ Call $1
+ Pop $0
+ Pop $8
+ Pop $7
+ Pop $1
+ IntOp $7 $7 - 1
+ IntOp $8 $8 - 1
+ IfErrors TextFunc_FileReadFromEnd_error
+ StrCmp $0 'StopFileReadFromEnd' TextFunc_FileReadFromEnd_clearstack TextFunc_FileReadFromEnd_nextline
+
+ TextFunc_FileReadFromEnd_error:
+ SetErrors
+
+ TextFunc_FileReadFromEnd_clearstack:
+ StrCmp $8 0 TextFunc_FileReadFromEnd_end
+ Pop $9
+ IntOp $8 $8 - 1
+ goto TextFunc_FileReadFromEnd_clearstack
+
+ TextFunc_FileReadFromEnd_end:
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $1
+ Pop $0
+
+ !verbose pop
+!macroend
+
+!define LineSum `!insertmacro LineSumCall`
+!define un.LineSum `!insertmacro LineSumCall`
+
+!macro LineSum
+!macroend
+
+!macro un.LineSum
+!macroend
+
+!macro LineSum_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ Exch $0
+ Push $1
+ Push $2
+ ClearErrors
+
+ IfFileExists $0 0 TextFunc_LineSum_error
+ StrCpy $2 0
+ FileOpen $0 $0 r
+ IfErrors TextFunc_LineSum_error
+ FileRead $0 $1
+ IfErrors +3
+ IntOp $2 $2 + 1
+ Goto -3
+ FileClose $0
+ StrCpy $0 $2
+ goto TextFunc_LineSum_end
+
+ TextFunc_LineSum_error:
+ SetErrors
+ StrCpy $0 ''
+
+ TextFunc_LineSum_end:
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define FileJoin `!insertmacro FileJoinCall`
+!define un.FileJoin `!insertmacro FileJoinCall`
+
+!macro FileJoin
+!macroend
+
+!macro un.FileJoin
+!macroend
+
+!macro FileJoin_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ Exch $2
+ Exch
+ Exch $1
+ Exch
+ Exch 2
+ Exch $0
+ Exch 2
+ Push $3
+ Push $4
+ Push $5
+ ClearErrors
+
+ IfFileExists $0 0 TextFunc_FileJoin_error
+ IfFileExists $1 0 TextFunc_FileJoin_error
+ StrCpy $3 0
+ IntOp $3 $3 - 1
+ StrCpy $4 $2 1 $3
+ StrCmp $4 \ +2
+ StrCmp $4 '' +3 -3
+ StrCpy $4 $2 $3
+ IfFileExists '$4\*.*' 0 TextFunc_FileJoin_error
+
+ StrCmp $2 $0 0 +2
+ StrCpy $2 ''
+ StrCmp $2 '' 0 +3
+ StrCpy $4 $0
+ Goto TextFunc_FileJoin_notemp
+ !insertmacro _TextFunc_TempFileForFile $2 $4
+ CopyFiles /SILENT $0 $4
+ TextFunc_FileJoin_notemp:
+ FileOpen $3 $4 a
+ IfErrors TextFunc_FileJoin_error
+ FileSeek $3 -1 END
+ FileRead $3 $5
+ StrCmp $5 '$\r' +3
+ StrCmp $5 '$\n' +2
+ FileWrite $3 '$\r$\n'
+
+ ;FileWrite $3 '$\r$\n--Divider--$\r$\n'
+
+ FileOpen $0 $1 r
+ IfErrors TextFunc_FileJoin_error
+ FileRead $0 $5
+ IfErrors +3
+ FileWrite $3 $5
+ goto -3
+ FileClose $0
+ FileClose $3
+ StrCmp $2 '' TextFunc_FileJoin_end
+ Delete '$EXEDIR\$2'
+ Rename $4 '$EXEDIR\$2'
+ IfErrors 0 TextFunc_FileJoin_end
+ Delete $2
+ Rename $4 $2
+ IfErrors 0 TextFunc_FileJoin_end
+
+ TextFunc_FileJoin_error:
+ SetErrors
+
+ TextFunc_FileJoin_end:
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+
+ !verbose pop
+!macroend
+
+!macro TextCompareBody _TEXTFUNC_S
+ Exch $3
+ Exch
+ Exch $2
+ Exch
+ Exch 2
+ Exch $1
+ Exch 2
+ Exch 3
+ Exch $0
+ Exch 3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ ClearErrors
+
+ IfFileExists $0 0 TextFunc_TextCompare${_TEXTFUNC_S}_error
+ IfFileExists $1 0 TextFunc_TextCompare${_TEXTFUNC_S}_error
+ StrCmp $2 'FastDiff' +5
+ StrCmp $2 'FastEqual' +4
+ StrCmp $2 'SlowDiff' +3
+ StrCmp $2 'SlowEqual' +2
+ goto TextFunc_TextCompare${_TEXTFUNC_S}_error
+
+ FileOpen $4 $0 r
+ IfErrors TextFunc_TextCompare${_TEXTFUNC_S}_error
+ FileOpen $5 $1 r
+ IfErrors TextFunc_TextCompare${_TEXTFUNC_S}_error
+ SetDetailsPrint textonly
+
+ StrCpy $6 0
+ StrCpy $8 0
+
+ TextFunc_TextCompare${_TEXTFUNC_S}_nextline:
+ StrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_fast
+ IntOp $8 $8 + 1
+ FileRead $4 $9
+ IfErrors 0 +4
+ FileClose $4
+ StrCpy $4 ''
+ StrCmp${_TEXTFUNC_S} $5 '' TextFunc_TextCompare${_TEXTFUNC_S}_end
+ StrCmp $2 'FastDiff' TextFunc_TextCompare${_TEXTFUNC_S}_fast
+ StrCmp $2 'FastEqual' TextFunc_TextCompare${_TEXTFUNC_S}_fast TextFunc_TextCompare${_TEXTFUNC_S}_slow
+
+ TextFunc_TextCompare${_TEXTFUNC_S}_fast:
+ StrCmp${_TEXTFUNC_S} $5 '' TextFunc_TextCompare${_TEXTFUNC_S}_call
+ IntOp $6 $6 + 1
+ FileRead $5 $7
+ IfErrors 0 +5
+ FileClose $5
+ StrCpy $5 ''
+ StrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_end
+ StrCmp $2 'FastDiff' TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_close
+ StrCmp $2 'FastDiff' 0 +2
+ StrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_nextline TextFunc_TextCompare${_TEXTFUNC_S}_call
+ StrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_nextline
+
+ TextFunc_TextCompare${_TEXTFUNC_S}_slow:
+ StrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_close
+ StrCpy $6 ''
+ DetailPrint '$8. $9'
+ FileSeek $5 0
+
+ TextFunc_TextCompare${_TEXTFUNC_S}_slownext:
+ FileRead $5 $7
+ IfErrors 0 +2
+ StrCmp $2 'SlowDiff' TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_nextline
+ StrCmp $2 'SlowDiff' 0 +2
+ StrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_nextline TextFunc_TextCompare${_TEXTFUNC_S}_slownext
+ IntOp $6 $6 + 1
+ StrCmp${_TEXTFUNC_S} $7 $9 0 TextFunc_TextCompare${_TEXTFUNC_S}_slownext
+
+ TextFunc_TextCompare${_TEXTFUNC_S}_call:
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ Call $3
+ Pop $0
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ StrCmp $0 'StopTextCompare' 0 TextFunc_TextCompare${_TEXTFUNC_S}_nextline
+
+ TextFunc_TextCompare${_TEXTFUNC_S}_close:
+ FileClose $4
+ FileClose $5
+ goto TextFunc_TextCompare${_TEXTFUNC_S}_end
+
+ TextFunc_TextCompare${_TEXTFUNC_S}_error:
+ SetErrors
+
+ TextFunc_TextCompare${_TEXTFUNC_S}_end:
+ SetDetailsPrint both
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+!macroend
+
+!define TextCompare `!insertmacro TextCompareCall`
+!define un.TextCompare `!insertmacro TextCompareCall`
+
+!macro TextCompare
+!macroend
+
+!macro un.TextCompare
+!macroend
+
+!macro TextCompare_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ !insertmacro TextCompareBody ''
+
+ !verbose pop
+!macroend
+
+!define TextCompareS `!insertmacro TextCompareSCall`
+!define un.TextCompareS `!insertmacro TextCompareSCall`
+
+!macro TextCompareS
+!macroend
+
+!macro un.TextCompareS
+!macroend
+
+!macro TextCompareS_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ !insertmacro TextCompareBody 'S'
+
+ !verbose pop
+!macroend
+
+!macro ConfigReadBody _TEXTFUNC_S
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+ ClearErrors
+
+ FileOpen $2 $0 r
+ IfErrors TextFunc_ConfigRead${_TEXTFUNC_S}_error
+ StrLen $0 $1
+ StrCmp${_TEXTFUNC_S} $0 0 TextFunc_ConfigRead${_TEXTFUNC_S}_error
+
+ TextFunc_ConfigRead${_TEXTFUNC_S}_readnext:
+ FileRead $2 $3
+ IfErrors TextFunc_ConfigRead${_TEXTFUNC_S}_error
+ StrCpy $4 $3 $0
+ StrCmp${_TEXTFUNC_S} $4 $1 0 TextFunc_ConfigRead${_TEXTFUNC_S}_readnext
+ StrCpy $0 $3 '' $0
+ StrCpy $4 $0 1 -1
+ StrCmp${_TEXTFUNC_S} $4 '$\r' +2
+ StrCmp${_TEXTFUNC_S} $4 '$\n' 0 TextFunc_ConfigRead${_TEXTFUNC_S}_close
+ StrCpy $0 $0 -1
+ goto -4
+
+ TextFunc_ConfigRead${_TEXTFUNC_S}_error:
+ SetErrors
+ StrCpy $0 ''
+
+ TextFunc_ConfigRead${_TEXTFUNC_S}_close:
+ FileClose $2
+
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+!macroend
+
+!define ConfigRead `!insertmacro ConfigReadCall`
+!define un.ConfigRead `!insertmacro ConfigReadCall`
+
+!macro ConfigRead
+!macroend
+
+!macro un.ConfigRead
+!macroend
+
+!macro ConfigRead_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ !insertmacro ConfigReadBody ''
+
+ !verbose pop
+!macroend
+
+!define ConfigReadS `!insertmacro ConfigReadSCall`
+!define un.ConfigReadS `!insertmacro ConfigReadSCall`
+
+!macro ConfigReadS
+!macroend
+
+!macro un.ConfigReadS
+!macroend
+
+!macro ConfigReadS_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ !insertmacro ConfigReadBody 'S'
+
+ !verbose pop
+!macroend
+
+!macro ConfigWriteBody _TEXTFUNC_S
+ Exch $2
+ Exch
+ Exch $1
+ Exch
+ Exch 2
+ Exch $0
+ Exch 2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ ClearErrors
+
+ IfFileExists $0 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_error
+ FileOpen $3 $0 a
+ IfErrors TextFunc_ConfigWrite${_TEXTFUNC_S}_error
+
+ StrLen $0 $1
+ StrCmp${_TEXTFUNC_S} $0 0 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext
+ StrCpy $0 ''
+ goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close
+
+ TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext:
+ FileRead $3 $4
+ IfErrors TextFunc_ConfigWrite${_TEXTFUNC_S}_add
+ StrCpy $5 $4 $0
+ StrCmp${_TEXTFUNC_S} $5 $1 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext
+
+ StrCpy $5 0
+ IntOp $5 $5 - 1
+ StrCpy $6 $4 1 $5
+ StrCmp${_TEXTFUNC_S} $6 '$\r' -2
+ StrCmp${_TEXTFUNC_S} $6 '$\n' -3
+ StrCpy $6 $4
+ StrCmp${_TEXTFUNC_S} $5 -1 +3
+ IntOp $5 $5 + 1
+ StrCpy $6 $4 $5
+
+ StrCmp${_TEXTFUNC_S} $2 '' TextFunc_ConfigWrite${_TEXTFUNC_S}_change
+ StrCmp${_TEXTFUNC_S} $6 '$1$2' 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_change
+ StrCpy $0 SAME
+ goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close
+
+ TextFunc_ConfigWrite${_TEXTFUNC_S}_change:
+ FileSeek $3 0 CUR $5
+ StrLen $4 $4
+ IntOp $4 $5 - $4
+ FileSeek $3 0 END $6
+ IntOp $6 $6 - $5
+
+ System::Alloc $6
+ Pop $0
+ FileSeek $3 $5 SET
+ System::Call 'kernel32::ReadFile(i r3, i r0, i $6, t.,)'
+ FileSeek $3 $4 SET
+ StrCmp${_TEXTFUNC_S} $2 '' +2
+ FileWrite $3 '$1$2$\r$\n'
+ System::Call 'kernel32::WriteFile(i r3, i r0, i $6, t.,)'
+ System::Call 'kernel32::SetEndOfFile(i r3)'
+ System::Free $0
+ StrCmp${_TEXTFUNC_S} $2 '' +3
+ StrCpy $0 CHANGED
+ goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close
+ StrCpy $0 DELETED
+ goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close
+
+ TextFunc_ConfigWrite${_TEXTFUNC_S}_add:
+ StrCmp${_TEXTFUNC_S} $2 '' 0 +3
+ StrCpy $0 SAME
+ goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close
+ FileSeek $3 -1 END
+ FileRead $3 $4
+ IfErrors +4
+ StrCmp${_TEXTFUNC_S} $4 '$\r' +3
+ StrCmp${_TEXTFUNC_S} $4 '$\n' +2
+ FileWrite $3 '$\r$\n'
+ FileWrite $3 '$1$2$\r$\n'
+ StrCpy $0 ADDED
+
+ TextFunc_ConfigWrite${_TEXTFUNC_S}_close:
+ FileClose $3
+ goto TextFunc_ConfigWrite${_TEXTFUNC_S}_end
+
+ TextFunc_ConfigWrite${_TEXTFUNC_S}_error:
+ SetErrors
+ StrCpy $0 ''
+
+ TextFunc_ConfigWrite${_TEXTFUNC_S}_end:
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+!macroend
+
+!define ConfigWrite `!insertmacro ConfigWriteCall`
+!define un.ConfigWrite `!insertmacro ConfigWriteCall`
+
+!macro ConfigWrite
+!macroend
+
+!macro un.ConfigWrite
+!macroend
+
+!macro ConfigWrite_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ !insertmacro ConfigWriteBody ''
+
+ !verbose pop
+!macroend
+
+!define ConfigWriteS `!insertmacro ConfigWriteSCall`
+!define un.ConfigWriteS `!insertmacro ConfigWriteSCall`
+
+!macro ConfigWriteS
+!macroend
+
+!macro un.ConfigWriteS
+!macroend
+
+!macro ConfigWriteS_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ !insertmacro ConfigWriteBody 'S'
+
+ !verbose pop
+!macroend
+
+!define FileRecode `!insertmacro FileRecodeCall`
+!define un.FileRecode `!insertmacro FileRecodeCall`
+
+!macro FileRecode
+!macroend
+
+!macro un.FileRecode
+!macroend
+
+!macro FileRecode_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+
+ IfFileExists $0 0 TextFunc_FileRecode_error
+ StrCmp $1 OemToChar +2
+ StrCmp $1 CharToOem 0 TextFunc_FileRecode_error
+
+ FileOpen $2 $0 a
+ FileSeek $2 0 END $3
+ System::Alloc $3
+ Pop $4
+ FileSeek $2 0 SET
+ System::Call 'kernel32::ReadFile(i r2, i r4, i $3, t.,)'
+ System::Call 'user32::$1Buff(i r4, i r4, i $3)'
+ FileSeek $2 0 SET
+ System::Call 'kernel32::WriteFile(i r2, i r4, i $3, t.,)'
+ System::Free $4
+ FileClose $2
+ goto TextFunc_FileRecode_end
+
+ TextFunc_FileRecode_error:
+ SetErrors
+
+ TextFunc_FileRecode_end:
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+
+ !verbose pop
+!macroend
+
+!define TrimNewLines `!insertmacro TrimNewLinesCall`
+!define un.TrimNewLines `!insertmacro TrimNewLinesCall`
+
+!macro TrimNewLines
+!macroend
+
+!macro un.TrimNewLines
+!macroend
+
+!macro TrimNewLines_
+ !verbose push
+ !verbose ${_TEXTFUNC_VERBOSE}
+
+ Exch $0
+ Push $1
+ Push $2
+
+ StrCpy $1 0
+ IntOp $1 $1 - 1
+ StrCpy $2 $0 1 $1
+ StrCmp $2 '$\r' -2
+ StrCmp $2 '$\n' -3
+ StrCmp $1 -1 +3
+ IntOp $1 $1 + 1
+ StrCpy $0 $0 $1
+
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!endif
diff --git a/Engine/bin/tools/nsis/app/Include/UpgradeDLL.nsh b/Engine/bin/tools/nsis/app/Include/UpgradeDLL.nsh
new file mode 100644
index 000000000..ba10674c6
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/UpgradeDLL.nsh
@@ -0,0 +1,203 @@
+/*
+
+NOTE:
+-----
+This macro is provided for backwards compatibility with NSIS 2.0 scripts.
+It's recommended you update your scripts to use the new Library.nsh macros.
+
+
+Macro - Upgrade DLL File
+Written by Joost Verburg
+------------------------
+
+Parameters:
+LOCALFILE Location of the new DLL file (on the compiler system)
+DESTFILE Location of the DLL file that should be upgraded (on the user's system)
+TEMPBASEDIR Directory on the user's system to store a temporary file when the system has
+ to be rebooted.
+ For Win9x/ME support, this should be on the same volume as DESTFILE.
+ The Windows temp directory could be located on any volume, so you cannot use
+ this directory.
+
+Define UPGRADEDLL_NOREGISTER if you want to upgrade a DLL that does not have to be registered.
+
+Notes:
+
+* If you want to support Windows 9x/ME, you can only use short filenames (8.3).
+
+* This macro uses the GetDLLVersionLocal command to retrieve the version of local libraries.
+ This command is only supported when compiling on a Windows system.
+
+------------------------
+
+Example:
+
+!insertmacro UpgradeDLL "dllname.dll" "$SYSDIR\dllname.dll" "$SYSDIR"
+
+*/
+
+!ifndef UPGRADEDLL_INCLUDED
+
+!define UPGRADEDLL_INCLUDED
+
+!macro __UpgradeDLL_Helper_AddRegToolEntry mode filename tempdir
+
+ Push $R0
+ Push $R1
+ Push $R2
+ Push $R3
+
+ ;------------------------
+ ;Copy the parameters
+
+ Push "${filename}"
+ Push "${tempdir}"
+
+ Pop $R2 ; temporary directory
+ Pop $R1 ; file name to register
+
+ ;------------------------
+ ;Advance counter
+
+ StrCpy $R0 0
+ ReadRegDWORD $R0 HKLM "Software\NSIS.Library.RegTool.v2\UpgradeDLLSession" "count"
+ IntOp $R0 $R0 + 1
+ WriteRegDWORD HKLM "Software\NSIS.Library.RegTool.v2\UpgradeDLLSession" "count" "$R0"
+
+ ;------------------------
+ ;Setup RegTool
+
+ ReadRegStr $R3 HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" "NSIS.Library.RegTool.v2"
+ StrCpy $R3 $R3 -4 1
+ IfFileExists $R3 +3
+
+ File /oname=$R2\NSIS.Library.RegTool.v2.$HWNDPARENT.exe "${NSISDIR}\Bin\RegTool.bin"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \
+ "NSIS.Library.RegTool.v2" '"$R2\NSIS.Library.RegTool.v2.$HWNDPARENT.exe" /S'
+
+ ;------------------------
+ ;Add RegTool entry
+
+ WriteRegStr HKLM "Software\NSIS.Library.RegTool.v2\UpgradeDLLSession" "$R0.file" "$R1"
+ WriteRegStr HKLM "Software\NSIS.Library.RegTool.v2\UpgradeDLLSession" "$R0.mode" "${mode}"
+
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $R0
+
+!macroend
+
+!macro UpgradeDLL LOCALFILE DESTFILE TEMPBASEDIR
+
+ Push $R0
+ Push $R1
+ Push $R2
+ Push $R3
+ Push $R4
+ Push $R5
+
+ !define UPGRADEDLL_UNIQUE "${__FILE__}${__LINE__}"
+
+ SetOverwrite try
+
+ ;------------------------
+ ;Copy the parameters used on run-time to a variable
+ ;This allows the usage of variables as paramter
+
+ StrCpy $R4 "${DESTFILE}"
+ StrCpy $R5 "${TEMPBASEDIR}"
+
+ ;------------------------
+ ;Get version information
+
+ IfFileExists $R4 0 "upgradedll.copy_${UPGRADEDLL_UNIQUE}"
+
+ ClearErrors
+ GetDLLVersionLocal "${LOCALFILE}" $R0 $R1
+ GetDLLVersion $R4 $R2 $R3
+ IfErrors "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}"
+
+ IntCmpU $R0 $R2 0 "upgradedll.done_${UPGRADEDLL_UNIQUE}" "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}"
+ IntCmpU $R1 $R3 "upgradedll.done_${UPGRADEDLL_UNIQUE}" "upgradedll.done_${UPGRADEDLL_UNIQUE}" \
+ "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}"
+
+ ;------------------------
+ ;Upgrade
+
+ "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}:"
+ !ifndef UPGRADEDLL_NOREGISTER
+ ;Unregister the DLL
+ UnRegDLL $R4
+ !endif
+
+ ;------------------------
+ ;Copy
+
+ ClearErrors
+ StrCpy $R0 $R4
+ Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}"
+ IfErrors 0 "upgradedll.noreboot_${UPGRADEDLL_UNIQUE}"
+
+ ;------------------------
+ ;Copy on reboot
+
+ GetTempFileName $R0 $R5
+ Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}"
+ Rename /REBOOTOK $R0 $R4
+
+ ;------------------------
+ ;Register on reboot
+
+ !insertmacro __UpgradeDLL_Helper_AddRegToolEntry 'D' $R4 $R5
+
+ Goto "upgradedll.done_${UPGRADEDLL_UNIQUE}"
+
+ ;------------------------
+ ;DLL does not exist
+
+ "upgradedll.copy_${UPGRADEDLL_UNIQUE}:"
+ StrCpy $R0 $R4
+ Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}"
+
+ ;------------------------
+ ;Register
+
+ "upgradedll.noreboot_${UPGRADEDLL_UNIQUE}:"
+ !ifndef UPGRADEDLL_NOREGISTER
+ RegDLL $R4
+ !endif
+
+ ;------------------------
+ ;Done
+
+ "upgradedll.done_${UPGRADEDLL_UNIQUE}:"
+
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $R0
+
+ ;------------------------
+ ;End
+
+ Goto "upgradedll.end_${UPGRADEDLL_UNIQUE}"
+
+ ;------------------------
+ ;Extract
+
+ "upgradedll.file_${UPGRADEDLL_UNIQUE}:"
+ File /oname=$R0 "${LOCALFILE}"
+ Return
+
+ "upgradedll.end_${UPGRADEDLL_UNIQUE}:"
+
+ SetOverwrite lastused
+
+ !undef UPGRADEDLL_UNIQUE
+
+!macroend
+
+!endif
diff --git a/Engine/bin/tools/nsis/app/Include/Util.nsh b/Engine/bin/tools/nsis/app/Include/Util.nsh
new file mode 100644
index 000000000..cb046364d
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/Util.nsh
@@ -0,0 +1,56 @@
+; ---------------------
+; Util.nsh
+; ---------------------
+;
+; Voodoo macros to make end-user usage easier. This may be documented someday.
+
+!verbose push
+!verbose 3
+
+!ifndef ___UTIL__NSH___
+!define ___UTIL__NSH___
+
+# see WinVer.nsh and *Func.nsh for usage examples
+!macro CallArtificialFunction NAME
+ !ifndef __UNINSTALL__
+ !define CallArtificialFunction_TYPE inst
+ !else
+ !define CallArtificialFunction_TYPE uninst
+ !endif
+ Call :.${NAME}${CallArtificialFunction_TYPE}
+ !ifndef ${NAME}${CallArtificialFunction_TYPE}_DEFINED
+ Goto ${NAME}${CallArtificialFunction_TYPE}_DONE
+ !define ${NAME}${CallArtificialFunction_TYPE}_DEFINED
+ .${NAME}${CallArtificialFunction_TYPE}:
+ !insertmacro ${NAME}
+ Return
+ ${NAME}${CallArtificialFunction_TYPE}_DONE:
+ !endif
+ !undef CallArtificialFunction_TYPE
+!macroend
+!define CallArtificialFunction `!insertmacro CallArtificialFunction`
+
+# for usage of artificial functions inside artificial functions
+# macro recursion is prohibited
+!macro CallArtificialFunction2 NAME
+ !ifndef __UNINSTALL__
+ !define CallArtificialFunction2_TYPE inst
+ !else
+ !define CallArtificialFunction2_TYPE uninst
+ !endif
+ Call :.${NAME}${CallArtificialFunction2_TYPE}
+ !ifndef ${NAME}${CallArtificialFunction2_TYPE}_DEFINED
+ Goto ${NAME}${CallArtificialFunction2_TYPE}_DONE
+ !define ${NAME}${CallArtificialFunction2_TYPE}_DEFINED
+ .${NAME}${CallArtificialFunction2_TYPE}:
+ !insertmacro ${NAME}
+ Return
+ ${NAME}${CallArtificialFunction2_TYPE}_DONE:
+ !endif
+ !undef CallArtificialFunction2_TYPE
+!macroend
+!define CallArtificialFunction2 `!insertmacro CallArtificialFunction2`
+
+!endif # !___UTIL__NSH___
+
+!verbose pop
diff --git a/Engine/bin/tools/nsis/app/Include/VB6RunTime.nsh b/Engine/bin/tools/nsis/app/Include/VB6RunTime.nsh
new file mode 100644
index 000000000..4822badf1
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/VB6RunTime.nsh
@@ -0,0 +1,90 @@
+/*
+
+VB6RunTime.nsh
+
+Setup of Visual Basic 6.0 run-time files, including the Oleaut32.dll security update
+
+Copyright 2008-2009 Joost Verburg
+
+To obtain the run-time files, download and extract
+http://nsis.sourceforge.net/vb6runtime.zip
+
+Script code for installation:
+
+!insertmacro InstallVB6RunTime FOLDER ALREADY_INSTALLED
+
+in which FOLDER is the location of the run-time files and ALREADY_INSTALLED is the
+name of a variable that is empty when the application is installed for the first time
+and non-empty otherwise
+
+Script code for uninstallation:
+
+!insertmacro UnInstallVB6RunTime
+
+Remarks:
+
+* You may have to install additional files for such Visual Basic application to work,
+ such as OCX files for user interface controls.
+
+* Installation of the run-time files requires Administrator or Power User privileges.
+ Use the Multi-User header file to verify whether these privileges are available.
+
+* Add a Modern UI finish page or another check (see IfRebootFlag in the NSIS Users
+ Manual) to allow the user to restart the computer when necessary.
+
+*/
+
+!ifndef VB6_INCLUDED
+!define VB6_INCLUDED
+!verbose push
+!verbose 3
+
+!include Library.nsh
+!include WinVer.nsh
+
+!macro VB6RunTimeInstall FOLDER ALREADY_INSTALLED
+
+ !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\msvbvm60.dll" "$SYSDIR\msvbvm60.dll" "$SYSDIR"
+
+ ;The files below will only be installed on Win9x/NT4
+
+ !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\olepro32.dll" "$SYSDIR\olepro32.dll" "$SYSDIR"
+ !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\comcat.dll" "$SYSDIR\comcat.dll" "$SYSDIR"
+ !insertmacro InstallLib DLL "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\asycfilt.dll" "$SYSDIR\asycfilt.dll" "$SYSDIR"
+ !insertmacro InstallLib TLB "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\stdole2.tlb" "$SYSDIR\stdole2.tlb" "$SYSDIR"
+
+ Push $R0
+
+ ${if} ${IsNT}
+ ${if} ${IsWinNT4}
+ ReadRegStr $R0 HKLM "System\CurrentControlSet\Control" "ProductOptions"
+ ${if} $R0 == "Terminal Server"
+ !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_NOTPROTECTED "${FOLDER}\NT4TS\oleaut32.dll" "$SYSDIR\oleaut32.dll" "$SYSDIR"
+ ${else}
+ !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_NOTPROTECTED "${FOLDER}\NT4\oleaut32.dll" "$SYSDIR\oleaut32.dll" "$SYSDIR"
+ ${endif}
+ ${endif}
+ ${else}
+ ;No Oleaut32.dll with the security update has been released for Windows 9x.
+ ;The NT4 version is used because NT4 and Win9x used to share the same 2.40 version
+ ;and version 2.40.4519.0 is reported to work fine on Win9x.
+ !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_NOTPROTECTED "${FOLDER}\NT4\oleaut32.dll" "$SYSDIR\oleaut32.dll" "$SYSDIR"
+ ${endif}
+
+ Pop $R0
+
+!macroend
+
+!macro VB6RunTimeUnInstall
+
+ !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\msvbvm60.dll"
+ !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\oleaut32.dll"
+ !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\olepro32.dll"
+ !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\comcat.dll"
+ !insertmacro UnInstallLib DLL SHARED NOREMOVE "$SYSDIR\asycfilt.dll"
+ !insertmacro UnInstallLib TLB SHARED NOREMOVE "$SYSDIR\stdole2.tlb"
+
+!macroend
+
+!verbose pop
+!endif
diff --git a/Engine/bin/tools/nsis/app/Include/VPatchLib.nsh b/Engine/bin/tools/nsis/app/Include/VPatchLib.nsh
new file mode 100644
index 000000000..1e01bc8c7
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/VPatchLib.nsh
@@ -0,0 +1,47 @@
+; PatchLib v3.0
+; =============
+;
+; Library with macro for use with VPatch (DLL version) in NSIS 2.0.5+
+; Created by Koen van de Sande
+
+!include LogicLib.nsh
+
+!macro VPatchFile PATCHDATA SOURCEFILE TEMPFILE
+
+ Push $1
+ Push $2
+ Push $3
+ Push $4
+
+ Push ${SOURCEFILE}
+ Push ${TEMPFILE}
+
+ Pop $2 # temp file
+ Pop $3 # source file
+
+ InitPluginsDir
+ GetTempFileName $1 $PLUGINSDIR
+ File /oname=$1 ${PATCHDATA}
+
+ vpatch::vpatchfile $1 $3 $2
+ Pop $4
+ DetailPrint $4
+
+ StrCpy $4 $4 2
+ ${Unless} $4 == "OK"
+ SetErrors
+ ${EndIf}
+
+ ${If} ${FileExists} $2
+ Delete $3
+ Rename /REBOOTOK $2 $3
+ ${EndIf}
+
+ Delete $1
+
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+
+!macroend
diff --git a/Engine/bin/tools/nsis/app/Include/Win/WinDef.nsh b/Engine/bin/tools/nsis/app/Include/Win/WinDef.nsh
new file mode 100644
index 000000000..14ee768bb
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/Win/WinDef.nsh
@@ -0,0 +1,74 @@
+!ifndef __WIN_WINDEF__INC
+!define __WIN_WINDEF__INC
+!verbose push
+!verbose 3
+!ifndef __WIN_NOINC_WINDEF
+
+
+!ifndef MAX_PATH
+!define MAX_PATH 260
+!endif
+#define NULL 0
+
+
+!macro _Win_MINMAX _intcmp _j1 _j2 _outvar _a _b
+${_intcmp} "${_a}" "${_b}" ${_j1} ${_j1} ${_j2}
+StrCpy ${_outvar} "${_a}"
+goto +2
+StrCpy ${_outvar} "${_b}"
+!macroend
+!ifndef __WIN_MS_NOMINMAX & min & max & min_u & max_u
+!define min "!insertmacro _Win_MINMAX IntCmp +1 +3 "
+!define max "!insertmacro _Win_MINMAX IntCmp +3 +1 "
+!define min_u "!insertmacro _Win_MINMAX IntCmpU +1 +3 "
+!define max_u "!insertmacro _Win_MINMAX IntCmpU +3 +1 "
+!endif
+
+!macro _Win_LOBYTE _outvar _in
+IntOp ${_outvar} "${_in}" & 0xFF
+!macroend
+!define LOBYTE "!insertmacro _Win_LOBYTE "
+
+!macro _Win_HIBYTE _outvar _in
+IntOp ${_outvar} "${_in}" >> 8
+${LOBYTE} ${_outvar} ${_outvar}
+!macroend
+!define HIBYTE "!insertmacro _Win_HIBYTE "
+
+!macro _Win_LOWORD _outvar _in
+IntOp ${_outvar} "${_in}" & 0xFFFF
+!macroend
+!define LOWORD "!insertmacro _Win_LOWORD "
+
+!macro _Win_HIWORD _outvar _in
+IntOp ${outvar} "${_in}" >> 16 ;sign extended :(
+${LOWORD} ${_outvar} ${outvar} ;make sure we strip off the upper word
+!macroend
+!define HIWORD "!insertmacro _Win_HIWORD "
+
+!macro _Win_MAKEWORD _outvar _tmpvar _lo _hi
+${LOBYTE} ${_outvar} "${_hi}"
+${LOBYTE} ${_tmpvar} "${_lo}"
+IntOp ${_outvar} ${_outvar} << 8
+IntOp ${_outvar} ${_outvar} | ${_tmpvar}
+!macroend
+!define MAKEWORD "!insertmacro _Win_MAKEWORD "
+
+!macro _Win_MAKELONG32 _outvar _tmpvar _wlo _whi
+${LOWORD} ${_outvar} "${_wlo}"
+IntOp ${_tmpvar} "${_whi}" << 16
+IntOp ${_outvar} ${_outvar} | ${_tmpvar}
+!macroend
+!define MAKELONG "!insertmacro _Win_MAKELONG32 "
+!if "${__WIN_PTRSIZE}" <= 4
+!define MAKEWPARAM "${MAKELONG}"
+!define MAKELPARAM "${MAKELONG}"
+!define MAKELRESULT "${MAKELONG}"
+!else
+!error "Missing 64bit imp!"
+!endif
+
+
+!endif /* __WIN_NOINC_WINDEF */
+!verbose pop
+!endif /* __WIN_WINDEF__INC */
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Include/Win/WinError.nsh b/Engine/bin/tools/nsis/app/Include/Win/WinError.nsh
new file mode 100644
index 000000000..988c9ebd6
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/Win/WinError.nsh
@@ -0,0 +1,64 @@
+!ifndef __WIN_WINERROR__INC
+!define __WIN_WINERROR__INC
+!verbose push
+!verbose 3
+!ifndef __WIN_NOINC_WINERROR
+
+#define NO_ERROR 0
+!define ERROR_SUCCESS 0
+!define ERROR_INVALID_FUNCTION 1
+!define ERROR_FILE_NOT_FOUND 2
+!define ERROR_PATH_NOT_FOUND 3
+!define ERROR_TOO_MANY_OPEN_FILES 4
+!define ERROR_ACCESS_DENIED 5
+!define ERROR_INVALID_HANDLE 6
+!define ERROR_ARENA_TRASHED 7
+!define ERROR_NOT_ENOUGH_MEMORY 8
+!define ERROR_INVALID_BLOCK 9
+!define ERROR_BAD_ENVIRONMENT 10
+!define ERROR_BAD_FORMAT 11
+!define ERROR_INVALID_ACCESS 12
+!define ERROR_INVALID_DATA 13
+!define ERROR_OUTOFMEMORY 14
+!define ERROR_INVALID_DRIVE 15
+!define ERROR_CURRENT_DIRECTORY 16
+!define ERROR_NOT_SAME_DEVICE 17
+!define ERROR_NO_MORE_FILES 18
+!define ERROR_WRITE_PROTECT 19
+!define ERROR_BAD_UNIT 20
+!define ERROR_NOT_READY 21
+!define ERROR_BAD_COMMAND 22
+!define ERROR_CRC 23
+!define ERROR_BAD_LENGTH 24
+!define ERROR_SEEK 25
+!define ERROR_NOT_DOS_DISK 26
+!define ERROR_SECTOR_NOT_FOUND 27
+!define ERROR_OUT_OF_PAPER 28
+!define ERROR_WRITE_FAULT 29
+!define ERROR_READ_FAULT 30
+!define ERROR_GEN_FAILURE 31
+!define ERROR_SHARING_VIOLATION 32
+!define ERROR_LOCK_VIOLATION 33
+!define ERROR_WRONG_DISK 34
+!define ERROR_SHARING_BUFFER_EXCEEDED 36
+!define ERROR_HANDLE_EOF 38
+!define ERROR_HANDLE_DISK_FULL 39
+!define ERROR_NOT_SUPPORTED 50
+
+!define SEVERITY_SUCCESS 0
+!define SEVERITY_ERROR 1
+!define E_UNEXPECTED 0x8000FFFF
+!define E_NOTIMPL 0x80004001
+!define E_OUTOFMEMORY 0x8007000E
+!define E_INVALIDARG 0x80070057
+!define E_NOINTERFACE 0x80004002
+!define E_POINTER 0x80004003
+!define E_HANDLE 0x80070006
+!define E_ABORT 0x80004004
+!define E_FAIL 0x80004005
+!define E_ACCESSDENIED 0x80070005
+!define E_PENDING 0x8000000A
+
+!endif /* __WIN_NOINC_WINERROR */
+!verbose pop
+!endif /* __WIN_WINERROR__INC */
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Include/Win/WinNT.nsh b/Engine/bin/tools/nsis/app/Include/Win/WinNT.nsh
new file mode 100644
index 000000000..629b32f9b
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/Win/WinNT.nsh
@@ -0,0 +1,209 @@
+!ifndef __WIN_WINNT__INC
+!define __WIN_WINNT__INC
+!verbose push
+!verbose 3
+!ifndef __WIN_NOINC_WINNT
+
+
+#define MINCHAR 0x80
+#define MAXCHAR 0x7f
+!define MINSHORT 0x8000
+!define MAXSHORT 0x7fff
+!define MINLONG 0x80000000
+!define MAXLONG 0x7fffffff
+!define MAXBYTE 0xff
+!define MAXWORD 0xffff
+!define MAXDWORD 0xffffffff
+
+!ifndef WIN32_NO_STATUS
+!define STATUS_WAIT_0 0x00000000
+!define STATUS_ABANDONED_WAIT_0 0x00000080
+!define STATUS_USER_APC 0x000000C0
+!define STATUS_TIMEOUT 0x00000102
+!define STATUS_PENDING 0x00000103
+!define DBG_EXCEPTION_HANDLED 0x00010001
+!define DBG_CONTINUE 0x00010002
+!define STATUS_SEGMENT_NOTIFICATION 0x40000005
+!define DBG_TERMINATE_THREAD 0x40010003
+!define DBG_TERMINATE_PROCESS 0x40010004
+!define DBG_CONTROL_C 0x40010005
+!define DBG_CONTROL_BREAK 0x40010008
+!define DBG_COMMAND_EXCEPTION 0x40010009
+!define STATUS_GUARD_PAGE_VIOLATION 0x80000001
+!define STATUS_DATATYPE_MISALIGNMENT 0x80000002
+!define STATUS_BREAKPOINT 0x80000003
+!define STATUS_SINGLE_STEP 0x80000004
+!define DBG_EXCEPTION_NOT_HANDLED 0x80010001
+!define STATUS_ACCESS_VIOLATION 0xC0000005
+!define STATUS_IN_PAGE_ERROR 0xC0000006
+!define STATUS_INVALID_HANDLE 0xC0000008
+!define STATUS_NO_MEMORY 0xC0000017
+!define STATUS_ILLEGAL_INSTRUCTION 0xC000001D
+!define STATUS_NONCONTINUABLE_EXCEPTION 0xC0000025
+!define STATUS_INVALID_DISPOSITION 0xC0000026
+!define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C
+!define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D
+!define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E
+!define STATUS_FLOAT_INEXACT_RESULT 0xC000008F
+!define STATUS_FLOAT_INVALID_OPERATION 0xC0000090
+!define STATUS_FLOAT_OVERFLOW 0xC0000091
+!define STATUS_FLOAT_STACK_CHECK 0xC0000092
+!define STATUS_FLOAT_UNDERFLOW 0xC0000093
+!define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094
+!define STATUS_INTEGER_OVERFLOW 0xC0000095
+!define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096
+!define STATUS_STACK_OVERFLOW 0xC00000FD
+!define STATUS_CONTROL_C_EXIT 0xC000013A
+!define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4
+!define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5
+!define STATUS_REG_NAT_CONSUMPTION 0xC00002C9
+!define STATUS_SXS_EARLY_DEACTIVATION 0xC015000F
+!define STATUS_SXS_INVALID_DEACTIVATION 0xC0150010
+!endif /*WIN32_NO_STATUS*/
+
+#define MAXIMUM_WAIT_OBJECTS 64
+
+!define DELETE 0x00010000
+!define READ_CONTROL 0x00020000
+!define WRITE_DAC 0x00040000
+!define WRITE_OWNER 0x00080000
+!define SYNCHRONIZE 0x00100000
+!define STANDARD_RIGHTS_REQUIRED 0x000F0000
+!define STANDARD_RIGHTS_READ ${READ_CONTROL}
+!define STANDARD_RIGHTS_WRITE ${READ_CONTROL}
+!define STANDARD_RIGHTS_EXECUTE ${READ_CONTROL}
+!define STANDARD_RIGHTS_ALL 0x001F0000
+!define SPECIFIC_RIGHTS_ALL 0x0000FFFF
+!define ACCESS_SYSTEM_SECURITY 0x01000000
+!define MAXIMUM_ALLOWED 0x02000000
+!define GENERIC_READ 0x80000000
+!define GENERIC_WRITE 0x40000000
+!define GENERIC_EXECUTE 0x20000000
+!define GENERIC_ALL 0x10000000
+
+!define SE_PRIVILEGE_ENABLED_BY_DEFAULT 0x00000001
+!define SE_PRIVILEGE_ENABLED 0x00000002
+!define SE_PRIVILEGE_REMOVED 0x00000004
+!define SE_PRIVILEGE_USED_FOR_ACCESS 0x80000000
+
+!define SE_CREATE_TOKEN_NAME "SeCreateTokenPrivilege"
+!define SE_ASSIGNPRIMARYTOKEN_NAME "SeAssignPrimaryTokenPrivilege"
+!define SE_LOCK_MEMORY_NAME "SeLockMemoryPrivilege"
+!define SE_INCREASE_QUOTA_NAME "SeIncreaseQuotaPrivilege"
+!define SE_UNSOLICITED_INPUT_NAME "SeUnsolicitedInputPrivilege"
+!define SE_MACHINE_ACCOUNT_NAME "SeMachineAccountPrivilege"
+!define SE_TCB_NAME "SeTcbPrivilege"
+!define SE_SECURITY_NAME "SeSecurityPrivilege"
+!define SE_TAKE_OWNERSHIP_NAME "SeTakeOwnershipPrivilege"
+!define SE_LOAD_DRIVER_NAME "SeLoadDriverPrivilege"
+!define SE_SYSTEM_PROFILE_NAME "SeSystemProfilePrivilege"
+!define SE_SYSTEMTIME_NAME "SeSystemtimePrivilege"
+!define SE_PROF_SINGLE_PROCESS_NAME "SeProfileSingleProcessPrivilege"
+!define SE_INC_BASE_PRIORITY_NAME "SeIncreaseBasePriorityPrivilege"
+!define SE_CREATE_PAGEFILE_NAME "SeCreatePagefilePrivilege"
+!define SE_CREATE_PERMANENT_NAME "SeCreatePermanentPrivilege"
+!define SE_BACKUP_NAME "SeBackupPrivilege"
+!define SE_RESTORE_NAME "SeRestorePrivilege"
+!define SE_SHUTDOWN_NAME "SeShutdownPrivilege"
+!define SE_DEBUG_NAME "SeDebugPrivilege"
+!define SE_AUDIT_NAME "SeAuditPrivilege"
+!define SE_SYSTEM_ENVIRONMENT_NAME "SeSystemEnvironmentPrivilege"
+!define SE_CHANGE_NOTIFY_NAME "SeChangeNotifyPrivilege"
+!define SE_REMOTE_SHUTDOWN_NAME "SeRemoteShutdownPrivilege"
+!define SE_UNDOCK_NAME "SeUndockPrivilege"
+!define SE_SYNC_AGENT_NAME "SeSyncAgentPrivilege"
+!define SE_ENABLE_DELEGATION_NAME "SeEnableDelegationPrivilege"
+!define SE_MANAGE_VOLUME_NAME "SeManageVolumePrivilege"
+!define SE_IMPERSONATE_NAME "SeImpersonatePrivilege"
+!define SE_CREATE_GLOBAL_NAME "SeCreateGlobalPrivilege"
+
+!define TOKEN_ASSIGN_PRIMARY 0x0001
+!define TOKEN_DUPLICATE 0x0002
+!define TOKEN_IMPERSONATE 0x0004
+!define TOKEN_QUERY 0x0008
+!define TOKEN_QUERY_SOURCE 0x0010
+!define TOKEN_ADJUST_PRIVILEGES 0x0020
+!define TOKEN_ADJUST_GROUPS 0x0040
+!define TOKEN_ADJUST_DEFAULT 0x0080
+!define TOKEN_ADJUST_SESSIONID 0x0100
+!define TOKEN_ALL_ACCESS_P 0xF00FF
+!define /math TOKEN_ALL_ACCESS ${TOKEN_ALL_ACCESS_P} | ${TOKEN_ADJUST_SESSIONID}
+!define /math TOKEN_READ ${STANDARD_RIGHTS_READ} | ${TOKEN_QUERY}
+!define TOKEN_WRITE 0x200E0 ;(STANDARD_RIGHTS_WRITE|TOKEN_ADJUST_PRIVILEGES|TOKEN_ADJUST_GROUPS|TOKEN_ADJUST_DEFAULT)
+!define TOKEN_EXECUTE ${STANDARD_RIGHTS_EXECUTE}
+
+!define PROCESS_TERMINATE 0x0001
+!define PROCESS_CREATE_THREAD 0x0002
+!define PROCESS_SET_SESSIONID 0x0004
+!define PROCESS_VM_OPERATION 0x0008
+!define PROCESS_VM_READ 0x0010
+!define PROCESS_VM_WRITE 0x0020
+!define PROCESS_DUP_HANDLE 0x0040
+!define PROCESS_CREATE_PROCESS 0x0080
+!define PROCESS_SET_QUOTA 0x0100
+!define PROCESS_SET_INFORMATION 0x0200
+!define PROCESS_QUERY_INFORMATION 0x0400
+!define PROCESS_SUSPEND_RESUME 0x0800
+!define PROCESS_ALL_ACCESS 0x1F0FFF ;(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
+!define THREAD_TERMINATE 0x0001
+!define THREAD_SUSPEND_RESUME 0x0002
+!define THREAD_GET_CONTEXT 0x0008
+!define THREAD_SET_CONTEXT 0x0010
+!define THREAD_SET_INFORMATION 0x0020
+!define THREAD_QUERY_INFORMATION 0x0040
+!define THREAD_SET_THREAD_TOKEN 0x0080
+!define THREAD_IMPERSONATE 0x0100
+!define THREAD_DIRECT_IMPERSONATION 0x0200
+!define THREAD_ALL_ACCESS 0x1F03FF ;(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
+!define JOB_OBJECT_ASSIGN_PROCESS 0x0001
+!define JOB_OBJECT_SET_ATTRIBUTES 0x0002
+!define JOB_OBJECT_QUERY 0x0004
+!define JOB_OBJECT_TERMINATE 0x0008
+!define JOB_OBJECT_SET_SECURITY_ATTRIBUTES 0x0010
+!define JOB_OBJECT_ALL_ACCESS 0x1F001F ;(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1F )
+!define EVENT_MODIFY_STATE 0x0002
+!define EVENT_ALL_ACCESS 0x1F0003 ;(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
+!define MUTANT_QUERY_STATE 0x0001
+!define MUTANT_ALL_ACCESS 0x1F0001 ;(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|MUTANT_QUERY_STATE)
+
+!define FILE_SHARE_READ 0x00000001
+!define FILE_SHARE_WRITE 0x00000002
+!define FILE_SHARE_DELETE 0x00000004
+!define FILE_ATTRIBUTE_READONLY 0x00000001
+!define FILE_ATTRIBUTE_HIDDEN 0x00000002
+!define FILE_ATTRIBUTE_SYSTEM 0x00000004
+!define FILE_ATTRIBUTE_DIRECTORY 0x00000010
+!define FILE_ATTRIBUTE_ARCHIVE 0x00000020
+!define FILE_ATTRIBUTE_DEVICE 0x00000040
+!define FILE_ATTRIBUTE_NORMAL 0x00000080
+!define FILE_ATTRIBUTE_TEMPORARY 0x00000100
+!define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
+!define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
+!define FILE_ATTRIBUTE_COMPRESSED 0x00000800
+!define FILE_ATTRIBUTE_OFFLINE 0x00001000
+!define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
+!define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
+
+!define DUPLICATE_CLOSE_SOURCE 0x00000001
+!define DUPLICATE_SAME_ACCESS 0x00000002
+
+!define VER_PLATFORM_WIN32s 0
+!define VER_PLATFORM_WIN32_WINDOWS 1
+!define VER_PLATFORM_WIN32_NT 2
+
+!ifndef REG_SZ & NSIS_WINDOWS__NO_REGTYPES
+!define REG_NONE 0
+!define REG_SZ 1
+!define REG_EXPAND_SZ 2
+!define REG_BINARY 3
+!define REG_DWORD 4
+!define REG_DWORD_LITTLE_ENDIAN 4
+!define REG_DWORD_BIG_ENDIAN 5
+!define REG_LINK 6
+!define REG_MULTI_SZ 7
+!endif
+
+
+!endif /* __WIN_NOINC_WINNT */
+!verbose pop
+!endif /* __WIN_WINNT__INC */
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Include/Win/WinUser.nsh b/Engine/bin/tools/nsis/app/Include/Win/WinUser.nsh
new file mode 100644
index 000000000..1092848de
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/Win/WinUser.nsh
@@ -0,0 +1,199 @@
+!ifndef __WIN_WINUSER__INC
+!define __WIN_WINUSER__INC
+!verbose push
+!verbose 3
+!ifndef __WIN_MS_NOUSER & __WIN_NOINC_WINUSER
+
+!ifndef __WIN_MS_NOVIRTUALKEYCODES
+!define VK_LBUTTON 0x01
+!define VK_RBUTTON 0x02
+!define VK_CANCEL 0x03
+!define VK_MBUTTON 0x04 /* NOT contiguous with L & RBUTTON */
+!define VK_XBUTTON1 0x05 /* NOT contiguous with L & RBUTTON */
+!define VK_XBUTTON2 0x06 /* NOT contiguous with L & RBUTTON */
+!define VK_BACK 0x08
+!define VK_TAB 0x09
+!define VK_CLEAR 0x0C
+!define VK_RETURN 0x0D
+!define VK_SHIFT 0x10
+!define VK_CONTROL 0x11
+!define VK_MENU 0x12
+!define VK_PAUSE 0x13
+!define VK_CAPITAL 0x14
+!define VK_ESCAPE 0x1B
+!define VK_CONVERT 0x1C
+!define VK_NONCONVERT 0x1D
+!define VK_ACCEPT 0x1E
+!define VK_MODECHANGE 0x1F
+!define VK_SPACE 0x20
+!define VK_PRIOR 0x21
+!define VK_NEXT 0x22
+!define VK_END 0x23
+!define VK_HOME 0x24
+!define VK_LEFT 0x25
+!define VK_UP 0x26
+!define VK_RIGHT 0x27
+!define VK_DOWN 0x28
+!define VK_SELECT 0x29
+!define VK_PRINT 0x2A
+!define VK_EXECUTE 0x2B
+!define VK_SNAPSHOT 0x2C
+!define VK_INSERT 0x2D
+!define VK_DELETE 0x2E
+!define VK_HELP 0x2F
+; VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
+; VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
+!define VK_LWIN 0x5B
+!define VK_RWIN 0x5C
+!define VK_APPS 0x5D
+!define VK_SLEEP 0x5F
+!define VK_NUMPAD0 0x60
+!define VK_NUMPAD1 0x61
+!define VK_NUMPAD2 0x62
+!define VK_NUMPAD3 0x63
+!define VK_NUMPAD4 0x64
+!define VK_NUMPAD5 0x65
+!define VK_NUMPAD6 0x66
+!define VK_NUMPAD7 0x67
+!define VK_NUMPAD8 0x68
+!define VK_NUMPAD9 0x69
+!define VK_MULTIPLY 0x6A
+!define VK_ADD 0x6B
+!define VK_SEPARATOR 0x6C
+!define VK_SUBTRACT 0x6D
+!define VK_DECIMAL 0x6E
+!define VK_DIVIDE 0x6F
+!define VK_F1 0x70
+!define VK_F2 0x71
+!define VK_F3 0x72
+!define VK_F4 0x73
+!define VK_F5 0x74
+!define VK_F6 0x75
+!define VK_F7 0x76
+!define VK_F8 0x77
+!define VK_F9 0x78
+!define VK_F10 0x79
+!define VK_F11 0x7A
+!define VK_F12 0x7B
+!define VK_NUMLOCK 0x90
+!define VK_SCROLL 0x91
+!define VK_OEM_NEC_EQUAL 0x92 ; '=' key on numpad
+!define VK_LSHIFT 0xA0
+!define VK_RSHIFT 0xA1
+!define VK_LCONTROL 0xA2
+!define VK_RCONTROL 0xA3
+!define VK_LMENU 0xA4
+!define VK_RMENU 0xA5
+!endif
+
+!ifndef __WIN_MS_NOWINOFFSETS
+/* in nsDialogs.nsh...
+!define GWL_STYLE -16
+!define GWL_EXSTYLE -20 */
+!define GWLP_WNDPROC -4
+!define GWLP_HINSTANCE -6
+!define GWLP_HWNDPARENT -8
+!define GWLP_USERDATA -21
+!define GWLP_ID -12
+!define DWLP_MSGRESULT 0
+!define /math DWLP_DLGPROC ${DWLP_MSGRESULT} + ${__WIN_PTRSIZE} ;DWLP_MSGRESULT + sizeof(LRESULT)
+!define /math DWLP_USER ${DWLP_DLGPROC} + ${__WIN_PTRSIZE} ;DWLP_DLGPROC + sizeof(DLGPROC)
+!endif
+
+!ifndef __WIN_MS_NONCMESSAGES
+!define HTERROR -2
+!define HTTRANSPARENT -1
+!define HTNOWHERE 0
+!define HTCLIENT 1
+!define HTCAPTION 2
+!define HTSYSMENU 3
+!define HTGROWBOX 4
+!define HTSIZE ${HTGROWBOX}
+!define HTMENU 5
+!define HTHSCROLL 6
+!define HTVSCROLL 7
+!define HTMINBUTTON 8
+!define HTMAXBUTTON 9
+!define HTLEFT 10
+!define HTRIGHT 11
+!define HTTOP 12
+!define HTTOPLEFT 13
+!define HTTOPRIGHT 14
+!define HTBOTTOM 15
+!define HTBOTTOMLEFT 16
+!define HTBOTTOMRIGHT 17
+!define HTBORDER 18
+!define HTREDUCE ${HTMINBUTTON}
+!define HTZOOM ${HTMAXBUTTON}
+!define HTSIZEFIRST ${HTLEFT}
+!define HTSIZELAST ${HTBOTTOMRIGHT}
+!define HTOBJECT 19
+!define HTCLOSE 20
+!define HTHELP 21
+!endif
+
+!ifndef __WIN_MS_NOSYSCOMMANDS
+!define SC_SIZE 0xF000
+!define SC_MOVE 0xF010
+!define SC_MINIMIZE 0xF020
+!define SC_MAXIMIZE 0xF030
+!define SC_NEXTWINDOW 0xF040
+!define SC_PREVWINDOW 0xF050
+!define SC_CLOSE 0xF060
+!define SC_VSCROLL 0xF070
+!define SC_HSCROLL 0xF080
+!define SC_MOUSEMENU 0xF090
+!define SC_KEYMENU 0xF100
+!define SC_ARRANGE 0xF110
+!define SC_RESTORE 0xF120
+!define SC_TASKLIST 0xF130
+!define SC_SCREENSAVE 0xF140
+!define SC_HOTKEY 0xF150
+!define SC_DEFAULT 0xF160
+!define SC_MONITORPOWER 0xF170
+!define SC_CONTEXTHELP 0xF180
+!define SC_SEPARATOR 0xF00F
+!endif
+
+!define IDC_ARROW 32512
+!define IDC_IBEAM 32513
+!define IDC_WAIT 32514
+!define IDC_CROSS 32515
+!define IDC_UPARROW 32516
+!define IDC_SIZENWSE 32642
+!define IDC_SIZENESW 32643
+!define IDC_SIZEWE 32644
+!define IDC_SIZENS 32645
+!define IDC_SIZEALL 32646
+!define IDC_NO 32648
+!define IDC_HAND 32649
+!define IDC_APPSTARTING 32650
+!define IDC_HELP 32651
+
+/* in nsDialogs.nsh...
+!define IMAGE_BITMAP 0
+!define IMAGE_ICON 1
+!define IMAGE_CURSOR 2*/
+
+/* in nsDialogs.nsh...
+!define LR_DEFAULTCOLOR 0x0000
+!define LR_MONOCHROME 0x0001
+!define LR_COLOR 0x0002
+!define LR_COPYRETURNORG 0x0004
+!define LR_COPYDELETEORG 0x0008
+!define LR_LOADFROMFILE 0x0010
+!define LR_LOADTRANSPARENT 0x0020
+!define LR_DEFAULTSIZE 0x0040
+!define LR_VGACOLOR 0x0080
+!define LR_LOADMAP3DCOLORS 0x1000
+!define LR_CREATEDIBSECTION 0x2000
+!define LR_COPYFROMRESOURCE 0x4000
+!define LR_SHARED 0x8000*/
+
+!define GA_PARENT 1
+!define GA_ROOT 2
+!define GA_ROOTOWNER 3
+
+!endif /* __WIN_MS_NOUSER & __WIN_NOINC_WINUSER */
+!verbose pop
+!endif /* __WIN_WINUSER__INC */
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Include/WinCore.nsh b/Engine/bin/tools/nsis/app/Include/WinCore.nsh
new file mode 100644
index 000000000..0aa5ab044
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/WinCore.nsh
@@ -0,0 +1,214 @@
+/*
+
+WinCore.nsh & Win\*.nsh - Collection of common windows defines
+
+!define __WIN_NOINC_xxx to exclude a windows header file
+!define __WIN_MS_xxx to exclude specific things (The original #ifdef xxx checks can be found in the official Microsoft headers)
+
+*/
+
+!ifndef __WIN_WINDOWS__INC
+!define __WIN_WINDOWS__INC
+!verbose push
+!verbose 3
+
+
+!define __WIN_PTRSIZE 4 ;will we ever see a 64 bit version?
+
+
+!include Win\WinDef.nsh
+!include Win\WinError.nsh
+!include Win\WinNT.nsh
+!include Win\WinUser.nsh
+
+!ifndef __WIN_MS_NOWINMESSAGES
+!include WinMessages.nsh
+!endif
+
+
+
+
+
+/**************************************************
+WinBase.h
+**************************************************/
+!ifndef __WIN_NOINC_WINBASE
+!define INVALID_HANDLE_VALUE -1
+!define INVALID_FILE_SIZE 0xFFFFFFFF
+!define INVALID_SET_FILE_POINTER -1
+!define INVALID_FILE_ATTRIBUTES -1
+
+!define WAIT_FAILED 0xFFFFFFFF
+!define WAIT_OBJECT_0 0 ;((STATUS_WAIT_0 ) + 0 )
+
+!define WAIT_ABANDONED 0x80 ;((STATUS_ABANDONED_WAIT_0 ) + 0 )
+!define WAIT_ABANDONED_0 0x80 ;((STATUS_ABANDONED_WAIT_0 ) + 0 )
+
+!define DRIVE_UNKNOWN 0
+!define DRIVE_NO_ROOT_DIR 1
+!define DRIVE_REMOVABLE 2
+!define DRIVE_FIXED 3
+!define DRIVE_REMOTE 4
+!define DRIVE_CDROM 5
+!define DRIVE_RAMDISK 6
+
+!define FILE_TYPE_UNKNOWN 0x0000
+!define FILE_TYPE_DISK 0x0001
+!define FILE_TYPE_CHAR 0x0002
+!define FILE_TYPE_PIPE 0x0003
+!define FILE_TYPE_REMOTE 0x8000
+
+!define STD_INPUT_HANDLE -10
+!define STD_OUTPUT_HANDLE -11
+!define STD_ERROR_HANDLE -12
+
+#define IGNORE 0 ; Ignore signal
+!define INFINITE 0xFFFFFFFF ; Infinite timeout
+
+!endif /* __WIN_NOINC_WINBASE */
+
+
+
+
+
+/**************************************************
+WinGDI.h
+**************************************************/
+!ifndef __WIN_MS_NOGDI & __WIN_NOINC_WINGDI
+!define HORZRES 8
+!define VERTRES 10
+!define BITSPIXEL 12
+!define LOGPIXELSX 88
+!define LOGPIXELSY 90
+!define COLORRES 108
+!define VREFRESH 116
+!define DESKTOPVERTRES 117
+!define DESKTOPHORZRES 118
+!endif /* __WIN_MS_NOGDI & __WIN_NOINC_WINGDI */
+
+
+
+
+
+/**************************************************
+WinReg.h
+**************************************************/
+!ifndef __WIN_NOINC_WINREG
+!ifndef __WIN_NOHKEY & HKEY_CLASSES_ROOT & HKEY_CURRENT_USER & HKEY_LOCAL_MACHINE & HKEY_USERS
+!define HKEY_CLASSES_ROOT 0x80000000
+!define HKEY_CURRENT_USER 0x80000001
+!define HKEY_LOCAL_MACHINE 0x80000002
+!define HKEY_USERS 0x80000003
+!define HKEY_PERFORMANCE_DATA 0x80000004
+!define HKEY_PERFORMANCE_TEXT 0x80000050
+!define HKEY_PERFORMANCE_NLSTEXT 0x80000060
+!define HKEY_CURRENT_CONFIG 0x80000005
+!define HKEY_DYN_DATA 0x80000006
+!ifndef __WIN_NOSHORTHKEY & HKCR & HKCU & HKLM
+!define HKCR ${HKEY_CLASSES_ROOT}
+!define HKCU ${HKEY_CURRENT_USER}
+!define HKLM ${HKEY_LOCAL_MACHINE}
+!endif
+!endif
+!endif /* __WIN_NOINC_WINREG */
+
+
+
+
+
+/**************************************************
+WindowsX.h
+**************************************************/
+!ifndef __WIN_NOINC_WINDOWSX
+!ifndef GET_X_LPARAM & GET_Y_LPARAM
+!macro _Win_GET_X_LPARAM _outvar _in
+IntOp ${_outvar} "${_in}" << 16 ;We can't just use LOWORD, we need to keep the sign,
+IntOp ${_outvar} ${_outvar} >> 16 ;so we let NSIS sign extend for us
+!macroend
+!define GET_X_LPARAM "!insertmacro _Win_GET_X_LPARAM "
+!macro _Win_GET_Y_LPARAM _outvar _in
+IntOp ${_outvar} "${_in}" >> 16
+!macroend
+!define GET_Y_LPARAM "!insertmacro _Win_GET_Y_LPARAM "
+!endif
+!endif /* __WIN_NOINC_WINDOWSX */
+
+
+
+
+
+/**************************************************
+ShlObj.h
+**************************************************/
+!ifndef __WIN_NOINC_SHLOBJ
+!ifndef __WIN_NOSHELLFOLDERCSIDL
+!define CSIDL_DESKTOP 0x0000
+!define CSIDL_INTERNET 0x0001 ;Internet Explorer (icon on desktop)
+!define CSIDL_PROGRAMS 0x0002 ;Start Menu\Programs
+!define CSIDL_CONTROLS 0x0003 ;My Computer\Control Panel
+!define CSIDL_PRINTERS 0x0004 ;My Computer\Printers
+!define CSIDL_PERSONAL 0x0005 ;My Documents
+!define CSIDL_FAVORITES 0x0006 ;\Favorites
+!define CSIDL_STARTUP 0x0007 ;Start Menu\Programs\Startup
+!define CSIDL_RECENT 0x0008 ;\Recent
+!define CSIDL_SENDTO 0x0009 ;\SendTo
+!define CSIDL_BITBUCKET 0x000a ;\Recycle Bin
+!define CSIDL_STARTMENU 0x000b ;\Start Menu
+!define CSIDL_MYDOCUMENTS 0x000c ;logical "My Documents" desktop icon
+!define CSIDL_MYMUSIC 0x000d ;"My Music" folder
+!define CSIDL_MYVIDEO 0x000e ;"My Videos" folder
+!define CSIDL_DESKTOPDIRECTORY 0x0010 ;\Desktop
+!define CSIDL_DRIVES 0x0011 ;My Computer
+!define CSIDL_NETWORK 0x0012 ;Network Neighborhood
+!define CSIDL_NETHOOD 0x0013 ;\nethood
+!define CSIDL_FONTS 0x0014 ;windows\fonts
+!define CSIDL_TEMPLATES 0x0015
+!define CSIDL_COMMON_STARTMENU 0x0016 ;All Users\Start Menu
+!define CSIDL_COMMON_PROGRAMS 0x0017 ;All Users\Start Menu\Programs
+!define CSIDL_COMMON_STARTUP 0x0018 ;All Users\Startup
+!define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019 ;All Users\Desktop
+!define CSIDL_APPDATA 0x001a ;\Application Data
+!define CSIDL_PRINTHOOD 0x001b ;\PrintHood
+!define CSIDL_LOCAL_APPDATA 0x001c ;\Local Settings\Applicaiton Data (non roaming)
+!define CSIDL_ALTSTARTUP 0x001d ;non localized startup
+!define CSIDL_COMMON_ALTSTARTUP 0x001e ;non localized common startup
+!define CSIDL_COMMON_FAVORITES 0x001f
+!define CSIDL_INTERNET_CACHE 0x0020
+!define CSIDL_COOKIES 0x0021
+!define CSIDL_HISTORY 0x0022
+!define CSIDL_COMMON_APPDATA 0x0023 ;All Users\Application Data
+!define CSIDL_WINDOWS 0x0024 ;GetWindowsDirectory
+!define CSIDL_SYSTEM 0x0025 ;GetSystemDirectory
+!define CSIDL_PROGRAM_FILES 0x0026 ;C:\Program Files
+!define CSIDL_MYPICTURES 0x0027
+!define CSIDL_PROFILE 0x0028 ;USERPROFILE
+!define CSIDL_SYSTEMX86 0x0029 ;x86 system directory on RISC
+!define CSIDL_PROGRAM_FILESX86 0x002a ;x86 C:\Program Files on RISC
+!define CSIDL_PROGRAM_FILES_COMMON 0x002b ;C:\Program Files\Common
+!define CSIDL_PROGRAM_FILES_COMMONX86 0x002c ;x86 Program Files\Common on RISC
+!define CSIDL_COMMON_TEMPLATES 0x002d ;All Users\Templates
+!define CSIDL_COMMON_DOCUMENTS 0x002e ;All Users\Documents
+!define CSIDL_COMMON_ADMINTOOLS 0x002f ;All Users\Start Menu\Programs\Administrative Tools
+!define CSIDL_ADMINTOOLS 0x0030 ;\Start Menu\Programs\Administrative Tools
+!define CSIDL_CONNECTIONS 0x0031 ;Network and Dial-up Connections
+!define CSIDL_COMMON_MUSIC 0x0035 ;All Users\My Music
+!define CSIDL_COMMON_PICTURES 0x0036 ;All Users\My Pictures
+!define CSIDL_COMMON_VIDEO 0x0037 ;All Users\My Video
+!define CSIDL_RESOURCES 0x0038 ;Resource Direcotry
+!define CSIDL_RESOURCES_LOCALIZED 0x0039 ;Localized Resource Direcotry
+!define CSIDL_COMMON_OEM_LINKS 0x003a ;Links to All Users OEM specific apps
+!define CSIDL_CDBURN_AREA 0x003b ;USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning
+!define CSIDL_COMPUTERSNEARME 0x003d ;Computers Near Me (computered from Workgroup membership)
+!define CSIDL_FLAG_CREATE 0x8000 ;combine with CSIDL_ value to force folder creation in SHGetFolderPath()
+!define CSIDL_FLAG_DONT_VERIFY 0x4000 ;combine with CSIDL_ value to return an unverified folder path
+!define CSIDL_FLAG_NO_ALIAS 0x1000 ;combine with CSIDL_ value to insure non-alias versions of the pidl
+!define CSIDL_FLAG_PER_USER_INIT 0x0800 ;combine with CSIDL_ value to indicate per-user init (eg. upgrade)
+!define CSIDL_FLAG_MASK 0xFF00
+!endif /* __WIN_NOSHELLFOLDERCSIDL */
+!endif /* __WIN_NOINC_SHLOBJ */
+
+
+
+
+!verbose pop
+!endif /* __WIN_WINDOWS__INC */
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Include/WinMessages.nsh b/Engine/bin/tools/nsis/app/Include/WinMessages.nsh
new file mode 100644
index 000000000..e40c269ae
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/WinMessages.nsh
@@ -0,0 +1,592 @@
+/*
+_____________________________________________________________________________
+
+ List of common Windows Messages
+_____________________________________________________________________________
+
+ 2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
+
+
+Usage example:
+---------------------------------------------------
+Name "Output"
+OutFile "Output.exe"
+
+!include "WinMessages.nsh"
+
+Section
+ FindWindow $0 '#32770' '' $HWNDPARENT
+ GetDlgItem $1 $0 1027
+ SendMessage $1 ${WM_SETTEXT} 0 'STR:MyText'
+SectionEnd
+---------------------------------------------------
+
+
+Prefix Message category
+-------------------------
+SW ShowWindow Commands
+BM Button control
+CB Combo box control
+EM Edit control
+LB List box control
+WM General window
+ABM Application desktop toolbar
+DBT Device
+DM Default push button control
+HDM Header control
+LVM List view control
+SB Status bar window
+SBM Scroll bar control
+STM Static control
+TCM Tab control
+PBM Progress bar
+-----------------------------------
+
+NOT included messages (WM_USER + X)
+-----------------------------------
+CBEM Extended combo box control
+CDM Common dialog box
+DL Drag list box
+DTM Date and time picker control
+HKM Hot key control
+IPM IP address control
+MCM Month calendar control
+PGM Pager control
+PSM Property sheet
+RB Rebar control
+TB Toolbar
+TBM Trackbar
+TTM Tooltip control
+TVM Tree-view control
+UDM Up-down control
+-----------------------------------
+*/
+
+
+!ifndef WINMESSAGES_INCLUDED
+!define WINMESSAGES_INCLUDED
+!verbose push
+!verbose 3
+
+!define HWND_BROADCAST 0xFFFF
+
+#ShowWindow Commands#
+!define SW_HIDE 0
+!define SW_SHOWNORMAL 1
+!define SW_NORMAL 1
+!define SW_SHOWMINIMIZED 2
+!define SW_SHOWMAXIMIZED 3
+!define SW_MAXIMIZE 3
+!define SW_SHOWNOACTIVATE 4
+!define SW_SHOW 5
+!define SW_MINIMIZE 6
+!define SW_SHOWMINNOACTIVE 7
+!define SW_SHOWNA 8
+!define SW_RESTORE 9
+!define SW_SHOWDEFAULT 10
+!define SW_FORCEMINIMIZE 11
+!define SW_MAX 11
+
+#Button Control Messages#
+!define BM_CLICK 0x00F5
+!define BM_GETCHECK 0x00F0
+!define BM_GETIMAGE 0x00F6
+!define BM_GETSTATE 0x00F2
+!define BM_SETCHECK 0x00F1
+!define BM_SETIMAGE 0x00F7
+!define BM_SETSTATE 0x00F3
+!define BM_SETSTYLE 0x00F4
+
+!define BST_UNCHECKED 0
+!define BST_CHECKED 1
+!define BST_INDETERMINATE 2
+!define BST_PUSHED 4
+!define BST_FOCUS 8
+
+#Combo Box Messages#
+!define CB_ADDSTRING 0x0143
+!define CB_DELETESTRING 0x0144
+!define CB_DIR 0x0145
+!define CB_FINDSTRING 0x014C
+!define CB_FINDSTRINGEXACT 0x0158
+!define CB_GETCOUNT 0x0146
+!define CB_GETCURSEL 0x0147
+!define CB_GETDROPPEDCONTROLRECT 0x0152
+!define CB_GETDROPPEDSTATE 0x0157
+!define CB_GETDROPPEDWIDTH 0x015f
+!define CB_GETEDITSEL 0x0140
+!define CB_GETEXTENDEDUI 0x0156
+!define CB_GETHORIZONTALEXTENT 0x015d
+!define CB_GETITEMDATA 0x0150
+!define CB_GETITEMHEIGHT 0x0154
+!define CB_GETLBTEXT 0x0148
+!define CB_GETLBTEXTLEN 0x0149
+!define CB_GETLOCALE 0x015A
+!define CB_GETTOPINDEX 0x015b
+!define CB_INITSTORAGE 0x0161
+!define CB_INSERTSTRING 0x014A
+!define CB_LIMITTEXT 0x0141
+!define CB_MSGMAX 0x015B # 0x0162 0x0163
+!define CB_MULTIPLEADDSTRING 0x0163
+!define CB_RESETCONTENT 0x014B
+!define CB_SELECTSTRING 0x014D
+!define CB_SETCURSEL 0x014E
+!define CB_SETDROPPEDWIDTH 0x0160
+!define CB_SETEDITSEL 0x0142
+!define CB_SETEXTENDEDUI 0x0155
+!define CB_SETHORIZONTALEXTENT 0x015e
+!define CB_SETITEMDATA 0x0151
+!define CB_SETITEMHEIGHT 0x0153
+!define CB_SETLOCALE 0x0159
+!define CB_SETTOPINDEX 0x015c
+!define CB_SHOWDROPDOWN 0x014F
+
+!define CB_ERR -1
+
+#Edit Control Messages#
+!define EM_CANUNDO 0x00C6
+!define EM_CHARFROMPOS 0x00D7
+!define EM_EMPTYUNDOBUFFER 0x00CD
+!define EM_EXLIMITTEXT 0x0435
+!define EM_FMTLINES 0x00C8
+!define EM_GETFIRSTVISIBLELINE 0x00CE
+!define EM_GETHANDLE 0x00BD
+!define EM_GETIMESTATUS 0x00D9
+!define EM_GETLIMITTEXT 0x00D5
+!define EM_GETLINE 0x00C4
+!define EM_GETLINECOUNT 0x00BA
+!define EM_GETMARGINS 0x00D4
+!define EM_GETMODIFY 0x00B8
+!define EM_GETPASSWORDCHAR 0x00D2
+!define EM_GETRECT 0x00B2
+!define EM_GETSEL 0x00B0
+!define EM_GETTHUMB 0x00BE
+!define EM_GETWORDBREAKPROC 0x00D1
+!define EM_LIMITTEXT 0x00C5
+!define EM_LINEFROMCHAR 0x00C9
+!define EM_LINEINDEX 0x00BB
+!define EM_LINELENGTH 0x00C1
+!define EM_LINESCROLL 0x00B6
+!define EM_POSFROMCHAR 0x00D6
+!define EM_REPLACESEL 0x00C2
+!define EM_SCROLL 0x00B5
+!define EM_SCROLLCARET 0x00B7
+!define EM_SETHANDLE 0x00BC
+!define EM_SETIMESTATUS 0x00D8
+!define EM_SETLIMITTEXT 0x00C5 # Same as EM_LIMITTEXT
+!define EM_SETMARGINS 0x00D3
+!define EM_SETMODIFY 0x00B9
+!define EM_SETPASSWORDCHAR 0x00CC
+!define EM_SETREADONLY 0x00CF
+!define EM_SETRECT 0x00B3
+!define EM_SETRECTNP 0x00B4
+!define EM_SETSEL 0x00B1
+!define EM_SETTABSTOPS 0x00CB
+!define EM_SETWORDBREAKPROC 0x00D0
+!define EM_UNDO 0x00C7
+
+#Listbox Messages#
+!define LB_ADDFILE 0x0196
+!define LB_ADDSTRING 0x0180
+!define LB_DELETESTRING 0x0182
+!define LB_DIR 0x018D
+!define LB_FINDSTRING 0x018F
+!define LB_FINDSTRINGEXACT 0x01A2
+!define LB_GETANCHORINDEX 0x019D
+!define LB_GETCARETINDEX 0x019F
+!define LB_GETCOUNT 0x018B
+!define LB_GETCURSEL 0x0188
+!define LB_GETHORIZONTALEXTENT 0x0193
+!define LB_GETITEMDATA 0x0199
+!define LB_GETITEMHEIGHT 0x01A1
+!define LB_GETITEMRECT 0x0198
+!define LB_GETLOCALE 0x01A6
+!define LB_GETSEL 0x0187
+!define LB_GETSELCOUNT 0x0190
+!define LB_GETSELITEMS 0x0191
+!define LB_GETTEXT 0x0189
+!define LB_GETTEXTLEN 0x018A
+!define LB_GETTOPINDEX 0x018E
+!define LB_INITSTORAGE 0x01A8
+!define LB_INSERTSTRING 0x0181
+!define LB_ITEMFROMPOINT 0x01A9
+!define LB_MSGMAX 0x01A8 # 0x01B0 0x01B1
+!define LB_MULTIPLEADDSTRING 0x01B1
+!define LB_RESETCONTENT 0x0184
+!define LB_SELECTSTRING 0x018C
+!define LB_SELITEMRANGE 0x019B
+!define LB_SELITEMRANGEEX 0x0183
+!define LB_SETANCHORINDEX 0x019C
+!define LB_SETCARETINDEX 0x019E
+!define LB_SETCOLUMNWIDTH 0x0195
+!define LB_SETCOUNT 0x01A7
+!define LB_SETCURSEL 0x0186
+!define LB_SETHORIZONTALEXTENT 0x0194
+!define LB_SETITEMDATA 0x019A
+!define LB_SETITEMHEIGHT 0x01A0
+!define LB_SETLOCALE 0x01A5
+!define LB_SETSEL 0x0185
+!define LB_SETTABSTOPS 0x0192
+!define LB_SETTOPINDEX 0x0197
+
+!define LB_ERR -1
+
+#Window Messages#
+!define WM_ACTIVATE 0x0006
+!define WM_ACTIVATEAPP 0x001C
+!define WM_AFXFIRST 0x0360
+!define WM_AFXLAST 0x037F
+!define WM_APP 0x8000
+!define WM_APPCOMMAND 0x0319
+!define WM_ASKCBFORMATNAME 0x030C
+!define WM_CANCELJOURNAL 0x004B
+!define WM_CANCELMODE 0x001F
+!define WM_CAPTURECHANGED 0x0215
+!define WM_CHANGECBCHAIN 0x030D
+!define WM_CHANGEUISTATE 0x0127
+!define WM_CHAR 0x0102
+!define WM_CHARTOITEM 0x002F
+!define WM_CHILDACTIVATE 0x0022
+!define WM_CLEAR 0x0303
+!define WM_CLOSE 0x0010
+!define WM_COMMAND 0x0111
+!define WM_COMMNOTIFY 0x0044 # no longer suported
+!define WM_COMPACTING 0x0041
+!define WM_COMPAREITEM 0x0039
+!define WM_CONTEXTMENU 0x007B
+!define WM_CONVERTREQUESTEX 0x108
+!define WM_COPY 0x0301
+!define WM_COPYDATA 0x004A
+!define WM_CREATE 0x0001
+!define WM_CTLCOLOR 0x0019
+!define WM_CTLCOLORBTN 0x0135
+!define WM_CTLCOLORDLG 0x0136
+!define WM_CTLCOLOREDIT 0x0133
+!define WM_CTLCOLORLISTBOX 0x0134
+!define WM_CTLCOLORMSGBOX 0x0132
+!define WM_CTLCOLORSCROLLBAR 0x0137
+!define WM_CTLCOLORSTATIC 0x0138
+!define WM_CUT 0x0300
+!define WM_DDE_FIRST 0x3E0
+!define WM_DEADCHAR 0x0103
+!define WM_DELETEITEM 0x002D
+!define WM_DESTROY 0x0002
+!define WM_DESTROYCLIPBOARD 0x0307
+!define WM_DEVICECHANGE 0x0219
+!define WM_DEVMODECHANGE 0x001B
+!define WM_DISPLAYCHANGE 0x007E
+!define WM_DRAWCLIPBOARD 0x0308
+!define WM_DRAWITEM 0x002B
+!define WM_DROPFILES 0x0233
+!define WM_ENABLE 0x000A
+!define WM_ENDSESSION 0x0016
+!define WM_ENTERIDLE 0x0121
+!define WM_ENTERMENULOOP 0x0211
+!define WM_ENTERSIZEMOVE 0x0231
+!define WM_ERASEBKGND 0x0014
+!define WM_EXITMENULOOP 0x0212
+!define WM_EXITSIZEMOVE 0x0232
+!define WM_FONTCHANGE 0x001D
+!define WM_GETDLGCODE 0x0087
+!define WM_GETFONT 0x0031
+!define WM_GETHOTKEY 0x0033
+!define WM_GETICON 0x007F
+!define WM_GETMINMAXINFO 0x0024
+!define WM_GETOBJECT 0x003D
+!define WM_GETTEXT 0x000D
+!define WM_GETTEXTLENGTH 0x000E
+!define WM_HANDHELDFIRST 0x0358
+!define WM_HANDHELDLAST 0x035F
+!define WM_HELP 0x0053
+!define WM_HOTKEY 0x0312
+!define WM_HSCROLL 0x0114
+!define WM_HSCROLLCLIPBOARD 0x030E
+!define WM_ICONERASEBKGND 0x0027
+!define WM_IME_CHAR 0x0286
+!define WM_IME_COMPOSITION 0x010F
+!define WM_IME_COMPOSITIONFULL 0x0284
+!define WM_IME_CONTROL 0x0283
+!define WM_IME_ENDCOMPOSITION 0x010E
+!define WM_IME_KEYDOWN 0x0290
+!define WM_IME_KEYLAST 0x010F
+!define WM_IME_KEYUP 0x0291
+!define WM_IME_NOTIFY 0x0282
+!define WM_IME_REQUEST 0x0288
+!define WM_IME_SELECT 0x0285
+!define WM_IME_SETCONTEXT 0x0281
+!define WM_IME_STARTCOMPOSITION 0x010D
+!define WM_INITDIALOG 0x0110
+!define WM_INITMENU 0x0116
+!define WM_INITMENUPOPUP 0x0117
+!define WM_INPUT 0x00FF
+!define WM_INPUTLANGCHANGE 0x0051
+!define WM_INPUTLANGCHANGEREQUEST 0x0050
+!define WM_KEYDOWN 0x0100
+!define WM_KEYFIRST 0x0100
+!define WM_KEYLAST 0x0108
+!define WM_KEYUP 0x0101
+!define WM_KILLFOCUS 0x0008
+!define WM_LBUTTONDBLCLK 0x0203
+!define WM_LBUTTONDOWN 0x0201
+!define WM_LBUTTONUP 0x0202
+!define WM_MBUTTONDBLCLK 0x0209
+!define WM_MBUTTONDOWN 0x0207
+!define WM_MBUTTONUP 0x0208
+!define WM_MDIACTIVATE 0x0222
+!define WM_MDICASCADE 0x0227
+!define WM_MDICREATE 0x0220
+!define WM_MDIDESTROY 0x0221
+!define WM_MDIGETACTIVE 0x0229
+!define WM_MDIICONARRANGE 0x0228
+!define WM_MDIMAXIMIZE 0x0225
+!define WM_MDINEXT 0x0224
+!define WM_MDIREFRESHMENU 0x0234
+!define WM_MDIRESTORE 0x0223
+!define WM_MDISETMENU 0x0230
+!define WM_MDITILE 0x0226
+!define WM_MEASUREITEM 0x002C
+!define WM_MENUCHAR 0x0120
+!define WM_MENUCOMMAND 0x0126
+!define WM_MENUDRAG 0x0123
+!define WM_MENUGETOBJECT 0x0124
+!define WM_MENURBUTTONUP 0x0122
+!define WM_MENUSELECT 0x011F
+!define WM_MOUSEACTIVATE 0x0021
+!define WM_MOUSEFIRST 0x0200
+!define WM_MOUSEHOVER 0x02A1
+!define WM_MOUSELAST 0x0209 # 0x020A 0x020D
+!define WM_MOUSELEAVE 0x02A3
+!define WM_MOUSEMOVE 0x0200
+!define WM_MOUSEWHEEL 0x020A
+!define WM_MOVE 0x0003
+!define WM_MOVING 0x0216
+!define WM_NCACTIVATE 0x0086
+!define WM_NCCALCSIZE 0x0083
+!define WM_NCCREATE 0x0081
+!define WM_NCDESTROY 0x0082
+!define WM_NCHITTEST 0x0084
+!define WM_NCLBUTTONDBLCLK 0x00A3
+!define WM_NCLBUTTONDOWN 0x00A1
+!define WM_NCLBUTTONUP 0x00A2
+!define WM_NCMBUTTONDBLCLK 0x00A9
+!define WM_NCMBUTTONDOWN 0x00A7
+!define WM_NCMBUTTONUP 0x00A8
+!define WM_NCMOUSEHOVER 0x02A0
+!define WM_NCMOUSELEAVE 0x02A2
+!define WM_NCMOUSEMOVE 0x00A0
+!define WM_NCPAINT 0x0085
+!define WM_NCRBUTTONDBLCLK 0x00A6
+!define WM_NCRBUTTONDOWN 0x00A4
+!define WM_NCRBUTTONUP 0x00A5
+!define WM_NCXBUTTONDBLCLK 0x00AD
+!define WM_NCXBUTTONDOWN 0x00AB
+!define WM_NCXBUTTONUP 0x00AC
+!define WM_NEXTDLGCTL 0x0028
+!define WM_NEXTMENU 0x0213
+!define WM_NOTIFY 0x004E
+!define WM_NOTIFYFORMAT 0x0055
+!define WM_NULL 0x0000
+!define WM_PAINT 0x000F
+!define WM_PAINTCLIPBOARD 0x0309
+!define WM_PAINTICON 0x0026
+!define WM_PALETTECHANGED 0x0311
+!define WM_PALETTEISCHANGING 0x0310
+!define WM_PARENTNOTIFY 0x0210
+!define WM_PASTE 0x0302
+!define WM_PENWINFIRST 0x0380
+!define WM_PENWINLAST 0x038F
+!define WM_POWER 0x0048
+!define WM_POWERBROADCAST 0x0218
+!define WM_PRINT 0x0317
+!define WM_PRINTCLIENT 0x0318
+!define WM_QUERYDRAGICON 0x0037
+!define WM_QUERYENDSESSION 0x0011
+!define WM_QUERYNEWPALETTE 0x030F
+!define WM_QUERYOPEN 0x0013
+!define WM_QUERYUISTATE 0x0129
+!define WM_QUEUESYNC 0x0023
+!define WM_QUIT 0x0012
+!define WM_RBUTTONDBLCLK 0x0206
+!define WM_RBUTTONDOWN 0x0204
+!define WM_RBUTTONUP 0x0205
+!define WM_RASDIALEVENT 0xCCCD
+!define WM_RENDERALLFORMATS 0x0306
+!define WM_RENDERFORMAT 0x0305
+!define WM_SETCURSOR 0x0020
+!define WM_SETFOCUS 0x0007
+!define WM_SETFONT 0x0030
+!define WM_SETHOTKEY 0x0032
+!define WM_SETICON 0x0080
+!define WM_SETREDRAW 0x000B
+!define WM_SETTEXT 0x000C
+!define WM_SETTINGCHANGE 0x001A # Same as WM_WININICHANGE
+!define WM_SHOWWINDOW 0x0018
+!define WM_SIZE 0x0005
+!define WM_SIZECLIPBOARD 0x030B
+!define WM_SIZING 0x0214
+!define WM_SPOOLERSTATUS 0x002A
+!define WM_STYLECHANGED 0x007D
+!define WM_STYLECHANGING 0x007C
+!define WM_SYNCPAINT 0x0088
+!define WM_SYSCHAR 0x0106
+!define WM_SYSCOLORCHANGE 0x0015
+!define WM_SYSCOMMAND 0x0112
+!define WM_SYSDEADCHAR 0x0107
+!define WM_SYSKEYDOWN 0x0104
+!define WM_SYSKEYUP 0x0105
+!define WM_TABLET_FIRST 0x02C0
+!define WM_TABLET_LAST 0x02DF
+!define WM_THEMECHANGED 0x031A
+!define WM_TCARD 0x0052
+!define WM_TIMECHANGE 0x001E
+!define WM_TIMER 0x0113
+!define WM_UNDO 0x0304
+!define WM_UNICHAR 0x0109
+!define WM_UNINITMENUPOPUP 0x0125
+!define WM_UPDATEUISTATE 0x0128
+!define WM_USER 0x400
+!define WM_USERCHANGED 0x0054
+!define WM_VKEYTOITEM 0x002E
+!define WM_VSCROLL 0x0115
+!define WM_VSCROLLCLIPBOARD 0x030A
+!define WM_WINDOWPOSCHANGED 0x0047
+!define WM_WINDOWPOSCHANGING 0x0046
+!define WM_WININICHANGE 0x001A
+!define WM_WTSSESSION_CHANGE 0x02B1
+!define WM_XBUTTONDBLCLK 0x020D
+!define WM_XBUTTONDOWN 0x020B
+!define WM_XBUTTONUP 0x020C
+
+
+#Application desktop toolbar#
+!define ABM_ACTIVATE 0x00000006 # lParam == TRUE/FALSE means activate/deactivate
+!define ABM_GETAUTOHIDEBAR 0x00000007
+!define ABM_GETSTATE 0x00000004
+!define ABM_GETTASKBARPOS 0x00000005
+!define ABM_NEW 0x00000000
+!define ABM_QUERYPOS 0x00000002
+!define ABM_REMOVE 0x00000001
+!define ABM_SETAUTOHIDEBAR 0x00000008 # This can fail, you MUST check the result
+!define ABM_SETPOS 0x00000003
+!define ABM_WINDOWPOSCHANGED 0x0000009
+
+#Device#
+!define DBT_APPYBEGIN 0x0000
+!define DBT_APPYEND 0x0001
+!define DBT_CONFIGCHANGECANCELED 0x0019
+!define DBT_CONFIGCHANGED 0x0018
+!define DBT_CONFIGMGAPI32 0x0022
+!define DBT_CONFIGMGPRIVATE 0x7FFF
+!define DBT_CUSTOMEVENT 0x8006 # User-defined event
+!define DBT_DEVICEARRIVAL 0x8000 # System detected a new device
+!define DBT_DEVICEQUERYREMOVE 0x8001 # Wants to remove, may fail
+!define DBT_DEVICEQUERYREMOVEFAILED 0x8002 # Removal aborted
+!define DBT_DEVICEREMOVECOMPLETE 0x8004 # Device is gone
+!define DBT_DEVICEREMOVEPENDING 0x8003 # About to remove, still avail.
+!define DBT_DEVICETYPESPECIFIC 0x8005 # Type specific event
+!define DBT_DEVNODES_CHANGED 0x0007
+!define DBT_DEVTYP_DEVICEINTERFACE 0x00000005 # Device interface class
+!define DBT_DEVTYP_DEVNODE 0x00000001 # Devnode number
+!define DBT_DEVTYP_HANDLE 0x00000006 # File system handle
+!define DBT_DEVTYP_NET 0x00000004 # Network resource
+!define DBT_DEVTYP_OEM 0x00000000 # Oem-defined device type
+!define DBT_DEVTYP_PORT 0x00000003 # Serial, parallel
+!define DBT_DEVTYP_VOLUME 0x00000002 # Logical volume
+!define DBT_LOW_DISK_SPACE 0x0048
+!define DBT_MONITORCHANGE 0x001B
+!define DBT_NO_DISK_SPACE 0x0047
+!define DBT_QUERYCHANGECONFIG 0x0017
+!define DBT_SHELLLOGGEDON 0x0020
+!define DBT_USERDEFINED 0xFFFF
+!define DBT_VOLLOCKLOCKFAILED 0x8043
+!define DBT_VOLLOCKLOCKRELEASED 0x8045
+!define DBT_VOLLOCKLOCKTAKEN 0x8042
+!define DBT_VOLLOCKQUERYLOCK 0x8041
+!define DBT_VOLLOCKQUERYUNLOCK 0x8044
+!define DBT_VOLLOCKUNLOCKFAILED 0x8046
+!define DBT_VPOWERDAPI 0x8100 # VPOWERD API for Win95
+!define DBT_VXDINITCOMPLETE 0x0023
+
+#Default push button control#
+!define DM_BITSPERPEL 0x00040000
+!define DM_COLLATE 0x00008000
+!define DM_COLOR 0x00000800
+!define DM_COPIES 0x00000100
+!define DM_DEFAULTSOURCE 0x00000200
+!define DM_DISPLAYFLAGS 0x00200000
+!define DM_DISPLAYFREQUENCY 0x00400000
+!define DM_DITHERTYPE 0x04000000
+!define DM_DUPLEX 0x00001000
+!define DM_FORMNAME 0x00010000
+!define DM_GRAYSCALE 0x00000001 # This flag is no longer valid
+!define DM_ICMINTENT 0x01000000
+!define DM_ICMMETHOD 0x00800000
+!define DM_INTERLACED 0x00000002 # This flag is no longer valid
+!define DM_LOGPIXELS 0x00020000
+!define DM_MEDIATYPE 0x02000000
+!define DM_NUP 0x00000040
+!define DM_ORIENTATION 0x00000001
+!define DM_PANNINGHEIGHT 0x10000000
+!define DM_PANNINGWIDTH 0x08000000
+!define DM_PAPERLENGTH 0x00000004
+!define DM_PAPERSIZE 0x00000002
+!define DM_PAPERWIDTH 0x00000008
+!define DM_PELSHEIGHT 0x00100000
+!define DM_PELSWIDTH 0x00080000
+!define DM_POSITION 0x00000020
+!define DM_PRINTQUALITY 0x00000400
+!define DM_SCALE 0x00000010
+!define DM_SPECVERSION 0x0320 # 0x0400 0x0401
+!define DM_TTOPTION 0x00004000
+!define DM_YRESOLUTION 0x00002000
+
+#Header control#
+!define HDM_FIRST 0x1200
+
+#List view control#
+!define LVM_FIRST 0x1000
+
+#Status bar window#
+!define SB_CONST_ALPHA 0x00000001
+!define SB_GRAD_RECT 0x00000010
+!define SB_GRAD_TRI 0x00000020
+!define SB_NONE 0x00000000
+!define SB_PIXEL_ALPHA 0x00000002
+!define SB_PREMULT_ALPHA 0x00000004
+!define SB_SIMPLEID 0x00ff
+
+#Scroll bar control#
+!define SBM_ENABLE_ARROWS 0x00E4 # Not in win3.1
+!define SBM_GETPOS 0x00E1 # Not in win3.1
+!define SBM_GETRANGE 0x00E3 # Not in win3.1
+!define SBM_GETSCROLLINFO 0x00EA
+!define SBM_SETPOS 0x00E0 # Not in win3.1
+!define SBM_SETRANGE 0x00E2 # Not in win3.1
+!define SBM_SETRANGEREDRAW 0x00E6 # Not in win3.1
+!define SBM_SETSCROLLINFO 0x00E9
+
+#Static control#
+!define STM_GETICON 0x0171
+!define STM_GETIMAGE 0x0173
+!define STM_MSGMAX 0x0174
+!define STM_ONLY_THIS_INTERFACE 0x00000001
+!define STM_ONLY_THIS_NAME 0x00000008
+!define STM_ONLY_THIS_PROTOCOL 0x00000002
+!define STM_ONLY_THIS_TYPE 0x00000004
+!define STM_SETICON 0x0170
+!define STM_SETIMAGE 0x0172
+
+#Tab control#
+!define TCM_FIRST 0x1300
+
+#Progress bar control#
+!define PBM_SETRANGE 0x0401
+!define PBM_SETPOS 0x0402
+!define PBM_DELTAPOS 0x0403
+!define PBM_SETSTEP 0x0404
+!define PBM_STEPIT 0x0405
+!define PBM_GETPOS 0x0408
+!define PBM_SETMARQUEE 0x040a
+
+!verbose pop
+!endif
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/Include/WinVer.nsh b/Engine/bin/tools/nsis/app/Include/WinVer.nsh
new file mode 100644
index 000000000..806be952d
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/WinVer.nsh
@@ -0,0 +1,472 @@
+; ---------------------
+; WinVer.nsh
+; ---------------------
+;
+; LogicLib extensions for handling Windows versions and service packs.
+;
+; IsNT checks if the installer is running on Windows NT family (NT4, 2000, XP, etc.)
+;
+; ${If} ${IsNT}
+; DetailPrint "Running on NT. Installing Unicode enabled application."
+; ${Else}
+; DetailPrint "Not running on NT. Installing ANSI application."
+; ${EndIf}
+;
+; IsServer checks if the installer is running on a server version of Windows (NT4, 2003, 2008, etc.)
+;
+; AtLeastWin checks if the installer is running on Windows version at least as specified.
+; IsWin checks if the installer is running on Windows version exactly as specified.
+; AtMostWin checks if the installer is running on Windows version at most as specified.
+;
+; can be replaced with the following values:
+;
+; 95
+; 98
+; ME
+;
+; NT4
+; 2000
+; XP
+; 2003
+; Vista
+; 2008
+;
+; AtLeastServicePack checks if the installer is running on Windows service pack version at least as specified.
+; IsServicePack checks if the installer is running on Windows service pack version exactly as specified.
+; AtMostServicePack checks if the installer is running on Windows service version pack at most as specified.
+;
+; Usage examples:
+;
+; ${If} ${IsNT}
+; DetailPrint "Running on NT family."
+; DetailPrint "Surely not running on 95, 98 or ME."
+; ${AndIf} ${AtLeastWinNT4}
+; DetailPrint "Running on NT4 or better. Could even be 2003."
+; ${EndIf}
+;
+; ${If} ${AtLeastWinXP}
+; DetailPrint "Running on XP or better."
+; ${EndIf}
+;
+; ${If} ${IsWin2000}
+; DetailPrint "Running on 2000."
+; ${EndIf}
+;
+; ${If} ${IsWin2000}
+; ${AndIf} ${AtLeastServicePack} 3
+; ${OrIf} ${AtLeastWinXP}
+; DetailPrint "Running Win2000 SP3 or above"
+; ${EndIf}
+;
+; ${If} ${AtMostWinXP}
+; DetailPrint "Running on XP or older. Surely not running on Vista. Maybe 98, or even 95."
+; ${EndIf}
+;
+; Warning:
+;
+; Windows 95 and NT both use the same version number. To avoid getting NT4 misidentified
+; as Windows 95 and vice-versa or 98 as a version higher than NT4, always use IsNT to
+; check if running on the NT family.
+;
+; ${If} ${AtLeastWin95}
+; ${And} ${AtMostWinME}
+; DetailPrint "Running 95, 98 or ME."
+; DetailPrint "Actually, maybe it's NT4?"
+; ${If} ${IsNT}
+; DetailPrint "Yes, it's NT4! oops..."
+; ${Else}
+; DetailPrint "Nope, not NT4. phew..."
+; ${EndIf}
+; ${EndIf}
+;
+;
+; Other useful extensions are:
+;
+; * IsWin2003R2
+; * IsStarterEdition
+; * OSHasMediaCenter
+; * OSHasTabletSupport
+;
+
+!verbose push
+!verbose 3
+
+!ifndef ___WINVER__NSH___
+!define ___WINVER__NSH___
+
+!include LogicLib.nsh
+!include Util.nsh
+
+# masks for our variables
+
+!define _WINVER_VERXBIT 0x00000001
+!define _WINVER_MASKVMAJ 0x7F000000
+!define _WINVER_MASKVMIN 0x00FF0000
+
+!define _WINVER_NTBIT 0x80000000
+!define _WINVER_NTMASK 0x7FFFFFFF
+!define _WINVER_NTSRVBIT 0x40000000
+!define _WINVER_MASKVBLD 0x0000FFFF
+!define _WINVER_MASKSP 0x000F0000
+
+# possible variable values for different versions
+
+!define WINVER_95_NT 0x04000000 ;4.00.0950
+!define WINVER_95 0x04000000 ;4.00.0950
+!define WINVER_98_NT 0x040a0000 ;4.10.1998
+!define WINVER_98 0x040a0000 ;4.10.1998
+;define WINVER_98SE 0x040a0000 ;4.10.2222
+!define WINVER_ME_NT 0x045a0000 ;4.90.3000
+!define WINVER_ME 0x045a0000 ;4.90.3000
+;define WINVER_NT3d51 ;3.51.1057
+!define WINVER_NT4_NT 0x84000000 ;4.00.1381
+!define WINVER_NT4 0x04000000 ;4.00.1381
+!define WINVER_2000_NT 0x85000000 ;5.00.2195
+!define WINVER_2000 0x05000000 ;5.00.2195
+!define WINVER_XP_NT 0x85010000 ;5.01.2600
+!define WINVER_XP 0x05010000 ;5.01.2600
+;define WINVER_XP64 ;5.02.3790
+!define WINVER_2003_NT 0x85020000 ;5.02.3790
+!define WINVER_2003 0x05020000 ;5.02.3790
+!define WINVER_VISTA_NT 0x86000000 ;6.00.6000
+!define WINVER_VISTA 0x06000000 ;6.00.6000
+!define WINVER_2008_NT 0x86000001 ;6.00.6001
+!define WINVER_2008 0x06000001 ;6.00.6001
+
+# use this to make all nt > 9x
+
+!ifdef WINVER_NT4_OVER_W95
+ !define __WINVERTMP ${WINVER_NT4}
+ !undef WINVER_NT4
+ !define /math WINVER_NT4 ${__WINVERTMP} | ${_WINVER_VERXBIT}
+ !undef __WINVERTMP
+!endif
+
+# some definitions from header files
+
+!define OSVERSIONINFOA_SIZE 148
+!define OSVERSIONINFOEXA_SIZE 156
+!define VER_PLATFORM_WIN32_NT 2
+!define VER_NT_WORKSTATION 1
+
+!define SM_TABLETPC 86
+!define SM_MEDIACENTER 87
+!define SM_STARTER 88
+!define SM_SERVERR2 89
+
+# variable declaration
+
+!macro __WinVer_DeclareVars
+
+ !ifndef __WINVER_VARS_DECLARED
+
+ !define __WINVER_VARS_DECLARED
+
+ Var /GLOBAL __WINVERV
+ Var /GLOBAL __WINVERSP
+
+ !endif
+
+!macroend
+
+# lazy initialization macro
+
+!ifmacrondef __WinVer_Call_GetVersionEx
+
+ !macro __WinVer_Call_GetVersionEx STRUCT_SIZE
+
+ System::Call '*$0(i ${STRUCT_SIZE})'
+ System::Call kernel32::GetVersionEx(ir0)i.r3
+
+ !macroend
+
+!endif
+
+!macro __WinVer_InitVars
+ # variables
+ !insertmacro __WinVer_DeclareVars
+
+ # only calculate version once
+ StrCmp $__WINVERV "" _winver_noveryet
+ Return
+ _winver_noveryet:
+
+ # push used registers on the stack
+ Push $0
+ Push $1 ;maj
+ Push $2 ;min
+ Push $3 ;bld
+ Push $R0 ;temp
+
+ # allocate memory
+ System::Alloc ${OSVERSIONINFOEXA_SIZE}
+ Pop $0
+
+ # use OSVERSIONINFOEX
+ !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFOEXA_SIZE}
+
+ IntCmp $3 0 "" _winver_ex _winver_ex
+ # OSVERSIONINFOEX not allowed (Win9x or NT4 w/SP < 6), use OSVERSIONINFO
+ !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFOA_SIZE}
+ _winver_ex:
+
+ # get results from struct
+ System::Call '*$0(i.s,i.r1,i.r2,i.r3,i.s,&t128.s,&i2.s,&i2,&i2,&i1.s,&i1)'
+
+ # free struct
+ System::Free $0
+
+ # win9x has major and minor info in high word of dwBuildNumber - remove it
+ IntOp $3 $3 & 0xFFFF
+
+ # get dwOSVersionInfoSize
+ Pop $R0
+
+ # get dwPlatformId
+ Pop $0
+
+ # NT?
+ IntCmp $0 ${VER_PLATFORM_WIN32_NT} "" _winver_notnt _winver_notnt
+ IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTBIT}
+ IntOp $__WINVERV $__WINVERV | ${_WINVER_NTBIT}
+ _winver_notnt:
+
+ # get service pack information
+ IntCmp $0 ${VER_PLATFORM_WIN32_NT} _winver_nt "" _winver_nt # win9x
+
+ # get szCSDVersion
+ Pop $0
+
+ # copy second char
+ StrCpy $0 $0 1 1
+
+ # discard invalid wServicePackMajor and wProductType
+ Pop $R0
+ Pop $R0
+
+ # switch
+ StrCmp $0 'A' "" +3
+ StrCpy $0 1
+ Goto _winver_sp_done
+ StrCmp $0 'B' "" +3
+ StrCpy $0 2
+ Goto _winver_sp_done
+ StrCmp $0 'C' "" +3
+ StrCpy $0 3
+ Goto _winver_sp_done
+ StrCpy $0 0
+ Goto _winver_sp_done
+
+ _winver_nt: # nt
+
+ IntCmp $R0 ${OSVERSIONINFOEXA_SIZE} "" _winver_sp_noex _winver_sp_noex
+
+ # discard szCSDVersion
+ Pop $0
+
+ # get wProductType
+ Exch
+ Pop $0
+
+ # is server?
+ IntCmp $0 ${VER_NT_WORKSTATION} _winver_noserver _winver_noserver ""
+ IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTSRVBIT}
+ _winver_noserver:
+
+ # get wServicePackMajor
+ Pop $0
+
+ # done with sp
+ Goto _winver_sp_done
+
+ _winver_sp_noex: # OSVERSIONINFO, not OSVERSIONINFOEX
+
+ #### TODO
+ ## For IsServer to support < NT4SP6, we need to check the registry
+ ## here to see if we are a server and/or DC
+
+ # get szCSDVersion
+ Pop $0
+
+ # discard invalid wServicePackMajor and wProductType
+ Pop $R0
+ Pop $R0
+
+ # get service pack number from text
+ StrCpy $R0 $0 13
+ StrCmp $R0 "Service Pack " "" +3
+ StrCpy $0 $0 "" 13 # cut "Service Pack "
+ Goto +2
+ StrCpy $0 0 # no service pack
+
+!ifdef WINVER_NT4_OVER_W95
+ IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT}
+!endif
+
+ _winver_sp_done:
+
+ # store service pack
+ IntOp $0 $0 << 16
+ IntOp $__WINVERSP $__WINVERSP | $0
+
+ ### now for the version
+
+ # is server?
+ IntOp $0 $__WINVERSP & ${_WINVER_NTSRVBIT}
+
+ # windows xp x64?
+ IntCmp $0 0 "" _winver_not_xp_x64 _winver_not_xp_x64 # not server
+ IntCmp $1 5 "" _winver_not_xp_x64 _winver_not_xp_x64 # maj 5
+ IntCmp $2 2 "" _winver_not_xp_x64 _winver_not_xp_x64 # min 2
+ # change XP x64 from 5.2 to 5.1 so it's still XP
+ StrCpy $2 1
+ _winver_not_xp_x64:
+
+ # server 2008?
+ IntCmp $0 0 _winver_not_2008 # server
+ IntCmp $1 6 "" _winver_not_2008 _winver_not_2008 # maj 6
+ IntCmp $2 0 "" _winver_not_2008 _winver_not_2008 # min 0
+ # extra bit so Server 2008 comes after Vista SP1 that has the same minor version
+ IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT}
+ _winver_not_2008:
+
+ # pack version
+ IntOp $1 $1 << 24 # VerMajor
+ IntOp $__WINVERV $__WINVERV | $1
+ IntOp $0 $2 << 16
+ IntOp $__WINVERV $__WINVERV | $0 # VerMinor
+ IntOp $__WINVERSP $__WINVERSP | $3 # VerBuild
+
+ # restore registers
+ Pop $R0
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+
+!macroend
+
+# version comparison LogicLib macros
+
+!macro _WinVerAtLeast _a _b _t _f
+ !insertmacro _LOGICLIB_TEMP
+ ${CallArtificialFunction} __WinVer_InitVars
+ IntOp $_LOGICLIB_TEMP $__WINVERV & ${_WINVER_NTMASK}
+ !insertmacro _>= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}`
+!macroend
+!macro _WinVerIs _a _b _t _f
+ ${CallArtificialFunction} __WinVer_InitVars
+ !insertmacro _= $__WINVERV `${_b}` `${_t}` `${_f}`
+!macroend
+!macro _WinVerAtMost _a _b _t _f
+ !insertmacro _LOGICLIB_TEMP
+ ${CallArtificialFunction} __WinVer_InitVars
+ IntOp $_LOGICLIB_TEMP $__WINVERV & ${_WINVER_NTMASK}
+ !insertmacro _<= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}`
+!macroend
+
+!macro __WinVer_DefineOSTest Test OS Suffix
+ !define ${Test}Win${OS} `"" WinVer${Test} ${WINVER_${OS}${Suffix}}`
+!macroend
+
+!macro __WinVer_DefineOSTests Test Suffix
+ !insertmacro __WinVer_DefineOSTest ${Test} 95 '${Suffix}'
+ !insertmacro __WinVer_DefineOSTest ${Test} 98 '${Suffix}'
+ !insertmacro __WinVer_DefineOSTest ${Test} ME '${Suffix}'
+ !insertmacro __WinVer_DefineOSTest ${Test} NT4 '${Suffix}'
+ !insertmacro __WinVer_DefineOSTest ${Test} 2000 '${Suffix}'
+ !insertmacro __WinVer_DefineOSTest ${Test} XP '${Suffix}'
+ !insertmacro __WinVer_DefineOSTest ${Test} 2003 '${Suffix}'
+ !insertmacro __WinVer_DefineOSTest ${Test} VISTA '${Suffix}'
+ !insertmacro __WinVer_DefineOSTest ${Test} 2008 '${Suffix}'
+!macroend
+
+!insertmacro __WinVer_DefineOSTests AtLeast ""
+!insertmacro __WinVer_DefineOSTests Is _NT
+!insertmacro __WinVer_DefineOSTests AtMost ""
+
+# version feature LogicLib macros
+
+!macro _IsNT _a _b _t _f
+ !insertmacro _LOGICLIB_TEMP
+ ${CallArtificialFunction} __WinVer_InitVars
+ IntOp $_LOGICLIB_TEMP $__WINVERSP & ${_WINVER_NTBIT}
+ !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`
+!macroend
+!define IsNT `"" IsNT ""`
+
+!macro _IsServerOS _a _b _t _f
+ !insertmacro _LOGICLIB_TEMP
+ ${CallArtificialFunction} __WinVer_InitVars
+ IntOp $_LOGICLIB_TEMP $__WINVERSP & ${_WINVER_NTSRVBIT}
+ !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`
+!macroend
+!define IsServerOS `"" IsServerOS ""`
+
+# service pack macros
+
+!macro _WinVer_GetServicePackLevel OUTVAR
+ ${CallArtificialFunction} __WinVer_InitVars
+ IntOp ${OUTVAR} $__WINVERSP & ${_WINVER_MASKSP}
+ IntOp ${OUTVAR} ${OUTVAR} >> 16
+!macroend
+!define WinVerGetServicePackLevel '!insertmacro _WinVer_GetServicePackLevel '
+
+!macro _AtLeastServicePack _a _b _t _f
+ !insertmacro _LOGICLIB_TEMP
+ ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP
+ !insertmacro _>= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}`
+!macroend
+!define AtLeastServicePack `"" AtLeastServicePack`
+
+!macro _AtMostServicePack _a _b _t _f
+ !insertmacro _LOGICLIB_TEMP
+ ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP
+ !insertmacro _<= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}`
+!macroend
+!define AtMostServicePack `"" AtMostServicePack`
+
+!macro _IsServicePack _a _b _t _f
+ !insertmacro _LOGICLIB_TEMP
+ ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP
+ !insertmacro _= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}`
+!macroend
+!define IsServicePack `"" IsServicePack`
+
+# special feature LogicLib macros
+
+!macro _WinVer_SysMetricCheck m _b _t _f
+ !insertmacro _LOGICLIB_TEMP
+ System::Call user32::GetSystemMetrics(i${m})i.s
+ pop $_LOGICLIB_TEMP
+ !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`
+!macroend
+
+!define IsWin2003R2 `${SM_SERVERR2} WinVer_SysMetricCheck ""`
+!define IsStarterEdition `${SM_STARTER} WinVer_SysMetricCheck ""`
+!define OSHasMediaCenter `${SM_MEDIACENTER} WinVer_SysMetricCheck ""`
+!define OSHasTabletSupport `${SM_TABLETPC} WinVer_SysMetricCheck ""`
+
+# version retrieval macros
+
+!macro __WinVer_GetVer var rshift mask outvar
+ ${CallArtificialFunction} __WinVer_InitVars
+ !if "${mask}" != ""
+ IntOp ${outvar} ${var} & ${mask}
+ !if "${rshift}" != ""
+ IntOp ${outvar} ${outvar} >> ${rshift}
+ !endif
+ !else
+ IntOp ${outvar} ${var} >> ${rshift}
+ !endif
+!macroend
+
+!define WinVerGetMajor '!insertmacro __WinVer_GetVer $__WINVERV 24 ${_WINVER_MASKVMAJ}'
+!define WinVerGetMinor '!insertmacro __WinVer_GetVer $__WINVERV 16 ${_WINVER_MASKVMIN}'
+!define WinVerGetBuild '!insertmacro __WinVer_GetVer $__WINVERSP "" ${_WINVER_MASKVBLD}'
+
+# done
+
+!endif # !___WINVER__NSH___
+
+!verbose pop
diff --git a/Engine/bin/tools/nsis/app/Include/WordFunc.nsh b/Engine/bin/tools/nsis/app/Include/WordFunc.nsh
new file mode 100644
index 000000000..2e62d4036
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/WordFunc.nsh
@@ -0,0 +1,1803 @@
+/*
+_____________________________________________________________________________
+
+ Word Functions Header v3.3
+_____________________________________________________________________________
+
+ 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
+
+ See documentation for more information about the following functions.
+
+ Usage in script:
+ 1. !include "WordFunc.nsh"
+ 2. [Section|Function]
+ ${WordFunction} "Param1" "Param2" "..." $var
+ [SectionEnd|FunctionEnd]
+
+
+ WordFunction=[WordFind|WordFindS|WordFind2X|WordFind2XS|WordFind3X|WordFind3XS|
+ WordReplace|WordReplaceS|WordAdd|WordAddS|WordInsert|WordInsertS|
+ StrFilter|StrFilterS|VersionCompare|VersionConvert]
+
+_____________________________________________________________________________
+
+ Thanks to:
+_____________________________________________________________________________
+
+WordFind3X
+ Afrow UK (Based on his idea of Function "StrSortLR")
+StrFilter
+ sunjammer (Function "StrUpper")
+VersionCompare
+ Afrow UK (Based on his Function "VersionCheckNew2")
+VersionConvert
+ Afrow UK (Based on his idea of Function "CharIndexReplace")
+*/
+
+
+;_____________________________________________________________________________
+;
+; Macros
+;_____________________________________________________________________________
+;
+; Change log window verbosity (default: 3=no script)
+;
+; Example:
+; !include "WordFunc.nsh"
+; !insertmacro WordFind
+; ${WORDFUNC_VERBOSE} 4 # all verbosity
+; !insertmacro WordReplace
+; ${WORDFUNC_VERBOSE} 3 # no script
+
+!ifndef WORDFUNC_INCLUDED
+!define WORDFUNC_INCLUDED
+
+!include Util.nsh
+
+!verbose push
+!verbose 3
+!ifndef _WORDFUNC_VERBOSE
+ !define _WORDFUNC_VERBOSE 3
+!endif
+!verbose ${_WORDFUNC_VERBOSE}
+!define WORDFUNC_VERBOSE `!insertmacro WORDFUNC_VERBOSE`
+!verbose pop
+
+!macro WORDFUNC_VERBOSE _VERBOSE
+ !verbose push
+ !verbose 3
+ !undef _WORDFUNC_VERBOSE
+ !define _WORDFUNC_VERBOSE ${_VERBOSE}
+ !verbose pop
+!macroend
+
+
+!macro WordFindCall _ART _STRING _DELIMITER _OPTION _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING}`
+ Push `${_DELIMITER}`
+ Push `${_OPTION}`
+ ${CallArtificialFunction}${_ART} WordFind_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro WordFindSCall _ART _STRING _DELIMITER _OPTION _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING}`
+ Push `${_DELIMITER}`
+ Push `${_OPTION}`
+ ${CallArtificialFunction}${_ART} WordFindS_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro WordFind2XCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING}`
+ Push `${_DELIMITER1}`
+ Push `${_DELIMITER2}`
+ Push `${_NUMBER}`
+ ${CallArtificialFunction} WordFind2X_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro WordFind2XSCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING}`
+ Push `${_DELIMITER1}`
+ Push `${_DELIMITER2}`
+ Push `${_NUMBER}`
+ ${CallArtificialFunction} WordFind2XS_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro WordFind3XCall _STRING _DELIMITER1 _CENTER _DELIMITER2 _NUMBER _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING}`
+ Push `${_DELIMITER1}`
+ Push `${_CENTER}`
+ Push `${_DELIMITER2}`
+ Push `${_NUMBER}`
+ ${CallArtificialFunction} WordFind3X_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro WordFind3XSCall _STRING _DELIMITER1 _CENTER _DELIMITER2 _NUMBER _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING}`
+ Push `${_DELIMITER1}`
+ Push `${_CENTER}`
+ Push `${_DELIMITER2}`
+ Push `${_NUMBER}`
+ ${CallArtificialFunction} WordFind3XS_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro WordReplaceCall _STRING _WORD1 _WORD2 _NUMBER _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING}`
+ Push `${_WORD1}`
+ Push `${_WORD2}`
+ Push `${_NUMBER}`
+ ${CallArtificialFunction} WordReplace_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro WordReplaceSCall _STRING _WORD1 _WORD2 _NUMBER _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING}`
+ Push `${_WORD1}`
+ Push `${_WORD2}`
+ Push `${_NUMBER}`
+ ${CallArtificialFunction} WordReplaceS_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro WordAddCall _STRING1 _DELIMITER _STRING2 _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING1}`
+ Push `${_DELIMITER}`
+ Push `${_STRING2}`
+ ${CallArtificialFunction} WordAdd_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro WordAddSCall _STRING1 _DELIMITER _STRING2 _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING1}`
+ Push `${_DELIMITER}`
+ Push `${_STRING2}`
+ ${CallArtificialFunction} WordAddS_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro WordInsertCall _STRING _DELIMITER _WORD _NUMBER _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING}`
+ Push `${_DELIMITER}`
+ Push `${_WORD}`
+ Push `${_NUMBER}`
+ ${CallArtificialFunction} WordInsert_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro WordInsertSCall _STRING _DELIMITER _WORD _NUMBER _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING}`
+ Push `${_DELIMITER}`
+ Push `${_WORD}`
+ Push `${_NUMBER}`
+ ${CallArtificialFunction} WordInsertS_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro StrFilterCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING}`
+ Push `${_FILTER}`
+ Push `${_INCLUDE}`
+ Push `${_EXCLUDE}`
+ ${CallArtificialFunction} StrFilter_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro StrFilterSCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_STRING}`
+ Push `${_FILTER}`
+ Push `${_INCLUDE}`
+ Push `${_EXCLUDE}`
+ ${CallArtificialFunction} StrFilterS_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro VersionCompareCall _VER1 _VER2 _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_VER1}`
+ Push `${_VER2}`
+ ${CallArtificialFunction} VersionCompare_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro VersionConvertCall _VERSION _CHARLIST _RESULT
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+ Push `${_VERSION}`
+ Push `${_CHARLIST}`
+ ${CallArtificialFunction} VersionConvert_
+ Pop ${_RESULT}
+ !verbose pop
+!macroend
+
+!macro WordFindBody _WORDFUNC_S
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Exch 2
+ Exch $R0
+ Exch 2
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ Push $R1
+ Push $R2
+ ClearErrors
+
+ StrCpy $9 ''
+ StrCpy $2 $1 1
+ StrCpy $1 $1 '' 1
+ StrCmp $2 'E' 0 +3
+ StrCpy $9 E
+ goto -4
+
+ StrCpy $3 ''
+ StrCmp${_WORDFUNC_S} $2 '+' +6
+ StrCmp${_WORDFUNC_S} $2 '-' +5
+ StrCmp${_WORDFUNC_S} $2 '/' WordFunc_WordFind${_WORDFUNC_S}_restart
+ StrCmp${_WORDFUNC_S} $2 '#' WordFunc_WordFind${_WORDFUNC_S}_restart
+ StrCmp${_WORDFUNC_S} $2 '*' WordFunc_WordFind${_WORDFUNC_S}_restart
+ goto WordFunc_WordFind${_WORDFUNC_S}_error3
+
+ StrCpy $4 $1 1 -1
+ StrCmp${_WORDFUNC_S} $4 '*' +4
+ StrCmp${_WORDFUNC_S} $4 '}' +3
+ StrCmp${_WORDFUNC_S} $4 '{' +2
+ goto +4
+ StrCpy $1 $1 -1
+ StrCpy $3 '$4$3'
+ goto -7
+ StrCmp${_WORDFUNC_S} $3 '*' WordFunc_WordFind${_WORDFUNC_S}_error3
+ StrCmp${_WORDFUNC_S} $3 '**' WordFunc_WordFind${_WORDFUNC_S}_error3
+ StrCmp${_WORDFUNC_S} $3 '}{' WordFunc_WordFind${_WORDFUNC_S}_error3
+ IntOp $1 $1 + 0
+ StrCmp${_WORDFUNC_S} $1 0 WordFunc_WordFind${_WORDFUNC_S}_error2
+
+ WordFunc_WordFind${_WORDFUNC_S}_restart:
+ StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind${_WORDFUNC_S}_error1
+ StrCpy $4 0
+ StrCpy $5 0
+ StrCpy $6 0
+ StrLen $7 $0
+ goto WordFunc_WordFind${_WORDFUNC_S}_loop
+
+ WordFunc_WordFind${_WORDFUNC_S}_preloop:
+ IntOp $6 $6 + 1
+
+ WordFunc_WordFind${_WORDFUNC_S}_loop:
+ StrCpy $8 $R0 $7 $6
+ StrCmp${_WORDFUNC_S} $8$5 0 WordFunc_WordFind${_WORDFUNC_S}_error1
+ StrLen $R2 $8
+ IntCmp $R2 0 +2
+ StrCmp${_WORDFUNC_S} $8 $0 +5 WordFunc_WordFind${_WORDFUNC_S}_preloop
+ StrCmp${_WORDFUNC_S} $3 '{' WordFunc_WordFind${_WORDFUNC_S}_minus
+ StrCmp${_WORDFUNC_S} $3 '}' WordFunc_WordFind${_WORDFUNC_S}_minus
+ StrCmp${_WORDFUNC_S} $2 '*' WordFunc_WordFind${_WORDFUNC_S}_minus
+ StrCmp${_WORDFUNC_S} $5 $6 WordFunc_WordFind${_WORDFUNC_S}_minus +5
+ StrCmp${_WORDFUNC_S} $3 '{' +4
+ StrCmp${_WORDFUNC_S} $3 '}' +3
+ StrCmp${_WORDFUNC_S} $2 '*' +2
+ StrCmp${_WORDFUNC_S} $5 $6 WordFunc_WordFind${_WORDFUNC_S}_nextword
+ IntOp $4 $4 + 1
+ StrCmp${_WORDFUNC_S} $2$4 +$1 WordFunc_WordFind${_WORDFUNC_S}_plus
+ StrCmp${_WORDFUNC_S} $2 '/' 0 WordFunc_WordFind${_WORDFUNC_S}_nextword
+ IntOp $8 $6 - $5
+ StrCpy $8 $R0 $8 $5
+ StrCmp${_WORDFUNC_S} $1 $8 0 WordFunc_WordFind${_WORDFUNC_S}_nextword
+ StrCpy $R1 $4
+ goto WordFunc_WordFind${_WORDFUNC_S}_end
+ WordFunc_WordFind${_WORDFUNC_S}_nextword:
+ IntOp $6 $6 + $7
+ StrCpy $5 $6
+ goto WordFunc_WordFind${_WORDFUNC_S}_loop
+
+ WordFunc_WordFind${_WORDFUNC_S}_minus:
+ StrCmp${_WORDFUNC_S} $2 '-' 0 WordFunc_WordFind${_WORDFUNC_S}_sum
+ StrCpy $2 '+'
+ IntOp $1 $4 - $1
+ IntOp $1 $1 + 1
+ IntCmp $1 0 WordFunc_WordFind${_WORDFUNC_S}_error2 WordFunc_WordFind${_WORDFUNC_S}_error2 WordFunc_WordFind${_WORDFUNC_S}_restart
+ WordFunc_WordFind${_WORDFUNC_S}_sum:
+ StrCmp${_WORDFUNC_S} $2 '#' 0 WordFunc_WordFind${_WORDFUNC_S}_sumdelim
+ StrCpy $R1 $4
+ goto WordFunc_WordFind${_WORDFUNC_S}_end
+ WordFunc_WordFind${_WORDFUNC_S}_sumdelim:
+ StrCmp${_WORDFUNC_S} $2 '*' 0 WordFunc_WordFind${_WORDFUNC_S}_error2
+ StrCpy $R1 $4
+ goto WordFunc_WordFind${_WORDFUNC_S}_end
+
+ WordFunc_WordFind${_WORDFUNC_S}_plus:
+ StrCmp${_WORDFUNC_S} $3 '' 0 +4
+ IntOp $6 $6 - $5
+ StrCpy $R1 $R0 $6 $5
+ goto WordFunc_WordFind${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $3 '{' 0 +3
+ StrCpy $R1 $R0 $6
+ goto WordFunc_WordFind${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $3 '}' 0 +4
+ IntOp $6 $6 + $7
+ StrCpy $R1 $R0 '' $6
+ goto WordFunc_WordFind${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $3 '{*' +2
+ StrCmp${_WORDFUNC_S} $3 '*{' 0 +3
+ StrCpy $R1 $R0 $6
+ goto WordFunc_WordFind${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $3 '*}' +2
+ StrCmp${_WORDFUNC_S} $3 '}*' 0 +3
+ StrCpy $R1 $R0 '' $5
+ goto WordFunc_WordFind${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $3 '}}' 0 +3
+ StrCpy $R1 $R0 '' $6
+ goto WordFunc_WordFind${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $3 '{{' 0 +3
+ StrCpy $R1 $R0 $5
+ goto WordFunc_WordFind${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $3 '{}' 0 WordFunc_WordFind${_WORDFUNC_S}_error3
+ StrLen $3 $R0
+ StrCmp${_WORDFUNC_S} $3 $6 0 +3
+ StrCpy $0 ''
+ goto +2
+ IntOp $6 $6 + $7
+ StrCpy $8 $R0 '' $6
+ StrCmp${_WORDFUNC_S} $4$8 1 +6
+ StrCmp${_WORDFUNC_S} $4 1 +2 +7
+ IntOp $6 $6 + $7
+ StrCpy $3 $R0 $7 $6
+ StrCmp${_WORDFUNC_S} $3 '' +2
+ StrCmp${_WORDFUNC_S} $3 $0 -3 +3
+ StrCpy $R1 ''
+ goto WordFunc_WordFind${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $5 0 0 +3
+ StrCpy $0 ''
+ goto +2
+ IntOp $5 $5 - $7
+ StrCpy $3 $R0 $5
+ StrCpy $R1 '$3$0$8'
+ goto WordFunc_WordFind${_WORDFUNC_S}_end
+
+ WordFunc_WordFind${_WORDFUNC_S}_error3:
+ StrCpy $R1 3
+ goto WordFunc_WordFind${_WORDFUNC_S}_error
+ WordFunc_WordFind${_WORDFUNC_S}_error2:
+ StrCpy $R1 2
+ goto WordFunc_WordFind${_WORDFUNC_S}_error
+ WordFunc_WordFind${_WORDFUNC_S}_error1:
+ StrCpy $R1 1
+ WordFunc_WordFind${_WORDFUNC_S}_error:
+ StrCmp $9 'E' 0 +3
+ SetErrors
+
+ WordFunc_WordFind${_WORDFUNC_S}_end:
+ StrCpy $R0 $R1
+
+ Pop $R2
+ Pop $R1
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+ Exch $R0
+!macroend
+
+!define WordFind `!insertmacro WordFindCall ''`
+!define un.WordFind `!insertmacro WordFindCall ''`
+
+!macro WordFind
+!macroend
+
+!macro un.WordFind
+!macroend
+
+!macro WordFind_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro WordFindBody ''
+
+ !verbose pop
+!macroend
+
+!define WordFindS `!insertmacro WordFindSCall ''`
+!define un.WordFindS `!insertmacro WordFindSCall ''`
+
+!macro WordFindS
+!macroend
+
+!macro un.WordFindS
+!macroend
+
+!macro WordFindS_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro WordFindBody 'S'
+
+ !verbose pop
+!macroend
+
+!macro WordFind2XBody _WORDFUNC_S
+ Exch $2
+ Exch
+ Exch $1
+ Exch
+ Exch 2
+ Exch $0
+ Exch 2
+ Exch 3
+ Exch $R0
+ Exch 3
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ Push $R1
+ Push $R2
+ ClearErrors
+
+ StrCpy $R2 ''
+ StrCpy $3 $2 1
+ StrCpy $2 $2 '' 1
+ StrCmp $3 'E' 0 +3
+ StrCpy $R2 E
+ goto -4
+
+ StrCmp${_WORDFUNC_S} $3 '+' +5
+ StrCmp${_WORDFUNC_S} $3 '-' +4
+ StrCmp${_WORDFUNC_S} $3 '#' WordFunc_WordFind2X${_WORDFUNC_S}_restart
+ StrCmp${_WORDFUNC_S} $3 '/' WordFunc_WordFind2X${_WORDFUNC_S}_restart
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_error3
+
+ StrCpy $4 $2 2 -2
+ StrCmp${_WORDFUNC_S} $4 '{{' +9
+ StrCmp${_WORDFUNC_S} $4 '}}' +8
+ StrCmp${_WORDFUNC_S} $4 '{*' +7
+ StrCmp${_WORDFUNC_S} $4 '*{' +6
+ StrCmp${_WORDFUNC_S} $4 '*}' +5
+ StrCmp${_WORDFUNC_S} $4 '}*' +4
+ StrCmp${_WORDFUNC_S} $4 '{}' +3
+ StrCpy $4 ''
+ goto +2
+ StrCpy $2 $2 -2
+ IntOp $2 $2 + 0
+ StrCmp${_WORDFUNC_S} $2 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2
+
+ WordFunc_WordFind2X${_WORDFUNC_S}_restart:
+ StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind2X${_WORDFUNC_S}_error1
+ StrCpy $5 -1
+ StrCpy $6 0
+ StrCpy $7 ''
+ StrLen $8 $0
+ StrLen $9 $1
+
+ WordFunc_WordFind2X${_WORDFUNC_S}_loop:
+ IntOp $5 $5 + 1
+
+ WordFunc_WordFind2X${_WORDFUNC_S}_delim1:
+ StrCpy $R1 $R0 $8 $5
+ StrCmp${_WORDFUNC_S} $R1$6 0 WordFunc_WordFind2X${_WORDFUNC_S}_error1
+ StrCmp${_WORDFUNC_S} $R1 '' WordFunc_WordFind2X${_WORDFUNC_S}_minus
+ StrCmp${_WORDFUNC_S} $R1 $0 +2
+ StrCmp${_WORDFUNC_S} $7 '' WordFunc_WordFind2X${_WORDFUNC_S}_loop WordFunc_WordFind2X${_WORDFUNC_S}_delim2
+ StrCmp${_WORDFUNC_S} $0 $1 0 +2
+ StrCmp${_WORDFUNC_S} $7 '' 0 WordFunc_WordFind2X${_WORDFUNC_S}_delim2
+ IntOp $7 $5 + $8
+ StrCpy $5 $7
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_delim1
+
+ WordFunc_WordFind2X${_WORDFUNC_S}_delim2:
+ StrCpy $R1 $R0 $9 $5
+ StrCmp${_WORDFUNC_S} $R1 $1 0 WordFunc_WordFind2X${_WORDFUNC_S}_loop
+ IntOp $6 $6 + 1
+ StrCmp${_WORDFUNC_S} $3$6 '+$2' WordFunc_WordFind2X${_WORDFUNC_S}_plus
+ StrCmp${_WORDFUNC_S} $3 '/' 0 WordFunc_WordFind2X${_WORDFUNC_S}_nextword
+ IntOp $R1 $5 - $7
+ StrCpy $R1 $R0 $R1 $7
+ StrCmp${_WORDFUNC_S} $R1 $2 0 +3
+ StrCpy $R1 $6
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_end
+ WordFunc_WordFind2X${_WORDFUNC_S}_nextword:
+ IntOp $5 $5 + $9
+ StrCpy $7 ''
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_delim1
+
+ WordFunc_WordFind2X${_WORDFUNC_S}_minus:
+ StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordFind2X${_WORDFUNC_S}_sum
+ StrCpy $3 +
+ IntOp $2 $6 - $2
+ IntOp $2 $2 + 1
+ IntCmp $2 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2 WordFunc_WordFind2X${_WORDFUNC_S}_error2 WordFunc_WordFind2X${_WORDFUNC_S}_restart
+ WordFunc_WordFind2X${_WORDFUNC_S}_sum:
+ StrCmp${_WORDFUNC_S} $3 '#' 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2
+ StrCpy $R1 $6
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_end
+
+ WordFunc_WordFind2X${_WORDFUNC_S}_plus:
+ StrCmp${_WORDFUNC_S} $4 '' 0 +4
+ IntOp $R1 $5 - $7
+ StrCpy $R1 $R0 $R1 $7
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_end
+ IntOp $5 $5 + $9
+ IntOp $7 $7 - $8
+ StrCmp${_WORDFUNC_S} $4 '{*' +2
+ StrCmp${_WORDFUNC_S} $4 '*{' 0 +3
+ StrCpy $R1 $R0 $5
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $4 '*}' +2
+ StrCmp${_WORDFUNC_S} $4 '}*' 0 +3
+ StrCpy $R1 $R0 '' $7
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $4 '}}' 0 +3
+ StrCpy $R1 $R0 '' $5
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $4 '{{' 0 +3
+ StrCpy $R1 $R0 $7
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $4 '{}' 0 WordFunc_WordFind2X${_WORDFUNC_S}_error3
+ StrCpy $5 $R0 '' $5
+ StrCpy $7 $R0 $7
+ StrCpy $R1 '$7$5'
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_end
+
+ WordFunc_WordFind2X${_WORDFUNC_S}_error3:
+ StrCpy $R1 3
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_error
+ WordFunc_WordFind2X${_WORDFUNC_S}_error2:
+ StrCpy $R1 2
+ goto WordFunc_WordFind2X${_WORDFUNC_S}_error
+ WordFunc_WordFind2X${_WORDFUNC_S}_error1:
+ StrCpy $R1 1
+ WordFunc_WordFind2X${_WORDFUNC_S}_error:
+ StrCmp $R2 'E' 0 +3
+ SetErrors
+
+ WordFunc_WordFind2X${_WORDFUNC_S}_end:
+ StrCpy $R0 $R1
+
+ Pop $R2
+ Pop $R1
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+ Exch $R0
+!macroend
+
+!define WordFind2X `!insertmacro WordFind2XCall`
+!define un.WordFind2X `!insertmacro WordFind2XCall`
+
+!macro WordFind2X
+!macroend
+
+!macro un.WordFind2X
+!macroend
+
+!macro WordFind2X_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro WordFind2XBody ''
+
+ !verbose pop
+!macroend
+
+!define WordFind2XS `!insertmacro WordFind2XSCall`
+!define un.WordFind2XS `!insertmacro WordFind2XSCall`
+
+!macro WordFind2XS
+!macroend
+
+!macro un.WordFind2XS
+!macroend
+
+!macro WordFind2XS_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro WordFind2XBody 'S'
+
+ !verbose pop
+!macroend
+
+!macro WordFind3XBody _WORDFUNC_S
+ Exch $3
+ Exch
+ Exch $2
+ Exch
+ Exch 2
+ Exch $1
+ Exch 2
+ Exch 3
+ Exch $0
+ Exch 3
+ Exch 4
+ Exch $R0
+ Exch 4
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ Push $R1
+ Push $R2
+ Push $R3
+ Push $R4
+ Push $R5
+ ClearErrors
+
+ StrCpy $R5 ''
+ StrCpy $4 $3 1
+ StrCpy $3 $3 '' 1
+ StrCmp $4 'E' 0 +3
+ StrCpy $R5 E
+ goto -4
+
+ StrCmp${_WORDFUNC_S} $4 '+' +5
+ StrCmp${_WORDFUNC_S} $4 '-' +4
+ StrCmp${_WORDFUNC_S} $4 '#' WordFunc_WordFind3X${_WORDFUNC_S}_restart
+ StrCmp${_WORDFUNC_S} $4 '/' WordFunc_WordFind3X${_WORDFUNC_S}_restart
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_error3
+
+ StrCpy $5 $3 2 -2
+ StrCmp${_WORDFUNC_S} $5 '{{' +9
+ StrCmp${_WORDFUNC_S} $5 '}}' +8
+ StrCmp${_WORDFUNC_S} $5 '{*' +7
+ StrCmp${_WORDFUNC_S} $5 '*{' +6
+ StrCmp${_WORDFUNC_S} $5 '*}' +5
+ StrCmp${_WORDFUNC_S} $5 '}*' +4
+ StrCmp${_WORDFUNC_S} $5 '{}' +3
+ StrCpy $5 ''
+ goto +2
+ StrCpy $3 $3 -2
+ IntOp $3 $3 + 0
+ StrCmp${_WORDFUNC_S} $3 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2
+
+ WordFunc_WordFind3X${_WORDFUNC_S}_restart:
+ StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind3X${_WORDFUNC_S}_error1
+ StrCpy $6 -1
+ StrCpy $7 0
+ StrCpy $8 ''
+ StrCpy $9 ''
+ StrLen $R1 $0
+ StrLen $R2 $1
+ StrLen $R3 $2
+
+ WordFunc_WordFind3X${_WORDFUNC_S}_loop:
+ IntOp $6 $6 + 1
+
+ WordFunc_WordFind3X${_WORDFUNC_S}_delim1:
+ StrCpy $R4 $R0 $R1 $6
+ StrCmp${_WORDFUNC_S} $R4$7 0 WordFunc_WordFind3X${_WORDFUNC_S}_error1
+ StrCmp${_WORDFUNC_S} $R4 '' WordFunc_WordFind3X${_WORDFUNC_S}_minus
+ StrCmp${_WORDFUNC_S} $R4 $0 +2
+ StrCmp${_WORDFUNC_S} $8 '' WordFunc_WordFind3X${_WORDFUNC_S}_loop WordFunc_WordFind3X${_WORDFUNC_S}_center
+ StrCmp${_WORDFUNC_S} $0 $1 +2
+ StrCmp${_WORDFUNC_S} $0 $2 0 +2
+ StrCmp${_WORDFUNC_S} $8 '' 0 WordFunc_WordFind3X${_WORDFUNC_S}_center
+ IntOp $8 $6 + $R1
+ StrCpy $6 $8
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_delim1
+
+ WordFunc_WordFind3X${_WORDFUNC_S}_center:
+ StrCmp${_WORDFUNC_S} $9 '' 0 WordFunc_WordFind3X${_WORDFUNC_S}_delim2
+ StrCpy $R4 $R0 $R2 $6
+ StrCmp${_WORDFUNC_S} $R4 $1 0 WordFunc_WordFind3X${_WORDFUNC_S}_loop
+ IntOp $9 $6 + $R2
+ StrCpy $6 $9
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_delim1
+
+ WordFunc_WordFind3X${_WORDFUNC_S}_delim2:
+ StrCpy $R4 $R0 $R3 $6
+ StrCmp${_WORDFUNC_S} $R4 $2 0 WordFunc_WordFind3X${_WORDFUNC_S}_loop
+ IntOp $7 $7 + 1
+ StrCmp${_WORDFUNC_S} $4$7 '+$3' WordFunc_WordFind3X${_WORDFUNC_S}_plus
+ StrCmp${_WORDFUNC_S} $4 '/' 0 WordFunc_WordFind3X${_WORDFUNC_S}_nextword
+ IntOp $R4 $6 - $8
+ StrCpy $R4 $R0 $R4 $8
+ StrCmp${_WORDFUNC_S} $R4 $3 0 +3
+ StrCpy $R4 $7
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_end
+ WordFunc_WordFind3X${_WORDFUNC_S}_nextword:
+ IntOp $6 $6 + $R3
+ StrCpy $8 ''
+ StrCpy $9 ''
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_delim1
+
+ WordFunc_WordFind3X${_WORDFUNC_S}_minus:
+ StrCmp${_WORDFUNC_S} $4 '-' 0 WordFunc_WordFind3X${_WORDFUNC_S}_sum
+ StrCpy $4 +
+ IntOp $3 $7 - $3
+ IntOp $3 $3 + 1
+ IntCmp $3 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2 WordFunc_WordFind3X${_WORDFUNC_S}_error2 WordFunc_WordFind3X${_WORDFUNC_S}_restart
+ WordFunc_WordFind3X${_WORDFUNC_S}_sum:
+ StrCmp${_WORDFUNC_S} $4 '#' 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2
+ StrCpy $R4 $7
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_end
+
+ WordFunc_WordFind3X${_WORDFUNC_S}_plus:
+ StrCmp${_WORDFUNC_S} $5 '' 0 +4
+ IntOp $R4 $6 - $8
+ StrCpy $R4 $R0 $R4 $8
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_end
+ IntOp $6 $6 + $R3
+ IntOp $8 $8 - $R1
+ StrCmp${_WORDFUNC_S} $5 '{*' +2
+ StrCmp${_WORDFUNC_S} $5 '*{' 0 +3
+ StrCpy $R4 $R0 $6
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $5 '*}' +2
+ StrCmp${_WORDFUNC_S} $5 '}*' 0 +3
+ StrCpy $R4 $R0 '' $8
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $5 '}}' 0 +3
+ StrCpy $R4 $R0 '' $6
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $5 '{{' 0 +3
+ StrCpy $R4 $R0 $8
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $5 '{}' 0 WordFunc_WordFind3X${_WORDFUNC_S}_error3
+ StrCpy $6 $R0 '' $6
+ StrCpy $8 $R0 $8
+ StrCpy $R4 '$8$6'
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_end
+
+ WordFunc_WordFind3X${_WORDFUNC_S}_error3:
+ StrCpy $R4 3
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_error
+ WordFunc_WordFind3X${_WORDFUNC_S}_error2:
+ StrCpy $R4 2
+ goto WordFunc_WordFind3X${_WORDFUNC_S}_error
+ WordFunc_WordFind3X${_WORDFUNC_S}_error1:
+ StrCpy $R4 1
+ WordFunc_WordFind3X${_WORDFUNC_S}_error:
+ StrCmp $R5 'E' 0 +3
+ SetErrors
+
+ WordFunc_WordFind3X${_WORDFUNC_S}_end:
+ StrCpy $R0 $R4
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+ Exch $R0
+!macroend
+
+!define WordFind3X `!insertmacro WordFind3XCall`
+!define un.WordFind3X `!insertmacro WordFind3XCall`
+
+!macro WordFind3X
+!macroend
+
+!macro un.WordFind3X
+!macroend
+
+!macro WordFind3X_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro WordFind3XBody ''
+
+ !verbose pop
+!macroend
+
+!define WordFind3XS `!insertmacro WordFind3XSCall`
+!define un.WordFind3XS `!insertmacro WordFind3XSCall`
+
+!macro WordFind3XS
+!macroend
+
+!macro un.WordFind3XS
+!macroend
+
+!macro WordFind3XS_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro WordFind3XBody 'S'
+
+ !verbose pop
+!macroend
+
+!macro WordReplaceBody _WORDFUNC_S
+ Exch $2
+ Exch
+ Exch $1
+ Exch
+ Exch 2
+ Exch $0
+ Exch 2
+ Exch 3
+ Exch $R0
+ Exch 3
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ Push $R1
+ ClearErrors
+
+ StrCpy $R1 $R0
+ StrCpy $9 ''
+ StrCpy $3 $2 1
+ StrCpy $2 $2 '' 1
+ StrCmp $3 'E' 0 +3
+ StrCpy $9 E
+ goto -4
+
+ StrCpy $4 $2 1 -1
+ StrCpy $5 ''
+ StrCpy $6 ''
+ StrLen $7 $0
+
+ StrCmp${_WORDFUNC_S} $7 0 WordFunc_WordReplace${_WORDFUNC_S}_error1
+ StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordReplace${_WORDFUNC_S}_error1
+ StrCmp${_WORDFUNC_S} $3 '{' WordFunc_WordReplace${_WORDFUNC_S}_beginning
+ StrCmp${_WORDFUNC_S} $3 '}' WordFunc_WordReplace${_WORDFUNC_S}_ending WordFunc_WordReplace${_WORDFUNC_S}_errorchk
+
+ WordFunc_WordReplace${_WORDFUNC_S}_beginning:
+ StrCpy $8 $R0 $7
+ StrCmp${_WORDFUNC_S} $8 $0 0 +4
+ StrCpy $R0 $R0 '' $7
+ StrCpy $5 '$5$1'
+ goto -4
+ StrCpy $3 $2 1
+ StrCmp${_WORDFUNC_S} $3 '}' 0 WordFunc_WordReplace${_WORDFUNC_S}_merge
+
+ WordFunc_WordReplace${_WORDFUNC_S}_ending:
+ StrCpy $8 $R0 '' -$7
+ StrCmp${_WORDFUNC_S} $8 $0 0 +4
+ StrCpy $R0 $R0 -$7
+ StrCpy $6 '$6$1'
+ goto -4
+
+ WordFunc_WordReplace${_WORDFUNC_S}_merge:
+ StrCmp${_WORDFUNC_S} $4 '*' 0 +5
+ StrCmp${_WORDFUNC_S} $5 '' +2
+ StrCpy $5 $1
+ StrCmp${_WORDFUNC_S} $6 '' +2
+ StrCpy $6 $1
+ StrCpy $R0 '$5$R0$6'
+ goto WordFunc_WordReplace${_WORDFUNC_S}_end
+
+ WordFunc_WordReplace${_WORDFUNC_S}_errorchk:
+ StrCmp${_WORDFUNC_S} $3 '+' +2
+ StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordReplace${_WORDFUNC_S}_error3
+
+ StrCpy $5 $2 1
+ IntOp $2 $2 + 0
+ StrCmp${_WORDFUNC_S} $2 0 0 WordFunc_WordReplace${_WORDFUNC_S}_one
+ StrCmp${_WORDFUNC_S} $5 0 WordFunc_WordReplace${_WORDFUNC_S}_error2
+ StrCpy $3 ''
+
+ WordFunc_WordReplace${_WORDFUNC_S}_all:
+ StrCpy $5 0
+ StrCpy $2 $R0 $7 $5
+ StrCmp${_WORDFUNC_S} $2 '' +4
+ StrCmp${_WORDFUNC_S} $2 $0 +6
+ IntOp $5 $5 + 1
+ goto -4
+ StrCmp${_WORDFUNC_S} $R0 $R1 WordFunc_WordReplace${_WORDFUNC_S}_error1
+ StrCpy $R0 '$3$R0'
+ goto WordFunc_WordReplace${_WORDFUNC_S}_end
+ StrCpy $2 $R0 $5
+ IntOp $5 $5 + $7
+ StrCmp${_WORDFUNC_S} $4 '*' 0 +3
+ StrCpy $6 $R0 $7 $5
+ StrCmp${_WORDFUNC_S} $6 $0 -3
+ StrCpy $R0 $R0 '' $5
+ StrCpy $3 '$3$2$1'
+ goto WordFunc_WordReplace${_WORDFUNC_S}_all
+
+ WordFunc_WordReplace${_WORDFUNC_S}_one:
+ StrCpy $5 0
+ StrCpy $8 0
+ goto WordFunc_WordReplace${_WORDFUNC_S}_loop
+
+ WordFunc_WordReplace${_WORDFUNC_S}_preloop:
+ IntOp $5 $5 + 1
+
+ WordFunc_WordReplace${_WORDFUNC_S}_loop:
+ StrCpy $6 $R0 $7 $5
+ StrCmp${_WORDFUNC_S} $6$8 0 WordFunc_WordReplace${_WORDFUNC_S}_error1
+ StrCmp${_WORDFUNC_S} $6 '' WordFunc_WordReplace${_WORDFUNC_S}_minus
+ StrCmp${_WORDFUNC_S} $6 $0 0 WordFunc_WordReplace${_WORDFUNC_S}_preloop
+ IntOp $8 $8 + 1
+ StrCmp${_WORDFUNC_S} $3$8 +$2 WordFunc_WordReplace${_WORDFUNC_S}_found
+ IntOp $5 $5 + $7
+ goto WordFunc_WordReplace${_WORDFUNC_S}_loop
+
+ WordFunc_WordReplace${_WORDFUNC_S}_minus:
+ StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordReplace${_WORDFUNC_S}_error2
+ StrCpy $3 +
+ IntOp $2 $8 - $2
+ IntOp $2 $2 + 1
+ IntCmp $2 0 WordFunc_WordReplace${_WORDFUNC_S}_error2 WordFunc_WordReplace${_WORDFUNC_S}_error2 WordFunc_WordReplace${_WORDFUNC_S}_one
+
+ WordFunc_WordReplace${_WORDFUNC_S}_found:
+ StrCpy $3 $R0 $5
+ StrCmp${_WORDFUNC_S} $4 '*' 0 +5
+ StrCpy $6 $3 '' -$7
+ StrCmp${_WORDFUNC_S} $6 $0 0 +3
+ StrCpy $3 $3 -$7
+ goto -3
+ IntOp $5 $5 + $7
+ StrCmp${_WORDFUNC_S} $4 '*' 0 +3
+ StrCpy $6 $R0 $7 $5
+ StrCmp${_WORDFUNC_S} $6 $0 -3
+ StrCpy $R0 $R0 '' $5
+ StrCpy $R0 '$3$1$R0'
+ goto WordFunc_WordReplace${_WORDFUNC_S}_end
+
+ WordFunc_WordReplace${_WORDFUNC_S}_error3:
+ StrCpy $R0 3
+ goto WordFunc_WordReplace${_WORDFUNC_S}_error
+ WordFunc_WordReplace${_WORDFUNC_S}_error2:
+ StrCpy $R0 2
+ goto WordFunc_WordReplace${_WORDFUNC_S}_error
+ WordFunc_WordReplace${_WORDFUNC_S}_error1:
+ StrCpy $R0 1
+ WordFunc_WordReplace${_WORDFUNC_S}_error:
+ StrCmp $9 'E' +3
+ StrCpy $R0 $R1
+ goto +2
+ SetErrors
+
+ WordFunc_WordReplace${_WORDFUNC_S}_end:
+ Pop $R1
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+ Exch $R0
+!macroend
+
+!define WordReplace `!insertmacro WordReplaceCall`
+!define un.WordReplace `!insertmacro WordReplaceCall`
+
+!macro WordReplace
+!macroend
+
+!macro un.WordReplace
+!macroend
+
+!macro WordReplace_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro WordReplaceBody ''
+
+ !verbose pop
+!macroend
+
+!define WordReplaceS `!insertmacro WordReplaceSCall`
+!define un.WordReplaceS `!insertmacro WordReplaceSCall`
+
+!macro WordReplaceS
+!macroend
+
+!macro un.WordReplaceS
+!macroend
+
+!macro WordReplaceS_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro WordReplaceBody 'S'
+
+ !verbose pop
+!macroend
+
+!macro WordAddBody _WORDFUNC_S
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Exch 2
+ Exch $R0
+ Exch 2
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $R1
+ ClearErrors
+
+ StrCpy $7 ''
+ StrCpy $2 $1 1
+ StrCmp $2 'E' 0 +4
+ StrCpy $7 E
+ StrCpy $1 $1 '' 1
+ goto -4
+
+ StrCpy $5 0
+ StrCpy $R1 $R0
+ StrCpy $2 $1 '' 1
+ StrCpy $1 $1 1
+ StrCmp${_WORDFUNC_S} $1 '+' +2
+ StrCmp${_WORDFUNC_S} $1 '-' 0 WordFunc_WordAdd${_WORDFUNC_S}_error3
+
+ StrCmp${_WORDFUNC_S} $0 '' WordFunc_WordAdd${_WORDFUNC_S}_error1
+ StrCmp${_WORDFUNC_S} $2 '' WordFunc_WordAdd${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $R0 '' 0 +5
+ StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $1 '+' 0 +3
+ StrCpy $R0 $2
+ goto WordFunc_WordAdd${_WORDFUNC_S}_end
+
+ WordFunc_WordAdd${_WORDFUNC_S}_loop:
+ IntOp $5 $5 + 1
+ !insertmacro WordFind${_WORDFUNC_S}Call 2 $2 $0 E+$5 $3
+ IfErrors 0 WordFunc_WordAdd${_WORDFUNC_S}_/word
+ StrCmp${_WORDFUNC_S} $3 2 +4
+ StrCmp${_WORDFUNC_S} $3$5 11 0 +3
+ StrCpy $3 $2
+ goto WordFunc_WordAdd${_WORDFUNC_S}_/word
+ StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_end WordFunc_WordAdd${_WORDFUNC_S}_preend
+
+ WordFunc_WordAdd${_WORDFUNC_S}_/word:
+ !insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E/$3 $4
+ IfErrors +2
+ StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_delete WordFunc_WordAdd${_WORDFUNC_S}_loop
+ StrCmp${_WORDFUNC_S} $1$4 '-1' +2
+ StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_loop +4
+ StrCmp${_WORDFUNC_S} $R0 $3 0 WordFunc_WordAdd${_WORDFUNC_S}_loop
+ StrCpy $R0 ''
+ goto WordFunc_WordAdd${_WORDFUNC_S}_end
+ StrCmp${_WORDFUNC_S} $1$4 '+1' 0 +2
+ StrCmp${_WORDFUNC_S} $R0 $3 WordFunc_WordAdd${_WORDFUNC_S}_loop
+ StrCmp${_WORDFUNC_S} $R0 $R1 +3
+ StrCpy $R1 '$R1$0$3'
+ goto WordFunc_WordAdd${_WORDFUNC_S}_loop
+ StrLen $6 $0
+ StrCpy $6 $R0 '' -$6
+ StrCmp${_WORDFUNC_S} $6 $0 0 -4
+ StrCpy $R1 '$R1$3'
+ goto WordFunc_WordAdd${_WORDFUNC_S}_loop
+
+ WordFunc_WordAdd${_WORDFUNC_S}_delete:
+ !insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E+$4{} $R0
+ goto WordFunc_WordAdd${_WORDFUNC_S}_/word
+
+ WordFunc_WordAdd${_WORDFUNC_S}_error3:
+ StrCpy $R1 3
+ goto WordFunc_WordAdd${_WORDFUNC_S}_error
+ WordFunc_WordAdd${_WORDFUNC_S}_error1:
+ StrCpy $R1 1
+ WordFunc_WordAdd${_WORDFUNC_S}_error:
+ StrCmp $7 'E' 0 WordFunc_WordAdd${_WORDFUNC_S}_end
+ SetErrors
+
+ WordFunc_WordAdd${_WORDFUNC_S}_preend:
+ StrCpy $R0 $R1
+
+ WordFunc_WordAdd${_WORDFUNC_S}_end:
+ Pop $R1
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+ Exch $R0
+!macroend
+
+!define WordAdd `!insertmacro WordAddCall`
+!define un.WordAdd `!insertmacro WordAddCall`
+
+!macro WordAdd
+!macroend
+
+!macro un.WordAdd
+!macroend
+
+!macro WordAdd_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro WordAddBody ''
+
+ !verbose pop
+!macroend
+
+!define WordAddS `!insertmacro WordAddSCall`
+!define un.WordAddS `!insertmacro WordAddSCall`
+
+!macro WordAddS
+!macroend
+
+!macro un.WordAddS
+!macroend
+
+!macro WordAddS_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro WordAddBody 'S'
+
+ !verbose pop
+!macroend
+
+!macro WordInsertBody _WORDFUNC_S
+ Exch $2
+ Exch
+ Exch $1
+ Exch
+ Exch 2
+ Exch $0
+ Exch 2
+ Exch 3
+ Exch $R0
+ Exch 3
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $8
+ Push $9
+ Push $R1
+ ClearErrors
+
+ StrCpy $5 ''
+ StrCpy $6 $0
+ StrCpy $7 }
+
+ StrCpy $9 ''
+ StrCpy $R1 $R0
+ StrCpy $3 $2 1
+ StrCpy $2 $2 '' 1
+ StrCmp $3 'E' 0 +3
+ StrCpy $9 'E'
+ goto -4
+
+ StrCmp${_WORDFUNC_S} $3 '+' +2
+ StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordInsert${_WORDFUNC_S}_error3
+ IntOp $2 $2 + 0
+ StrCmp${_WORDFUNC_S} $2 0 WordFunc_WordInsert${_WORDFUNC_S}_error2
+ StrCmp${_WORDFUNC_S} $0 '' WordFunc_WordInsert${_WORDFUNC_S}_error1
+
+ StrCmp${_WORDFUNC_S} $2 1 0 WordFunc_WordInsert${_WORDFUNC_S}_two
+ GetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_oneback
+ StrCmp${_WORDFUNC_S} $3 '+' WordFunc_WordInsert${_WORDFUNC_S}_call
+ StrCpy $7 {
+ goto WordFunc_WordInsert${_WORDFUNC_S}_call
+ WordFunc_WordInsert${_WORDFUNC_S}_oneback:
+ IfErrors 0 +2
+ StrCpy $4 $R0
+ StrCmp${_WORDFUNC_S} $3 '+' 0 +3
+ StrCpy $R0 '$1$0$4'
+ goto WordFunc_WordInsert${_WORDFUNC_S}_end
+ StrCpy $R0 '$4$0$1'
+ goto WordFunc_WordInsert${_WORDFUNC_S}_end
+
+ WordFunc_WordInsert${_WORDFUNC_S}_two:
+ IntOp $2 $2 - 1
+ GetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_twoback
+ StrCmp${_WORDFUNC_S} $3 '+' 0 WordFunc_WordInsert${_WORDFUNC_S}_call
+ StrCpy $7 {
+ goto WordFunc_WordInsert${_WORDFUNC_S}_call
+ WordFunc_WordInsert${_WORDFUNC_S}_twoback:
+ IfErrors 0 WordFunc_WordInsert${_WORDFUNC_S}_tree
+ StrCmp${_WORDFUNC_S} $2$4 11 0 WordFunc_WordInsert${_WORDFUNC_S}_error2
+ StrCmp${_WORDFUNC_S} $3 '+' 0 +3
+ StrCpy $R0 '$R0$0$1'
+ goto WordFunc_WordInsert${_WORDFUNC_S}_end
+ StrCpy $R0 '$1$0$R0'
+ goto WordFunc_WordInsert${_WORDFUNC_S}_end
+
+ WordFunc_WordInsert${_WORDFUNC_S}_tree:
+ StrCpy $7 }
+ StrCpy $5 $4
+ IntOp $2 $2 + 1
+ GetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_treeback
+ StrCmp${_WORDFUNC_S} $3 '+' WordFunc_WordInsert${_WORDFUNC_S}_call
+ StrCpy $7 {
+ goto WordFunc_WordInsert${_WORDFUNC_S}_call
+ WordFunc_WordInsert${_WORDFUNC_S}_treeback:
+ IfErrors 0 +3
+ StrCpy $4 ''
+ StrCpy $6 ''
+ StrCmp${_WORDFUNC_S} $3 '+' 0 +3
+ StrCpy $R0 '$5$0$1$6$4'
+ goto WordFunc_WordInsert${_WORDFUNC_S}_end
+ StrCpy $R0 '$4$6$1$0$5'
+ goto WordFunc_WordInsert${_WORDFUNC_S}_end
+
+ WordFunc_WordInsert${_WORDFUNC_S}_call:
+ !insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E$3$2*$7 $4
+ goto $8
+
+ WordFunc_WordInsert${_WORDFUNC_S}_error3:
+ StrCpy $R0 3
+ goto WordFunc_WordInsert${_WORDFUNC_S}_error
+ WordFunc_WordInsert${_WORDFUNC_S}_error2:
+ StrCpy $R0 2
+ goto WordFunc_WordInsert${_WORDFUNC_S}_error
+ WordFunc_WordInsert${_WORDFUNC_S}_error1:
+ StrCpy $R0 1
+ WordFunc_WordInsert${_WORDFUNC_S}_error:
+ StrCmp $9 'E' +3
+ StrCpy $R0 $R1
+ goto +2
+ SetErrors
+
+ WordFunc_WordInsert${_WORDFUNC_S}_end:
+ Pop $R1
+ Pop $9
+ Pop $8
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+ Exch $R0
+!macroend
+
+!define WordInsert `!insertmacro WordInsertCall`
+!define un.WordInsert `!insertmacro WordInsertCall`
+
+!macro WordInsert
+!macroend
+
+!macro un.WordInsert
+!macroend
+
+!macro WordInsert_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro WordInsertBody ''
+
+ !verbose pop
+!macroend
+
+
+!define WordInsertS `!insertmacro WordInsertSCall`
+!define un.WordInsertS `!insertmacro WordInsertSCall`
+
+!macro WordInsertS
+!macroend
+
+!macro un.WordInsertS
+!macroend
+
+!macro WordInsertS_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro WordInsertBody 'S'
+
+ !verbose pop
+!macroend
+
+!macro StrFilterBody _WORDFUNC_S
+ Exch $2
+ Exch
+ Exch $1
+ Exch
+ Exch 2
+ Exch $0
+ Exch 2
+ Exch 3
+ Exch $R0
+ Exch 3
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+ Push $R1
+ Push $R2
+ Push $R3
+ Push $R4
+ Push $R5
+ Push $R6
+ Push $R7
+ Push $R8
+ ClearErrors
+
+ StrCpy $R2 $0 '' -3
+ StrCmp $R2 "eng" WordFunc_StrFilter${_WORDFUNC_S}_eng
+ StrCmp $R2 "rus" WordFunc_StrFilter${_WORDFUNC_S}_rus
+ WordFunc_StrFilter${_WORDFUNC_S}_eng:
+ StrCpy $4 65
+ StrCpy $5 90
+ StrCpy $6 97
+ StrCpy $7 122
+ goto WordFunc_StrFilter${_WORDFUNC_S}_langend
+ WordFunc_StrFilter${_WORDFUNC_S}_rus:
+ StrCpy $4 192
+ StrCpy $5 223
+ StrCpy $6 224
+ StrCpy $7 255
+ goto WordFunc_StrFilter${_WORDFUNC_S}_langend
+ ;...
+
+ WordFunc_StrFilter${_WORDFUNC_S}_langend:
+ StrCpy $R7 ''
+ StrCpy $R8 ''
+
+ StrCmp${_WORDFUNC_S} $2 '' 0 WordFunc_StrFilter${_WORDFUNC_S}_begin
+
+ WordFunc_StrFilter${_WORDFUNC_S}_restart1:
+ StrCpy $2 ''
+ StrCpy $3 $0 1
+ StrCmp${_WORDFUNC_S} $3 '+' +2
+ StrCmp${_WORDFUNC_S} $3 '-' 0 +3
+ StrCpy $0 $0 '' 1
+ goto +2
+ StrCpy $3 ''
+
+ IntOp $0 $0 + 0
+ StrCmp${_WORDFUNC_S} $0 0 +5
+ StrCpy $R7 $0 1 0
+ StrCpy $R8 $0 1 1
+ StrCpy $R2 $0 1 2
+ StrCmp${_WORDFUNC_S} $R2 '' WordFunc_StrFilter${_WORDFUNC_S}_filter WordFunc_StrFilter${_WORDFUNC_S}_error
+
+ WordFunc_StrFilter${_WORDFUNC_S}_restart2:
+ StrCmp${_WORDFUNC_S} $3 '' WordFunc_StrFilter${_WORDFUNC_S}_end
+ StrCpy $R7 ''
+ StrCpy $R8 '+-'
+ goto WordFunc_StrFilter${_WORDFUNC_S}_begin
+
+ WordFunc_StrFilter${_WORDFUNC_S}_filter:
+ StrCmp${_WORDFUNC_S} $R7 '1' +3
+ StrCmp${_WORDFUNC_S} $R7 '2' +2
+ StrCmp${_WORDFUNC_S} $R7 '3' 0 WordFunc_StrFilter${_WORDFUNC_S}_error
+
+ StrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_begin
+ StrCmp${_WORDFUNC_S} $R7$R8 '23' +2
+ StrCmp${_WORDFUNC_S} $R7$R8 '32' 0 +3
+ StrCpy $R7 -1
+ goto WordFunc_StrFilter${_WORDFUNC_S}_begin
+ StrCmp${_WORDFUNC_S} $R7$R8 '13' +2
+ StrCmp${_WORDFUNC_S} $R7$R8 '31' 0 +3
+ StrCpy $R7 -2
+ goto WordFunc_StrFilter${_WORDFUNC_S}_begin
+ StrCmp${_WORDFUNC_S} $R7$R8 '12' +2
+ StrCmp${_WORDFUNC_S} $R7$R8 '21' 0 WordFunc_StrFilter${_WORDFUNC_S}_error
+ StrCpy $R7 -3
+
+ WordFunc_StrFilter${_WORDFUNC_S}_begin:
+ StrCpy $R6 0
+ StrCpy $R1 ''
+
+ WordFunc_StrFilter${_WORDFUNC_S}_loop:
+ StrCpy $R2 $R0 1 $R6
+ StrCmp${_WORDFUNC_S} $R2 '' WordFunc_StrFilter${_WORDFUNC_S}_restartchk
+
+ StrCmp${_WORDFUNC_S} $2 '' +7
+ StrCpy $R4 0
+ StrCpy $R5 $2 1 $R4
+ StrCmp${_WORDFUNC_S} $R5 '' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol
+ StrCmp${_WORDFUNC_S} $R5 $R2 WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol
+ IntOp $R4 $R4 + 1
+ goto -4
+
+ StrCmp${_WORDFUNC_S} $1 '' +7
+ StrCpy $R4 0
+ StrCpy $R5 $1 1 $R4
+ StrCmp${_WORDFUNC_S} $R5 '' +4
+ StrCmp${_WORDFUNC_S} $R5 $R2 WordFunc_StrFilter${_WORDFUNC_S}_addsymbol
+ IntOp $R4 $R4 + 1
+ goto -4
+
+ StrCmp${_WORDFUNC_S} $R7 '1' +2
+ StrCmp${_WORDFUNC_S} $R7 '-1' 0 +4
+ StrCpy $R4 48
+ StrCpy $R5 57
+ goto WordFunc_StrFilter${_WORDFUNC_S}_loop2
+ StrCmp${_WORDFUNC_S} $R8 '+-' 0 +2
+ StrCmp${_WORDFUNC_S} $3 '+' 0 +4
+ StrCpy $R4 $4
+ StrCpy $R5 $5
+ goto WordFunc_StrFilter${_WORDFUNC_S}_loop2
+ StrCpy $R4 $6
+ StrCpy $R5 $7
+
+ WordFunc_StrFilter${_WORDFUNC_S}_loop2:
+ IntFmt $R3 '%c' $R4
+ StrCmp $R2 $R3 WordFunc_StrFilter${_WORDFUNC_S}_found
+ StrCmp $R4 $R5 WordFunc_StrFilter${_WORDFUNC_S}_notfound
+ IntOp $R4 $R4 + 1
+ goto WordFunc_StrFilter${_WORDFUNC_S}_loop2
+
+ WordFunc_StrFilter${_WORDFUNC_S}_found:
+ StrCmp${_WORDFUNC_S} $R8 '+-' WordFunc_StrFilter${_WORDFUNC_S}_setcase
+ StrCmp${_WORDFUNC_S} $R7 '3' WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol
+ StrCmp${_WORDFUNC_S} $R7 '-3' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol
+ StrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol
+
+ WordFunc_StrFilter${_WORDFUNC_S}_notfound:
+ StrCmp${_WORDFUNC_S} $R8 '+-' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol
+ StrCmp${_WORDFUNC_S} $R7 '3' 0 +2
+ StrCmp${_WORDFUNC_S} $R5 57 WordFunc_StrFilter${_WORDFUNC_S}_addsymbol +3
+ StrCmp${_WORDFUNC_S} $R7 '-3' 0 +5
+ StrCmp${_WORDFUNC_S} $R5 57 WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol
+ StrCpy $R4 48
+ StrCpy $R5 57
+ goto WordFunc_StrFilter${_WORDFUNC_S}_loop2
+ StrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol WordFunc_StrFilter${_WORDFUNC_S}_addsymbol
+
+ WordFunc_StrFilter${_WORDFUNC_S}_setcase:
+ StrCpy $R2 $R3
+ WordFunc_StrFilter${_WORDFUNC_S}_addsymbol:
+ StrCpy $R1 $R1$R2
+ WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol:
+ IntOp $R6 $R6 + 1
+ goto WordFunc_StrFilter${_WORDFUNC_S}_loop
+
+ WordFunc_StrFilter${_WORDFUNC_S}_error:
+ SetErrors
+ StrCpy $R0 ''
+ goto WordFunc_StrFilter${_WORDFUNC_S}_end
+
+ WordFunc_StrFilter${_WORDFUNC_S}_restartchk:
+ StrCpy $R0 $R1
+ StrCmp${_WORDFUNC_S} $2 '' 0 WordFunc_StrFilter${_WORDFUNC_S}_restart1
+ StrCmp${_WORDFUNC_S} $R8 '+-' 0 WordFunc_StrFilter${_WORDFUNC_S}_restart2
+
+ WordFunc_StrFilter${_WORDFUNC_S}_end:
+ Pop $R8
+ Pop $R7
+ Pop $R6
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+ Exch $R0
+!macroend
+
+!define StrFilter `!insertmacro StrFilterCall`
+!define un.StrFilter `!insertmacro StrFilterCall`
+
+!macro StrFilter
+!macroend
+
+!macro un.StrFilter
+!macroend
+
+!macro StrFilter_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro StrFilterBody ''
+
+ !verbose pop
+!macroend
+
+
+!define StrFilterS `!insertmacro StrFilterSCall`
+!define un.StrFilterS `!insertmacro StrFilterSCall`
+
+!macro StrFilterS
+!macroend
+
+!macro un.StrFilterS
+!macroend
+
+!macro StrFilterS_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ !insertmacro StrFilterBody 'S'
+
+ !verbose pop
+!macroend
+
+!define VersionCompare `!insertmacro VersionCompareCall`
+!define un.VersionCompare `!insertmacro VersionCompareCall`
+
+!macro VersionCompare
+!macroend
+
+!macro un.VersionCompare
+!macroend
+
+!macro VersionCompare_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+
+ WordFunc_VersionCompare_begin:
+ StrCpy $2 -1
+ IntOp $2 $2 + 1
+ StrCpy $3 $0 1 $2
+ StrCmp $3 '' +2
+ StrCmp $3 '.' 0 -3
+ StrCpy $4 $0 $2
+ IntOp $2 $2 + 1
+ StrCpy $0 $0 '' $2
+
+ StrCpy $2 -1
+ IntOp $2 $2 + 1
+ StrCpy $3 $1 1 $2
+ StrCmp $3 '' +2
+ StrCmp $3 '.' 0 -3
+ StrCpy $5 $1 $2
+ IntOp $2 $2 + 1
+ StrCpy $1 $1 '' $2
+
+ StrCmp $4$5 '' WordFunc_VersionCompare_equal
+
+ StrCpy $6 -1
+ IntOp $6 $6 + 1
+ StrCpy $3 $4 1 $6
+ StrCmp $3 '0' -2
+ StrCmp $3 '' 0 +2
+ StrCpy $4 0
+
+ StrCpy $7 -1
+ IntOp $7 $7 + 1
+ StrCpy $3 $5 1 $7
+ StrCmp $3 '0' -2
+ StrCmp $3 '' 0 +2
+ StrCpy $5 0
+
+ StrCmp $4 0 0 +2
+ StrCmp $5 0 WordFunc_VersionCompare_begin WordFunc_VersionCompare_newer2
+ StrCmp $5 0 WordFunc_VersionCompare_newer1
+ IntCmp $6 $7 0 WordFunc_VersionCompare_newer1 WordFunc_VersionCompare_newer2
+
+ StrCpy $4 '1$4'
+ StrCpy $5 '1$5'
+ IntCmp $4 $5 WordFunc_VersionCompare_begin WordFunc_VersionCompare_newer2 WordFunc_VersionCompare_newer1
+
+ WordFunc_VersionCompare_equal:
+ StrCpy $0 0
+ goto WordFunc_VersionCompare_end
+ WordFunc_VersionCompare_newer1:
+ StrCpy $0 1
+ goto WordFunc_VersionCompare_end
+ WordFunc_VersionCompare_newer2:
+ StrCpy $0 2
+
+ WordFunc_VersionCompare_end:
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!define VersionConvert `!insertmacro VersionConvertCall`
+!define un.VersionConvert `!insertmacro VersionConvertCall`
+
+!macro VersionConvert
+!macroend
+
+!macro un.VersionConvert
+!macroend
+
+!macro VersionConvert_
+ !verbose push
+ !verbose ${_WORDFUNC_VERBOSE}
+
+ Exch $1
+ Exch
+ Exch $0
+ Exch
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+ Push $6
+ Push $7
+
+ StrCmp $1 '' 0 +2
+ StrCpy $1 'abcdefghijklmnopqrstuvwxyz'
+ StrCpy $1 $1 99
+
+ StrCpy $2 0
+ StrCpy $7 'dot'
+ goto WordFunc_VersionConvert_loop
+
+ WordFunc_VersionConvert_preloop:
+ IntOp $2 $2 + 1
+
+ WordFunc_VersionConvert_loop:
+ StrCpy $3 $0 1 $2
+ StrCmp $3 '' WordFunc_VersionConvert_endcheck
+ StrCmp $3 '.' WordFunc_VersionConvert_dot
+ StrCmp $3 '0' WordFunc_VersionConvert_digit
+ IntCmp $3 '0' WordFunc_VersionConvert_letter WordFunc_VersionConvert_letter WordFunc_VersionConvert_digit
+
+ WordFunc_VersionConvert_dot:
+ StrCmp $7 'dot' WordFunc_VersionConvert_replacespecial
+ StrCpy $7 'dot'
+ goto WordFunc_VersionConvert_preloop
+
+ WordFunc_VersionConvert_digit:
+ StrCmp $7 'letter' WordFunc_VersionConvert_insertdot
+ StrCpy $7 'digit'
+ goto WordFunc_VersionConvert_preloop
+
+ WordFunc_VersionConvert_letter:
+ StrCpy $5 0
+ StrCpy $4 $1 1 $5
+ IntOp $5 $5 + 1
+ StrCmp $4 '' WordFunc_VersionConvert_replacespecial
+ StrCmp $4 $3 0 -3
+ IntCmp $5 9 0 0 +2
+ StrCpy $5 '0$5'
+
+ StrCmp $7 'letter' +2
+ StrCmp $7 'dot' 0 +3
+ StrCpy $6 ''
+ goto +2
+ StrCpy $6 '.'
+
+ StrCpy $4 $0 $2
+ IntOp $2 $2 + 1
+ StrCpy $0 $0 '' $2
+ StrCpy $0 '$4$6$5$0'
+ StrLen $4 '$6$5'
+ IntOp $2 $2 + $4
+ IntOp $2 $2 - 1
+ StrCpy $7 'letter'
+ goto WordFunc_VersionConvert_loop
+
+ WordFunc_VersionConvert_replacespecial:
+ StrCmp $7 'dot' 0 +3
+ StrCpy $6 ''
+ goto +2
+ StrCpy $6 '.'
+
+ StrCpy $4 $0 $2
+ IntOp $2 $2 + 1
+ StrCpy $0 $0 '' $2
+ StrCpy $0 '$4$6$0'
+ StrLen $4 $6
+ IntOp $2 $2 + $4
+ IntOp $2 $2 - 1
+ StrCpy $7 'dot'
+ goto WordFunc_VersionConvert_loop
+
+ WordFunc_VersionConvert_insertdot:
+ StrCpy $4 $0 $2
+ StrCpy $0 $0 '' $2
+ StrCpy $0 '$4.$0'
+ StrCpy $7 'dot'
+ goto WordFunc_VersionConvert_preloop
+
+ WordFunc_VersionConvert_endcheck:
+ StrCpy $4 $0 1 -1
+ StrCmp $4 '.' 0 WordFunc_VersionConvert_end
+ StrCpy $0 $0 -1
+ goto -3
+
+ WordFunc_VersionConvert_end:
+ Pop $7
+ Pop $6
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Exch $0
+
+ !verbose pop
+!macroend
+
+!endif
diff --git a/Engine/bin/tools/nsis/app/Include/nsDialogs.nsh b/Engine/bin/tools/nsis/app/Include/nsDialogs.nsh
new file mode 100644
index 000000000..dc68d8597
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/nsDialogs.nsh
@@ -0,0 +1,860 @@
+/*
+
+nsDialogs.nsh
+Header file for creating custom installer pages with nsDialogs
+
+*/
+
+!ifndef NSDIALOGS_INCLUDED
+!define NSDIALOGS_INCLUDED
+!verbose push
+!verbose 3
+
+!include LogicLib.nsh
+!include WinMessages.nsh
+
+!define WS_EX_DLGMODALFRAME 0x00000001
+!define WS_EX_NOPARENTNOTIFY 0x00000004
+!define WS_EX_TOPMOST 0x00000008
+!define WS_EX_ACCEPTFILES 0x00000010
+!define WS_EX_TRANSPARENT 0x00000020
+!define WS_EX_MDICHILD 0x00000040
+!define WS_EX_TOOLWINDOW 0x00000080
+!define WS_EX_WINDOWEDGE 0x00000100
+!define WS_EX_CLIENTEDGE 0x00000200
+!define WS_EX_CONTEXTHELP 0x00000400
+!define WS_EX_RIGHT 0x00001000
+!define WS_EX_LEFT 0x00000000
+!define WS_EX_RTLREADING 0x00002000
+!define WS_EX_LTRREADING 0x00000000
+!define WS_EX_LEFTSCROLLBAR 0x00004000
+!define WS_EX_RIGHTSCROLLBAR 0x00000000
+!define WS_EX_CONTROLPARENT 0x00010000
+!define WS_EX_STATICEDGE 0x00020000
+!define WS_EX_APPWINDOW 0x00040000
+
+!define WS_CHILD 0x40000000
+!define WS_VISIBLE 0x10000000
+!define WS_DISABLED 0x08000000
+!define WS_CLIPSIBLINGS 0x04000000
+!define WS_CLIPCHILDREN 0x02000000
+!define WS_MAXIMIZE 0x01000000
+!define WS_VSCROLL 0x00200000
+!define WS_HSCROLL 0x00100000
+!define WS_GROUP 0x00020000
+!define WS_TABSTOP 0x00010000
+
+!define ES_LEFT 0x00000000
+!define ES_CENTER 0x00000001
+!define ES_RIGHT 0x00000002
+!define ES_MULTILINE 0x00000004
+!define ES_UPPERCASE 0x00000008
+!define ES_LOWERCASE 0x00000010
+!define ES_PASSWORD 0x00000020
+!define ES_AUTOVSCROLL 0x00000040
+!define ES_AUTOHSCROLL 0x00000080
+!define ES_NOHIDESEL 0x00000100
+!define ES_OEMCONVERT 0x00000400
+!define ES_READONLY 0x00000800
+!define ES_WANTRETURN 0x00001000
+!define ES_NUMBER 0x00002000
+
+!define SS_LEFT 0x00000000
+!define SS_CENTER 0x00000001
+!define SS_RIGHT 0x00000002
+!define SS_ICON 0x00000003
+!define SS_BLACKRECT 0x00000004
+!define SS_GRAYRECT 0x00000005
+!define SS_WHITERECT 0x00000006
+!define SS_BLACKFRAME 0x00000007
+!define SS_GRAYFRAME 0x00000008
+!define SS_WHITEFRAME 0x00000009
+!define SS_USERITEM 0x0000000A
+!define SS_SIMPLE 0x0000000B
+!define SS_LEFTNOWORDWRAP 0x0000000C
+!define SS_OWNERDRAW 0x0000000D
+!define SS_BITMAP 0x0000000E
+!define SS_ENHMETAFILE 0x0000000F
+!define SS_ETCHEDHORZ 0x00000010
+!define SS_ETCHEDVERT 0x00000011
+!define SS_ETCHEDFRAME 0x00000012
+!define SS_TYPEMASK 0x0000001F
+!define SS_REALSIZECONTROL 0x00000040
+!define SS_NOPREFIX 0x00000080
+!define SS_NOTIFY 0x00000100
+!define SS_CENTERIMAGE 0x00000200
+!define SS_RIGHTJUST 0x00000400
+!define SS_REALSIZEIMAGE 0x00000800
+!define SS_SUNKEN 0x00001000
+!define SS_EDITCONTROL 0x00002000
+!define SS_ENDELLIPSIS 0x00004000
+!define SS_PATHELLIPSIS 0x00008000
+!define SS_WORDELLIPSIS 0x0000C000
+!define SS_ELLIPSISMASK 0x0000C000
+
+!define BS_PUSHBUTTON 0x00000000
+!define BS_DEFPUSHBUTTON 0x00000001
+!define BS_CHECKBOX 0x00000002
+!define BS_AUTOCHECKBOX 0x00000003
+!define BS_RADIOBUTTON 0x00000004
+!define BS_3STATE 0x00000005
+!define BS_AUTO3STATE 0x00000006
+!define BS_GROUPBOX 0x00000007
+!define BS_USERBUTTON 0x00000008
+!define BS_AUTORADIOBUTTON 0x00000009
+!define BS_PUSHBOX 0x0000000A
+!define BS_OWNERDRAW 0x0000000B
+!define BS_TYPEMASK 0x0000000F
+!define BS_LEFTTEXT 0x00000020
+!define BS_TEXT 0x00000000
+!define BS_ICON 0x00000040
+!define BS_BITMAP 0x00000080
+!define BS_LEFT 0x00000100
+!define BS_RIGHT 0x00000200
+!define BS_CENTER 0x00000300
+!define BS_TOP 0x00000400
+!define BS_BOTTOM 0x00000800
+!define BS_VCENTER 0x00000C00
+!define BS_PUSHLIKE 0x00001000
+!define BS_MULTILINE 0x00002000
+!define BS_NOTIFY 0x00004000
+!define BS_FLAT 0x00008000
+!define BS_RIGHTBUTTON ${BS_LEFTTEXT}
+
+!define CBS_SIMPLE 0x0001
+!define CBS_DROPDOWN 0x0002
+!define CBS_DROPDOWNLIST 0x0003
+!define CBS_OWNERDRAWFIXED 0x0010
+!define CBS_OWNERDRAWVARIABLE 0x0020
+!define CBS_AUTOHSCROLL 0x0040
+!define CBS_OEMCONVERT 0x0080
+!define CBS_SORT 0x0100
+!define CBS_HASSTRINGS 0x0200
+!define CBS_NOINTEGRALHEIGHT 0x0400
+!define CBS_DISABLENOSCROLL 0x0800
+!define CBS_UPPERCASE 0x2000
+!define CBS_LOWERCASE 0x4000
+
+!define LBS_NOTIFY 0x0001
+!define LBS_SORT 0x0002
+!define LBS_NOREDRAW 0x0004
+!define LBS_MULTIPLESEL 0x0008
+!define LBS_OWNERDRAWFIXED 0x0010
+!define LBS_OWNERDRAWVARIABLE 0x0020
+!define LBS_HASSTRINGS 0x0040
+!define LBS_USETABSTOPS 0x0080
+!define LBS_NOINTEGRALHEIGHT 0x0100
+!define LBS_MULTICOLUMN 0x0200
+!define LBS_WANTKEYBOARDINPUT 0x0400
+!define LBS_EXTENDEDSEL 0x0800
+!define LBS_DISABLENOSCROLL 0x1000
+!define LBS_NODATA 0x2000
+!define LBS_NOSEL 0x4000
+!define LBS_COMBOBOX 0x8000
+
+!define LR_DEFAULTCOLOR 0x0000
+!define LR_MONOCHROME 0x0001
+!define LR_COLOR 0x0002
+!define LR_COPYRETURNORG 0x0004
+!define LR_COPYDELETEORG 0x0008
+!define LR_LOADFROMFILE 0x0010
+!define LR_LOADTRANSPARENT 0x0020
+!define LR_DEFAULTSIZE 0x0040
+!define LR_VGACOLOR 0x0080
+!define LR_LOADMAP3DCOLORS 0x1000
+!define LR_CREATEDIBSECTION 0x2000
+!define LR_COPYFROMRESOURCE 0x4000
+!define LR_SHARED 0x8000
+
+!define IMAGE_BITMAP 0
+!define IMAGE_ICON 1
+!define IMAGE_CURSOR 2
+!define IMAGE_ENHMETAFILE 3
+
+!define GWL_STYLE -16
+!define GWL_EXSTYLE -20
+
+!define DEFAULT_STYLES ${WS_CHILD}|${WS_VISIBLE}|${WS_CLIPSIBLINGS}
+
+!define __NSD_HLine_CLASS STATIC
+!define __NSD_HLine_STYLE ${DEFAULT_STYLES}|${SS_ETCHEDHORZ}|${SS_SUNKEN}
+!define __NSD_HLine_EXSTYLE ${WS_EX_TRANSPARENT}
+
+!define __NSD_VLine_CLASS STATIC
+!define __NSD_VLine_STYLE ${DEFAULT_STYLES}|${SS_ETCHEDVERT}|${SS_SUNKEN}
+!define __NSD_VLine_EXSTYLE ${WS_EX_TRANSPARENT}
+
+!define __NSD_Label_CLASS STATIC
+!define __NSD_Label_STYLE ${DEFAULT_STYLES}|${SS_NOTIFY}
+!define __NSD_Label_EXSTYLE ${WS_EX_TRANSPARENT}
+
+!define __NSD_Icon_CLASS STATIC
+!define __NSD_Icon_STYLE ${DEFAULT_STYLES}|${SS_ICON}|${SS_NOTIFY}
+!define __NSD_Icon_EXSTYLE 0
+
+!define __NSD_Bitmap_CLASS STATIC
+!define __NSD_Bitmap_STYLE ${DEFAULT_STYLES}|${SS_BITMAP}|${SS_NOTIFY}
+!define __NSD_Bitmap_EXSTYLE 0
+
+!define __NSD_BrowseButton_CLASS BUTTON
+!define __NSD_BrowseButton_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}
+!define __NSD_BrowseButton_EXSTYLE 0
+
+!define __NSD_Link_CLASS LINK
+!define __NSD_Link_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${BS_OWNERDRAW}
+!define __NSD_Link_EXSTYLE 0
+
+!define __NSD_Button_CLASS BUTTON
+!define __NSD_Button_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}
+!define __NSD_Button_EXSTYLE 0
+
+!define __NSD_GroupBox_CLASS BUTTON
+!define __NSD_GroupBox_STYLE ${DEFAULT_STYLES}|${BS_GROUPBOX}
+!define __NSD_GroupBox_EXSTYLE ${WS_EX_TRANSPARENT}
+
+!define __NSD_CheckBox_CLASS BUTTON
+!define __NSD_CheckBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${BS_TEXT}|${BS_VCENTER}|${BS_AUTOCHECKBOX}|${BS_MULTILINE}
+!define __NSD_CheckBox_EXSTYLE 0
+
+!define __NSD_RadioButton_CLASS BUTTON
+!define __NSD_RadioButton_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${BS_TEXT}|${BS_VCENTER}|${BS_AUTORADIOBUTTON}|${BS_MULTILINE}
+!define __NSD_RadioButton_EXSTYLE 0
+
+!define __NSD_Text_CLASS EDIT
+!define __NSD_Text_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}
+!define __NSD_Text_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+
+!define __NSD_Password_CLASS EDIT
+!define __NSD_Password_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_PASSWORD}
+!define __NSD_Password_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+
+!define __NSD_Number_CLASS EDIT
+!define __NSD_Number_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_NUMBER}
+!define __NSD_Number_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+
+!define __NSD_FileRequest_CLASS EDIT
+!define __NSD_FileRequest_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}
+!define __NSD_FileRequest_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+
+!define __NSD_DirRequest_CLASS EDIT
+!define __NSD_DirRequest_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}
+!define __NSD_DirRequest_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+
+!define __NSD_ComboBox_CLASS COMBOBOX
+!define __NSD_ComboBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${WS_CLIPCHILDREN}|${CBS_AUTOHSCROLL}|${CBS_HASSTRINGS}|${CBS_DROPDOWN}
+!define __NSD_ComboBox_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+
+!define __NSD_DropList_CLASS COMBOBOX
+!define __NSD_DropList_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${WS_CLIPCHILDREN}|${CBS_AUTOHSCROLL}|${CBS_HASSTRINGS}|${CBS_DROPDOWNLIST}
+!define __NSD_DropList_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+
+!define __NSD_ListBox_CLASS LISTBOX
+!define __NSD_ListBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${LBS_DISABLENOSCROLL}|${LBS_HASSTRINGS}|${LBS_NOINTEGRALHEIGHT}|${LBS_NOTIFY}
+!define __NSD_ListBox_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+
+!define __NSD_ProgressBar_CLASS msctls_progress32
+!define __NSD_ProgressBar_STYLE ${DEFAULT_STYLES}
+!define __NSD_ProgressBar_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
+
+!macro __NSD_DefineControl NAME
+
+ !define NSD_Create${NAME} "nsDialogs::CreateControl ${__NSD_${Name}_CLASS} ${__NSD_${Name}_STYLE} ${__NSD_${Name}_EXSTYLE}"
+
+!macroend
+
+!insertmacro __NSD_DefineControl HLine
+!insertmacro __NSD_DefineControl VLine
+!insertmacro __NSD_DefineControl Label
+!insertmacro __NSD_DefineControl Icon
+!insertmacro __NSD_DefineControl Bitmap
+!insertmacro __NSD_DefineControl BrowseButton
+!insertmacro __NSD_DefineControl Link
+!insertmacro __NSD_DefineControl Button
+!insertmacro __NSD_DefineControl GroupBox
+!insertmacro __NSD_DefineControl CheckBox
+!insertmacro __NSD_DefineControl RadioButton
+!insertmacro __NSD_DefineControl Text
+!insertmacro __NSD_DefineControl Password
+!insertmacro __NSD_DefineControl Number
+!insertmacro __NSD_DefineControl FileRequest
+!insertmacro __NSD_DefineControl DirRequest
+!insertmacro __NSD_DefineControl ComboBox
+!insertmacro __NSD_DefineControl DropList
+!insertmacro __NSD_DefineControl ListBox
+!insertmacro __NSD_DefineControl ProgressBar
+
+!macro __NSD_OnControlEvent EVENT HWND FUNCTION
+
+ Push $0
+ Push $1
+
+ StrCpy $1 "${HWND}"
+
+ GetFunctionAddress $0 "${FUNCTION}"
+ nsDialogs::On${EVENT} $1 $0
+
+ Pop $1
+ Pop $0
+
+!macroend
+
+!macro __NSD_DefineControlCallback EVENT
+
+ !define NSD_On${EVENT} `!insertmacro __NSD_OnControlEvent ${EVENT}`
+
+!macroend
+
+!macro __NSD_OnDialogEvent EVENT FUNCTION
+
+ Push $0
+
+ GetFunctionAddress $0 "${FUNCTION}"
+ nsDialogs::On${EVENT} $0
+
+ Pop $0
+
+!macroend
+
+!macro __NSD_DefineDialogCallback EVENT
+
+ !define NSD_On${EVENT} `!insertmacro __NSD_OnDialogEvent ${EVENT}`
+
+!macroend
+
+!insertmacro __NSD_DefineControlCallback Click
+!insertmacro __NSD_DefineControlCallback Change
+!insertmacro __NSD_DefineControlCallback Notify
+!insertmacro __NSD_DefineDialogCallback Back
+
+!macro _NSD_CreateTimer FUNCTION INTERVAL
+
+ Push $0
+
+ GetFunctionAddress $0 "${FUNCTION}"
+ nsDialogs::CreateTimer $0 "${INTERVAL}"
+
+ Pop $0
+
+!macroend
+
+!define NSD_CreateTimer `!insertmacro _NSD_CreateTimer`
+
+!macro _NSD_KillTimer FUNCTION
+
+ Push $0
+
+ GetFunctionAddress $0 "${FUNCTION}"
+ nsDialogs::KillTimer $0
+
+ Pop $0
+
+!macroend
+
+!define NSD_KillTimer `!insertmacro _NSD_KillTimer`
+
+!macro _NSD_AddStyle CONTROL STYLE
+
+ Push $0
+
+ System::Call "user32::GetWindowLong(i ${CONTROL}, i ${GWL_STYLE}) i .r0"
+ System::Call "user32::SetWindowLong(i ${CONTROL}, i ${GWL_STYLE}, i $0|${STYLE})"
+
+ Pop $0
+
+!macroend
+
+!define NSD_AddStyle "!insertmacro _NSD_AddStyle"
+
+!macro _NSD_AddExStyle CONTROL EXSTYLE
+
+ Push $0
+
+ System::Call "user32::GetWindowLong(i ${CONTROL}, i ${GWL_EXSTYLE}) i .r0"
+ System::Call "user32::SetWindowLong(i ${CONTROL}, i ${GWL_EXSTYLE}, i $0|${EXSTYLE})"
+
+ Pop $0
+
+!macroend
+
+!define NSD_AddExStyle "!insertmacro _NSD_AddExStyle"
+
+!macro __NSD_GetText CONTROL VAR
+
+ System::Call user32::GetWindowText(i${CONTROL},t.s,i${NSIS_MAX_STRLEN})
+ Pop ${VAR}
+
+!macroend
+
+!define NSD_GetText `!insertmacro __NSD_GetText`
+
+!macro __NSD_SetText CONTROL TEXT
+
+ SendMessage ${CONTROL} ${WM_SETTEXT} 0 `STR:${TEXT}`
+
+!macroend
+
+!define NSD_SetText `!insertmacro __NSD_SetText`
+
+!macro _NSD_SetTextLimit CONTROL LIMIT
+
+ SendMessage ${CONTROL} ${EM_SETLIMITTEXT} ${LIMIT} 0
+
+!macroend
+
+!define NSD_SetTextLimit "!insertmacro _NSD_SetTextLimit"
+
+!macro __NSD_GetState CONTROL VAR
+
+ SendMessage ${CONTROL} ${BM_GETCHECK} 0 0 ${VAR}
+
+!macroend
+
+!define NSD_GetState `!insertmacro __NSD_GetState`
+
+!macro __NSD_SetState CONTROL STATE
+
+ SendMessage ${CONTROL} ${BM_SETCHECK} ${STATE} 0
+
+!macroend
+
+!define NSD_SetState `!insertmacro __NSD_SetState`
+
+!macro __NSD_Check CONTROL
+
+ ${NSD_SetState} ${CONTROL} ${BST_CHECKED}
+
+!macroend
+
+!define NSD_Check `!insertmacro __NSD_Check`
+
+!macro __NSD_Uncheck CONTROL
+
+ ${NSD_SetState} ${CONTROL} ${BST_UNCHECKED}
+
+!macroend
+
+!define NSD_Uncheck `!insertmacro __NSD_Uncheck`
+
+!macro __NSD_SetFocus HWND
+
+ System::Call "user32::SetFocus(i${HWND})"
+
+!macroend
+
+!define NSD_SetFocus `!insertmacro __NSD_SetFocus`
+
+!macro _NSD_CB_AddString CONTROL STRING
+
+ SendMessage ${CONTROL} ${CB_ADDSTRING} 0 `STR:${STRING}`
+
+!macroend
+
+!define NSD_CB_AddString "!insertmacro _NSD_CB_AddString"
+
+!macro _NSD_CB_SelectString CONTROL STRING
+
+ SendMessage ${CONTROL} ${CB_SELECTSTRING} -1 `STR:${STRING}`
+
+!macroend
+
+!define NSD_CB_SelectString "!insertmacro _NSD_CB_SelectString"
+
+!macro _NSD_LB_AddString CONTROL STRING
+
+ SendMessage ${CONTROL} ${LB_ADDSTRING} 0 `STR:${STRING}`
+
+!macroend
+
+!define NSD_LB_AddString "!insertmacro _NSD_LB_AddString"
+
+!macro __NSD_LB_DelString CONTROL STRING
+
+ SendMessage ${CONTROL} ${LB_DELETESTRING} 0 `STR:${STRING}`
+
+!macroend
+
+!define NSD_LB_DelString `!insertmacro __NSD_LB_DelString`
+
+!macro __NSD_LB_Clear CONTROL VAR
+
+ SendMessage ${CONTROL} ${LB_RESETCONTENT} 0 0 ${VAR}
+
+!macroend
+
+!define NSD_LB_Clear `!insertmacro __NSD_LB_Clear`
+
+!macro __NSD_LB_GetCount CONTROL VAR
+
+ SendMessage ${CONTROL} ${LB_GETCOUNT} 0 0 ${VAR}
+
+!macroend
+
+!define NSD_LB_GetCount `!insertmacro __NSD_LB_GetCount`
+
+!macro _NSD_LB_SelectString CONTROL STRING
+
+ SendMessage ${CONTROL} ${LB_SELECTSTRING} -1 `STR:${STRING}`
+
+!macroend
+
+!define NSD_LB_SelectString "!insertmacro _NSD_LB_SelectString"
+
+!macro __NSD_LB_GetSelection CONTROL VAR
+
+ SendMessage ${CONTROL} ${LB_GETCURSEL} 0 0 ${VAR}
+ System::Call 'user32::SendMessage(i ${CONTROL}, i ${LB_GETTEXT}, i ${VAR}, t .s)'
+ Pop ${VAR}
+
+!macroend
+
+!define NSD_LB_GetSelection `!insertmacro __NSD_LB_GetSelection`
+
+
+!macro __NSD_LoadAndSetImage _LIHINSTMODE _IMGTYPE _LIHINSTSRC _LIFLAGS CONTROL IMAGE HANDLE
+
+ Push $0
+ Push $R0
+
+ StrCpy $R0 ${CONTROL} # in case ${CONTROL} is $0
+
+ !if "${_LIHINSTMODE}" == "exeresource"
+ System::Call 'kernel32::GetModuleHandle(i0) i.r0'
+ !undef _LIHINSTSRC
+ !define _LIHINSTSRC r0
+ !endif
+
+ System::Call 'user32::LoadImage(i ${_LIHINSTSRC}, ts, i ${_IMGTYPE}, i0, i0, i${_LIFLAGS}) i.r0' "${IMAGE}"
+ SendMessage $R0 ${STM_SETIMAGE} ${_IMGTYPE} $0
+
+ Pop $R0
+ Exch $0
+
+ Pop ${HANDLE}
+
+!macroend
+
+!macro __NSD_SetIconFromExeResource CONTROL IMAGE HANDLE
+ !insertmacro __NSD_LoadAndSetImage exeresource ${IMAGE_ICON} 0 ${LR_DEFAULTSIZE} "${CONTROL}" "${IMAGE}" ${HANDLE}
+!macroend
+
+!macro __NSD_SetIconFromInstaller CONTROL HANDLE
+ !insertmacro __NSD_SetIconFromExeResource "${CONTROL}" "#103" ${HANDLE}
+!macroend
+
+!define NSD_SetImage `!insertmacro __NSD_LoadAndSetImage file ${IMAGE_BITMAP} 0 "${LR_LOADFROMFILE}"`
+!define NSD_SetBitmap `${NSD_SetImage}`
+
+!define NSD_SetIcon `!insertmacro __NSD_LoadAndSetImage file ${IMAGE_ICON} 0 "${LR_LOADFROMFILE}|${LR_DEFAULTSIZE}"`
+!define NSD_SetIconFromExeResource `!insertmacro __NSD_SetIconFromExeResource`
+!define NSD_SetIconFromInstaller `!insertmacro __NSD_SetIconFromInstaller`
+
+
+!macro __NSD_SetStretchedImage CONTROL IMAGE HANDLE
+
+ Push $0
+ Push $1
+ Push $2
+ Push $R0
+
+ StrCpy $R0 ${CONTROL} # in case ${CONTROL} is $0
+
+ StrCpy $1 ""
+ StrCpy $2 ""
+
+ System::Call '*(i, i, i, i) i.s'
+ Pop $0
+
+ ${If} $0 <> 0
+
+ System::Call 'user32::GetClientRect(iR0, ir0)'
+ System::Call '*$0(i, i, i .s, i .s)'
+ System::Free $0
+ Pop $1
+ Pop $2
+
+ ${EndIf}
+
+ System::Call 'user32::LoadImage(i0, ts, i ${IMAGE_BITMAP}, ir1, ir2, i${LR_LOADFROMFILE}) i.s' "${IMAGE}"
+ Pop $0
+ SendMessage $R0 ${STM_SETIMAGE} ${IMAGE_BITMAP} $0
+
+ Pop $R0
+ Pop $2
+ Pop $1
+ Exch $0
+
+ Pop ${HANDLE}
+
+!macroend
+
+!define NSD_SetStretchedImage `!insertmacro __NSD_SetStretchedImage`
+
+!macro __NSD_FreeImage IMAGE
+
+ ${If} ${IMAGE} <> 0
+
+ System::Call gdi32::DeleteObject(is) ${IMAGE}
+
+ ${EndIf}
+
+!macroend
+
+!define NSD_FreeImage `!insertmacro __NSD_FreeImage`
+!define NSD_FreeBitmap `${NSD_FreeImage}`
+
+!macro __NSD_FreeIcon IMAGE
+ System::Call user32::DestroyIcon(is) ${IMAGE}
+!macroend
+
+!define NSD_FreeIcon `!insertmacro __NSD_FreeIcon`
+
+!macro __NSD_ClearImage _IMGTYPE CONTROL
+
+ SendMessage ${CONTROL} ${STM_SETIMAGE} ${_IMGTYPE} 0
+
+!macroend
+
+!define NSD_ClearImage `!insertmacro __NSD_ClearImage ${IMAGE_BITMAP}`
+!define NSD_ClearIcon `!insertmacro __NSD_ClearImage ${IMAGE_ICON}`
+
+
+!define DEBUG `System::Call kernel32::OutputDebugString(ts)`
+
+!macro __NSD_ControlCase TYPE
+
+ ${Case} ${TYPE}
+ ${NSD_Create${TYPE}} $R3u $R4u $R5u $R6u $R7
+ Pop $R9
+ ${Break}
+
+!macroend
+
+!macro __NSD_ControlCaseEx TYPE
+
+ ${Case} ${TYPE}
+ Call ${TYPE}
+ ${Break}
+
+!macroend
+
+!macro NSD_FUNCTION_INIFILE
+
+ !insertmacro NSD_INIFILE ""
+
+!macroend
+
+!macro NSD_UNFUNCTION_INIFILE
+
+ !insertmacro NSD_INIFILE un.
+
+!macroend
+
+!macro NSD_INIFILE UNINSTALLER_FUNCPREFIX
+
+ ;Functions to create dialogs based on old InstallOptions INI files
+
+ Function ${UNINSTALLER_FUNCPREFIX}CreateDialogFromINI
+
+ # $0 = ini
+
+ ReadINIStr $R0 $0 Settings RECT
+ ${If} $R0 == ""
+ StrCpy $R0 1018
+ ${EndIf}
+
+ nsDialogs::Create $R0
+ Pop $R9
+
+ ReadINIStr $R0 $0 Settings RTL
+ nsDialogs::SetRTL $R0
+
+ ReadINIStr $R0 $0 Settings NumFields
+
+ ${DEBUG} "NumFields = $R0"
+
+ ${For} $R1 1 $R0
+ ${DEBUG} "Creating field $R1"
+ ReadINIStr $R2 $0 "Field $R1" Type
+ ${DEBUG} " Type = $R2"
+ ReadINIStr $R3 $0 "Field $R1" Left
+ ${DEBUG} " Left = $R3"
+ ReadINIStr $R4 $0 "Field $R1" Top
+ ${DEBUG} " Top = $R4"
+ ReadINIStr $R5 $0 "Field $R1" Right
+ ${DEBUG} " Right = $R5"
+ ReadINIStr $R6 $0 "Field $R1" Bottom
+ ${DEBUG} " Bottom = $R6"
+ IntOp $R5 $R5 - $R3
+ ${DEBUG} " Width = $R5"
+ IntOp $R6 $R6 - $R4
+ ${DEBUG} " Height = $R6"
+ ReadINIStr $R7 $0 "Field $R1" Text
+ ${DEBUG} " Text = $R7"
+ ${Switch} $R2
+ !insertmacro __NSD_ControlCase HLine
+ !insertmacro __NSD_ControlCase VLine
+ !insertmacro __NSD_ControlCase Label
+ !insertmacro __NSD_ControlCase Icon
+ !insertmacro __NSD_ControlCase Bitmap
+ !insertmacro __NSD_ControlCaseEx Link
+ !insertmacro __NSD_ControlCase Button
+ !insertmacro __NSD_ControlCase GroupBox
+ !insertmacro __NSD_ControlCase CheckBox
+ !insertmacro __NSD_ControlCase RadioButton
+ !insertmacro __NSD_ControlCase Text
+ !insertmacro __NSD_ControlCase Password
+ !insertmacro __NSD_ControlCaseEx FileRequest
+ !insertmacro __NSD_ControlCaseEx DirRequest
+ !insertmacro __NSD_ControlCase ComboBox
+ !insertmacro __NSD_ControlCase DropList
+ !insertmacro __NSD_ControlCase ListBox
+ ${EndSwitch}
+
+ WriteINIStr $0 "Field $R1" HWND $R9
+ ${Next}
+
+ nsDialogs::Show
+
+ FunctionEnd
+
+ Function ${UNINSTALLER_FUNCPREFIX}UpdateINIState
+
+ ${DEBUG} "Updating INI state"
+
+ ReadINIStr $R0 $0 Settings NumFields
+
+ ${DEBUG} "NumField = $R0"
+
+ ${For} $R1 1 $R0
+ ReadINIStr $R2 $0 "Field $R1" HWND
+ ReadINIStr $R3 $0 "Field $R1" "Type"
+ ${Switch} $R3
+ ${Case} "CheckBox"
+ ${Case} "RadioButton"
+ ${DEBUG} " HWND = $R2"
+ ${NSD_GetState} $R2 $R2
+ ${DEBUG} " Window selection = $R2"
+ ${Break}
+ ${CaseElse}
+ ${DEBUG} " HWND = $R2"
+ ${NSD_GetText} $R2 $R2
+ ${DEBUG} " Window text = $R2"
+ ${Break}
+ ${EndSwitch}
+ WriteINIStr $0 "Field $R1" STATE $R2
+ ${Next}
+
+ FunctionEnd
+
+ Function ${UNINSTALLER_FUNCPREFIX}FileRequest
+
+ IntOp $R5 $R5 - 15
+ IntOp $R8 $R3 + $R5
+
+ ${NSD_CreateBrowseButton} $R8u $R4u 15u $R6u ...
+ Pop $R8
+
+ nsDialogs::SetUserData $R8 $R1 # remember field id
+
+ WriteINIStr $0 "Field $R1" HWND2 $R8
+
+ ${NSD_OnClick} $R8 ${UNINSTALLER_FUNCPREFIX}OnFileBrowseButton
+
+ ReadINIStr $R9 $0 "Field $R1" State
+
+ ${NSD_CreateFileRequest} $R3u $R4u $R5u $R6u $R9
+ Pop $R9
+
+ FunctionEnd
+
+ Function ${UNINSTALLER_FUNCPREFIX}DirRequest
+
+ IntOp $R5 $R5 - 15
+ IntOp $R8 $R3 + $R5
+
+ ${NSD_CreateBrowseButton} $R8u $R4u 15u $R6u ...
+ Pop $R8
+
+ nsDialogs::SetUserData $R8 $R1 # remember field id
+
+ WriteINIStr $0 "Field $R1" HWND2 $R8
+
+ ${NSD_OnClick} $R8 ${UNINSTALLER_FUNCPREFIX}OnDirBrowseButton
+
+ ReadINIStr $R9 $0 "Field $R1" State
+
+ ${NSD_CreateFileRequest} $R3u $R4u $R5u $R6u $R9
+ Pop $R9
+
+ FunctionEnd
+
+ Function ${UNINSTALLER_FUNCPREFIX}OnFileBrowseButton
+
+ Pop $R0
+
+ nsDialogs::GetUserData $R0
+ Pop $R1
+
+ ReadINIStr $R2 $0 "Field $R1" HWND
+ ReadINIStr $R4 $0 "Field $R1" Filter
+
+ ${NSD_GetText} $R2 $R3
+
+ nsDialogs::SelectFileDialog save $R3 $R4
+ Pop $R3
+
+ ${If} $R3 != ""
+ SendMessage $R2 ${WM_SETTEXT} 0 STR:$R3
+ ${EndIf}
+
+ FunctionEnd
+
+ Function ${UNINSTALLER_FUNCPREFIX}OnDirBrowseButton
+
+ Pop $R0
+
+ nsDialogs::GetUserData $R0
+ Pop $R1
+
+ ReadINIStr $R2 $0 "Field $R1" HWND
+ ReadINIStr $R3 $0 "Field $R1" Text
+
+ ${NSD_GetText} $R2 $R4
+
+ nsDialogs::SelectFolderDialog $R3 $R4
+ Pop $R3
+
+ ${If} $R3 != error
+ SendMessage $R2 ${WM_SETTEXT} 0 STR:$R3
+ ${EndIf}
+
+ FunctionEnd
+
+ Function ${UNINSTALLER_FUNCPREFIX}Link
+
+ ${NSD_CreateLink} $R3u $R4u $R5u $R6u $R7
+ Pop $R9
+
+ nsDialogs::SetUserData $R9 $R1 # remember field id
+
+ ${NSD_OnClick} $R9 ${UNINSTALLER_FUNCPREFIX}OnLink
+
+ FunctionEnd
+
+ Function ${UNINSTALLER_FUNCPREFIX}OnLink
+
+ Pop $R0
+
+ nsDialogs::GetUserData $R0
+ Pop $R1
+
+ ReadINIStr $R1 $0 "Field $R1" STATE
+
+ ExecShell "" $R1
+
+ FunctionEnd
+
+!macroend
+
+!verbose pop
+!endif
diff --git a/Engine/bin/tools/nsis/app/Include/x64.nsh b/Engine/bin/tools/nsis/app/Include/x64.nsh
new file mode 100644
index 000000000..e694c1e61
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Include/x64.nsh
@@ -0,0 +1,54 @@
+; ---------------------
+; x64.nsh
+; ---------------------
+;
+; A few simple macros to handle installations on x64 machines.
+;
+; RunningX64 checks if the installer is running on x64.
+;
+; ${If} ${RunningX64}
+; MessageBox MB_OK "running on x64"
+; ${EndIf}
+;
+; DisableX64FSRedirection disables file system redirection.
+; EnableX64FSRedirection enables file system redirection.
+;
+; SetOutPath $SYSDIR
+; ${DisableX64FSRedirection}
+; File some.dll # extracts to C:\Windows\System32
+; ${EnableX64FSRedirection}
+; File some.dll # extracts to C:\Windows\SysWOW64
+;
+
+!ifndef ___X64__NSH___
+!define ___X64__NSH___
+
+!include LogicLib.nsh
+
+!macro _RunningX64 _a _b _t _f
+ !insertmacro _LOGICLIB_TEMP
+ System::Call kernel32::GetCurrentProcess()i.s
+ System::Call kernel32::IsWow64Process(is,*i.s)
+ Pop $_LOGICLIB_TEMP
+ !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`
+!macroend
+
+!define RunningX64 `"" RunningX64 ""`
+
+!macro DisableX64FSRedirection
+
+ System::Call kernel32::Wow64EnableWow64FsRedirection(i0)
+
+!macroend
+
+!define DisableX64FSRedirection "!insertmacro DisableX64FSRedirection"
+
+!macro EnableX64FSRedirection
+
+ System::Call kernel32::Wow64EnableWow64FsRedirection(i1)
+
+!macroend
+
+!define EnableX64FSRedirection "!insertmacro EnableX64FSRedirection"
+
+!endif # !___X64__NSH___
diff --git a/Engine/bin/tools/nsis/app/Menu/images/header.gif b/Engine/bin/tools/nsis/app/Menu/images/header.gif
new file mode 100644
index 000000000..9f20998a2
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Menu/images/header.gif differ
diff --git a/Engine/bin/tools/nsis/app/Menu/images/line.gif b/Engine/bin/tools/nsis/app/Menu/images/line.gif
new file mode 100644
index 000000000..ed78ca4a8
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Menu/images/line.gif differ
diff --git a/Engine/bin/tools/nsis/app/Menu/images/site.gif b/Engine/bin/tools/nsis/app/Menu/images/site.gif
new file mode 100644
index 000000000..7569a960b
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Menu/images/site.gif differ
diff --git a/Engine/bin/tools/nsis/app/Menu/index.html b/Engine/bin/tools/nsis/app/Menu/index.html
new file mode 100644
index 000000000..b88a49d9e
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/Menu/index.html
@@ -0,0 +1,63 @@
+
+
+
+

+
+
+ 
+
+
+
diff --git a/Engine/bin/tools/nsis/app/NSIS.chm b/Engine/bin/tools/nsis/app/NSIS.chm
new file mode 100644
index 000000000..99e82dcf3
Binary files /dev/null and b/Engine/bin/tools/nsis/app/NSIS.chm differ
diff --git a/Engine/bin/tools/nsis/app/NSIS.exe b/Engine/bin/tools/nsis/app/NSIS.exe
new file mode 100644
index 000000000..9eef20106
Binary files /dev/null and b/Engine/bin/tools/nsis/app/NSIS.exe differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/AdvSplash.dll b/Engine/bin/tools/nsis/app/Plugins/AdvSplash.dll
new file mode 100644
index 000000000..bfe841e98
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/AdvSplash.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/Banner.dll b/Engine/bin/tools/nsis/app/Plugins/Banner.dll
new file mode 100644
index 000000000..b7d05bd5e
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/Banner.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/BgImage.dll b/Engine/bin/tools/nsis/app/Plugins/BgImage.dll
new file mode 100644
index 000000000..752df2165
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/BgImage.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/Dialer.dll b/Engine/bin/tools/nsis/app/Plugins/Dialer.dll
new file mode 100644
index 000000000..f2193bb43
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/Dialer.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/InstallOptions.dll b/Engine/bin/tools/nsis/app/Plugins/InstallOptions.dll
new file mode 100644
index 000000000..98d31afa3
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/InstallOptions.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/LangDLL.dll b/Engine/bin/tools/nsis/app/Plugins/LangDLL.dll
new file mode 100644
index 000000000..f42721867
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/LangDLL.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/Math.dll b/Engine/bin/tools/nsis/app/Plugins/Math.dll
new file mode 100644
index 000000000..e3ef85869
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/Math.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/NSISdl.dll b/Engine/bin/tools/nsis/app/Plugins/NSISdl.dll
new file mode 100644
index 000000000..7e8dc873b
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/NSISdl.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/Splash.dll b/Engine/bin/tools/nsis/app/Plugins/Splash.dll
new file mode 100644
index 000000000..1817bbf7d
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/Splash.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/StartMenu.dll b/Engine/bin/tools/nsis/app/Plugins/StartMenu.dll
new file mode 100644
index 000000000..dd5675584
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/StartMenu.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/System.dll b/Engine/bin/tools/nsis/app/Plugins/System.dll
new file mode 100644
index 000000000..1f65d2e39
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/System.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/TypeLib.dll b/Engine/bin/tools/nsis/app/Plugins/TypeLib.dll
new file mode 100644
index 000000000..dcfbc7da5
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/TypeLib.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/UserInfo.dll b/Engine/bin/tools/nsis/app/Plugins/UserInfo.dll
new file mode 100644
index 000000000..441f1933d
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/UserInfo.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/VPatch.dll b/Engine/bin/tools/nsis/app/Plugins/VPatch.dll
new file mode 100644
index 000000000..85137310d
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/VPatch.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/nsDialogs.dll b/Engine/bin/tools/nsis/app/Plugins/nsDialogs.dll
new file mode 100644
index 000000000..47ed954db
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/nsDialogs.dll differ
diff --git a/Engine/bin/tools/nsis/app/Plugins/nsExec.dll b/Engine/bin/tools/nsis/app/Plugins/nsExec.dll
new file mode 100644
index 000000000..f50e26f15
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Plugins/nsExec.dll differ
diff --git a/Engine/bin/tools/nsis/app/Stubs/bzip2 b/Engine/bin/tools/nsis/app/Stubs/bzip2
new file mode 100644
index 000000000..379eecee6
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Stubs/bzip2 differ
diff --git a/Engine/bin/tools/nsis/app/Stubs/bzip2_solid b/Engine/bin/tools/nsis/app/Stubs/bzip2_solid
new file mode 100644
index 000000000..45d98bca8
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Stubs/bzip2_solid differ
diff --git a/Engine/bin/tools/nsis/app/Stubs/lzma b/Engine/bin/tools/nsis/app/Stubs/lzma
new file mode 100644
index 000000000..2469f5158
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Stubs/lzma differ
diff --git a/Engine/bin/tools/nsis/app/Stubs/lzma_solid b/Engine/bin/tools/nsis/app/Stubs/lzma_solid
new file mode 100644
index 000000000..f845fa507
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Stubs/lzma_solid differ
diff --git a/Engine/bin/tools/nsis/app/Stubs/uninst b/Engine/bin/tools/nsis/app/Stubs/uninst
new file mode 100644
index 000000000..90d7d2252
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Stubs/uninst differ
diff --git a/Engine/bin/tools/nsis/app/Stubs/zlib b/Engine/bin/tools/nsis/app/Stubs/zlib
new file mode 100644
index 000000000..f78924c0b
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Stubs/zlib differ
diff --git a/Engine/bin/tools/nsis/app/Stubs/zlib_solid b/Engine/bin/tools/nsis/app/Stubs/zlib_solid
new file mode 100644
index 000000000..9f73a72d2
Binary files /dev/null and b/Engine/bin/tools/nsis/app/Stubs/zlib_solid differ
diff --git a/Engine/bin/tools/nsis/app/makensis.exe b/Engine/bin/tools/nsis/app/makensis.exe
new file mode 100644
index 000000000..13c943aaf
Binary files /dev/null and b/Engine/bin/tools/nsis/app/makensis.exe differ
diff --git a/Engine/bin/tools/nsis/app/makensisw.exe b/Engine/bin/tools/nsis/app/makensisw.exe
new file mode 100644
index 000000000..5032a0a46
Binary files /dev/null and b/Engine/bin/tools/nsis/app/makensisw.exe differ
diff --git a/Engine/bin/tools/nsis/app/nsisconf.nsh b/Engine/bin/tools/nsis/app/nsisconf.nsh
new file mode 100644
index 000000000..48a491590
--- /dev/null
+++ b/Engine/bin/tools/nsis/app/nsisconf.nsh
@@ -0,0 +1,62 @@
+;------------------------
+;DEFAULT NSIS CONFIG FILE
+;------------------------
+
+;This header file will be included when compiling any NSIS installer,
+;you can use it to add script code to every installer you compile.
+
+;This file is treated as if it is in the directory of your script.
+;When using relative paths, the files have to be in your build directory.
+
+;------------------------
+;EXAMPLES
+;------------------------
+
+;Compress installer exehead with an executable compressor (such as UPX / Petite).
+
+;Paths should be absolute to allow building from any location.
+;Note that your executable compressor should not compress the first icon.
+
+;!packhdr temp.dat '"C:\Program Files\upx\upx" -9 -q temp.dat'
+;!packhdr temp.dat '"C:\Program Files\petite\petite" -9 -b0 -r** -p0 -y temp.dat'
+
+;------------------------
+
+;Set default compressor
+
+;SetCompressor bzip2
+
+;------------------------
+
+;Change the default icons
+
+;Icon "${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico"
+;UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico"
+
+;------------------------
+
+;Define symbols
+
+;!define COMPANYNAME "bla"
+
+;------------------------
+;MODERN UI
+;------------------------
+
+;The Modern UI will insert the MUI_NSISCONF macro just before processing the settings.
+;Here you can set default settings for the Modern UI.
+
+;------------------------
+
+!define MUI_INSERT_NSISCONF
+
+!macro MUI_NSISCONF
+
+ ;Example: Change the default Modern UI icons
+
+ ;!ifndef MUI_ICON & MUI_UNICON
+ ; !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico"
+ ; !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico"
+ ;!endif
+
+!macroend
\ No newline at end of file
diff --git a/Engine/bin/tools/nsis/app/uninst-nsis.exe b/Engine/bin/tools/nsis/app/uninst-nsis.exe
new file mode 100644
index 000000000..30218272e
Binary files /dev/null and b/Engine/bin/tools/nsis/app/uninst-nsis.exe differ
diff --git a/Engine/bin/tools/nsis/scripts/templates/default_template.nsi b/Engine/bin/tools/nsis/scripts/templates/default_template.nsi
new file mode 100644
index 000000000..ddac501c7
--- /dev/null
+++ b/Engine/bin/tools/nsis/scripts/templates/default_template.nsi
@@ -0,0 +1,151 @@
+;NSIS Modern User Interface version 1.70
+
+;--------------------------------
+;Include Modern UI
+
+!include "MUI.nsh"
+
+;--------------------------------
+;General
+
+!define REG_KEY ""
+
+;Name and file
+Name ""
+OutFile ""
+
+;Default installation folder
+InstallDir ""
+InstallDirRegKey HKLM "${REG_KEY}" "Install_Dir"
+DirText "This will install the $(^Name) on your computer. Please choose a directory"
+BrandingText ""
+
+;--------------------------------
+;Interface Settings
+
+!define MUI_ABORTWARNING
+!define MUI_ICON "\main.ico"
+!define MUI_UNICON "\main.ico"
+!define MUI_COMPONENTSPAGE_SMALLDESC
+!define MUI_HEADERIMAGE
+!define MUI_WELCOMEFINISHPAGE_BITMAP ""
+!define MUI_HEADERIMAGE_BITMAP ""
+
+
+
+;--------------------------------
+;Pages
+
+!insertmacro MUI_PAGE_WELCOME
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+
+
+;--------------------------------
+;Languages
+
+!insertmacro MUI_LANGUAGE "English"
+
+;--------------------------------
+; Game section
+
+Section "!$(^Name) (required)" SecGame
+ SectionIn RO
+ SetOutPath "$INSTDIR"
+ File "\Engine\bin\tools\getD3DXVer\app\getD3DXVer.exe"
+ File "\Engine\bin\tools\dxwebsetup\dxwebsetup.exe"
+ File /r ""
+
+ ; Start Menu
+ SetOutPath "$SMPROGRAMS\$(^Name)"
+
+
+ SetOutPath "$INSTDIR"
+
+
+ ; Web registry settings
+
+
+ ; Registry uninstall
+ WriteRegStr HKLM "${REG_KEY}" "" $INSTDIR
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" \
+ "DisplayName" "$(^Name) (remove only)"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" \
+ "UninstallString" '"$INSTDIR\uninst-$(^Name).exe"'
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" \
+ "DisplayIcon" "$INSTDIR\uninst-$(^Name).exe"
+
+
+ ; Check for DX and D3DX version
+ ExecWait "$INSTDIR\getD3DXVer.exe"
+ IfErrors AskDXInstall NoDXInstall
+
+ AskDXInstall:
+ MessageBox MB_YESNO|MB_ICONQUESTION \
+ "$(^Name) requires a newer version of DirectX than you have installed on your computer. Would you like to launch the Microsoft DirectX web installer?" IDNO NoDXInstall
+
+ ; Install DirectX from the web
+ ExecWait "$INSTDIR\dxwebsetup.exe"
+ IfErrors NoDXInstall NoDXInstall
+
+ NoDXInstall:
+ ; Do nothing and go onto the next step.
+
+ ;Create uninstaller
+ WriteUninstaller "$INSTDIR\uninst-$(^Name).exe"
+SectionEnd
+
+;--------------------------------
+; Desktop Shortcut
+
+Section "Desktop Shortcut" SecDesktop
+ ; Desktop
+ SetOutPath "$INSTDIR"
+
+SectionEnd
+
+;--------------------------------
+; Readme at the end
+
+
+
+;--------------------------------
+; Uninstaller
+
+Section Uninstall
+ MessageBox MB_YESNO|MB_ICONQUESTION \
+ "Everything in the $(^Name) directory will be deleted. Are you sure you wish to uninstall the $(^Name)?" \
+ IDNO Removed
+
+ ; Shortcuts
+
+ RMDir "$SMPROGRAMS\$(^Name)"
+
+ ; Registry
+ DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
+ DeleteRegKey HKLM "${REG_KEY}"
+
+ ; Web registry uninstall settings
+
+
+ ; SDK Source and Binaries
+ RMDir /r $INSTDIR
+ IfFileExists $INSTDIR 0 Removed
+ MessageBox MB_OK|MB_ICONEXCLAMATION \
+ "Note: $INSTDIR could not be removed."
+ Removed:
+SectionEnd
+
+;--------------------------------
+;Descriptions
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+!insertmacro MUI_DESCRIPTION_TEXT ${SecGame} "Install $(^Name). This component is required."
+!insertmacro MUI_DESCRIPTION_TEXT ${SecDesktop} "Create a shortcut on your desktop"
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
diff --git a/Engine/bin/tools/nsis/scripts/templates/header.bmp b/Engine/bin/tools/nsis/scripts/templates/header.bmp
new file mode 100644
index 000000000..427569692
Binary files /dev/null and b/Engine/bin/tools/nsis/scripts/templates/header.bmp differ
diff --git a/Engine/bin/tools/nsis/scripts/templates/main.ico b/Engine/bin/tools/nsis/scripts/templates/main.ico
new file mode 100644
index 000000000..4ae7cd5c2
Binary files /dev/null and b/Engine/bin/tools/nsis/scripts/templates/main.ico differ
diff --git a/Engine/bin/tools/nsis/scripts/templates/panel.bmp b/Engine/bin/tools/nsis/scripts/templates/panel.bmp
new file mode 100644
index 000000000..bdb1a3f08
Binary files /dev/null and b/Engine/bin/tools/nsis/scripts/templates/panel.bmp differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/CodeResources b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/CodeResources
new file mode 100644
index 000000000..ff157bc6f
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/CodeResources
@@ -0,0 +1,1010 @@
+
+
+
+
+ files
+
+ Resources/ActionDefinitions.plist
+
+ /s046M3E9gduZSjM4B0SS7Lu8nw=
+
+ Resources/ActionViewClose.tif
+
+ lE4SbNTYPsSW4WgVTQKBRKGK6Pg=
+
+ Resources/ActionViewClose_Pressed.tif
+
+ SZL09wG0esOdJoaaMhdOgesGxzA=
+
+ Resources/CertLargeStd.tif
+
+ IoQEO8e6RexAT6xANCvdvOP7K3Q=
+
+ Resources/Choose.tif
+
+ qFdye0kIFjPFXIcDNTDlcieV3tQ=
+
+ Resources/Choose_Pressed.tif
+
+ bEcVXwXIrVJF4G9olTn7thdbOB8=
+
+ Resources/DotBlue.tif
+
+ 5Y6wCt6jVcGRxPtAS/oejum52io=
+
+ Resources/DotBlueDisabled.tif
+
+ ui+Tt0nwiXpRzz5XbZEpnHeFNzY=
+
+ Resources/DotGray.tif
+
+ 5qu1Zzw6oSTcAP8awVYgK/MUQZM=
+
+ Resources/EditInterface.tif
+
+ f0DPZw6TRDSpijhMOtxfBuTGwag=
+
+ Resources/English.lproj/ActionView.nib/classes.nib
+
+ hash
+
+ wlDzATZxXkRLcewRCQXNH+6mgyA=
+
+ optional
+
+
+ Resources/English.lproj/ActionView.nib/info.nib
+
+ hash
+
+ OHsp5op+GCw7Jtc/uBFKFfgYxG4=
+
+ optional
+
+
+ Resources/English.lproj/ActionView.nib/keyedobjects.nib
+
+ hash
+
+ lDy0+lddzKjifOqryfWq0ottgKY=
+
+ optional
+
+
+ Resources/English.lproj/ActionViews.nib/classes.nib
+
+ hash
+
+ Bf4wGem0G1dlFgW4YihJ2SfK+9Q=
+
+ optional
+
+
+ Resources/English.lproj/ActionViews.nib/info.nib
+
+ hash
+
+ CMFBJq/FB6PyZjh+A7O/8jpvbSQ=
+
+ optional
+
+
+ Resources/English.lproj/ActionViews.nib/keyedobjects.nib
+
+ hash
+
+ C+HpMBRLAIBchF84D61stCyCAzc=
+
+ optional
+
+
+ Resources/English.lproj/AddLocalization.nib/classes.nib
+
+ hash
+
+ VEGk22bu1DtCnPZ3jzeIhXqnx0g=
+
+ optional
+
+
+ Resources/English.lproj/AddLocalization.nib/info.nib
+
+ hash
+
+ R5eZDgfRAcs0KG6WN9sQnfl6Nqo=
+
+ optional
+
+
+ Resources/English.lproj/AddLocalization.nib/keyedobjects.nib
+
+ hash
+
+ JJmCYYdyh8TurmD/OpK8RCO6E+I=
+
+ optional
+
+
+ Resources/English.lproj/BuildResult.strings
+
+ hash
+
+ Wh+M1LelZl9yy2pWCCNlXO0r5y4=
+
+ optional
+
+
+ Resources/English.lproj/BuildResultsWindow.nib/classes.nib
+
+ hash
+
+ L+06xToD6abSN7duvw9xygopmhs=
+
+ optional
+
+
+ Resources/English.lproj/BuildResultsWindow.nib/info.nib
+
+ hash
+
+ PU7rM8x2Vl00cikD+7kNhqvmH64=
+
+ optional
+
+
+ Resources/English.lproj/BuildResultsWindow.nib/keyedobjects.nib
+
+ hash
+
+ e2mdMCA7w/+u2xp9G3AzkJP1THg=
+
+ optional
+
+
+ Resources/English.lproj/CertificatePanel.nib/classes.nib
+
+ hash
+
+ 9HlefBHMrfNYTVgXDUrCEzBXHU8=
+
+ optional
+
+
+ Resources/English.lproj/CertificatePanel.nib/info.nib
+
+ hash
+
+ T4dZkMAdao3AgWYsBPLBXIMoEqA=
+
+ optional
+
+
+ Resources/English.lproj/CertificatePanel.nib/keyedobjects.nib
+
+ hash
+
+ +pwS6046eh3cNabvQJmPk0fmmh4=
+
+ optional
+
+
+ Resources/English.lproj/ComponentScripts.nib/classes.nib
+
+ hash
+
+ NWCRJXpvon4/3OQo+uCZ+XXhSHU=
+
+ optional
+
+
+ Resources/English.lproj/ComponentScripts.nib/info.nib
+
+ hash
+
+ 8gPmExYbBY8SZu7ZubVYpWLaVS0=
+
+ optional
+
+
+ Resources/English.lproj/ComponentScripts.nib/keyedobjects.nib
+
+ hash
+
+ HOdzi22zSo7aQ5UQTl2adS3Pt8s=
+
+ optional
+
+
+ Resources/English.lproj/EditActions.nib/classes.nib
+
+ hash
+
+ ezTCEo1hj2upHAsag2gBErUHC5U=
+
+ optional
+
+
+ Resources/English.lproj/EditActions.nib/info.nib
+
+ hash
+
+ HQ0F6pMUXZ34N7lnKHuBQQe+lf4=
+
+ optional
+
+
+ Resources/English.lproj/EditActions.nib/keyedobjects.nib
+
+ hash
+
+ fQHBqo3vJWg0qBl70KVekSQrmo8=
+
+ optional
+
+
+ Resources/English.lproj/EditPathMapping.nib/classes.nib
+
+ hash
+
+ VqIp7LXNrRFMTHg99RdqmnNk6QE=
+
+ optional
+
+
+ Resources/English.lproj/EditPathMapping.nib/info.nib
+
+ hash
+
+ fGViLJrO73oUSQcrt4bG7ZjlMBI=
+
+ optional
+
+
+ Resources/English.lproj/EditPathMapping.nib/keyedobjects.nib
+
+ hash
+
+ AfaHh9L4EnsXHSeYZzKrGW6CsZc=
+
+ optional
+
+
+ Resources/English.lproj/ErrorsAndWarningsHeaderRow.nib/classes.nib
+
+ hash
+
+ 7i6svfuktGOw9zd7AAnggzW92N0=
+
+ optional
+
+
+ Resources/English.lproj/ErrorsAndWarningsHeaderRow.nib/info.nib
+
+ hash
+
+ SiaJSojX+7hvpDxU/8SCSVOWpcg=
+
+ optional
+
+
+ Resources/English.lproj/ErrorsAndWarningsHeaderRow.nib/keyedobjects.nib
+
+ hash
+
+ 8cxR0Tg+ATvuExhQBNEq1aRmOqk=
+
+ optional
+
+
+ Resources/English.lproj/ErrorsAndWarningsRow.nib/classes.nib
+
+ hash
+
+ SkRDYWNWooHIWeeJMlFsQzwj/O0=
+
+ optional
+
+
+ Resources/English.lproj/ErrorsAndWarningsRow.nib/info.nib
+
+ hash
+
+ bMNZiKgA2altrNVopM8b8FHuQUY=
+
+ optional
+
+
+ Resources/English.lproj/ErrorsAndWarningsRow.nib/keyedobjects.nib
+
+ hash
+
+ j52YLuw1fiEi+VKoaoL9s73+FI0=
+
+ optional
+
+
+ Resources/English.lproj/FSEventsPanels.nib/classes.nib
+
+ hash
+
+ MBYurMv7UhVqsEyu/Z8159lv63k=
+
+ optional
+
+
+ Resources/English.lproj/FSEventsPanels.nib/info.nib
+
+ hash
+
+ sr2/egfO19N6Qptbnn9vEHgc3g4=
+
+ optional
+
+
+ Resources/English.lproj/FSEventsPanels.nib/keyedobjects.nib
+
+ hash
+
+ aLde5jLlAp3odqtWxt6G+NAn0sk=
+
+ optional
+
+
+ Resources/English.lproj/FileFilters.nib/classes.nib
+
+ hash
+
+ U1Y2L1Ow/hJk4B6cBGdsFl0X46o=
+
+ optional
+
+
+ Resources/English.lproj/FileFilters.nib/info.nib
+
+ hash
+
+ 2ShD6C6Zt4EzKMP++PRffMPZC7U=
+
+ optional
+
+
+ Resources/English.lproj/FileFilters.nib/keyedobjects.nib
+
+ hash
+
+ pMrvzwrMMWYQOfXt8UVar6SBJCM=
+
+ optional
+
+
+ Resources/English.lproj/IEDefault-background.rtf
+
+ hash
+
+ AFy4dllbvQeUx64hQKJ+F00Q3ko=
+
+ optional
+
+
+ Resources/English.lproj/IEDefault-conclusion.rtf
+
+ hash
+
+ 70UC26Uy7N1zUvGW/3a7h1wS9Hg=
+
+ optional
+
+
+ Resources/English.lproj/IEDefault-license.rtf
+
+ hash
+
+ nV6KCsBQpXtN7maWE+iux+DcN0Q=
+
+ optional
+
+
+ Resources/English.lproj/IEDefault-readme.rtf
+
+ hash
+
+ 5AtADKK2RKsuZUvGzNc76LDh/PY=
+
+ optional
+
+
+ Resources/English.lproj/IEDefault-welcome.rtf
+
+ hash
+
+ FXoBVAtwdTn/t+WCH7zX2wBNFQ0=
+
+ optional
+
+
+ Resources/English.lproj/InfoPlist.strings
+
+ hash
+
+ 0deEKCq+afFmFZwK5Bs6hwNHCbM=
+
+ optional
+
+
+ Resources/English.lproj/InterfaceEditor.nib/classes.nib
+
+ hash
+
+ K9KXZko4qPAzrNhPgOOwrhZ99u8=
+
+ optional
+
+
+ Resources/English.lproj/InterfaceEditor.nib/info.nib
+
+ hash
+
+ lx9gBV48MnH+9ECz4PBLDKJlovI=
+
+ optional
+
+
+ Resources/English.lproj/InterfaceEditor.nib/keyedobjects.nib
+
+ hash
+
+ QqmSOoAUJPUgCdesOjZJjgzrnbA=
+
+ optional
+
+
+ Resources/English.lproj/MainMenu.nib/classes.nib
+
+ hash
+
+ 870l0FvqvQxVdmVwPpy5xt/11Mk=
+
+ optional
+
+
+ Resources/English.lproj/MainMenu.nib/info.nib
+
+ hash
+
+ X5uJCg0i5AggdZASw32GD9gSCx8=
+
+ optional
+
+
+ Resources/English.lproj/MainMenu.nib/keyedobjects.nib
+
+ hash
+
+ lhLKF6e9J11SZWys91Kcde4Efg0=
+
+ optional
+
+
+ Resources/English.lproj/MainWindow.nib/classes.nib
+
+ hash
+
+ PC6HbYCt26LBceoG4Rkp2GhP44Y=
+
+ optional
+
+
+ Resources/English.lproj/MainWindow.nib/data.dependency
+
+ hash
+
+ GmF6ksjncUWZWNdQMAbPtx87JAU=
+
+ optional
+
+
+ Resources/English.lproj/MainWindow.nib/info.nib
+
+ hash
+
+ dMaIjDJgekgsGRWxl41B8pqRvp4=
+
+ optional
+
+
+ Resources/English.lproj/MainWindow.nib/keyedobjects.nib
+
+ hash
+
+ hl8mDR0WzVvjqjjSMc8WMC8ztqQ=
+
+ optional
+
+
+ Resources/English.lproj/PackageFlags.nib/classes.nib
+
+ hash
+
+ 6xFm17IEwMF65n5q8gLjMEkMZBo=
+
+ optional
+
+
+ Resources/English.lproj/PackageFlags.nib/info.nib
+
+ hash
+
+ fZf6y2ESCsNtwa/9xf2U7Byzic8=
+
+ optional
+
+
+ Resources/English.lproj/PackageFlags.nib/keyedobjects.nib
+
+ hash
+
+ t1KroPt1uSfrdpp2VOiFFd7w6zU=
+
+ optional
+
+
+ Resources/English.lproj/PatchPackageConfiguration.nib/classes.nib
+
+ hash
+
+ Vtf+Da1WEPBYjwc+hIerQJoYgas=
+
+ optional
+
+
+ Resources/English.lproj/PatchPackageConfiguration.nib/info.nib
+
+ hash
+
+ WrI9iHNHl3fxurLK5bwpuQheGrA=
+
+ optional
+
+
+ Resources/English.lproj/PatchPackageConfiguration.nib/keyedobjects.nib
+
+ hash
+
+ 51F3y8AhUCOSQNf/q/YjItJSijA=
+
+ optional
+
+
+ Resources/English.lproj/Preferences.nib/classes.nib
+
+ hash
+
+ piD/HU3Ez+HVKkLJOA0oG6lW0yw=
+
+ optional
+
+
+ Resources/English.lproj/Preferences.nib/info.nib
+
+ hash
+
+ 6kwG1CYbi5E44bu2QGV07UVHL/g=
+
+ optional
+
+
+ Resources/English.lproj/Preferences.nib/keyedobjects.nib
+
+ hash
+
+ WklByaSOZ3ob0ggbCoAY4P9Ca1Y=
+
+ optional
+
+
+ Resources/English.lproj/Properties.nib/classes.nib
+
+ hash
+
+ UItG/g/phL/ieGk2fgNroqZZwXI=
+
+ optional
+
+
+ Resources/English.lproj/Properties.nib/info.nib
+
+ hash
+
+ WN+vriwUOi9/Ab4IhjNvizT1DhE=
+
+ optional
+
+
+ Resources/English.lproj/Properties.nib/keyedobjects.nib
+
+ hash
+
+ Kuo8VAXaSL+0df0zfYafoaklkGg=
+
+ optional
+
+
+ Resources/English.lproj/RawEdit.nib/classes.nib
+
+ hash
+
+ AajMo0sGwN7r46OXicsH6g8HRR0=
+
+ optional
+
+
+ Resources/English.lproj/RawEdit.nib/data.dependency
+
+ hash
+
+ ShgMDB0wiwt2tCaiXvjKVFCLdaw=
+
+ optional
+
+
+ Resources/English.lproj/RawEdit.nib/info.nib
+
+ hash
+
+ QALfOzWp9dzCpSyD0wFOB116X7Q=
+
+ optional
+
+
+ Resources/English.lproj/RawEdit.nib/keyedobjects.nib
+
+ hash
+
+ zjheA/0Z04nkZzgvimfulc05iPg=
+
+ optional
+
+
+ Resources/English.lproj/RecommendationProgress.nib/classes.nib
+
+ hash
+
+ i4YZMJmZgdq6lhVbsPgKLBQrKOU=
+
+ optional
+
+
+ Resources/English.lproj/RecommendationProgress.nib/info.nib
+
+ hash
+
+ 5tiATBROnZG2qdeaOGFRtkGTn2E=
+
+ optional
+
+
+ Resources/English.lproj/RecommendationProgress.nib/keyedobjects.nib
+
+ hash
+
+ MVb3PTbWB7MN+msiQeBvmaseyKE=
+
+ optional
+
+
+ Resources/English.lproj/RequirementPanel.nib/classes.nib
+
+ hash
+
+ MLQaKgcCvU9Ye9HIJvJ2mgbf3ZI=
+
+ optional
+
+
+ Resources/English.lproj/RequirementPanel.nib/info.nib
+
+ hash
+
+ wFyvKumxMIHiIV536zyfeuXdCgU=
+
+ optional
+
+
+ Resources/English.lproj/RequirementPanel.nib/keyedobjects.nib
+
+ hash
+
+ /+iOTfVdsqD/exuod7vvHbiFcW0=
+
+ optional
+
+
+ Resources/English.lproj/SidebarChoiceRow.nib/classes.nib
+
+ hash
+
+ rITsS6zN33wbIcmp1UxlyMYMpXo=
+
+ optional
+
+
+ Resources/English.lproj/SidebarChoiceRow.nib/info.nib
+
+ hash
+
+ X1TYFO3C6GmS3dZSeY3rIqP1Wt8=
+
+ optional
+
+
+ Resources/English.lproj/SidebarChoiceRow.nib/keyedobjects.nib
+
+ hash
+
+ qVr7RG1sTrY23oL1pyMBUYpIVrw=
+
+ optional
+
+
+ Resources/English.lproj/SidebarRow.nib/classes.nib
+
+ hash
+
+ sf8+9Y27wMdjobWzRwd2BOESVJ4=
+
+ optional
+
+
+ Resources/English.lproj/SidebarRow.nib/info.nib
+
+ hash
+
+ RJzezDqZp1/+mERXCkNPFwEE3fw=
+
+ optional
+
+
+ Resources/English.lproj/SidebarRow.nib/keyedobjects.nib
+
+ hash
+
+ PYZIndmbkOia7dBGcA6k30etYqw=
+
+ optional
+
+
+ Resources/English.lproj/WrapperRow.nib/classes.nib
+
+ hash
+
+ sf8+9Y27wMdjobWzRwd2BOESVJ4=
+
+ optional
+
+
+ Resources/English.lproj/WrapperRow.nib/info.nib
+
+ hash
+
+ 2CTv3COwBQdnLuxz/09mpSIQgLs=
+
+ optional
+
+
+ Resources/English.lproj/WrapperRow.nib/keyedobjects.nib
+
+ hash
+
+ ODuvH9EypULN5tz/VX2S6m9K5B0=
+
+ optional
+
+
+ Resources/Finder.icns
+
+ GoJ1k98gq+B5r9JhFhHgY8TaVMQ=
+
+ Resources/Installer.icns
+
+ Y3XVOjseI5dTfs7TxbwuPoO1T9A=
+
+ Resources/MagGlass.tif
+
+ ghwgm9KPWPc8oGNaCz/oz6sk1/c=
+
+ Resources/MagGlass_Hover.tif
+
+ ekixdX2Q3wgQGx6wdlshJc8M478=
+
+ Resources/PackageMakerDoc.icns
+
+ fSbIm2TQWF0cCFZOciAWW/QhOn0=
+
+ Resources/RawMode.tif
+
+ h22N3wZte5ST3HQMZkzQMEoKLAg=
+
+ Resources/SplitForks
+
+ jF+7Vag/sOjeY/XL3U+yHXtBYbU=
+
+ Resources/action.tif
+
+ +4r0vrLT+cELZiQLUScEGIEEOUw=
+
+ Resources/action_small.tif
+
+ K6hsVSdsFAja9VmA2lyJzKRXfro=
+
+ Resources/add.tif
+
+ mB6TwOLeivDN8su1WleOZooiihk=
+
+ Resources/build.tiff
+
+ 9qlc/AQyvWPU1Ikx3UMIT4EuL1Y=
+
+ Resources/buildandrun.tiff
+
+ s8HObUIOVZfVBFLvyEGkxT8xJxQ=
+
+ Resources/contents_control_bg.tif
+
+ 6rPER+hL4o0vED0lVxqyc24Rpjg=
+
+ Resources/defaultBackground.tif
+
+ WBN42ugXQUZunKTT7ALxoUM3AK8=
+
+ Resources/dragBadge1-2.tiff
+
+ sJ4Vt5aaBubWHdKHP0K3ZJFGJGE=
+
+ Resources/dragBadge3.tiff
+
+ f6qByVjx74nToTZF/g1eEEY5/Cg=
+
+ Resources/dragBadge4.tiff
+
+ YdRHkXn0ThtYvWtpgVCJQBKr8GM=
+
+ Resources/dragBadge5.tiff
+
+ 96Gt5HJJ8VsX6YeASQnwvIBC66I=
+
+ Resources/error.tif
+
+ V/XCfxasrbhDlb+Hj0Bd0yikGFo=
+
+ Resources/insp_minus_hi.tiff
+
+ tnY17uvx83h4r2Ed3X5n/9kbBIk=
+
+ Resources/insp_minus_norm.tiff
+
+ MDMt1U8/oVVgkw4eQeHWQrQ3ERQ=
+
+ Resources/insp_plus_hi.tiff
+
+ bO+wfFDewoT1xCsPZLN/EQbaHUg=
+
+ Resources/insp_plus_norm.tiff
+
+ oTZXOjZNTBhbtlwqsvUnDHh0gfw=
+
+ Resources/javascriptUtilityFunctions.plist
+
+ IWfYlKbfsSoPNb97Sv1R+wt5+Pc=
+
+ Resources/line.tif
+
+ /oWeu42XSWh1LLBt7j9KLIitacQ=
+
+ Resources/metapackage.icns
+
+ 9M6JlTUQu2r7ojruVROMVQt4K+E=
+
+ Resources/notfound.png
+
+ Lo/PRluzR+FucFsBcAWtAwscgQ8=
+
+ Resources/package.icns
+
+ 5OBCeDL5t6WsgE2GCKdVAmmvK60=
+
+ Resources/packagemaker.icns
+
+ bZbpgo65YQ7MtUDCSh+skmjIspk=
+
+ Resources/pkmkshellutility
+
+ H+KgN3vI9jieIZS7pDSzTiKMyy0=
+
+ Resources/requirementsDefinitions.plist
+
+ W+CKKBT3DxHf7h6i2ueJRVVQ6pA=
+
+ Resources/restrictedshine.tiff
+
+ 7UdtJMABBUj83NbbDcSo3jNReYk=
+
+ Resources/sidebarSelectionBackground.tif
+
+ eR1T3wq6cVBy/A6lE4IYttwrge0=
+
+ Resources/sidebarSelectionBackgroundSmall.tif
+
+ B4WXk3vhNETQEqz7iGXhK6/23Nc=
+
+ Resources/snapshot.tif
+
+ //6AQsARJXP2UgjvvzvNWZRphTU=
+
+ Resources/splitter_handle.tif
+
+ fC2kYTsrv+gCHyMxqcwDZsEoJrI=
+
+ Resources/stop.tiff
+
+ kRSp1Y4UwvzimcAv/5cUhmtGOVY=
+
+ Resources/warning.tif
+
+ R7/tBB/Hx4YgU0e8rN6UWMeLfN8=
+
+ version.plist
+
+ DazaSm1qILSk6eGoPF+5n9gfoGw=
+
+
+ rules
+
+ ^Resources/
+
+ ^Resources/.*\.lproj/
+
+ omit
+
+ weight
+ 10
+
+ ^Resources/.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 30
+
+ ^Resources/.*\.nib/classes\.nib$
+
+ optional
+
+ weight
+ 20
+
+ ^Resources/.*\.nib/data\.dependency$
+
+ optional
+
+ weight
+ 20
+
+ ^Resources/.*\.nib/info\.nib$
+
+ optional
+
+ weight
+ 20
+
+ ^Resources/English\.lproj/
+
+ optional
+
+ weight
+ 20
+
+ ^version.plist$
+
+
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Info.plist b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Info.plist
new file mode 100644
index 000000000..35022ad17
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Info.plist
@@ -0,0 +1,113 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleDocumentTypes
+
+
+ CFBundleTypeExtensions
+
+ pmdoc
+
+ CFBundleTypeIconFile
+ PackageMakerDoc
+ CFBundleTypeName
+ PackageMaker Document
+ CFBundleTypeOSTypes
+
+ pmdoc
+
+ CFBundleTypeRole
+ Editor
+ LSTypeIsPackage
+
+ NSDocumentClass
+ PackageDocument
+ NSPersistentStoreTypeKey
+ XML
+
+
+ CFBundleTypeExtensions
+
+ *
+
+ CFBundleTypeName
+ Directories
+ CFBundleTypeOSTypes
+
+ fold
+
+ CFBundleTypeRole
+ Viewer
+ LSTypeIsPackage
+
+ NSPersistentStoreTypeKey
+ Binary
+
+
+ CFBundleTypeExtensions
+
+ *
+
+ CFBundleTypeName
+ File
+ CFBundleTypeOSTypes
+
+ *
+
+ CFBundleTypeRole
+ Viewer
+ LSTypeIsPackage
+
+ NSDocumentClass
+ PackageDocument
+ NSPersistentStoreTypeKey
+ XML
+
+
+ CFBundleTypeExtensions
+
+ pmproj
+
+ CFBundleTypeIconFile
+ PackageMakerDoc
+ CFBundleTypeName
+ PackageMaker Project
+ CFBundleTypeOSTypes
+
+ pmproj
+
+ CFBundleTypeRole
+ Viewer
+ LSTypeIsPackage
+
+ NSDocumentClass
+ PackageDocument
+ NSPersistentStoreTypeKey
+ Binary
+
+
+ CFBundleExecutable
+ PackageMaker
+ CFBundleIconFile
+ packagemaker
+ CFBundleIdentifier
+ com.apple.PackageMaker
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 3.0.3
+ CFBundleSignature
+ PKMK
+ CFBundleVersion
+ 174
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/PackageArchiver b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/PackageArchiver
new file mode 100644
index 000000000..9549b73e2
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/PackageArchiver differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/PackageMaker b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/PackageMaker
new file mode 100644
index 000000000..c10ce30c6
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/PackageMaker differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/libpkmk.dylib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/libpkmk.dylib
new file mode 100644
index 000000000..c8f2e5b89
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/libpkmk.dylib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/pkmkpidforapp b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/pkmkpidforapp
new file mode 100644
index 000000000..89bf36a50
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/pkmkpidforapp differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/pkmksendae b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/pkmksendae
new file mode 100644
index 000000000..364bcc366
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/pkmksendae differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/pmcopy b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/pmcopy
new file mode 100644
index 000000000..67f211b75
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/pmcopy differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/pmread b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/pmread
new file mode 100644
index 000000000..1e46b31f7
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/MacOS/pmread differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/PkgInfo b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/PkgInfo
new file mode 100644
index 000000000..cff3f4bab
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/PkgInfo
@@ -0,0 +1 @@
+APPLPKMK
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/ActionDefinitions.plist b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/ActionDefinitions.plist
new file mode 100644
index 000000000..75d4db7ff
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/ActionDefinitions.plist
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+ icon
+ Finder
+ identifier
+ com.apple.packagemaker.actions.createalias
+ name
+ Create Alias
+ type
+ CreateAlias
+
+
+ icon
+ Finder
+ identifier
+ com.apple.packagemaker.actions.createcookie
+ name
+ Create Cookie File
+ type
+ CreateCookie
+
+
+ icon
+ Activity Monitor
+ identifier
+ com.apple.packagemaker.actions.getapplication
+ name
+ Get Application
+ type
+ GetApplication
+
+
+
+ icon
+ Activity Monitor
+ identifier
+ com.apple.packagemaker.actions.killapplication
+ name
+ Kill Application
+ type
+ KillApplication
+
+
+ icon
+ Terminal
+ identifier
+ com.apple.packagemaker.actions.loadkext
+ name
+ Load Kernel Extension
+ type
+ LoadKext
+
+
+ icon
+ Finder
+ identifier
+ com.apple.packagemaker.actions.openfile
+ name
+ Open File
+ type
+ OpenFile
+
+
+ icon
+ Safari
+ identifier
+ com.apple.packagemaker.actions.openurl
+ name
+ Open URL
+ type
+ OpenURL
+
+
+ icon
+ Activity Monitor
+ identifier
+ com.apple.packagemaker.actions.quitapplication
+ name
+ Quit Application
+ type
+ QuitApplication
+
+
+
+ icon
+ Finder
+ identifier
+ com.apple.packagemaker.actions.showfile
+ name
+ Show File in Finder
+ type
+ ShowFile
+
+
+ icon
+ Terminal
+ identifier
+ com.apple.packagemaker.actions.unloadkext
+ name
+ Unload Kernel Extension
+ type
+ UnloadKext
+
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/ActionViewClose.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/ActionViewClose.tif
new file mode 100644
index 000000000..082885984
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/ActionViewClose.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/ActionViewClose_Pressed.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/ActionViewClose_Pressed.tif
new file mode 100644
index 000000000..063645318
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/ActionViewClose_Pressed.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/CertLargeStd.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/CertLargeStd.tif
new file mode 100644
index 000000000..e206e08ae
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/CertLargeStd.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Choose.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Choose.tif
new file mode 100644
index 000000000..065d54123
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Choose.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Choose_Pressed.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Choose_Pressed.tif
new file mode 100644
index 000000000..e8404b0a3
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Choose_Pressed.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/DotBlue.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/DotBlue.tif
new file mode 100644
index 000000000..26765a2f6
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/DotBlue.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/DotBlueDisabled.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/DotBlueDisabled.tif
new file mode 100644
index 000000000..1aeb3eb99
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/DotBlueDisabled.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/DotGray.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/DotGray.tif
new file mode 100644
index 000000000..47b2409d4
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/DotGray.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/EditInterface.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/EditInterface.tif
new file mode 100644
index 000000000..6d6decf31
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/EditInterface.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionView.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionView.nib/classes.nib
new file mode 100644
index 000000000..51cadc76d
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionView.nib/classes.nib
@@ -0,0 +1,14 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ ACTIONS = {remove = id; };
+ CLASS = PMActionView;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_headerView" = NSView; "_titleField" = PMActionViewTitleField; };
+ SUPERCLASS = NSView;
+ },
+ {CLASS = PMActionViewTitleField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionView.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionView.nib/info.nib
new file mode 100644
index 000000000..3826a87a4
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionView.nib/info.nib
@@ -0,0 +1,21 @@
+
+
+
+
+ IBDocumentLocation
+ 660 301 356 240 0 0 1680 1028
+ IBEditorPositions
+
+ 5
+ 630 675 420 73 0 0 1680 1028
+
+ IBFramework Version
+ 451.0
+ IBOpenObjects
+
+ 5
+
+ IBSystem Version
+ 9A241
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionView.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionView.nib/keyedobjects.nib
new file mode 100644
index 000000000..82c6d3e50
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionView.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionViews.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionViews.nib/classes.nib
new file mode 100644
index 000000000..c9c223769
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionViews.nib/classes.nib
@@ -0,0 +1,23 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ ACTIONS = {chooseComponent = id; choosePackageFile = id; };
+ CLASS = PMAction;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_addDockItemView" = NSView;
+ "_addLoginItemView" = NSView;
+ "_createItemView" = NSView;
+ "_fileSelectView" = NSView;
+ "_getItemView" = NSView;
+ "_textFieldView" = NSView;
+ "_textView" = NSTextView;
+ "_textViewView" = NSView;
+ };
+ SUPERCLASS = NSObject;
+ },
+ {CLASS = PMDragTargetTextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionViews.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionViews.nib/info.nib
new file mode 100644
index 000000000..771a7329b
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionViews.nib/info.nib
@@ -0,0 +1,33 @@
+
+
+
+
+ IBDocumentLocation
+ 543 126 365 372 0 0 1440 878
+ IBEditorPositions
+
+ 120
+ 443 530 510 110 0 0 1440 878
+ 151
+ 443 530 510 110 0 0 1440 878
+ 194
+ 443 530 510 110 0 0 1440 878
+ 27
+ 426 543 544 84 0 0 1440 878
+ 48
+ 426 484 545 202 0 0 1440 878
+ 5
+ 443 543 510 84 0 0 1440 878
+ 74
+ 443 530 510 110 0 0 1440 878
+
+ IBFramework Version
+ 452.0
+ IBOpenObjects
+
+ 151
+
+ IBSystem Version
+ 9A283
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionViews.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionViews.nib/keyedobjects.nib
new file mode 100644
index 000000000..0d6f98c7e
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ActionViews.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/AddLocalization.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/AddLocalization.nib/classes.nib
new file mode 100644
index 000000000..1dd47b225
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/AddLocalization.nib/classes.nib
@@ -0,0 +1,12 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ ACTIONS = {finish = id; };
+ CLASS = ResourceLocaleCreator;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSWindowController;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/AddLocalization.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/AddLocalization.nib/info.nib
new file mode 100644
index 000000000..7e9bbf0e3
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/AddLocalization.nib/info.nib
@@ -0,0 +1,16 @@
+
+
+
+
+ IBDocumentLocation
+ 99 94 356 240 0 0 1024 746
+ IBFramework Version
+ 443.0
+ IBOpenObjects
+
+ 7
+
+ IBSystem Version
+ 8I127
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/AddLocalization.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/AddLocalization.nib/keyedobjects.nib
new file mode 100644
index 000000000..2096c5343
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/AddLocalization.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/BuildResult.strings b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/BuildResult.strings
new file mode 100644
index 000000000..6d929180c
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/BuildResult.strings differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/BuildResultsWindow.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/BuildResultsWindow.nib/classes.nib
new file mode 100644
index 000000000..809445b5e
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/BuildResultsWindow.nib/classes.nib
@@ -0,0 +1,22 @@
+{
+ IBClasses = (
+ {
+ CLASS = ErrorsAndWarningsOutlineView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = VariableHeightRowOutlineView;
+ },
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ CLASS = PMBuildResultWindowController;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_outlineView" = NSOutlineView; };
+ SUPERCLASS = NSWindowController;
+ },
+ {
+ CLASS = VariableHeightRowOutlineView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSOutlineView;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/BuildResultsWindow.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/BuildResultsWindow.nib/info.nib
new file mode 100644
index 000000000..85bf3af70
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/BuildResultsWindow.nib/info.nib
@@ -0,0 +1,16 @@
+
+
+
+
+ IBDocumentLocation
+ 279 245 356 240 0 0 1440 878
+ IBFramework Version
+ 453.0
+ IBOpenObjects
+
+ 5
+
+ IBSystem Version
+ 9A305
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/BuildResultsWindow.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/BuildResultsWindow.nib/keyedobjects.nib
new file mode 100644
index 000000000..c080385ca
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/BuildResultsWindow.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/CertificatePanel.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/CertificatePanel.nib/classes.nib
new file mode 100644
index 000000000..a4c4e0fc4
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/CertificatePanel.nib/classes.nib
@@ -0,0 +1,14 @@
+{
+ IBClasses = (
+ {
+ ACTIONS = {changeCertificate = id; close = id; removeCertificate = id; };
+ CLASS = CertificateController;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_certificateView" = SFCertificateView; "_tabView" = NSTabView; };
+ SUPERCLASS = NSWindowController;
+ },
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {CLASS = SFCertificateView; LANGUAGE = ObjC; SUPERCLASS = NSView; }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/CertificatePanel.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/CertificatePanel.nib/info.nib
new file mode 100644
index 000000000..f5e9448a5
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/CertificatePanel.nib/info.nib
@@ -0,0 +1,16 @@
+
+
+
+
+ IBDocumentLocation
+ 279 115 356 240 0 0 1440 878
+ IBFramework Version
+ 452.0
+ IBOpenObjects
+
+ 7
+
+ IBSystem Version
+ 9A283
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/CertificatePanel.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/CertificatePanel.nib/keyedobjects.nib
new file mode 100644
index 000000000..f98381860
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/CertificatePanel.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ComponentScripts.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ComponentScripts.nib/classes.nib
new file mode 100644
index 000000000..617ebfd37
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ComponentScripts.nib/classes.nib
@@ -0,0 +1,13 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ ACTIONS = {chooseScript = id; close = id; };
+ CLASS = PMComponentScriptsController;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSWindowController;
+ },
+ {CLASS = PMImagePopUpButton; LANGUAGE = ObjC; SUPERCLASS = NSPopUpButton; }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ComponentScripts.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ComponentScripts.nib/info.nib
new file mode 100644
index 000000000..b83afac72
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ComponentScripts.nib/info.nib
@@ -0,0 +1,16 @@
+
+
+
+
+ IBDocumentLocation
+ 323 421 356 240 0 0 1440 878
+ IBFramework Version
+ 453.0
+ IBOpenObjects
+
+ 7
+
+ IBSystem Version
+ 9A305
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ComponentScripts.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ComponentScripts.nib/keyedobjects.nib
new file mode 100644
index 000000000..457ba2d17
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ComponentScripts.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditActions.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditActions.nib/classes.nib
new file mode 100644
index 000000000..cbf089bb3
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditActions.nib/classes.nib
@@ -0,0 +1,37 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ ACTIONS = {collapseAll = id; deleteSelected = id; deselectAll = id; expandAll = id; };
+ CLASS = PMActionWorkspaceView;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_windowController" = PMActionsWindowController; };
+ SUPERCLASS = NSView;
+ },
+ {
+ ACTIONS = {browserAction = id; cancel = id; choose = id; save = id; };
+ CLASS = PMActionsWindowController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_browser" = NSBrowser;
+ "_packageTableView" = NSTableView;
+ "_workspace" = PMActionWorkspaceView;
+ };
+ SUPERCLASS = NSWindowController;
+ },
+ {
+ CLASS = PMAvailableActionsController;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_table" = NSTableView; "_workspace" = PMActionWorkspaceView; };
+ SUPERCLASS = NSArrayController;
+ },
+ {
+ ACTIONS = {flip = id; };
+ CLASS = PMFlippableWindow;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_backside" = NSView; };
+ SUPERCLASS = NSWindow;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditActions.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditActions.nib/info.nib
new file mode 100644
index 000000000..8a36c0db2
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditActions.nib/info.nib
@@ -0,0 +1,22 @@
+
+
+
+
+ IBDocumentLocation
+ 335 105 357 243 0 0 1440 878
+ IBEditorPositions
+
+ 25
+ 348 365 700 439 0 0 1440 878
+
+ IBFramework Version
+ 452.0
+ IBOpenObjects
+
+ 5
+ 25
+
+ IBSystem Version
+ 9A283
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditActions.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditActions.nib/keyedobjects.nib
new file mode 100644
index 000000000..7a5440d24
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditActions.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditPathMapping.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditPathMapping.nib/classes.nib
new file mode 100644
index 000000000..53f4d111b
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditPathMapping.nib/classes.nib
@@ -0,0 +1,20 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {CLASS = PMDragTargetTextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; },
+ {CLASS = PMImagePopUpButton; LANGUAGE = ObjC; SUPERCLASS = NSPopUpButton; },
+ {
+ CLASS = PMKeyboardControllableTableView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSTableView;
+ },
+ {
+ ACTIONS = {choosePath = id; close = id; };
+ CLASS = PMPathMappingWindowController;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_javaScriptTextView" = NSTextView; "_rulesController" = NSArrayController; };
+ SUPERCLASS = NSWindowController;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditPathMapping.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditPathMapping.nib/info.nib
new file mode 100644
index 000000000..0c0c2f5b7
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditPathMapping.nib/info.nib
@@ -0,0 +1,16 @@
+
+
+
+
+ IBDocumentLocation
+ 235 243 386 241 0 0 1440 878
+ IBFramework Version
+ 453.0
+ IBOpenObjects
+
+ 5
+
+ IBSystem Version
+ 9A305
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditPathMapping.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditPathMapping.nib/keyedobjects.nib
new file mode 100644
index 000000000..5e4729b51
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/EditPathMapping.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsHeaderRow.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsHeaderRow.nib/classes.nib
new file mode 100644
index 000000000..746db63a5
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsHeaderRow.nib/classes.nib
@@ -0,0 +1,24 @@
+{
+ IBClasses = (
+ {
+ CLASS = ErrorsAndWarningsHeaderRow;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_mainField" = NSTextField;
+ "_pillBox" = PMPillBoxTextField;
+ "_subField" = NSTextField;
+ };
+ SUPERCLASS = NSViewCellRow;
+ },
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ CLASS = NSViewCellRow;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_contentView" = NSView; "_objectController" = NSObjectController; };
+ SUPERCLASS = NSObject;
+ },
+ {CLASS = PMClickthroughImageView; LANGUAGE = ObjC; SUPERCLASS = NSImageView; },
+ {CLASS = PMPillBoxTextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsHeaderRow.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsHeaderRow.nib/info.nib
new file mode 100644
index 000000000..dea6bd355
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsHeaderRow.nib/info.nib
@@ -0,0 +1,21 @@
+
+
+
+
+ IBDocumentLocation
+ 286 202 356 240 0 0 1440 878
+ IBEditorPositions
+
+ 5
+ 538 544 320 82 0 0 1440 878
+
+ IBFramework Version
+ 454.0
+ IBOpenObjects
+
+ 5
+
+ IBSystem Version
+ 9A321
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsHeaderRow.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsHeaderRow.nib/keyedobjects.nib
new file mode 100644
index 000000000..0b6fac375
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsHeaderRow.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsRow.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsRow.nib/classes.nib
new file mode 100644
index 000000000..f56bab667
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsRow.nib/classes.nib
@@ -0,0 +1,21 @@
+{
+ IBClasses = (
+ {
+ ACTIONS = {showHelp = id; };
+ CLASS = ErrorsAndWarningsRow;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_helpButton" = NSButton; "_mainField" = NSTextField; };
+ SUPERCLASS = NSViewCellRow;
+ },
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ CLASS = NSViewCellRow;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_contentView" = NSView; "_objectController" = NSObjectController; };
+ SUPERCLASS = NSObject;
+ },
+ {CLASS = PMClickthroughImageView; LANGUAGE = ObjC; SUPERCLASS = NSImageView; },
+ {CLASS = PMHoverButton; LANGUAGE = ObjC; SUPERCLASS = NSButton; }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsRow.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsRow.nib/info.nib
new file mode 100644
index 000000000..1a042a366
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsRow.nib/info.nib
@@ -0,0 +1,21 @@
+
+
+
+
+ IBDocumentLocation
+ 382 217 356 240 0 0 1440 878
+ IBEditorPositions
+
+ 5
+ 588 551 220 68 0 0 1440 878
+
+ IBFramework Version
+ 452.0
+ IBOpenObjects
+
+ 5
+
+ IBSystem Version
+ 9A283
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsRow.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsRow.nib/keyedobjects.nib
new file mode 100644
index 000000000..5a1b48ae2
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/ErrorsAndWarningsRow.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FSEventsPanels.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FSEventsPanels.nib/classes.nib
new file mode 100644
index 000000000..fe66cbb66
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FSEventsPanels.nib/classes.nib
@@ -0,0 +1,19 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {CLASS = PMDragTargetTextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; },
+ {
+ ACTIONS = {back = id; cancel = id; next = id; save = id; start = id; stop = id; };
+ CLASS = PMFSEventsController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_outlineView" = NSOutlineView;
+ "_startStopButton" = NSButton;
+ "_step1" = NSView;
+ "_step2" = NSView;
+ };
+ SUPERCLASS = NSWindowController;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FSEventsPanels.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FSEventsPanels.nib/info.nib
new file mode 100644
index 000000000..0349fa996
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FSEventsPanels.nib/info.nib
@@ -0,0 +1,24 @@
+
+
+
+
+ IBDocumentLocation
+ 218 250 356 240 0 0 1024 746
+ IBEditorPositions
+
+ 7
+ 293 432 437 184 0 0 1024 746
+ 8
+ 268 334 487 379 0 0 1024 746
+
+ IBFramework Version
+ 452.0
+ IBOpenObjects
+
+ 7
+ 8
+
+ IBSystem Version
+ 9A272
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FSEventsPanels.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FSEventsPanels.nib/keyedobjects.nib
new file mode 100644
index 000000000..45802687e
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FSEventsPanels.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FileFilters.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FileFilters.nib/classes.nib
new file mode 100644
index 000000000..f6000bda5
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FileFilters.nib/classes.nib
@@ -0,0 +1,19 @@
+{
+ IBClasses = (
+ {
+ ACTIONS = {setPatterns = id; };
+ CLASS = FileFiltersArrayController;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSArrayController;
+ },
+ {
+ ACTIONS = {editFiltersCancel = id; editFiltersOK = id; };
+ CLASS = FileFiltersController;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_filtersArrayController" = FileFiltersArrayController; };
+ SUPERCLASS = NSWindowController;
+ },
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FileFilters.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FileFilters.nib/info.nib
new file mode 100644
index 000000000..16c1e20f8
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FileFilters.nib/info.nib
@@ -0,0 +1,16 @@
+
+
+
+
+ IBDocumentLocation
+ 450 229 356 240 0 0 1680 1028
+ IBFramework Version
+ 451.0
+ IBOpenObjects
+
+ 5
+
+ IBSystem Version
+ 9A241
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FileFilters.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FileFilters.nib/keyedobjects.nib
new file mode 100644
index 000000000..b80402868
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/FileFilters.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-background.rtf b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-background.rtf
new file mode 100644
index 000000000..6437a6959
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-background.rtf
@@ -0,0 +1,12 @@
+{\rtf1\mac\ansicpg10000\cocoartf890\cocoasubrtf200
+{\fonttbl\f0\fnil\fcharset77 LucidaGrande;}
+{\colortbl;\red255\green255\blue255;\red128\green128\blue128;}
+{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid1}}
+{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
+\margl1440\margr1440\vieww8220\viewh8380\viewkind0
+\pard\tx860\tx1160\li1160\fi-1160\ri2020\sb80\ql\qnatural\pardirnatural
+\ls1\ilvl0
+\f0\fs26 \cf2 \
+\
+{\listtext \'a5 }Select "Default" to use the default background.\
+{\listtext \'a5 }Or specify your custom background image by dropping it here.}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-conclusion.rtf b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-conclusion.rtf
new file mode 100644
index 000000000..f072019c7
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-conclusion.rtf
@@ -0,0 +1,13 @@
+{\rtf1\mac\ansicpg10000\cocoartf890\cocoasubrtf200
+{\fonttbl\f0\fnil\fcharset77 LucidaGrande;}
+{\colortbl;\red255\green255\blue255;\red128\green128\blue128;}
+{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid1}}
+{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
+\margl1440\margr1440\vieww8220\viewh8380\viewkind0
+\pard\tx860\tx1160\li1160\fi-1160\ri2020\sb80\ql\qnatural\pardirnatural
+\ls1\ilvl0
+\f0\fs26 \cf2 \
+\
+{\listtext \'a5 }Select "None" and no conclusion will be shown in the Installer.\
+{\listtext \'a5 }Select "Embedded" to enter a text to be embedded in the distribution.\
+{\listtext \'a5 }Or specify your custom conclusion file by dropping it here.}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-license.rtf b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-license.rtf
new file mode 100644
index 000000000..f014f2597
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-license.rtf
@@ -0,0 +1,13 @@
+{\rtf1\mac\ansicpg10000\cocoartf890\cocoasubrtf200
+{\fonttbl\f0\fnil\fcharset77 LucidaGrande;}
+{\colortbl;\red255\green255\blue255;\red128\green128\blue128;}
+{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid1}}
+{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
+\margl1440\margr1440\vieww8220\viewh8380\viewkind0
+\pard\tx860\tx1160\li1160\fi-1160\ri2020\sb80\ql\qnatural\pardirnatural
+\ls1\ilvl0
+\f0\fs26 \cf2 \
+\
+{\listtext \'a5 }Select "None" and no license will be shown in the Installer.\
+{\listtext \'a5 }Select "Embedded" to enter a text to be embedded in the distribution.\
+{\listtext \'a5 }Or specify your custom license file by dropping it here.}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-readme.rtf b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-readme.rtf
new file mode 100644
index 000000000..175420ce2
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-readme.rtf
@@ -0,0 +1,13 @@
+{\rtf1\mac\ansicpg10000\cocoartf890\cocoasubrtf200
+{\fonttbl\f0\fnil\fcharset77 LucidaGrande;}
+{\colortbl;\red255\green255\blue255;\red128\green128\blue128;}
+{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid1}}
+{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
+\margl1440\margr1440\vieww8220\viewh8380\viewkind0
+\pard\tx860\tx1160\li1160\fi-1160\ri2020\sb80\ql\qnatural\pardirnatural
+\ls1\ilvl0
+\f0\fs26 \cf2 \
+\
+{\listtext \'a5 }Select "None" and no Read Me will be shown in the Installer.\
+{\listtext \'a5 }Select "Embedded" to enter a text to be embedded in the distribution.\
+{\listtext \'a5 }Or specify your custom Read Me file by dropping it here.}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-welcome.rtf b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-welcome.rtf
new file mode 100644
index 000000000..f87d9bd1c
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/IEDefault-welcome.rtf
@@ -0,0 +1,14 @@
+{\rtf1\mac\ansicpg10000\cocoartf890\cocoasubrtf200
+{\fonttbl\f0\fnil\fcharset77 LucidaGrande;}
+{\colortbl;\red255\green255\blue255;\red128\green128\blue128;}
+{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid1}}
+{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}}
+\margl1440\margr1440\vieww8220\viewh8380\viewkind0
+\pard\tx860\tx1160\li1160\fi-1160\ri2020\sb80\ql\qnatural\pardirnatural
+\ls1\ilvl0
+\f0\fs26 \cf2 \
+\
+{\listtext \'a5 }Select "Default" to show the default welcome:\
+ You will be guided through the steps necessary to install this software.\
+{\listtext \'a5 }Select "Embedded" to enter a text to be embedded in the distribution.\
+{\listtext \'a5 }Or specify your custom welcome file by dropping it here.}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/InfoPlist.strings b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/InfoPlist.strings
new file mode 100644
index 000000000..06e24db4a
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/InfoPlist.strings differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/InterfaceEditor.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/InterfaceEditor.nib/classes.nib
new file mode 100644
index 000000000..07b96e7bc
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/InterfaceEditor.nib/classes.nib
@@ -0,0 +1,46 @@
+{
+ IBClasses = (
+ {CLASS = DroppableTextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; },
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ CLASS = IEBackgroundImageView;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_dragDelegate" = id; };
+ SUPERCLASS = NSView;
+ },
+ {CLASS = IEOpaqueContentView; LANGUAGE = ObjC; SUPERCLASS = NSView; },
+ {
+ CLASS = IEResourceTextView;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_dragDelegate" = id; };
+ SUPERCLASS = NSTextView;
+ },
+ {CLASS = IESectionMatrix; LANGUAGE = ObjC; SUPERCLASS = NSMatrix; },
+ {
+ ACTIONS = {
+ chooseResource = id;
+ continueButtonClicked = id;
+ goBackButtonClicked = id;
+ matrixButtonClicked = id;
+ };
+ CLASS = IEWindowController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_backgroundImageView" = IEBackgroundImageView;
+ "_currentLocaleController" = NSObjectController;
+ "_modelController" = NSObjectController;
+ "_sectionMatrix" = IESectionMatrix;
+ };
+ SUPERCLASS = NSWindowController;
+ },
+ {CLASS = PMDragTargetTextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; },
+ {CLASS = PMImagePopUpButton; LANGUAGE = ObjC; SUPERCLASS = NSPopUpButton; },
+ {
+ CLASS = ResourcesLocaleController;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_windowController" = NSWindowController; };
+ SUPERCLASS = NSArrayController;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/InterfaceEditor.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/InterfaceEditor.nib/info.nib
new file mode 100644
index 000000000..faca9399c
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/InterfaceEditor.nib/info.nib
@@ -0,0 +1,28 @@
+
+
+
+
+ IBDocumentLocation
+ 115 469 385 306 0 0 1440 878
+ IBEditorPositions
+
+ 147
+ 453 355 491 404 0 0 1440 878
+ 42
+ 538 343 320 420 0 0 1440 878
+
+ IBFramework Version
+ 455.0
+ IBLockedTabItems
+
+ 567
+
+ IBOpenObjects
+
+ 42
+ 5
+
+ IBSystem Version
+ 9A343
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/InterfaceEditor.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/InterfaceEditor.nib/keyedobjects.nib
new file mode 100644
index 000000000..814df8d9c
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/InterfaceEditor.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib
new file mode 100644
index 000000000..ff2d06651
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib
@@ -0,0 +1,72 @@
+{
+ IBClasses = (
+ {
+ ACTIONS = {
+ addChoice = id;
+ addFiles = id;
+ addPackageFromSystemChanges = id;
+ addPackageReference = id;
+ addPackageVariant = id;
+ build = id;
+ buildAndRun = id;
+ buildResults = id;
+ bumpVersion = id;
+ editCertificate = id;
+ editFlags = id;
+ editProperties = id;
+ revealInFinder = id;
+ revertRawChanges = id;
+ showInterfaceEditor = id;
+ toggleEditingMode = id;
+ };
+ CLASS = FirstResponder;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObject;
+ },
+ {
+ ACTIONS = {
+ showPreferences = id;
+ };
+ CLASS = NSMenu;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObject;
+ },
+ {
+ ACTIONS = {
+ didAdjustSubviews = RBSplitView;
+ willAdjustSubviews = RBSplitView;
+ };
+ CLASS = NSObject;
+ LANGUAGE = ObjC;
+ },
+ {
+ CLASS = NSView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSResponder;
+ },
+ {
+ ACTIONS = {
+ showAboutBox = id;
+ showHelpInXcode = id;
+ toggleOverwriteProjectPackage = id;
+ };
+ CLASS = PMApplicationDelegate;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObject;
+ },
+ {
+ CLASS = RBSplitSubview;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSView;
+ },
+ {
+ CLASS = RBSplitView;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ delegate = id;
+ };
+ SUPERCLASS = RBSplitSubview;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib
new file mode 100644
index 000000000..10a722df6
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib
@@ -0,0 +1,27 @@
+
+
+
+
+ IBDocumentLocation
+ 536 197 356 240 0 0 1680 1027
+ IBEditorPositions
+
+ 29
+ 140 923 526 44 0 0 1680 1027
+
+ IBFramework Version
+ 463.0
+ IBLastKnownRelativeProjectPath
+ ../../PackageMaker.xcodeproj
+ IBOldestOS
+ 5
+ IBOpenObjects
+
+ 29
+
+ IBSystem Version
+ 9A499
+ targetFramework
+ IBCocoaFramework
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainMenu.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainMenu.nib/keyedobjects.nib
new file mode 100644
index 000000000..13a29fce2
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainMenu.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainWindow.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainWindow.nib/classes.nib
new file mode 100644
index 000000000..1b0ba7c90
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainWindow.nib/classes.nib
@@ -0,0 +1,339 @@
+{
+ IBClasses = (
+ {
+ CLASS = AnimatingTabView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSTabView;
+ },
+ {
+ CLASS = BorderedBox;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSView;
+ },
+ {
+ ACTIONS = {
+ buildResults = id;
+ cancel = id;
+ openInInstaller = id;
+ showInFinder = id;
+ };
+ CLASS = BuildUIController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_activeViewTabView" = NSTabView;
+ "_enclosingTabView" = AnimatingTabView;
+ "_helpAccessController" = PMHelpAccessController;
+ "_lowerBox" = BorderedBox;
+ "_mirrorView" = ImageMirrorView;
+ "_objectController" = NSObjectController;
+ "_outlineView" = NSOutlineView;
+ "_upperBox" = BorderedBox;
+ "_window" = NSWindow;
+ };
+ SUPERCLASS = NSObject;
+ },
+ {
+ ACTIONS = {
+ chooseCustomLocation = id;
+ };
+ CLASS = ChoiceController;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObjectController;
+ },
+ {
+ CLASS = ChoiceRequirementsController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_modelController" = NSObjectController;
+ };
+ SUPERCLASS = RequirementsController;
+ },
+ {
+ CLASS = ErrorsAndWarningsOutlineView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = PMKeyboardControllableOutlineView;
+ },
+ {
+ CLASS = ErrorsAndWarningsTableColumn;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSTableColumn;
+ },
+ {
+ CLASS = ImageMirrorView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSView;
+ },
+ {
+ ACTIONS = {
+ addChoice = id;
+ addFiles = id;
+ addPackageFromSystemChanges = id;
+ addPackageReference = id;
+ addPackageVariant = id;
+ build = id;
+ buildAndRun = id;
+ bumpVersion = id;
+ cancel = id;
+ chooseItemScript = id;
+ chooseWrapperScript = id;
+ editCertificate = id;
+ editFlags = id;
+ editProperties = id;
+ revealInFinder = id;
+ revertRawChanges = id;
+ showInterfaceEditor = id;
+ toggleEditingMode = id;
+ };
+ CLASS = MainWindowController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_buildController" = BuildUIController;
+ "_leftPane" = RBSplitSubview;
+ "_packageContentFilesController" = PMPackageContentFilesController;
+ "_rightPane" = RBSplitSubview;
+ "_sidebarController" = SidebarController;
+ "_splitView" = RBSplitView;
+ "_splitterView" = NSImageView;
+ "_tabView" = AnimatingTabView;
+ };
+ SUPERCLASS = NSWindowController;
+ },
+ {
+ CLASS = MainWindowStatusController;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObject;
+ },
+ {
+ ACTIONS = {
+ edit = id;
+ };
+ CLASS = PMActionsArrayController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_tableView" = NSTableView;
+ "_wrapperController" = NSObjectController;
+ };
+ SUPERCLASS = NSArrayController;
+ },
+ {
+ CLASS = PMComponent;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObject;
+ },
+ {
+ ACTIONS = {
+ configurePatching = id;
+ configureRelocation = id;
+ configureScripts = id;
+ toggleDowngrade = id;
+ togglePatching = id;
+ toggleRelocation = id;
+ };
+ CLASS = PMComponentsController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_outlineView" = NSOutlineView;
+ "_wrapperController" = NSObjectController;
+ };
+ SUPERCLASS = NSTreeController;
+ },
+ {
+ CLASS = PMDisablingTextField;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSTextField;
+ },
+ {
+ CLASS = PMDragTargetTextField;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSTextField;
+ },
+ {
+ ACTIONS = {
+ flip = id;
+ };
+ CLASS = PMFlippableWindow;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_backside" = NSView;
+ };
+ SUPERCLASS = NSWindow;
+ },
+ {
+ CLASS = PMGradientOutlineView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = PMKeyboardControllableOutlineView;
+ },
+ {
+ CLASS = PMGradientTableView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = PMKeyboardControllableTableView;
+ },
+ {
+ CLASS = PMHelpAccessController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_authorizationButton" = NSView;
+ "_bundleIdentifierField" = NSView;
+ "_choiceIdentifier" = NSView;
+ "_choiceRequirements" = NSView;
+ "_choiceState" = NSView;
+ "_choiceTabView" = NSTabView;
+ "_choiceTitleField" = NSView;
+ "_contentsController" = PMPackageContentFilesController;
+ "_domainField" = NSView;
+ "_installFromField" = NSView;
+ "_installToField" = NSView;
+ "_locationStringField" = NSView;
+ "_packageTabView" = NSTabView;
+ "_postinstallActionsController" = PMActionsArrayController;
+ "_postinstallField" = NSView;
+ "_postupgradeField" = NSView;
+ "_preinstallActionsController" = PMActionsArrayController;
+ "_preinstallField" = NSView;
+ "_preupgradeField" = NSView;
+ "_relocationButton" = NSView;
+ "_requirementsController" = PackageRequirementsController;
+ "_sidebarController" = SidebarController;
+ "_userSeesButton" = NSView;
+ "_window" = NSWindow;
+ "_wrapperContentsOutlineView" = NSView;
+ "_wrapperTabView" = NSTabView;
+ "_wrapperTitleField" = NSView;
+ };
+ SUPERCLASS = NSObject;
+ },
+ {
+ CLASS = PMImagePopUpButton;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSPopUpButton;
+ },
+ {
+ CLASS = PMKeyboardControllableOutlineView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSOutlineView;
+ },
+ {
+ ACTIONS = {
+ delete = id;
+ };
+ CLASS = PMKeyboardControllableTableView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSTableView;
+ },
+ {
+ ACTIONS = {
+ addFile = id;
+ applyRecommendations = id;
+ editFileFilters = id;
+ };
+ CLASS = PMPackageContentFilesController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_outlineColumn" = NSTableColumn;
+ "_outlineView" = NSOutlineView;
+ "_statusController" = MainWindowStatusController;
+ };
+ SUPERCLASS = NSTreeController;
+ },
+ {
+ ACTIONS = {
+ choosePatchRootLocation = id;
+ };
+ CLASS = PMPackageContentsController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_wrapperController" = NSObjectController;
+ };
+ SUPERCLASS = NSObjectController;
+ },
+ {
+ CLASS = PMPathMappingsController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_packageContentsController" = NSTreeController;
+ "_packageModelsController" = NSArrayController;
+ "_tableView" = NSTableView;
+ };
+ SUPERCLASS = NSArrayController;
+ },
+ {
+ CLASS = PMScaledImageButton;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSButton;
+ },
+ {
+ CLASS = PackageRequirementsController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_sidebarController" = SidebarController;
+ };
+ SUPERCLASS = RequirementsController;
+ },
+ {
+ CLASS = PackageResourcesController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_tableView" = NSTableView;
+ "_windowController" = NSWindowController;
+ };
+ SUPERCLASS = NSArrayController;
+ },
+ {
+ CLASS = RequirementsController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_tableView" = NSTableView;
+ "_windowController" = NSWindowController;
+ };
+ SUPERCLASS = NSArrayController;
+ },
+ {
+ CLASS = ResourcesLocaleController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_windowController" = NSWindowController;
+ };
+ SUPERCLASS = NSArrayController;
+ },
+ {
+ ACTIONS = {
+ addChoice = id;
+ addFiles = id;
+ addVariant = id;
+ bumpVersion = id;
+ contentsDoubleAction = id;
+ editFlags = id;
+ revealInFinder = id;
+ };
+ CLASS = SidebarController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_choiceController" = NSObjectController;
+ "_choicesTabView" = NSTabView;
+ "_contentsOutlineView" = PMGradientOutlineView;
+ "_modelController" = NSObjectController;
+ "_packageTabView" = NSTabView;
+ "_windowController" = NSWindowController;
+ "_wrapperTabView" = NSTabView;
+ "_wrapperTableView" = PMGradientTableView;
+ };
+ SUPERCLASS = NSArrayController;
+ },
+ {
+ ACTIONS = {
+ add = id;
+ edit = id;
+ remove = id;
+ };
+ CLASS = WrapperContentsController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_modelController" = NSObjectController;
+ "_outlineView" = NSOutlineView;
+ "_windowController" = NSWindowController;
+ };
+ SUPERCLASS = NSObject;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainWindow.nib/data.dependency b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainWindow.nib/data.dependency
new file mode 100644
index 000000000..71914e28e
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainWindow.nib/data.dependency
@@ -0,0 +1,10 @@
+
+
+
+
+ IBPaletteDependency
+
+ RBSplitView
+
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainWindow.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainWindow.nib/info.nib
new file mode 100644
index 000000000..487786599
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainWindow.nib/info.nib
@@ -0,0 +1,29 @@
+
+
+
+
+ IBDocumentLocation
+ 36 508 568 370 0 0 1440 878
+ IBEditorPositions
+
+ 2383
+ 668 465 204 250 0 0 1440 878
+
+ IBFramework Version
+ 463.0
+ IBLockedTabItems
+
+ 2938
+ 2124
+ 870
+
+ IBOldestOS
+ 2
+ IBOpenObjects
+
+ 5
+
+ IBSystem Version
+ 9A499
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainWindow.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainWindow.nib/keyedobjects.nib
new file mode 100644
index 000000000..565ddfcc3
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/MainWindow.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PackageFlags.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PackageFlags.nib/classes.nib
new file mode 100644
index 000000000..2feca8d79
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PackageFlags.nib/classes.nib
@@ -0,0 +1,13 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {CLASS = PMDisablingTextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; },
+ {
+ ACTIONS = {end = id; };
+ CLASS = PMFlagsController;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSWindowController;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PackageFlags.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PackageFlags.nib/info.nib
new file mode 100644
index 000000000..845a8f747
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PackageFlags.nib/info.nib
@@ -0,0 +1,16 @@
+
+
+
+
+ IBDocumentLocation
+ 130 151 356 240 0 0 1440 878
+ IBFramework Version
+ 455.0
+ IBOpenObjects
+
+ 7
+
+ IBSystem Version
+ 9A343
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PackageFlags.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PackageFlags.nib/keyedobjects.nib
new file mode 100644
index 000000000..c4cf78806
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PackageFlags.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PatchPackageConfiguration.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PatchPackageConfiguration.nib/classes.nib
new file mode 100644
index 000000000..878c7704f
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PatchPackageConfiguration.nib/classes.nib
@@ -0,0 +1,15 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {CLASS = PMDragTargetTextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; },
+ {CLASS = PMImagePopUpButton; LANGUAGE = ObjC; SUPERCLASS = NSPopUpButton; },
+ {
+ ACTIONS = {choosePath = id; close = id; setRoot = id; };
+ CLASS = PMPatchPackageWindowController;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_patchRootPathField" = NSTextField; };
+ SUPERCLASS = NSWindowController;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PatchPackageConfiguration.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PatchPackageConfiguration.nib/info.nib
new file mode 100644
index 000000000..f134f3173
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PatchPackageConfiguration.nib/info.nib
@@ -0,0 +1,16 @@
+
+
+
+
+ IBDocumentLocation
+ 456 246 356 240 0 0 1440 878
+ IBFramework Version
+ 455.0
+ IBOpenObjects
+
+ 7
+
+ IBSystem Version
+ 9A343
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PatchPackageConfiguration.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PatchPackageConfiguration.nib/keyedobjects.nib
new file mode 100644
index 000000000..be7c4e61f
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/PatchPackageConfiguration.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Preferences.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Preferences.nib/classes.nib
new file mode 100644
index 000000000..1549fecb2
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Preferences.nib/classes.nib
@@ -0,0 +1,44 @@
+{
+ IBClasses = (
+ {
+ CLASS = NSButton;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ delegate = id;
+ };
+ SUPERCLASS = NSControl;
+ },
+ {
+ ACTIONS = {
+ didAdjustSubviews = RBSplitView;
+ willAdjustSubviews = RBSplitView;
+ };
+ CLASS = NSObject;
+ LANGUAGE = ObjC;
+ },
+ {
+ CLASS = NSView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSResponder;
+ },
+ {
+ CLASS = PMPreferencesController;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSWindowController;
+ },
+ {
+ CLASS = RBSplitSubview;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSView;
+ },
+ {
+ CLASS = RBSplitView;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ delegate = id;
+ };
+ SUPERCLASS = RBSplitSubview;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Preferences.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Preferences.nib/info.nib
new file mode 100644
index 000000000..0eefc2b69
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Preferences.nib/info.nib
@@ -0,0 +1,18 @@
+
+
+
+
+ IBDocumentLocation
+ 69 98 356 240 0 0 1680 1027
+ IBFramework Version
+ 463.0
+ IBLastKnownRelativeProjectPath
+ ../../PackageMaker.xcodeproj
+ IBOldestOS
+ 5
+ IBSystem Version
+ 9A499
+ targetFramework
+ IBCocoaFramework
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Preferences.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Preferences.nib/keyedobjects.nib
new file mode 100644
index 000000000..aefb89d97
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Preferences.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Properties.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Properties.nib/classes.nib
new file mode 100644
index 000000000..e7d2d2629
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Properties.nib/classes.nib
@@ -0,0 +1,62 @@
+{
+ IBClasses = (
+ {
+ CLASS = FirstResponder;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObject;
+ },
+ {
+ ACTIONS = {
+ didAdjustSubviews = RBSplitView;
+ willAdjustSubviews = RBSplitView;
+ };
+ CLASS = NSObject;
+ LANGUAGE = ObjC;
+ },
+ {
+ CLASS = NSView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSResponder;
+ },
+ {
+ CLASS = PMDragTargetTextField;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSTextField;
+ },
+ {
+ CLASS = PMOrganizationFormatter;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_propertiesController" = PropertiesController;
+ };
+ SUPERCLASS = NSFormatter;
+ },
+ {
+ ACTIONS = {
+ endSheet = id;
+ };
+ CLASS = PropertiesController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_organizationField" = NSTextField;
+ "_organizationFormatter" = NSFormatter;
+ "_prefPanel" = NSPanel;
+ };
+ SUPERCLASS = NSWindowController;
+ },
+ {
+ CLASS = RBSplitSubview;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSView;
+ },
+ {
+ CLASS = RBSplitView;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ delegate = id;
+ };
+ SUPERCLASS = RBSplitSubview;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Properties.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Properties.nib/info.nib
new file mode 100644
index 000000000..452a6a7dc
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Properties.nib/info.nib
@@ -0,0 +1,22 @@
+
+
+
+
+ IBDocumentLocation
+ 69 14 356 240 0 0 1280 777
+ IBFramework Version
+ 462.0
+ IBLastKnownRelativeProjectPath
+ ../../PackageMaker.xcodeproj
+ IBOldestOS
+ 5
+ IBOpenObjects
+
+ 7
+
+ IBSystem Version
+ 9A474
+ targetFramework
+ IBCocoaFramework
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Properties.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Properties.nib/keyedobjects.nib
new file mode 100644
index 000000000..b2d6be018
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/Properties.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RawEdit.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RawEdit.nib/classes.nib
new file mode 100644
index 000000000..e5238e0e5
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RawEdit.nib/classes.nib
@@ -0,0 +1,32 @@
+{
+ IBClasses = (
+ {CLASS = BorderedBox; LANGUAGE = ObjC; SUPERCLASS = NSView; },
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ CLASS = PMKeyboardControllableOutlineView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSOutlineView;
+ },
+ {
+ ACTIONS = {cancel = id; };
+ CLASS = PMRawController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ "_defaultView" = BorderedBox;
+ "_dragView" = NSImageView;
+ "_filesController" = PMRawFilesController;
+ "_leftPane" = RBSplitSubview;
+ "_rightPane" = RBSplitSubview;
+ "_splitView" = RBSplitView;
+ };
+ SUPERCLASS = NSWindowController;
+ },
+ {
+ CLASS = PMRawFilesController;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_outlineView" = NSOutlineView; "_textEditor" = NSTextView; };
+ SUPERCLASS = NSTreeController;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RawEdit.nib/data.dependency b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RawEdit.nib/data.dependency
new file mode 100644
index 000000000..c334e4687
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RawEdit.nib/data.dependency
@@ -0,0 +1,10 @@
+
+
+
+
+ IBPaletteDependency
+
+ RBSplitView
+
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RawEdit.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RawEdit.nib/info.nib
new file mode 100644
index 000000000..e3ea4b95a
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RawEdit.nib/info.nib
@@ -0,0 +1,22 @@
+
+
+
+
+ IBDocumentLocation
+ 490 384 423 243 0 0 1680 1028
+ IBEditorPositions
+
+ 5
+ 610 545 459 335 0 0 1680 1028
+
+ IBFramework Version
+ 451.0
+ IBOpenObjects
+
+ 5
+ 53
+
+ IBSystem Version
+ 9A264
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RawEdit.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RawEdit.nib/keyedobjects.nib
new file mode 100644
index 000000000..37b5f4eed
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RawEdit.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RecommendationProgress.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RecommendationProgress.nib/classes.nib
new file mode 100644
index 000000000..e32111e54
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RecommendationProgress.nib/classes.nib
@@ -0,0 +1,12 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ ACTIONS = {cancel = id; };
+ CLASS = PermissionsRecommender;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSWindowController;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RecommendationProgress.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RecommendationProgress.nib/info.nib
new file mode 100644
index 000000000..64c2e56ad
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RecommendationProgress.nib/info.nib
@@ -0,0 +1,16 @@
+
+
+
+
+ IBDocumentLocation
+ 69 68 356 240 0 0 1024 746
+ IBFramework Version
+ 437.0
+ IBOpenObjects
+
+ 5
+
+ IBSystem Version
+ 8F29
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RecommendationProgress.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RecommendationProgress.nib/keyedobjects.nib
new file mode 100644
index 000000000..9a84a62d7
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RecommendationProgress.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RequirementPanel.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RequirementPanel.nib/classes.nib
new file mode 100644
index 000000000..67ddffbb3
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RequirementPanel.nib/classes.nib
@@ -0,0 +1,127 @@
+
+
+
+
+ IBClasses
+
+
+ CLASS
+ RBSplitView
+ LANGUAGE
+ ObjC
+ OUTLETS
+
+ delegate
+ id
+
+ SUPERCLASS
+ RBSplitSubview
+
+
+ CLASS
+ RBSplitSubview
+ LANGUAGE
+ ObjC
+ SUPERCLASS
+ NSView
+
+
+ ACTIONS
+
+ didAdjustSubviews
+ RBSplitView
+ willAdjustSubviews
+ RBSplitView
+
+ CLASS
+ NSObject
+ LANGUAGE
+ ObjC
+
+
+ CLASS
+ NSView
+ LANGUAGE
+ ObjC
+ SUPERCLASS
+ NSResponder
+
+
+ CLASS
+ FirstResponder
+ LANGUAGE
+ ObjC
+ SUPERCLASS
+ NSObject
+
+
+ CLASS
+ AnimatingTabView
+ LANGUAGE
+ ObjC
+ SUPERCLASS
+ NSTabView
+
+
+ CLASS
+ PMDisablingTextField
+ LANGUAGE
+ ObjC
+ SUPERCLASS
+ NSTextField
+
+
+ ACTIONS
+
+ cancel
+ id
+ changeSelectedRequirement
+ id
+ save
+ id
+ selectComponent
+ id
+ showMain
+ id
+ showScriptRepository
+ id
+
+ CLASS
+ RequirementSpecificationWindowController
+ LANGUAGE
+ ObjC
+ OUTLETS
+
+ _choiceProperties
+ NSView
+ _componentsPopUpButton
+ NSPopUpButton
+ _objectController
+ NSObjectController
+ _packageProperties
+ NSView
+ _propertiesBox
+ NSBox
+ _requirementTypePopUpButton
+ NSPopUpButton
+ _scriptTextView
+ NSTextView
+ _tabView
+ AnimatingTabView
+
+ SUPERCLASS
+ NSWindowController
+
+
+ CLASS
+ PMDragTargetTextField
+ LANGUAGE
+ ObjC
+ SUPERCLASS
+ NSTextField
+
+
+ IBVersion
+ 1
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RequirementPanel.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RequirementPanel.nib/info.nib
new file mode 100644
index 000000000..2b6ea0cd7
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RequirementPanel.nib/info.nib
@@ -0,0 +1,20 @@
+
+
+
+
+ IBFramework Version
+ 613
+ IBLastKnownRelativeProjectPath
+ ../../PackageMaker.xcodeproj
+ IBOldestOS
+ 5
+ IBOpenObjects
+
+ 777
+
+ IBSystem Version
+ 9A497
+ targetFramework
+ IBCocoaFramework
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RequirementPanel.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RequirementPanel.nib/keyedobjects.nib
new file mode 100644
index 000000000..00ac20f52
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/RequirementPanel.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarChoiceRow.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarChoiceRow.nib/classes.nib
new file mode 100644
index 000000000..c307d62a1
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarChoiceRow.nib/classes.nib
@@ -0,0 +1,21 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {CLASS = PMClickthroughImageView; LANGUAGE = ObjC; SUPERCLASS = NSImageView; },
+ {CLASS = PMClickthroughTextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; },
+ {
+ CLASS = PMViewCellRow;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_contentView" = PMViewCellView; "_objectController" = NSObjectController; };
+ SUPERCLASS = NSObject;
+ },
+ {CLASS = PMViewCellView; LANGUAGE = ObjC; SUPERCLASS = NSView; },
+ {
+ CLASS = SidebarChoiceRow;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_mainField" = NSTextField; };
+ SUPERCLASS = PMViewCellRow;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarChoiceRow.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarChoiceRow.nib/info.nib
new file mode 100644
index 000000000..306d510f1
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarChoiceRow.nib/info.nib
@@ -0,0 +1,23 @@
+
+
+
+
+ IBDocumentLocation
+ 69 10 356 240 0 0 1440 878
+ IBEditorPositions
+
+ 5
+ 588 554 220 62 0 0 1440 878
+
+ IBFramework Version
+ 453.0
+ IBOldestOS
+ 4
+ IBOpenObjects
+
+ 5
+
+ IBSystem Version
+ 9A305
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarChoiceRow.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarChoiceRow.nib/keyedobjects.nib
new file mode 100644
index 000000000..1f0595b20
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarChoiceRow.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarRow.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarRow.nib/classes.nib
new file mode 100644
index 000000000..0df533b25
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarRow.nib/classes.nib
@@ -0,0 +1,21 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {CLASS = PMClickthroughImageView; LANGUAGE = ObjC; SUPERCLASS = NSImageView; },
+ {CLASS = PMClickthroughTextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; },
+ {
+ CLASS = PMViewCellRow;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_contentView" = PMViewCellView; "_objectController" = NSObjectController; };
+ SUPERCLASS = NSObject;
+ },
+ {CLASS = PMViewCellView; LANGUAGE = ObjC; SUPERCLASS = NSView; },
+ {
+ CLASS = SidebarRow;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_mainField" = NSTextField; "_subField" = NSTextField; };
+ SUPERCLASS = PMViewCellRow;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarRow.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarRow.nib/info.nib
new file mode 100644
index 000000000..a6e4eb52c
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarRow.nib/info.nib
@@ -0,0 +1,23 @@
+
+
+
+
+ IBDocumentLocation
+ 227 144 356 240 0 0 1440 878
+ IBEditorPositions
+
+ 5
+ 588 542 220 86 0 0 1440 878
+
+ IBFramework Version
+ 453.0
+ IBOldestOS
+ 4
+ IBOpenObjects
+
+ 5
+
+ IBSystem Version
+ 9A305
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarRow.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarRow.nib/keyedobjects.nib
new file mode 100644
index 000000000..0a44c2e4c
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/SidebarRow.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/WrapperRow.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/WrapperRow.nib/classes.nib
new file mode 100644
index 000000000..0df533b25
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/WrapperRow.nib/classes.nib
@@ -0,0 +1,21 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {CLASS = PMClickthroughImageView; LANGUAGE = ObjC; SUPERCLASS = NSImageView; },
+ {CLASS = PMClickthroughTextField; LANGUAGE = ObjC; SUPERCLASS = NSTextField; },
+ {
+ CLASS = PMViewCellRow;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_contentView" = PMViewCellView; "_objectController" = NSObjectController; };
+ SUPERCLASS = NSObject;
+ },
+ {CLASS = PMViewCellView; LANGUAGE = ObjC; SUPERCLASS = NSView; },
+ {
+ CLASS = SidebarRow;
+ LANGUAGE = ObjC;
+ OUTLETS = {"_mainField" = NSTextField; "_subField" = NSTextField; };
+ SUPERCLASS = PMViewCellRow;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/WrapperRow.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/WrapperRow.nib/info.nib
new file mode 100644
index 000000000..6681b4d5d
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/WrapperRow.nib/info.nib
@@ -0,0 +1,21 @@
+
+
+
+
+ IBDocumentLocation
+ 495 150 356 240 0 0 1440 878
+ IBEditorPositions
+
+ 5
+ 588 542 220 86 0 0 1440 878
+
+ IBFramework Version
+ 453.0
+ IBOpenObjects
+
+ 5
+
+ IBSystem Version
+ 9A305
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/WrapperRow.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/WrapperRow.nib/keyedobjects.nib
new file mode 100644
index 000000000..cc51bce97
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/English.lproj/WrapperRow.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Finder.icns b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Finder.icns
new file mode 100644
index 000000000..4b6817070
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Finder.icns differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/CodeResources b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/CodeResources
new file mode 100644
index 000000000..9e8396c41
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/CodeResources
@@ -0,0 +1,206 @@
+
+
+
+
+ files
+
+ Resources/English.lproj/BOMInspector.nib/classes.nib
+
+ hash
+
+ bP6piVGaMMBOhkgDSDvvyskdSrs=
+
+ optional
+
+
+ Resources/English.lproj/BOMInspector.nib/info.nib
+
+ hash
+
+ 5xGYkLKa0QC8yQfA8NDsJC8YfTw=
+
+ optional
+
+
+ Resources/English.lproj/BOMInspector.nib/keyedobjects.nib
+
+ hash
+
+ 0UWJxGCoW8QBsqlaO5FzgpG6Bcw=
+
+ optional
+
+
+ Resources/English.lproj/InfoPlist.strings
+
+ hash
+
+ UWhzCP4cUD5FfJLmedBCXCtF2NU=
+
+ optional
+
+
+ Resources/English.lproj/MainMenu.nib/classes.nib
+
+ hash
+
+ lsZDsjzzQCLkp5v1VP2C1qztHok=
+
+ optional
+
+
+ Resources/English.lproj/MainMenu.nib/info.nib
+
+ hash
+
+ WQJjMiGV1BT63wzBQ2NdKVRabg4=
+
+ optional
+
+
+ Resources/English.lproj/MainMenu.nib/keyedobjects.nib
+
+ hash
+
+ gJ0uXSbkkDqq1aNyoZBeV1GUB8I=
+
+ optional
+
+
+ Resources/English.lproj/TextInspector.nib/classes.nib
+
+ hash
+
+ WZ8hXcc8FvcRNZPGJDw64XFAtRI=
+
+ optional
+
+
+ Resources/English.lproj/TextInspector.nib/info.nib
+
+ hash
+
+ Of30HH/+j3dyF+FlqETbSKflBLM=
+
+ optional
+
+
+ Resources/English.lproj/TextInspector.nib/keyedobjects.nib
+
+ hash
+
+ d4jZEpfZj5LASxNUkIGHuzSfdRk=
+
+ optional
+
+
+ Resources/English.lproj/XARDocument.nib/classes.nib
+
+ hash
+
+ Q12i9I+lItH29cxBRcG4ExEPXko=
+
+ optional
+
+
+ Resources/English.lproj/XARDocument.nib/info.nib
+
+ hash
+
+ fK214TekfBFKEzbdRTI7bX9nvo0=
+
+ optional
+
+
+ Resources/English.lproj/XARDocument.nib/keyedobjects.nib
+
+ hash
+
+ +gbC4JHA2HXQCoPLIYifkx/boPY=
+
+ optional
+
+
+ Resources/English.lproj/XARInspector.nib/classes.nib
+
+ hash
+
+ 1DTuTbAguF07VhsAP/mseEaK/Fo=
+
+ optional
+
+
+ Resources/English.lproj/XARInspector.nib/info.nib
+
+ hash
+
+ WLaniK+N0lLeEPey5tKH3Cw942A=
+
+ optional
+
+
+ Resources/English.lproj/XARInspector.nib/keyedobjects.nib
+
+ hash
+
+ /BwBrFv7Kn7ORLALiwhbhNtoiEE=
+
+ optional
+
+
+ version.plist
+
+ QKLvOC4iXuXZ/gTypLIs0A/akHE=
+
+
+ rules
+
+ ^Resources/
+
+ ^Resources/.*\.lproj/
+
+ omit
+
+ weight
+ 10
+
+ ^Resources/.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 30
+
+ ^Resources/.*\.nib/classes\.nib$
+
+ optional
+
+ weight
+ 20
+
+ ^Resources/.*\.nib/data\.dependency$
+
+ optional
+
+ weight
+ 20
+
+ ^Resources/.*\.nib/info\.nib$
+
+ optional
+
+ weight
+ 20
+
+ ^Resources/English\.lproj/
+
+ optional
+
+ weight
+ 20
+
+ ^version.plist$
+
+
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Info.plist b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Info.plist
new file mode 100644
index 000000000..a9c8031c9
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Info.plist
@@ -0,0 +1,79 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleDocumentTypes
+
+
+ CFBundleTypeExtensions
+
+ pkg
+
+ CFBundleTypeName
+ Flat Package
+ CFBundleTypeOSTypes
+
+ ????
+
+ CFBundleTypeRole
+ Editor
+ NSDocumentClass
+ XARDocument
+
+
+ CFBundleTypeExtensions
+
+ dist
+
+ CFBundleTypeName
+ Distribution Archive
+ CFBundleTypeRole
+ Editor
+ LSTypeIsPackage
+
+ NSDocumentClass
+ XARDocument
+ NSPersistentStoreTypeKey
+ Binary
+
+
+ CFBundleTypeExtensions
+
+ mpkg
+
+ CFBundleTypeName
+ Flat Meta Package
+ CFBundleTypeRole
+ Editor
+ LSTypeIsPackage
+
+ NSDocumentClass
+ XARDocument
+ NSPersistentStoreTypeKey
+ Binary
+
+
+ CFBundleExecutable
+ Flat Package Editor
+ CFBundleIdentifier
+ com.apple.installer.tools.FlatPackageEditor
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ Flat Package Editor
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/MacOS/Flat Package Editor b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/MacOS/Flat Package Editor
new file mode 100644
index 000000000..ad5a5002b
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/MacOS/Flat Package Editor differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/PkgInfo b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/PkgInfo
new file mode 100644
index 000000000..bd04210fb
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/PkgInfo
@@ -0,0 +1 @@
+APPL????
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/BOMInspector.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/BOMInspector.nib/classes.nib
new file mode 100644
index 000000000..62d3b1a77
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/BOMInspector.nib/classes.nib
@@ -0,0 +1,38 @@
+{
+ IBClasses = (
+ {
+ ACTIONS = {done = id; searchTextEntered = id; };
+ CLASS = BOMInspector;
+ LANGUAGE = ObjC;
+ OUTLETS = {arrayController = id; fileTable = id; searchField = id; };
+ SUPERCLASS = InspectorDataProvider;
+ },
+ {
+ ACTIONS = {done = id; searchTextEntered = id; };
+ CLASS = BOMInspectorController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ arrayController = id;
+ bomInspectorWindow = id;
+ fileTable = id;
+ searchField = id;
+ };
+ SUPERCLASS = NSObject;
+ },
+ {
+ ACTIONS = {filterChanged = id; searchTextEntered = id; };
+ CLASS = FilteredArrayController;
+ LANGUAGE = ObjC;
+ OUTLETS = {fileCount = id; filterMatrix = id; searchTextField = id; };
+ SUPERCLASS = NSArrayController;
+ },
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ CLASS = InspectorDataProvider;
+ LANGUAGE = ObjC;
+ OUTLETS = {view = id; };
+ SUPERCLASS = NSObject;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/BOMInspector.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/BOMInspector.nib/info.nib
new file mode 100644
index 000000000..4abe23072
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/BOMInspector.nib/info.nib
@@ -0,0 +1,21 @@
+
+
+
+
+ IBDocumentLocation
+ 69 10 356 240 0 0 1920 1178
+ IBEditorPositions
+
+ 21
+ 807 589 262 392 0 0 1920 1178
+
+ IBFramework Version
+ 447.0
+ IBOpenObjects
+
+ 21
+
+ IBSystem Version
+ 9A105
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/BOMInspector.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/BOMInspector.nib/keyedobjects.nib
new file mode 100644
index 000000000..9ad4b91ab
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/BOMInspector.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/InfoPlist.strings b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/InfoPlist.strings
new file mode 100644
index 000000000..953622f81
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/InfoPlist.strings differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib
new file mode 100644
index 000000000..3113132dc
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib
@@ -0,0 +1,30 @@
+{
+ IBClasses = (
+ {
+ CLASS = FirstResponder;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObject;
+ },
+ {
+ ACTIONS = {
+ showAboutBox = id;
+ };
+ CLASS = NSMenuItem;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObject;
+ },
+ {
+ CLASS = NSObject;
+ LANGUAGE = ObjC;
+ },
+ {
+ ACTIONS = {
+ showAboutBox = id;
+ };
+ CLASS = XARApplicationDelegate;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObject;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib
new file mode 100644
index 000000000..395821e97
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib
@@ -0,0 +1,27 @@
+
+
+
+
+ IBDocumentLocation
+ 362 245 356 240 0 0 1680 1027
+ IBEditorPositions
+
+ 29
+ 511 699 363 44 0 0 1680 1027
+
+ IBFramework Version
+ 462.0
+ IBLastKnownRelativeProjectPath
+ ../../XAREditor.xcodeproj
+ IBOldestOS
+ 5
+ IBOpenObjects
+
+ 29
+
+ IBSystem Version
+ 9A476
+ targetFramework
+ IBCocoaFramework
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/MainMenu.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/MainMenu.nib/keyedobjects.nib
new file mode 100644
index 000000000..eecdee877
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/MainMenu.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/TextInspector.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/TextInspector.nib/classes.nib
new file mode 100644
index 000000000..16ac84b7c
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/TextInspector.nib/classes.nib
@@ -0,0 +1,37 @@
+{
+ IBClasses = (
+ {
+ ACTIONS = {done = id; searchTextEntered = id; };
+ CLASS = BOMInspectorController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ arrayController = id;
+ bomInspectorWindow = id;
+ fileTable = id;
+ searchField = id;
+ };
+ SUPERCLASS = NSObject;
+ },
+ {
+ ACTIONS = {filterChanged = id; searchTextEntered = id; };
+ CLASS = FilteredArrayController;
+ LANGUAGE = ObjC;
+ OUTLETS = {fileCount = id; filterMatrix = id; searchTextField = id; };
+ SUPERCLASS = NSArrayController;
+ },
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ CLASS = InspectorDataProvider;
+ LANGUAGE = ObjC;
+ OUTLETS = {view = id; };
+ SUPERCLASS = NSObject;
+ },
+ {
+ CLASS = TextInspector;
+ LANGUAGE = ObjC;
+ OUTLETS = {textView = id; view = id; };
+ SUPERCLASS = InspectorDataProvider;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/TextInspector.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/TextInspector.nib/info.nib
new file mode 100644
index 000000000..ad2a252a9
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/TextInspector.nib/info.nib
@@ -0,0 +1,21 @@
+
+
+
+
+ IBDocumentLocation
+ 69 10 356 240 0 0 1920 1178
+ IBEditorPositions
+
+ 33
+ 807 604 262 362 0 0 1920 1178
+
+ IBFramework Version
+ 447.0
+ IBOpenObjects
+
+ 33
+
+ IBSystem Version
+ 9A105
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/TextInspector.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/TextInspector.nib/keyedobjects.nib
new file mode 100644
index 000000000..7121ba052
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/TextInspector.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARDocument.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARDocument.nib/classes.nib
new file mode 100644
index 000000000..c31e5fa9b
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARDocument.nib/classes.nib
@@ -0,0 +1,17 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ CLASS = XARDocument;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ outlineView = id;
+ progressPanel = id;
+ progressStatus = id;
+ progressView = id;
+ };
+ SUPERCLASS = NSDocument;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARDocument.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARDocument.nib/info.nib
new file mode 100644
index 000000000..f9596ac24
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARDocument.nib/info.nib
@@ -0,0 +1,17 @@
+
+
+
+
+ IBDocumentLocation
+ 119 113 356 240 0 0 1680 1028
+ IBFramework Version
+ 439.0
+ IBOpenObjects
+
+ 28
+ 5
+
+ IBSystem Version
+ 8G25
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARDocument.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARDocument.nib/keyedobjects.nib
new file mode 100644
index 000000000..c75333c8a
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARDocument.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARInspector.nib/classes.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARInspector.nib/classes.nib
new file mode 100644
index 000000000..d2b7e490c
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARInspector.nib/classes.nib
@@ -0,0 +1,24 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {CLASS = NSLevelIndicator; LANGUAGE = ObjC; SUPERCLASS = NSControl; },
+ {
+ ACTIONS = {changedView = id; };
+ CLASS = XARInspectorController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ attributes = id;
+ basicInfoDoc = id;
+ basicInfoFile = id;
+ contentView = id;
+ inspectorWindow = id;
+ myOutlet = id;
+ objectController = id;
+ preview = id;
+ viewMenu = id;
+ };
+ SUPERCLASS = NSObject;
+ }
+ );
+ IBVersion = 1;
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARInspector.nib/info.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARInspector.nib/info.nib
new file mode 100644
index 000000000..194910c4f
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARInspector.nib/info.nib
@@ -0,0 +1,28 @@
+
+
+
+
+ IBDocumentLocation
+ 736 5 404 308 0 0 1680 1028
+ IBEditorPositions
+
+ 19
+ 565 587 262 392 0 0 1920 1178
+ 20
+ 807 589 262 392 0 0 1920 1178
+ 36
+ 807 589 262 392 0 0 1920 1178
+
+ IBFramework Version
+ 447.0
+ IBOpenObjects
+
+ 5
+ 19
+ 20
+ 36
+
+ IBSystem Version
+ 9A105
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARInspector.nib/keyedobjects.nib b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARInspector.nib/keyedobjects.nib
new file mode 100644
index 000000000..d76c26b0d
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/Resources/English.lproj/XARInspector.nib/keyedobjects.nib differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/version.plist b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/version.plist
new file mode 100644
index 000000000..3102036da
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Flat Package Editor.app/Contents/version.plist
@@ -0,0 +1,16 @@
+
+
+
+
+ BuildVersion
+ 144
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ ProjectName
+ InstallerMisc
+ SourceVersion
+ 180000
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Installer.icns b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Installer.icns
new file mode 100644
index 000000000..e8f8cc8c7
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/Installer.icns differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/MagGlass.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/MagGlass.tif
new file mode 100644
index 000000000..38caf2f92
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/MagGlass.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/MagGlass_Hover.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/MagGlass_Hover.tif
new file mode 100644
index 000000000..d7dbbafdc
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/MagGlass_Hover.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/PackageMakerDoc.icns b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/PackageMakerDoc.icns
new file mode 100644
index 000000000..f37da5dd4
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/PackageMakerDoc.icns differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/RawMode.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/RawMode.tif
new file mode 100644
index 000000000..8049d6ab7
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/RawMode.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/SplitForks b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/SplitForks
new file mode 100644
index 000000000..50118ce2e
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/SplitForks differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/action.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/action.tif
new file mode 100644
index 000000000..2ab576c3a
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/action.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/action_small.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/action_small.tif
new file mode 100644
index 000000000..4e85faf0e
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/action_small.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/add.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/add.tif
new file mode 100644
index 000000000..74a6ede8a
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/add.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/build.tiff b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/build.tiff
new file mode 100644
index 000000000..7f5f33a4e
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/build.tiff differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/buildandrun.tiff b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/buildandrun.tiff
new file mode 100644
index 000000000..39dc63450
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/buildandrun.tiff differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/contents_control_bg.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/contents_control_bg.tif
new file mode 100644
index 000000000..2810e03ea
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/contents_control_bg.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/defaultBackground.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/defaultBackground.tif
new file mode 100644
index 000000000..750f9b0fc
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/defaultBackground.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/dragBadge1-2.tiff b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/dragBadge1-2.tiff
new file mode 100644
index 000000000..83930e939
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/dragBadge1-2.tiff differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/dragBadge3.tiff b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/dragBadge3.tiff
new file mode 100644
index 000000000..dafd6c63f
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/dragBadge3.tiff differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/dragBadge4.tiff b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/dragBadge4.tiff
new file mode 100644
index 000000000..09e2ac2b0
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/dragBadge4.tiff differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/dragBadge5.tiff b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/dragBadge5.tiff
new file mode 100644
index 000000000..83ba59b75
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/dragBadge5.tiff differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/error.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/error.tif
new file mode 100644
index 000000000..e96aabc7a
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/error.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/insp_minus_hi.tiff b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/insp_minus_hi.tiff
new file mode 100644
index 000000000..a608f0f25
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/insp_minus_hi.tiff differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/insp_minus_norm.tiff b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/insp_minus_norm.tiff
new file mode 100644
index 000000000..608b77e0b
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/insp_minus_norm.tiff differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/insp_plus_hi.tiff b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/insp_plus_hi.tiff
new file mode 100644
index 000000000..343bc6782
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/insp_plus_hi.tiff differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/insp_plus_norm.tiff b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/insp_plus_norm.tiff
new file mode 100644
index 000000000..7ecd1a336
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/insp_plus_norm.tiff differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/javascriptUtilityFunctions.plist b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/javascriptUtilityFunctions.plist
new file mode 100644
index 000000000..c92f3896b
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/javascriptUtilityFunctions.plist
@@ -0,0 +1,71 @@
+
+
+
+
+ pm_device_exists
+
+function pm_device_exists(deviceClass, deviceName) {
+ var classObjects = system.ioregistry.matchingClass('IO' + deviceClass + 'Device');
+ if(classObjects) {
+ for(var i = 0; i < classObjects.length; i++) {
+ var obj = classObjects[i];
+ if(obj[deviceClass + ' Product Name'] == deviceName)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+ pm_pid_for_app
+
+function pm_pid_for_app(identifier, name) {
+ if(identifier && identifier.length) {
+ var apps = system.applications.fromIdentifier(identifier);
+ if(apps)
+ return apps[0].pid;
+ else
+ return -1;
+ }
+ var apps = system.applications.all();
+ if(!apps || !name || name.length == 0)
+ return -1;
+ for(i = 0; i < apps.length; i++) {
+ if(name == apps[i].CFBundleName)
+ return apps[i].pid;
+ }
+ return -1;
+}
+
+ pm_index_of_dock_item
+
+function pm_index_of_dock_item(name, label) {
+ var items = workspace.dockItems();
+ if(!items)
+ return -1;
+ for(i = 0; i < items.length; i++) {
+ var item = items[i];
+ if(label && label.length && label == item.label)
+ return i;
+ var index = (!item.path ? -1:item.path.lastIndexOf(name));
+ if(index != -1 && name && name.length && index == item.path.length - name.length)
+ return i;
+ }
+ return -1;
+}
+
+ pm_index_of_login_item
+
+function pm_index_of_login_item(name) {
+ var items = workspace.loginItems();
+ if(!items || !name || name.length == 0)
+ return -1;
+ for(i = 0; i < items.length; i++) {
+ if(name == items[i].name)
+ return i;
+ }
+ return -1;
+}
+
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/line.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/line.tif
new file mode 100644
index 000000000..7e30f386d
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/line.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/metapackage.icns b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/metapackage.icns
new file mode 100644
index 000000000..7df5ee5bc
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/metapackage.icns differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/notfound.png b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/notfound.png
new file mode 100644
index 000000000..a552fe234
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/notfound.png differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/package.icns b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/package.icns
new file mode 100644
index 000000000..3ff1d356c
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/package.icns differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/packagemaker.icns b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/packagemaker.icns
new file mode 100644
index 000000000..7731988a8
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/packagemaker.icns differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/pkmkshellutility b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/pkmkshellutility
new file mode 100644
index 000000000..6b66ad7f0
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/pkmkshellutility differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/requirementsDefinitions.plist b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/requirementsDefinitions.plist
new file mode 100644
index 000000000..f8bdca229
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/requirementsDefinitions.plist
@@ -0,0 +1,711 @@
+
+
+
+
+
+ Human-readable Name
+ Megabytes Available on Target
+ identifier
+ kilo
+ Type
+ number
+ javascriptTemplate
+ my.target.availableKilobytes %comparator %value * 1024 * 1024
+ ScriptTypes
+
+ VolumeCheck
+
+
+
+ Human-readable Name
+ Maximum CPU Frequency (Hz)
+ identifier
+ cpuf
+ Type
+ number
+ javascriptTemplate
+ system.sysctl('hw.cpufrequency_max') %comparator %value
+ SpecType
+ sysctl
+ SpecArgument
+ hw.cpufrequency_max
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ Memory Available (Bytes)
+ identifier
+ memo
+ Type
+ number
+ javascriptTemplate
+ system.sysctl('hw.memsize') %comparator %value
+ SpecType
+ sysctl
+ SpecArgument
+ hw.memsize
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ Number of CPUs
+ identifier
+ cpus
+ Type
+ number
+ javascriptTemplate
+ system.sysctl('hw.ncpu') %comparator %value
+ SpecType
+ sysctl
+ SpecArgument
+ hw.ncpu
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+
+ Human-readable Name
+ 64-bit Instructions Available
+ identifier
+ 64bi
+ Type
+ boolean
+ javascriptTemplate
+ system.sysctl('hw.optional.64bitops') %comparator %value
+ SpecType
+ sysctl
+ SpecArgument
+ hw.optional.64bitops
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ Altivec Available
+ identifier
+ alti
+ Type
+ boolean
+ javascriptTemplate
+ system.sysctl('hw.optional.altivec') %comparator %value
+ SpecType
+ sysctl
+ SpecArgument
+ hw.optional.altivec
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ Logged-in Users
+ identifier
+ user
+ Type
+ number
+ javascriptTemplate
+ system.users.desktopSessionsCount %comparator %value
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ Target Mountpoint
+ identifier
+ moun
+ Type
+ string
+ javascriptTemplate
+ my.target.mountpoint %comparator %value
+ ScriptTypes
+
+ VolumeCheck
+
+
+
+ Human-readable Name
+ System OS Version (e.g. 10.x.x)
+ identifier
+ sosv
+ Type
+ string
+ javascriptTemplate
+ system.version.ProductVersion %comparator %value
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ Target OS Version (e.g. 10.x.x)
+ identifier
+ tosv
+ Type
+ string
+ javascriptTemplate
+ my.target.systemVersion.ProductVersion %comparator %value
+ ScriptTypes
+
+ VolumeCheck
+
+
+
+
+ Human-readable Name
+ File Exists on System
+ identifier
+ file
+ Type
+ file
+ javascriptTemplate
+ system.files.fileExistsAtPath('%path') %comparator %value
+ SpecType
+ file
+ SpecArgument
+ %path
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ File Exists on Target
+ identifier
+ filt
+ Type
+ file
+ javascriptTemplate
+ system.files.fileExistsAtPath(my.target.mountpoint + '%path') %comparator %value
+ SpecType
+ file
+ SpecArgument
+ %path
+ ScriptTypes
+
+ VolumeCheck
+
+
+
+ Human-readable Name
+ Info from Bundle on System
+ identifier
+ bund
+ Type
+ bundle
+ javascriptTemplate
+ system.files.bundleAtPath('%path').%key %comparator %value
+ SpecType
+ bundle
+ SpecArgument
+ %path
+ SpecProperty
+ %key
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ Info from Bundle on Target
+ identifier
+ bunt
+ Type
+ bundle
+ javascriptTemplate
+ system.files.bundleAtPath(my.target.mountpoint + '%path').%key %comparator %value
+ SpecType
+ bundle
+ SpecArgument
+ %path
+ SpecProperty
+ %key
+ ScriptTypes
+
+ VolumeCheck
+
+
+
+ Human-readable Name
+ Info from Property List on System
+ identifier
+ plis
+ Type
+ plist
+ javascriptTemplate
+ system.files.plistAtPath('%path').%key %comparator %value
+ SpecType
+ plist
+ SpecArgument
+ %path
+ SpecProperty
+ %key
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ Info from Property List on Target
+ identifier
+ plit
+ Type
+ plist
+ javascriptTemplate
+ system.files.plistAtPath(my.target.mountpoint + '%path').%key %comparator %value
+ SpecType
+ plist
+ SpecArgument
+ %path
+ SpecProperty
+ %key
+ ScriptTypes
+
+ VolumeCheck
+
+
+
+
+ Human-readable Name
+ Choices
+ identifier
+ choi
+ Type
+ choices
+ javascriptTemplate
+ choices.%choice.%choiceProperty %comparator %value
+ ScriptTypes
+
+ ChoiceCheck
+
+
+
+ Human-readable Name
+ Current Choice
+ identifier
+ ccho
+ Type
+ curchoice
+ javascriptTemplate
+ my.choice.%choiceProperty %comparator %value
+ ScriptTypes
+
+ ChoiceCheck
+
+
+
+
+ Human-readable Name
+ IORegistry Entry
+ identifier
+ iore
+ Type
+ ioregistry
+ SpecType
+ ioregistry
+ SpecArgument
+ %planepath
+ SpecProperty
+ %attribute
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ FireWire Device Exists
+ identifier
+ fire
+ Type
+ device
+ javascriptTemplate
+ pm_device_exists('FireWire', '%argument') %comparator %value
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ PCI Device Exists
+ identifier
+ pcid
+ Type
+ device
+ javascriptTemplate
+ pm_device_exists('PCI', '%argument') %comparator %value
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ USB Device Exists
+ identifier
+ usbd
+ Type
+ device
+ javascriptTemplate
+ pm_device_exists('USB', '%argument') %comparator %value
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+
+ Human-readable Name
+ Result of Gestalt
+ identifier
+ gest
+ Type
+ combo
+ Values
+
+ addr
+ afps
+ alis
+ Appl
+ appr
+ arb
+ ascr
+ ata
+ bbox
+ BSDa
+ cfrg
+ cmta
+ cmtc
+ cntl
+ conn
+ cpkr
+ cpnt
+ cpuf
+ cput
+ crm
+ dbac
+ dict
+ ditl
+ dkpx
+ dlog
+ doub
+ dply
+ drag
+ dtpf
+ easy
+ edtn
+ evnt
+ fbci
+ fbcv
+ flmp
+ flpy
+ fndr
+ fold
+ font
+ fpu
+ fred
+ fs
+ fxfr
+ gfxa
+ grfx
+ hdwr
+ help
+ hrad
+ i486
+ i586
+ i5ii
+ i5pr
+ icon
+ kbd
+ mach
+ mbeh
+ menu
+ misc
+ mixd
+ mmap
+ mmu
+ mpsc
+ nlup
+ nmgr
+ ocet
+ oceu
+ os
+ otan
+ otcf
+ otra
+ pccd
+ pcxg
+ pic1
+ pop!
+ powr
+ ppc
+ ppcf
+ proc
+ prty
+ q3vc
+ qd
+ qd3d
+ qdrw
+ qdtf
+ qdtx
+ qtim
+ qtrs
+ qtth
+ qtvr
+ rmbg
+ rsrc
+ rtmr
+ safe
+ scra
+ scsi
+ sdev
+ ser
+ shut
+ slot
+ snd
+ spos
+ srad
+ srta
+ stdf
+ sys1
+ sys2
+ sysa
+ sysv
+ te
+ teat
+ tele
+ term
+ thds
+ tmgr
+ tmTE
+ tmTV
+ tree
+ trip
+ tsma
+ tsmv
+ ttsc
+ tv
+ uisf
+ uisv
+ usb
+ vers
+ vm
+ vmin
+ wind
+ wsat
+ x86f
+ x86v
+ xlat
+ zak
+ zak
+
+ javascriptTemplate
+ system.gestalt('%argument') %comparator %value
+ SpecType
+ gestalt
+ SpecArgument
+ %argument
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ Result of Script
+ identifier
+ scri
+ Type
+ file
+ javascriptTemplate
+ system.run('%path') %comparator %value
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ Result of Script for Target
+ identifier
+ scrt
+ Type
+ file
+ javascriptTemplate
+ system.run('%path') %comparator %value
+ ScriptTypes
+
+ VolumeCheck
+
+
+
+ Human-readable Name
+ Result of JavaScript
+ identifier
+ java
+ Type
+ javascript
+ javascriptTemplate
+ %function %comparator %value
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+ Human-readable Name
+ Result of JavaScript for Target
+ identifier
+ javt
+ Type
+ javascript
+ javascriptTemplate
+ %function %comparator %value
+ ScriptTypes
+
+ VolumeCheck
+
+
+
+ Human-readable Name
+ Result of Sysctl
+ identifier
+ sysc
+ Type
+ combo
+ Values
+
+ hw.memsize
+ hw.ncpu
+ hw.activecpu
+ hw.physicalcpu
+ hw.physicalcpu_max
+ hw.logicalcpu
+ hw.logicalcpu_max
+ hw.tbfrequency
+ hw.cpufrequency
+ hw.cpufrequency_max
+ hw.cpufrequency_min
+ hw.busfrequency
+ hw.busfrequency_max
+ hw.busfrequency_min
+ hw.cputype
+ hw.cpusubtype
+ hw.cputhreadtype
+ hw.byteorder
+ hw.pagesize
+ hw.cachelinesize
+ hw.l1dcachesize
+ hw.l1icachesize
+ hw.l2cachesize
+ hw.l3cachesize
+ hw.optional.floatingpoint
+ hw.optional.altivec
+ hw.optional.graphicsops
+ hw.optional.64bitops
+ hw.optional.fsqrt
+ hw.optional.stfiwx
+ hw.optional.dcba
+ hw.optional.datastreams
+ hw.optional.dcbtstreams
+ kern.aiomax
+ kern.aioprocmax
+ kern.aiothreads
+ kern.argmax
+ kern.bootfile
+ kern.boottime
+ kern.clockrate
+ kern.coredump
+ kern.corefile
+ kern.delayterm
+ kern.dummy
+ kern.dumpdev
+ kern.file
+ kern.hostid
+ kern.hostname
+ kern.ipc
+ kern.job_control
+ kern.kdebug
+ kern.logsigexit
+ kern.low_pri_delay
+ kern.low_pri_window
+ kern.maxfiles
+ kern.maxfilesperproc
+ kern.maxpartitions
+ kern.maxproc
+ kern.maxprocperuid
+ kern.maxvnodes
+ kern.netboot
+ kern.ngroups
+ kern.nisdomainname
+ kern.ntp_pll
+ kern.osreldate
+ kern.osrelease
+ kern.osrevision
+ kern.ostype
+ kern.panicinfo
+ kern.pcsamples
+ kern.posix
+ kern.posix1version
+ kern.proc_low_pri_io
+ kern.proc
+ kern.procargs
+ kern.procargs2
+ kern.profiling
+ kern.saved_ids
+ kern.securelevel
+ kern.shreg_private
+ kern.sugid_coredump
+ kern.symfile
+ kern.sysv
+ kern.update
+ kern.usrstack
+ kern.version
+ kern.vnode
+
+ javascriptTemplate
+ system.sysctl('%argument') %comparator %value
+ SpecType
+ sysctl
+ SpecArgument
+ %argument
+ ScriptTypes
+
+ InstallationCheck
+
+
+
+
+ Human-readable Name
+ Search Result is Found
+ identifier
+ seac
+ Type
+ search
+ javascriptTemplate
+ my.search.results['%search-id']
+ ScriptTypes
+
+ ChoiceCheck
+ VolumeCheck
+
+
+
+
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/restrictedshine.tiff b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/restrictedshine.tiff
new file mode 100644
index 000000000..de3f8bfa4
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/restrictedshine.tiff differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/sidebarSelectionBackground.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/sidebarSelectionBackground.tif
new file mode 100644
index 000000000..24aad6ffa
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/sidebarSelectionBackground.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/sidebarSelectionBackgroundSmall.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/sidebarSelectionBackgroundSmall.tif
new file mode 100644
index 000000000..32eed3cda
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/sidebarSelectionBackgroundSmall.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/snapshot.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/snapshot.tif
new file mode 100644
index 000000000..0d510f0dc
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/snapshot.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/splitter_handle.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/splitter_handle.tif
new file mode 100644
index 000000000..fe4d0f45a
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/splitter_handle.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/stop.tiff b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/stop.tiff
new file mode 100644
index 000000000..a65c6dff5
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/stop.tiff differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/warning.tif b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/warning.tif
new file mode 100644
index 000000000..234397271
Binary files /dev/null and b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/Resources/warning.tif differ
diff --git a/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/version.plist b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/version.plist
new file mode 100644
index 000000000..3ba7ae687
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/app/PackageMaker.app/Contents/version.plist
@@ -0,0 +1,16 @@
+
+
+
+
+ BuildVersion
+ 2
+ CFBundleShortVersionString
+ 3.0.3
+ CFBundleVersion
+ 174
+ ProjectName
+ PackageMaker
+ SourceVersion
+ 1760100
+
+
diff --git a/Engine/bin/tools/packagemaker/scripts/templates/default_template.pmdoc/index (Autosaved) b/Engine/bin/tools/packagemaker/scripts/templates/default_template.pmdoc/index (Autosaved)
new file mode 100644
index 000000000..e90a93d3f
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/scripts/templates/default_template.pmdoc/index (Autosaved)
@@ -0,0 +1 @@
+My Titlecom.mygamecompanyMy Package Description/Users/garagegames/Documents/GarageGames_Splash_Screens/iPhone/splash_itgb_v.pngdescriptionproperties.title
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/scripts/templates/default_template.pmdoc/index.xml b/Engine/bin/tools/packagemaker/scripts/templates/default_template.pmdoc/index.xml
new file mode 100644
index 000000000..6bb9b7db7
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/scripts/templates/default_template.pmdoc/index.xml
@@ -0,0 +1 @@
+My Titlecom.mygamecompanyMy Package Descriptionpanel.pngdescriptionproperties.title
\ No newline at end of file
diff --git a/Engine/bin/tools/packagemaker/scripts/templates/launchSafari b/Engine/bin/tools/packagemaker/scripts/templates/launchSafari
new file mode 100644
index 000000000..d200f19d9
--- /dev/null
+++ b/Engine/bin/tools/packagemaker/scripts/templates/launchSafari
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+exec osascript </" "/Users/$USER/Library/Internet Plug-Ins/"
+
+exec osascript <
+ Demos
+ Genre Kits
+ Stronghold Demo
+
+-->
+
+ My Projects
+ Games
+ Demos
+ Examples
+ Genre Kits
+ Templates
+
diff --git a/Engine/bin/tools/standards/header.txt b/Engine/bin/tools/standards/header.txt
new file mode 100644
index 000000000..509b0f0c0
--- /dev/null
+++ b/Engine/bin/tools/standards/header.txt
@@ -0,0 +1,21 @@
+//-----------------------------------------------------------------------------
+// Copyright (c) 2012 GarageGames, LLC
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//-----------------------------------------------------------------------------
diff --git a/Engine/bin/tools/store/ART.png b/Engine/bin/tools/store/ART.png
new file mode 100644
index 000000000..b4519ba2a
Binary files /dev/null and b/Engine/bin/tools/store/ART.png differ
diff --git a/Engine/bin/tools/store/BANNER_STORE.png b/Engine/bin/tools/store/BANNER_STORE.png
new file mode 100644
index 000000000..6db43db28
Binary files /dev/null and b/Engine/bin/tools/store/BANNER_STORE.png differ
diff --git a/Engine/bin/tools/store/GENRE.png b/Engine/bin/tools/store/GENRE.png
new file mode 100644
index 000000000..02486cdca
Binary files /dev/null and b/Engine/bin/tools/store/GENRE.png differ
diff --git a/Engine/bin/tools/store/TOOLS.png b/Engine/bin/tools/store/TOOLS.png
new file mode 100644
index 000000000..c2b9ca638
Binary files /dev/null and b/Engine/bin/tools/store/TOOLS.png differ
diff --git a/Engine/bin/tools/store/index.html b/Engine/bin/tools/store/index.html
new file mode 100644
index 000000000..aada60030
--- /dev/null
+++ b/Engine/bin/tools/store/index.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Engine/bin/tools/style-mac.css b/Engine/bin/tools/style-mac.css
new file mode 100644
index 000000000..e4ca09f02
--- /dev/null
+++ b/Engine/bin/tools/style-mac.css
@@ -0,0 +1,20 @@
+/*--------------------------------------- Tab Page ----------------------------------------------*/
+QTabWidget::pane {
+ top:0.6em; /*fixes mac vertical centering*/
+}
+/*--------------------------------------- mainWindow style ----------------------------------------------*/
+QMainWindow{
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(49, 43, 76, 255), stop:0.155 rgba(32, 26, 38, 255), stop:0.156 rgba(240, 239, 238, 255), stop:1 rgba(240, 239, 238, 255));
+}
+.DeploymentPage > QGroupBox{
+ margin-top:10px;
+}
+.DeploymentPage > QPushButton, .ProgressDialog QPushButton, .NewProjectPage QPushButton, .ProgressFinishedDialog QPushButton, .ToolBarEditorAdd QPushButton{
+ margin:0px 0px 0px 15px;
+}
+QPushButton{ padding-left:5px; padding-right:5px;}
+#PackageGroupBox QPushButton{ /*fixes button crowding issue*/
+ margin:0 10px 0 0;
+}
+#ProjectInformationGroupBox{border:none;}
+#ExistingProjectInfoLastUpdateValue{padding:0; margin:0;}
\ No newline at end of file
diff --git a/Engine/bin/tools/style.css b/Engine/bin/tools/style.css
new file mode 100644
index 000000000..fb1a945aa
--- /dev/null
+++ b/Engine/bin/tools/style.css
@@ -0,0 +1,305 @@
+/*--------------------------------------- Default Styles ----------------------------------------------*/
+QWidget { font: 11px Arial, Helvetica, sans-serif ; }
+QMainWindow{
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 255, 255, 255), stop:0.001 rgba(49, 43, 76, 255), stop:0.155 rgba(32, 26, 38, 255), stop:0.156 rgba(240, 239, 238, 255), stop:1 rgba(240, 239, 238, 255));
+}
+
+/*--------------------------------------- Radio Button ----------------------------------------------*/
+QRadioButton::indicator {width:13px; height:13px; }
+QRadioButton::indicator::unchecked {image: url(:/Torque3DFrontloader/resources/radioButton_unchecked.png); }
+QRadioButton::indicator:unchecked:hover {image: url(:/Torque3DFrontloader/resources/radioButton_unchecked_hover.png); }
+QRadioButton::indicator:unchecked:pressed {image: url(:/Torque3DFrontloader/resources/radioButton_unchecked_pressed.png); }
+QRadioButton::indicator::checked {image: url(:/Torque3DFrontloader/resources/radioButton_checked.png); }
+QRadioButton::indicator:checked:hover {image: url(:/Torque3DFrontloader/resources/radioButton_checked_hover.png); }
+QRadioButton::indicator:checked:pressed {image: url(:/Torque3DFrontloader/resources/radioButton_checked_pressed.png); }
+
+/*--------------------------------------- CheckBox ----------------------------------------------*/
+QCheckBox {spacing: 5px; }
+QCheckBox::indicator {width: 13px; height: 13px; }
+QCheckBox::indicator:unchecked {image: url(:/Torque3DFrontloader/resources/checkbox_unchecked.png); }
+QCheckBox::indicator:unchecked:hover {image: url(:/Torque3DFrontloader/resources/checkbox_unchecked_hover.png); }
+QCheckBox::indicator:unchecked:pressed {image: url(:/Torque3DFrontloader/resources/checkbox_unchecked_pressed.png); }
+QCheckBox::indicator:checked {image: url(:/Torque3DFrontloader/resources/checkbox_checked.png); }
+QCheckBox::indicator:checked:hover {image: url(:/Torque3DFrontloader/resources/checkbox_checked_hover.png); }
+QCheckBox::indicator:checked:pressed {image: url(:/Torque3DFrontloader/resources/checkbox_checked_pressed.png); }
+QCheckBox::indicator:indeterminate {image: url(:/Torque3DFrontloader/resources/checkbox_indeterminate.png); }
+/*QCheckBox::indicator:indeterminate:hover {image: url(:/Torque3DFrontloader/resources/checkbox_indeterminate_hover.png); }
+QCheckBox::indicator:indeterminate:pressed {image: url(:/Torque3DFrontloader/resources/checkbox_indeterminate_pressed.png); }*/
+
+/*--------------------------------------- Vertical Scrolbar ----------------------------------------------*/
+QScrollBar:vertical {
+background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(240, 239, 238, 255), stop:1 rgba(255, 255, 255, 255));
+width: 15px;
+margin: 16px 0 16px 0; }
+QScrollBar::handle:vertical {
+ border:1px solid rgb(200,200,200); border-radius:3px;
+ background-image: url(:/Torque3DFrontloader/resources/grip-v.png); background-repeat:none; background-position:center center;
+ background-color:qlineargradient(spread:repeat, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(247, 246, 245, 255), stop:0.497326 rgba(241, 240, 239, 255), stop:0.5 rgba(232, 231, 230, 255), stop:1 rgba(222, 222, 222, 255)); padding:5px 15px 5px 15px; min-height: 20px; }
+QScrollBar::handle:vertical:hover {border:1px solid rgb(150,150,150); background-image: url(:/Torque3DFrontloader/resources/grip-v_d.png);}
+QScrollBar::add-line:vertical {
+ background:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(240, 239, 238, 255), stop:1 rgba(255, 255, 255, 255));
+ height:16px; subcontrol-position:bottom; subcontrol-origin:margin; }
+QScrollBar::sub-line:vertical {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(240, 239, 238, 255), stop:1 rgba(255, 255, 255, 255));
+ height: 16px; subcontrol-position: top; subcontrol-origin: margin;}
+QScrollBar::up-arrow:vertical{margin:0 0 0 1px; width:16px; height:16px; background-image: url(:/Torque3DFrontloader/resources/up-arrow_n.png); }
+QScrollBar::down-arrow:vertical {margin:1px 0 0 1px; width:16px; height:16px; background-image: url(:/Torque3DFrontloader/resources/down-arrow_n.png); }
+QScrollBar::up-arrow:vertical:hover{background-image: url(:/Torque3DFrontloader/resources/up-arrow.png); }
+QScrollBar::down-arrow:vertical:hover {background-image: url(:/Torque3DFrontloader/resources/down-arrow.png); }
+QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: none; }
+/*--------------------------------------- Horizontal Scrolbar ----------------------------------------------*/
+QScrollBar:horizontal {
+background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(240, 239, 238, 255), stop:1 rgba(255, 255, 255, 255));
+height: 15px;
+margin: 0 16px 0 16px ; }
+QScrollBar::handle:horizontal {
+ border:1px solid rgb(200,200,200); border-radius:3px;
+ background-image: url(:/Torque3DFrontloader/resources/grip-h.png); background-repeat:none; background-position:center center;
+ background-color:qlineargradient(spread:repeat, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(247, 246, 245, 255), stop:0.497326 rgba(241, 240, 239, 255), stop:0.5 rgba(232, 231, 230, 255), stop:1 rgba(222, 222, 222, 255)); padding:5px 15px 5px 15px; min-width: 20px; }
+QScrollBar::handle:horizontal:hover {border:1px solid rgb(150,150,150); background-image: url(:/Torque3DFrontloader/resources/grip-h_d.png);}
+QScrollBar::add-line:horizontal {
+ background:qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(240, 239, 238, 255), stop:1 rgba(255, 255, 255, 255));
+ width:16px; subcontrol-position:right; subcontrol-origin:margin; }
+QScrollBar::sub-line:horizontal {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(240, 239, 238, 255), stop:1 rgba(255, 255, 255, 255));
+ width: 16px; subcontrol-position:left; subcontrol-origin: margin;}
+QScrollBar::left-arrow:horizontal{margin:0 0 0 1px; width:16px; height:16px; background-image: url(:/Torque3DFrontloader/resources/left-arrow_n.png); }
+QScrollBar::right-arrow:horizontal {margin:1px 0 0 1px; width:16px; height:16px; background-image: url(:/Torque3DFrontloader/resources/right-arrow_n.png); }
+QScrollBar::left-arrow:horizontal:hover{background-image: url(:/Torque3DFrontloader/resources/left-arrow.png); }
+QScrollBar::right-arrow:horizontal:hover {background-image: url(:/Torque3DFrontloader/resources/right-arrow.png); }
+QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { background: none; }
+
+/*--------------------------------------- Window Background Color ----------------------------------------------*/
+.DeploymentPageAdvanced, .DeploymentPage, .launchingdialog, .NewProjectPage, .ProgressFinishedDialog, QDialogue, .ProgressDialog, QDialog {
+ background-color: rgb(242, 241, 240);
+}
+.DeploymentPage > QGroupBox{
+ margin-left:8px;
+ margin-right:8px;
+ padding: 0 4px 0 4px;
+}
+
+/*--------------------------------------- Tab Page ----------------------------------------------*/
+QTabWidget::pane {
+ position:absolute;
+ top:0px; /*fixes mac vertical centering*/
+ border: 1px solid rgb(100, 100, 100);
+ border-top-right-radius:3px; border-bottom-left-radius:3px; border-bottom-right-radius:3px;
+ background-color: rgb(255, 255, 255);
+}
+QTabWidget::tab-bar{
+ alignment: left; /*fixes mac horizontal centering*/
+ top:0px; /*fixes mac vertical centering*/
+}
+QTabBar::tab {
+ right:0px;
+ border: 1px solid rgb(100, 100, 100);
+ min-width:8ex;
+ border-top-left-radius:3px; border-top-right-radius:3px;
+ padding:1px 10px 2px 10px;
+ background-color: rgb(255,255,255);
+}
+QTabBar::tab::selected {
+ border-style: solid solid none solid;
+ background-color: rgb(255,255,255);
+}
+QTabBar::tab::!selected:hover {
+ border-style: solid;
+ background-color:qlineargradient(spread:pad, x1:1, y1:0, x2:1, y2:1, stop:0.8125 rgba(230, 230, 230, 255), stop:1 rgba(190, 190, 190, 255));
+}
+QTabBar::tab:!selected {
+ background-color:qlineargradient(spread:pad, x1:1, y1:0, x2:1, y2:1, stop:0.8125 rgba(212, 212, 212, 255), stop:1 rgba(178, 178, 178, 255));
+ margin-top:3px;
+}
+QTabWidget::pane QTextEdit{
+ border: none;
+}
+
+/*--------------------------------------- Dropdown Boxes ----------------------------------------------*/
+QComboBox::drop-down{
+ subcontrol-origin: padding; subcontrol-position: top right; width: 17px;
+ padding:-2px 2px 0 0; border-top-right-radius: 3px; border-bottom-right-radius: 3px;
+}
+QComboBox::down-arrow{ background-image: url(:/Torque3DFrontloader/resources/down-arrow.png);}
+QComboBox::down-arrow:on { top: 1px; left: 1px; }
+QComboBox QAbstractItemView { background: white; border:1px solid gray; }
+QComboBox:on{background-color:qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0.903409 rgba(212, 212, 212, 255), stop:1 rgba(178, 178, 178, 255));}
+QComboBox{
+ border:1px solid rgb(100,100,100); border-radius:3px;
+ background-color:qlineargradient(spread:repeat, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(247, 246, 245, 255), stop:0.497326 rgba(241, 240, 239, 255), stop:0.5 rgba(232, 231, 230, 255), stop:1 rgba(222, 222, 222, 255));
+}
+
+/*--------------------------------------- Default Button ----------------------------------------------*/
+QPushButton{
+ border:1px solid rgb(100,100,100);
+ border-radius:3px;
+ background-color:qlineargradient(spread:repeat, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(247, 246, 245, 255), stop:0.497326 rgba(241, 240, 239, 255), stop:0.5 rgba(232, 231, 230, 255), stop:1 rgba(222, 222, 222, 255));
+ padding:4px 15px 4px 15px;
+ min-height:11px;
+}
+
+/*--------------------------------------- Tool Button ----------------------------------------------*/
+QToolButton{
+ border:1px solid rgb(100,100,100);
+ border-radius:3px;
+ background-color:qlineargradient(spread:repeat, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(247, 246, 245, 255), stop:0.497326 rgba(241, 240, 239, 255), stop:0.5 rgba(232, 231, 230, 255), stop:1 rgba(222, 222, 222, 255));
+}
+.QPushButton:pressed, .QToolButton::pressed, #PackageGroupBox .QPushButton:pressed, #CreateNewProjectButton:pressed, #OtherGroupBox .QPushButton:pressed, #EditorQuickLinkGroupBox .QPushButton:pressed{ /* Default Button Pressed state */
+ background-color:qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0.903409 rgba(212, 212, 212, 255), stop:1 rgba(178, 178, 178, 255));
+}
+QPushButton::hover, QToolButton::hover, QComboBox::hover{ /* Default Button Hover state */
+ background-color:qlineargradient(spread:repeat, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(247, 246, 245, 255), stop:1 rgba(222, 222, 222, 255));
+}
+QPushButton::menu-indicator{
+ subcontrol-position:right center;
+ subcontrol-orgin:padding;
+}
+
+/*--------------------------------------- New Project Button ----------------------------------------------*/
+#CreateNewProjectButton { border:none; background:none; margin:0; padding:0; }
+#CreateNewProjectButton:hover { border:1px solid rgb(200,200,200); background:none; }
+
+/*--------------------------------------- Web link style button ----------------------------------------------*/
+#EditToolBarButton, #HelpGroupBox QPushButton, #EditCommentsButton {
+ font:10px;
+ color:#0A0260;
+ border:none; background:none;
+ margin:0 0 5px 0;
+ text-decoration:underline;
+ max-height:20px;
+ padding:0;
+}
+#EditToolBarButton:hover, #HelpGroupBox QPushButton:hover, #EditCommentsButton:hover {
+ color:#000000;
+ margin:0 0 5px 0;
+}
+
+/*--------------------------------------- Project Tree Item ----------------------------------------------*/
+.ProjectTreeItem{ /*-- unSelected --*/
+ border-bottom-right-radius:4px;
+ border-top-right-radius:4px;
+ background:#F6f5f4;
+ border:1px solid #eeeeee;
+}
+.ProjectTreeItem::hover { /*-- Hover --*/
+ border:1px solid #cccccc;
+ background-color:qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(240, 239, 238, 255), stop:1 rgba(255, 255, 255, 255));
+}
+/*border:1px solid rgb(0, 44, 67); -- Selected done in Code --
+
+background-color: qlineargradient(spread:repeat, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(223, 245, 255, 255), stop:0.49 rgba(252, 254, 255, 255), stop:0.5 rgba(208, 233, 245, 255), stop:1 rgba(239, 250, 255, 255))*/
+#ProjectName{ /*-- project name color --*/
+ color:#000000;
+}
+/*--------------------------------------- Thumb Image Border ----------------------------------------------*/
+.ProjectTreeItem QLabel#ProjectImage, #ProjectInformationGroupBox QLabel#ExistingProjectInfoPreviewImage, #PreviewImage
+{
+ border:1px solid #444444;
+ border-radius:2px;
+}
+/*--------------------------------------- Blank Frame style ----------------------------------------------*/
+#PreviewImageFrame{ border:none; }
+
+/*--------------------------------------- Default text area styles ----------------------------------------------*/
+.ProjectScrollArea, QTreeView, QTextEdit, QLineEdit:focus, #DirectoryTextEdit:focus, #ExistingProjectInfoComment:focus{
+ border:1px inset rgb(100,100,100);
+ border-radius:2px;
+ background-color: rgb(255,255,255);
+}
+#ExistingProjectInfoComment{ border:1px solid rgb(200, 200, 200); border-radius:2px; background-color: rgb(255,255,255);}
+#DirectoryTextEdit{ border:none; background-color: rgb(242, 241, 240); }
+.ProjectScrollArea #ProjectScrollContent { background-color: rgb(255,255,255); }
+QLineEdit{ /*line edit not selected state*/
+ border:1px inset rgb(100,100,100);
+ border-radius:2px;
+ background-color: rgb(242, 241, 240);
+}
+/*--------------------------------------- Header style ----------------------------------------------*/
+QHeaderView::section{
+ border:1px solid rgb(100,100,100);
+ margin:-1px 0 0 -1px;
+ background-color:qlineargradient(spread:repeat, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(247, 246, 245, 255), stop:0.497326 rgba(241, 240, 239, 255), stop:0.5 rgba(232, 231, 230, 255), stop:1 rgba(222, 222, 222, 255));
+ padding-left:10px;
+ height:20px;
+}
+/*--------------------------------------- Quicklinks ----------------------------------------------*/
+#EditorQuickLinkGroupBox QPushButton {
+ height:20px; min-height:20px;
+ width:125px; max-width:125px;
+}
+/*--------------------------------------- Left Quicklinks ----------------------------------------------*/
+#LeftQuickLinkButton {
+ border:1px solid rgb(150,150,150); border-top-left-radius:3px; border-bottom-left-radius:3px; border-top-right-radius:0; border-bottom-right-radius:0;
+ width:100px; height:24px;
+ background-color:qlineargradient(spread:repeat, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(247, 246, 245, 255), stop:0.497326 rgba(241, 240, 239, 255), stop:0.5 rgba(232, 231, 230, 255), stop:1 rgba(222, 222, 222, 255));
+}
+#LeftQuickLinkButton::pressed, #RightQuickLinkButton::pressed { background-color:qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0.903409 rgba(212, 212, 212, 255), stop:1 rgba(178, 178, 178, 255));}
+/*--------------------------------------- Right Quicklinks ----------------------------------------------*/
+#RightQuickLinkButton {
+ border:1px solid rgb(150,150,150); border-top-right-radius:3px; border-bottom-right-radius:3px; border-top-left-radius:0; border-bottom-left-radius:0;
+ width:100px; height:24px;
+ background-color:qlineargradient(spread:repeat, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(247, 246, 245, 255), stop:0.497326 rgba(241, 240, 239, 255), stop:0.5 rgba(232, 231, 230, 255), stop:1 rgba(222, 222, 222, 255));
+}
+#RightQuickLinkButton::hover, #LeftQuickLinkButton::hover { background-color:qlineargradient(spread:repeat, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(247, 246, 245, 255), stop:1 rgba(222, 222, 222, 255)); }
+
+/*--------------------------------------- Less important Editor Buttons ----------------------------------------------*/
+#OtherGroupBox QPushButton{
+ color:rgb(50,50,50);
+ border:1px solid rgb(150,150,150);
+ background:none;
+}
+#PackageGroupBox QPushButton {
+ color:rgb(50,50,50);
+ border:1px solid rgb(200,200,200);
+ background:none;
+}
+#PackageGroupBox QPushButton:hover, #OtherGroupBox QPushButton:hover {
+ color:rgb(0,0,0);
+ border:1px solid rgb(100,100,100);
+ background:qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(240, 239, 238, 255), stop:1 rgba(255, 255, 255, 255));
+}
+/*--------------------------------------- Default GroupBox Style ----------------------------------------------*/
+QGroupBox {
+ border:1px rgb(150,150,150);
+ border-style: solid none none none;
+ border-radius:0;
+ margin:5px 0 0 0px;
+}
+QGroupBox::title { /* Default GroupBox Title Style */
+ top:-7px; left:0px;
+ margin: 0 4px 0 0px;
+}
+/*--------------------------------------- Full GroupBox ----------------------------------------------*/
+#ProjectApplicationsGroupBox, #commentsGroupBox{
+ border:1px solid rgb(220,220,220);
+ border-radius:3px;
+ margin:9px 0 0 0;
+ padding:8px 8px 8px 8px;
+}
+#ProjectApplicationsGroupBox::title { left:7px; margin: 0 4px 0 4px; } /* Full GroupBox Title*/
+
+/*--------------------------------------- Quicklinks GroupBox ----------------------------------------------*/
+#EditorQuickLinkGroupBox {
+ border:1px solid rgb(150,150,150);
+ border-radius:5px;
+ margin:0;
+ background:qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(240, 239, 238, 255), stop:1 rgba(255, 255, 255, 255));
+}
+
+/*--------------------------------------- Transparent GroupBox ----------------------------------------------*/
+#EditorQuickLinkLabel, #OtherGroupBox, #HelpGroupBox, #ExistingProjectInfoComment { /* invisable group boxes */ border: none; background:none; }
+
+/*--------------------------------------- Launching Dialog Main Text ----------------------------------------------*/
+#LaunchingDialogMainText{ font:18px Arial, Helvetica, sans-serif bold; }
+/*--------------------------------------- Gray light Text Lables ----------------------------------------------*/
+#ExistingProjectInfoSizeLabel, #ExistingProjectInfoLastUpdateLabel , #ProjectLastUpdate, #ProjectSize, #TemplatePreviewSizeLabel, #TemplatePreviewLastUpdateLabel, #TemplatePreviewCreatedDataLabel{
+ color:#999999
+}
+/*--------------------------------------- Gray dark Text Lables ----------------------------------------------*/
+#ProjectLastUpdateValue, #ProjectSizeValue{
+ color:#444444;
+}
+/*--------------------------------------- Text White Background Fill ----------------------------------------------*/
+#ExistingProjectInfoMyGameName, #ExistingProjectInfoLastUpdateValue, #EditCommentsButton, #ExistingProjectInfoCommentTime, #CurrentStageStatusText{
+ background-color: rgb(255, 255, 255);
+}
\ No newline at end of file
diff --git a/Engine/bin/tools/web/launchsafari.scpt b/Engine/bin/tools/web/launchsafari.scpt
new file mode 100644
index 000000000..b70dc56b2
Binary files /dev/null and b/Engine/bin/tools/web/launchsafari.scpt differ
diff --git a/Engine/bin/tools/web/launchsafarisamewindow.scpt b/Engine/bin/tools/web/launchsafarisamewindow.scpt
new file mode 100644
index 000000000..be7f80606
Binary files /dev/null and b/Engine/bin/tools/web/launchsafarisamewindow.scpt differ
diff --git a/Engine/bin/tools/web/macplugin/Full Plugin.bundle/Contents/Info.plist b/Engine/bin/tools/web/macplugin/Full Plugin.bundle/Contents/Info.plist
new file mode 100644
index 000000000..d7a40f96c
--- /dev/null
+++ b/Engine/bin/tools/web/macplugin/Full Plugin.bundle/Contents/Info.plist
@@ -0,0 +1,40 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ Full Plugin
+ CFBundleIdentifier
+ com.mygamecompany.fulltemplateplugin
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundlePackageType
+ BRPL
+ CFBundleShortVersionString
+ 1.01
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ CSResourcesFileMapped
+
+ GameInstallPath
+ /Users/garagegames/Desktop/Torque3DCheckout/Templates/Full/game/
+ GameName
+ Full
+ WebPluginDescription
+ Full Template Plugin 1.0
+ WebPluginMIMETypes
+
+ application/x-fulltemplateplugin
+
+ WebPluginTypeDescription
+ 1.0
+
+
+ WebPluginName
+ Full Plugin
+
+
diff --git a/Engine/bin/tools/web/macplugin/Full Plugin.bundle/Contents/MacOS/Full Plugin b/Engine/bin/tools/web/macplugin/Full Plugin.bundle/Contents/MacOS/Full Plugin
new file mode 100644
index 000000000..73ef657e2
Binary files /dev/null and b/Engine/bin/tools/web/macplugin/Full Plugin.bundle/Contents/MacOS/Full Plugin differ
diff --git a/Engine/bin/tools/web/macplugin/Full Plugin.bundle/Contents/Resources/English.lproj/InfoPlist.strings b/Engine/bin/tools/web/macplugin/Full Plugin.bundle/Contents/Resources/English.lproj/InfoPlist.strings
new file mode 100644
index 000000000..3234eacb2
Binary files /dev/null and b/Engine/bin/tools/web/macplugin/Full Plugin.bundle/Contents/Resources/English.lproj/InfoPlist.strings differ
diff --git a/Engine/bin/tools/web/templates/webDeploy.conf b/Engine/bin/tools/web/templates/webDeploy.conf
new file mode 100644
index 000000000..1edbffe3b
--- /dev/null
+++ b/Engine/bin/tools/web/templates/webDeploy.conf
@@ -0,0 +1,41 @@
+";
+
+ //------ NP plugin settings
+
+ // The plugin MUST begin with NP for Firefox to recognize it
+ // setup in project.conf
+ public static $npPluginName = "";
+
+ public static $company = "";
+ public static $companyKey = "";
+ public static $productName = "";
+ public static $version = "";
+ public static $description = "";
+
+ // Before you should specify a unique MIME type for your game
+ public static $mimeType = "";
+
+ //------ ActiveX plugin settings
+
+ // setup in project.conf
+ public static $axPluginName = "";
+
+ // Before shipping the UUID should be changed to unique numbers for your game
+
+ // This UUID is used by CLSID in object tag in your site's html
+ public static $axWebGameLibUUID = "";
+
+ // Other UUID used by registry
+ public static $axAppUUID = "";
+ public static $axWebGameUUID = "";
+ public static $axWebGameCtrlUUID = "";
+
+
+};
+
+?>
\ No newline at end of file
diff --git a/Engine/bin/tools/web/templates/webDeploy.mac.conf b/Engine/bin/tools/web/templates/webDeploy.mac.conf
new file mode 100644
index 000000000..9b8bbc709
--- /dev/null
+++ b/Engine/bin/tools/web/templates/webDeploy.mac.conf
@@ -0,0 +1,22 @@
+";
+
+
+ public static $description = "";
+
+
+ public static $version = "";
+
+ // Before you should specify a unique MIME type for your game
+ public static $mimeType = "";
+
+};
+
+?>
diff --git a/Engine/bin/tools/zip/unzip.exe b/Engine/bin/tools/zip/unzip.exe
new file mode 100644
index 000000000..510491f64
Binary files /dev/null and b/Engine/bin/tools/zip/unzip.exe differ
diff --git a/Engine/bin/tools/zip/zip.exe b/Engine/bin/tools/zip/zip.exe
new file mode 100644
index 000000000..55be81dad
Binary files /dev/null and b/Engine/bin/tools/zip/zip.exe differ
diff --git a/Engine/bin/uuidgen/uuidgen.exe b/Engine/bin/uuidgen/uuidgen.exe
new file mode 100644
index 000000000..7d3f3b176
Binary files /dev/null and b/Engine/bin/uuidgen/uuidgen.exe differ