3!       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ Safe-InferedButton 4 is default Button 3 is default Button 2 is default Button 1 is default RTL reading order Right align text Set foreground Make messagebox topmost Display with installer's icon Display with stop icon  Display with question mark icon Display with information icon Display with exclamation icon %Display with yes, no, cancel buttons  Display with yes and no buttons &Display with retry and cancel buttons *Display with abort, retry, ignore buttons !'Display with an OK and a cancel button "Display with an OK button 8Mode to use with ' Development. 94Opened for both read and write, contents preserved. ; Read a file. =A code label, used for goto programming, see .   !"#$%&'()*+,-./0123456789:;     <= !"#$%&'()*+,-./0  !"#$%&'()*+,-./0123456789:;     <=(  "! #3210/.-,+*)('&%$4765 8;:95     <= !"#$%&'()*+,-./0 Safe-Infered111 Safe-Infered222NoneC>&The type of a file handle, created by . P$The type of expressions - namely an R producing a Q. There are instances  for 3 and 4, and turning on {-# LANGUAGE OverloadedStrings #-} is  strongly recommended. The 5 function converts any embedded $VAR3 into a variable lookup, which may refer to one of $ the builtin NSIS variables (e.g.  $SMPROGRAMS, $TEMP,  $PROGRAMFILES), or a named variable  created with Z or X . The string $$ is used to escape $ values. A Bracket the variables to put text characters afterwards (e.g. $(SMPROGRAMS)XXX). In contrast  to standard strings, / is treated as \ and // is treated as /. Remember to escape any  slashes occuring in URLs. If the string is P 6 then any 71 variables used will be automatically shown (see ).  If the string is P ty then it must be of the form "$VAR" where $VAR is a variable of type ty. The 8 and 9 instances for P' throw errors for all comparisons (use g, i etc),  but : and ; are defined. The 3 (arithmetic) and <+ (string concatenation) instances are both  fully implemented. From = and >, only ?, @ and A are implemented, and 0 all as integer arithmetic. No functions from B or C are implemented. MWhen using a single expression multiple times, to ensure it is not evaluated  repeatedly, use \. QA Q, only used by P, which can be produced using D.  The ty argument should be one of 6, 7 or E. RIMonad in which installers are defined. A useful command to start with is . TCreate a new label, used with w and v' to write line jump based programming. B Where possible you should use structured alternatives, such as y, { and |. 4 Each created label must be used with one call to v, and any number of calls to  w. As an example:    abort <- T  { var $ do  z cond1 $ w abort  z cond2 $ w abort  var V q 1 var  v abort MNote that the above example could have been written in a simpler manner with |. USet all  actions to automatically take L. VZAssign a value to a mutable variable. The variable must have been originally created with  X or Y>, or there will be an error when generating the install file. WNIntroduce a variable scope. Scopes are automatically introduced by operations  such as y, |, {2 etc. Inside a scope you may define new variables ` whose names may clash with variables outside the scope, but the local versions will be used. WIf you have any non-evaluated expressions, before introducing any potentially clashing % variables in the scope you should \ them or use [ on them. For example:    operate x = do  x <- [ x  W $ do  Z "TEST" 0 It is important to turn x into a [ before defining a new constant $TEST, since  if x refers to $TEST? after the new definition, it will pick up the wrong variable. X=Create a mutable variable a name, which can be modified with V. ; After defining the expression, you can refer to it with $NAME in a 6. ! To introduce a new scope, see W.   h <- X "HELLO" " Hello World"  "$HELLO" V "$HELLO!"  h V "$HELLO!" -- equivalent to the above   "$HELLO"$ -- with 2 exclamation marks Y?Create an unnamed mutable variable, which can be modified with V.   h <- X " Hello World"  h V h  "!"   h ZBCreate a constant with a name, ensuring the expression is shared. ; After defining the expression, you can refer to it with $NAME in a 6. ! To introduce a new scope, see W.   Z HELLO  Hello World   $HELLO! [CCreate a constant with no name, ensuring the expression is shared.  Equivalent to \ D. \The PW language is call-by-name, meaning you must use share to avoid evaluating an exression  multiple times. Using \), if the expression has any side effects b they will be run immediately, but not on subsequent uses. When defining functions operating on  PP, if you use the same input expression twice, you should share it. For example:    strPalindrom x = \ x $ \x -> x g strReverse x &If the expression was not shared, and x6 read from a file, then the file would be read twice. ] Versions of X and Z restricted to P 7, used to avoid  ambiguous type errors. ^ Versions of X and Z restricted to P 7, used to avoid  ambiguous type errors. _ Versions of Y and [ restricted to P 7, used to avoid  ambiguous type errors. ` Versions of Y and [ restricted to P 7, used to avoid  ambiguous type errors. a Versions of X and Z restricted to P 6, used to avoid  ambiguous type errors. b Versions of X and Z restricted to P 6, used to avoid  ambiguous type errors. c Versions of Y and [ restricted to P 6, used to avoid  ambiguous type errors. d Versions of Y and [ restricted to P 6, used to avoid  ambiguous type errors. e7Perform string concatenation on a list of expressions. fBoolean negation. g+The standard equality operators, lifted to P. h+The standard equality operators, lifted to P. i-The standard comparison operators, lifted to P. j-The standard comparison operators, lifted to P. k-The standard comparison operators, lifted to P. l-The standard comparison operators, lifted to P. m#Boolean constants corresponding to F and G n#Boolean constants corresponding to F and G oReturn the length of a string,  strLength "test" g 4. pTake the first n characters from a string,  strTake 2 "test" g "te". qDrop the first n characters from a string,  strDrop 2 "test" g "st". r]Gets the last write time of the file, you should only use the result to compare for equality  with other results from r$. On failure the error flag is set. vDefine the location of a v, see T& for details. This function will fail  if the same = is passed to v more than once. w Jump to a v, see T& for details. This function will fail  if v is not used on the =. x$An expression orientated version of y!, returns the first component if  the first argument is n or the second if it is m.   x g 12 x (x, x H 5) y>Test a boolean expression, reunning the first action if it is n and the second if it is m. 6 The appropriate branch action will be run within a W. See x' for an expression orientated version.   y (x g 12) ( "is 12") ( " is not 12") z A version of y where there is no else action. {HA while loop, run the second argument while the first argument is true.  The action is run in a W . See also |.   x <- Y x  { (x j 10) $ do  x V x H 1 |A loop with a break> command. Run the action repeatedly until the breaking action % is called. The action is run in a W . See also {.   x <- Y x  | $ \ break -> do  z (x k 10) break  x V x H 1 }SRun an intitial action, and if that action causes an error, run the second action. Q Unlike other programming languages, any uncaught errors are silently ignored.  All actions are run in W.   } ( "\"$WINDIR/ notepad.exe\"") ( "Failed to run notepad") ~KChecks for existence of file(s) (which can be a wildcard, or a directory). = If you want to check to see if a file is a directory, use  fileExists  DIRECTORY/*.*. + iff_ (fileExists "$WINDIR/notepad.exe") $ / messageBox [MB_OK] "notepad is installed" IPerforms a search for filespec, running the action with each file found. _ If no files are found the error flag is set. Note that the filename output is without path.  # findEach "$INSTDIR/*.txt" $ \x ->  detailPrint x VIf you jump from inside the loop to after the loop then you may leak a search handle. %Concatenate two strings, for example "$FOO" & "$BAR" is equivalent  to "$FOO$BAR".  Convert an 7 to a 6 by showing it.  Convert a 6 to an 7#, any errors are silently ignored. Show an alert, equivalent to messageBox [MB_ICONEXCLAMATION]. TSets the name of the installer. The name is usually simply the product name such as 'MyApp' or ' Company MyApp'.  name "MyApp" Specifies the output file that MakeNSIS should write the installer to. 7 This is just the file that MakeNSIS writes, it doesn'(t affect the contents of the installer.  Usually should end with .exe.  outFile "installer.exe" Sets the output path ($OUTDIRC) and creates it (recursively if necessary), if it does not exist. , Must be a full pathname, usually is just $INSTDIR.  setOutPath "$INSTDIR" )Sets the default installation directory. 8 Note that the part of this string following the last \" will be used if the user selects browse, and d may be appended back on to the string at install time (to disable this, end the directory with a \).  If this doesn'<t make any sense, play around with the browse button a bit. " installDir "$PROGRAMFILES/MyApp" HWrites the uninstaller to the filename (and optionally path) specified. L Only valid from within an install section, and requires that you have an  section in your script. [ You can call this one or more times to write out one or more copies of the uninstaller. - writeUninstaller "$INSTDIR/uninstaller.exe" #Set the icon used for the installer/ uninstaller. B installIcon "$NSISDIR/Contrib/Graphics/Icons/modern-install.ico" #Set the icon used for the installer/ uninstaller. B installIcon "$NSISDIR/Contrib/Graphics/Icons/modern-install.ico" /Set the image used for the header splash. Pass I" to use the default header image. ? headerImage $ Just "$NSISDIR/Contrib/Graphics/Header/win.bmp" QCreates (recursively if necessary) the specified directory. Errors can be caught  using }.. You should always specify an absolute path. + createDirectory "$INSTDIR/some/directory" FThis attribute tells the installer to check a string in the registry, Y and use it for the install dir if that string is valid. If this attribute is present,  it will override the 3 attribute if the registry key is valid, otherwise  it will fall back to the 3 default. When querying the registry, this command ? will automatically remove any quotes. If the string ends in ".exe", it will automatically F remove the filename component of the string (i.e. if the string is "C: program filesfoo/foo.exe",  it will know to use "C: program filesfoo"). * installDirRegKey HKLM "Software/NSIS" "" @ installDirRegKey HKLM "Software/ACME/Thingy" "InstallLocation" UExecute the specified program and continue immediately. Note that the file specified > must exist on the target system, not the compiling system. $OUTDIR is used for the working ) directory. Errors can be caught using }*. Note, if the command could have spaces, D you should put it in quotes to delimit it from parameters. e.g.: exec "\"$INSTDIR/ command.exe\" parameters".  If you don'Nt put it in quotes it will not work on Windows 9x with or without parameters. % exec "\"$INSTDIR/someprogram.exe\"" 5 exec "\"$INSTDIR/someprogram.exe\" some parameters" ?While the action is executing, do not update the progress bar. O Useful for functions which do a large amount of computation, or have loops. 2Open a file, which must be closed explicitly with .  Often it is better to use  or   instead.   h <-  : "C:/log.txt"   h " Hello world!"   h &Write a string to a file openned with . Close a file file openned with . pDelete file (which can be a file or wildcard, but should be specified with a full path) from the target system.  If Ma is specified and the file cannot be deleted then the file is deleted when the system reboots -- r if the file will be deleted on a reboot, the reboot flag will be set. The error flag is set if files are found f and cannot be deleted. The error flag is not set from trying to delete a file that does not exist. # delete [] "$INSTDIR/somefile.dat" QRemove the specified directory (fully qualified path with no wildcards). Without K, D the directory will only be removed if it is completely empty. If K is specified, the b directory will be removed recursively, so all directories and files in the specified directory  will be removed. If M? is specified, any file or directory which could not have been \ removed during the process will be removed on reboot -- if any file or directory will be 5 removed on a reboot, the reboot flag will be set. E The error flag is set if any file or directory cannot be removed.   rmdir [] "$INSTDIR"  rmdir [] "$INSTDIR/data" ( rmdir [Recursive, RebootOK] "$INSTDIR" " rmdir [RebootOK] "$INSTDIR/DLLs" ]Note that the current working directory can not be deleted. The current working directory is  set by D. For example, the following example will not delete the directory.   setOutPath "$TEMP/dir"  rmdir [] "$TEMP/dir" 9The next example will succeed in deleting the directory.   setOutPath "$TEMP/dir"  setOutPath "$TEMP"  rmdir [] "$TEMP/dir" Warning: using rmdir [Recursive] $INSTDIR in % is not safe. Though it is unlikely, b the user might select to install to the Program Files folder and so this command will wipe out j the entire Program Files folder, including other programs that has nothing to do with the uninstaller. 4 The user can also put other files but the program'2s files and would expect them to get deleted with r the program. Solutions are available for easily uninstalling only files which were installed by the installer. (Creates a shortcut file that links to a Traget file, with optional E!. The icon used for the shortcut  is D,C. BF should be one of: SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED.  A should be in the form of 'flag|c'L where flag can be a combination (using |) of: ALT, CONTROL, EXT, or SHIFT. } c is the character to use (a-z, A-Z, 0-9, F1-F24, etc). Note that no spaces are allowed in this string. A good example is  "ALT|CONTROL|F8". $OUTDIR? is used for the working directory. You can change it by using  before creating  the Shortcut. HQ should be the description of the shortcut, or comment as it is called under XP.  The error flag is set if the shortcut cannot be created (i.e. either of the paths (link or target) does not exist, or some other error). * createDirectory "$SMPROGRAMS/My Company" 8 createShortcut "$SMPROGRAMS/My Company/My Program.lnk" & [Target "$INSTDIR/My Program.exe" . ,Parameter "some command line parameters" 5 ,IconFile "$INSTDIR/My Program.exe", IconIndex 2 " ,StartOptions "SW_SHOWNORMAL" - ,KeyboardShortcut "ALT|CONTROL|SHIFT|F5" " ,Description "a description"] >?@ABCDEFGHIJKLMNOPQJKRLMNOPQRSTUSVWTXYZ[\U]^_`aVWbXYZ[\]^_`abcdefghijklcmnopqrstuvwxyz{|}~defghijklm  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQJKRLMNOPQRSTUSVWTXYZ[\U]^_`aVWbXYZ[\]^_`abcdefghijklcmnopqrstuvwxyz{|}~v>?ONMLKJIHGFEDCBA@PQJKRLMNOPQRSTUSVWTXYZ[\U]^_`aVWbXYZ[\]^_`abcdefghijklcmnopqrstuvwxyz{|}~defghijklm  Safe-InferedNReplace one string with another string, in a target string. As some examples: ) strReplace "t" "XX" "test" %== "XXesXX" 2 strReplace "ell" "" "hello world" %== "ho world" ,Is the first string a prefix of the second. %Join together a list of strings with \r\n, after each line. Note that unlike standard n, 1 we use the Windows convention line separator. +Write a file comprising of a set of lines. 2Short circuiting boolean operators, equivalent to o and p but on P. 2Short circuiting boolean operators, equivalent to o and p but on P. With a . perform some action, then automatically call . < If the action argument jumps out of the section then the  call will be missed. Write a file, like q.  Safe-InferedGCreate the contents of an NSIS script from an installer specification. Like  , but don'5t try and optimise the resulting NSIS script. Useful K to figure out how the underlying installer works, or if you believe the M optimisations are introducing bugs (but please do report any such bugs!).   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~RPQ\WZ[XYV]^_`abcdyz{|}x=Tvwghilkjnmfeopq>r~tu<SsU4765#3210/.-,+*)('&%$"! ?ONMLKJIHGFEDCBA@  8;:9r     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      FG !"#$%&'()*+,-./01/23/24/567897:;7:<7:=7:>/?@/AB/AC/AD/AE/AF/GH/AI/5J78K78L78M/0N/OP[Q\RRSTUVWXYZ[\]^_`abcdefghijklmnopq/rs7:t7:u/vwx nsis-0.1.2Development.NSISDevelopment.NSIS.TypeDevelopment.NSIS.SugarnewLabelDevelopment.NSIS.OptimiseDevelopment.NSIS.Show writeFile'withFileDevelopment.NSIS.Library Visibility NeverShowShowHideLevelAdminHighestUserNonePageConfirm InstFiles Directory ComponentsLicenseMessageBoxType MB_DEFBUTTON4 MB_DEFBUTTON3 MB_DEFBUTTON2 MB_DEFBUTTON1 MB_RTLREADINGMB_RIGHTMB_SETFOREGROUND MB_TOPMOST MB_USERICON MB_ICONSTOPMB_ICONQUESTIONMB_ICONINFORMATIONMB_ICONEXCLAMATIONMB_YESNOCANCELMB_YESNOMB_RETRYCANCELMB_ABORTRETRYIGNORE MB_OKCANCELMB_OKHKEY SHELL_CONTEXTSHCTXHKEY_PERFORMANCE_DATAHKPD HKEY_DYN_DATAHKDDHKEY_CURRENT_CONFIGHKCC HKEY_USERSHKUHKEY_CURRENT_USERHKCUHKEY_LOCAL_MACHINEHKLMHKEY_CLASSES_ROOTHKCR CompressorBZIP2ZLIBLZMAFileMode ModeAppend ModeWriteModeRead SectionIdLabel FileHandleAttribIdKeyboardShortcut StartOptions IconIndexIconFile ParametersTargetRequired DescriptionExpanded Unselected RecursiveNonFatalRebootOKFinalSolidExpValueAction newSectionIdalwaysNonFatal@=scopemutablemutable_constant constant_share mutableInt constantInt mutableInt_ constantInt_ mutableStr constantStr mutableStr_ constantStr_ strConcatnot_%==%/=%<=%<%>=%>falsetrue strLengthstrTakestrDrop getFileTimesectionGetText readRegStr deleteRegKeylabelgoto?iffiff_whilelooponError fileExistsfindEach&strShowstrReadalertnameoutFile setOutPath installDirwriteUninstaller installIcon uninstallIcon headerImagecreateDirectoryinstallDirRegKeyexecsectionSetText messageBox writeRegStr writeRegDWORD hideProgressallowRootDirInstallcaption detailPrintshowInstDetailsshowUninstDetailsfileOpen fileWrite fileClose setCompressorfilesection sectionGroup uninstalldeletermdircreateShortcutpageunpagerequestExecutionLevel strReplace strIsPrefixOf strUnlineswriteFileLines%&&%|| withFile'nsisnsisNoOptimiseADeletedelFile delRebootOKARMDirrmDir rmRecursive rmRebootOKAFilefilePath fileNonFatal fileRecursive ACompressorcompType compSolid compFinal ASectionGroupsecgIdsecgName secgExpandedsecgDescriptionASectionsecIdsecNamesecDescriptionsecBold secRequired secUnselected AShortcutscFilescTarget scParameters scIconFile scIconIndexscStartOptionsscKeyboardShortcut scDescriptionNSIS DetailPrintShowUninstDetailsShowInstDetailsCaptionAllowRootDirInstallInstallDirRegKeyRequestExecutionLevelRMDirDelete ClearErrorsExec DeleteRegKey ReadRegStr WriteRegDWORD WriteRegStrCreateShortcut MessageBox FileClose FileWriteFileOpenWriteUninstaller SetCompressorCreateDirectory SetOutPathUnpage HeaderImage UninstallIcon InstallIcon InstallDirOutFileFileNameCallFunction SectionGroupSection FindCloseFindNext FindFirst IfFileExistsSectionSetTextSectionGetTextIfErrors GetFileTimeStrLenStrCpyIntOpIntCmpStrCmpSLabeledGotoAssignVal_LiteralBuiltinVar_ValFunVarDefaultdef$fDefaultMessageBoxType$fDefaultADelete$fDefaultARMDir$fDefaultAFile$fDefaultACompressor$fDefaultCompressor$fDefaultASectionGroup$fDefaultASection$fDefaultAShortcut$fShowFileMode $fShowVal_$fShowSectionId $fShowFun $fShowLabel $fShowVar $fDefaultVar $fDefault[]$fDefaultMaybeoptimiseshowNSISbaseGHC.NumNum Data.StringIsString fromStringGHC.BaseStringghc-prim GHC.TypesInt GHC.ClassesEqOrdminmax Data.MonoidMonoidGHC.RealIntegral Fractional/moddivGHC.EnumEnumRealreturnBoolTrueFalse+ Data.MaybeNothing fromValueSuniquesstreamscopestyStringtyIntuniquevarvallitemitrvalcapture runActionbuiltin parseStringintOpemit1emit2emit3addScopecomp$fMonoidAction$fFractionalAction $fOrdAction $fRealAction $fEnumAction$fIntegralAction $fNumAction $fEqAction $fShowAction$fIsStringAction Data.Listunlines&&|| System.IO writeFile