[1029] | 1 | -- Anniversary Edition Setup
|
---|
| 2 | -- for Anniversary Edition Seven
|
---|
| 3 | -- by Iritscen
|
---|
| 4 | -- For installing the Anniversary Edition Seven's AEI Updater. This script looks for an existing Oni
|
---|
| 5 | -- installation, places the AEInstaller2Updater into a new AE/ folder, and runs it. It also makes sure
|
---|
| 6 | -- that the user has Java installed so he can run the Updater and Installer. It does not check for Mono
|
---|
| 7 | -- because that would be redundant of the Installer itself.
|
---|
| 8 | -- History:
|
---|
[1091] | 9 | -- 1.3.0 - No code changes. Re-built in order to include AEInstaller2Updater 1.3.
|
---|
[1065] | 10 | -- 1.2.0 - No code changes. Re-built in order to include Run AE Installer 1.1.0, which had a change
|
---|
| 11 | -- made to ensure Mono compatibility in 10.13.
|
---|
[1043] | 12 | -- 1.1.9 - No code changes. Re-built in order to include Run AE Installer 1.0.9, which also had no
|
---|
| 13 | -- code changes but needed to be re-built in 10.12 in order to run in 10.12.
|
---|
[1030] | 14 | -- 1.1.8 - Updated "Run AE Installer" script for Mono in 10.11.
|
---|
[1029] | 15 | -- 1.1.7 - Now an AppleScriptObjC application to ensure signing integrity and OS compatibility.
|
---|
| 16 | -- 1.1.6 - Now testing for Java's existence before talking to it, because it seems that simply calling
|
---|
| 17 | -- "java -version" now causes the script to fail with an error dialog instead of invoking
|
---|
| 18 | -- OS X's Java installation prompt. Setup app now uses the standard icon name "applet" so
|
---|
| 19 | -- that Info.plist does not have to be edited, since that invalidates the code signature
|
---|
| 20 | -- applied by OS X 10.6's Script Editor. Some dialog text has been made clearer. Fixed a
|
---|
[1065] | 21 | -- weird bug that cropped up for the first time while testing this script, which was
|
---|
| 22 | -- breaking GDF validation.
|
---|
[1029] | 23 | -- 1.1.5 - Now using fixed paths for Java for 10.6 and for 10.7+ because "which java" is not reliable.
|
---|
| 24 | -- 1.1.4 - Now attempting to call Java through "java" again before falling back to looking in Internet
|
---|
| 25 | -- Plug-Ins, because 10.6 has Java installed differently.
|
---|
| 26 | -- 1.1.3 - No longer supplying link to MacUpdate page for Apple Java because it is out of date; only
|
---|
| 27 | -- supplying link to java.com.
|
---|
| 28 | -- 1.1.2 - Calling Java at Internet plug-in location instead of using basic command-line "java", as
|
---|
| 29 | -- only the JDK installs command-line Java.
|
---|
[1065] | 30 | -- 1.1.1 - Changed the "Run AE Installer" script to set environment to UTF-8 in order to avoid 'ƒ'
|
---|
[1029] | 31 | -- problem in Java 7.
|
---|
| 32 | -- 1.1 - Updated bundled AEI Updater to 1.1, which supports proxies.
|
---|
| 33 | -- 1.0 - Initial release.
|
---|
| 34 |
|
---|
| 35 | script AppDelegate
|
---|
| 36 | property parent : class "NSObject"
|
---|
| 37 | global pathToMe
|
---|
| 38 | global sosumi
|
---|
| 39 | global gNeedsJavaVersionMajor
|
---|
| 40 | global gNeedsJavaVersionMinor
|
---|
| 41 |
|
---|
| 42 | -- IBOutlets
|
---|
| 43 | property theWindow : missing value
|
---|
| 44 | property aesIcon : missing value
|
---|
| 45 |
|
---|
| 46 | on applicationWillFinishLaunching_(aNotification)
|
---|
| 47 | -- Set globals
|
---|
| 48 | set gNeedsJavaVersionMajor to 1
|
---|
| 49 | set gNeedsJavaVersionMinor to 6
|
---|
| 50 |
|
---|
| 51 | -- Set "pathToMe" for various future uses; its value will be "/path/to/Anniversary Edition Setup.app/Contents/Resources"
|
---|
| 52 | tell current application's class "NSBundle"
|
---|
| 53 | tell its mainBundle()
|
---|
| 54 | set pathToMe to resourcePath() as string
|
---|
| 55 | end tell
|
---|
| 56 | end tell
|
---|
| 57 |
|
---|
| 58 | -- Draw the AE Setup icon in the window
|
---|
| 59 | set iconPath to POSIX path of ((pathToMe & "/AppIcon.png") as string)
|
---|
| 60 | set aesIconImg to current application's NSImage's alloc's initWithContentsOfFile_(iconPath)
|
---|
| 61 | aesIcon's setImage_(aesIconImg)
|
---|
| 62 |
|
---|
| 63 | -- Set up "sosumi" with the Sosumi sound
|
---|
| 64 | tell current application's NSSound to set thisSound to soundNamed_("Sosumi")
|
---|
| 65 |
|
---|
| 66 | -- Bring self to front in case something else stole focus
|
---|
| 67 | tell me
|
---|
| 68 | activate
|
---|
| 69 | end tell
|
---|
| 70 | end applicationWillFinishLaunching_
|
---|
| 71 |
|
---|
| 72 | on applicationShouldTerminateAfterLastWindowClosed_(sender)
|
---|
| 73 | return true
|
---|
| 74 | end applicationShouldTerminateAfterLastWindowClosed_
|
---|
| 75 |
|
---|
| 76 | on applicationShouldTerminate_(sender)
|
---|
| 77 | -- Insert code here to do any housekeeping before your application quits
|
---|
| 78 | return current application's NSTerminateNow
|
---|
| 79 | end applicationShouldTerminate_
|
---|
| 80 |
|
---|
| 81 | -- IBActions
|
---|
| 82 | on clickStart_(sender)
|
---|
| 83 | set installPath to my find_Oni_folder()
|
---|
| 84 | tell me
|
---|
| 85 | activate
|
---|
| 86 | end tell
|
---|
| 87 | if (installPath is "Gave up") then
|
---|
| 88 | display dialog "Sorry, the AE currently requires a retail Oni installation." buttons {"OK"} default button 1 with title "AE Setup"
|
---|
| 89 | else if (installPath is "AE exists") then
|
---|
| 90 | display dialog "If you are sure you want to start over with a new AE installation in this location, then you should delete the existing AE/ folder and then run this Setup app again." buttons {"OK"} default button 1 with title "AE Setup"
|
---|
| 91 | else if (installPath is "") then
|
---|
| 92 | display dialog "Unknown error encountered while choosing Oni installation. Please ask for help in the Anniversary Edition sub-forum of the Oni Central Forum." buttons {"Go to forum", "OK"} default button 2 with title "AE Setup"
|
---|
| 93 | set quitOrForum to button returned of the result
|
---|
| 94 | if (quitOrForum is "Go to forum") then
|
---|
| 95 | open location "http://oni.bungie.org/community/forum/index.php"
|
---|
| 96 | end if
|
---|
| 97 | else
|
---|
| 98 | set installResult to my install_AEI_Updater(installPath)
|
---|
| 99 | tell me
|
---|
| 100 | activate
|
---|
| 101 | end tell
|
---|
| 102 | if (installResult is 0) then
|
---|
| 103 | display dialog "Updater installed. AE Setup will now continue the installation by running the Updater." buttons {"OK"} default button 1 with title "AE Setup"
|
---|
| 104 | set runResult to my run_AEIU(installPath)
|
---|
| 105 | tell me
|
---|
| 106 | activate
|
---|
| 107 | end tell
|
---|
| 108 | -- Quit if running Run AE Installer seems to have been successful
|
---|
| 109 | if (runResult is 0) then
|
---|
| 110 | tell me
|
---|
| 111 | quit
|
---|
| 112 | end tell
|
---|
| 113 | else if (runResult is 1) then
|
---|
| 114 | display dialog "Script copy error. Please ask for help in the Anniversary Edition sub-forum of the Oni Central Forum." buttons {"Go to forum", "OK"} default button 2 with title "AE Setup"
|
---|
| 115 | set quitOrForum to button returned of the result
|
---|
| 116 | if (quitOrForum is "Go to forum") then
|
---|
| 117 | open location "http://oni.bungie.org/community/forum/index.php"
|
---|
| 118 | end if
|
---|
| 119 | else if (runResult is 2) then
|
---|
| 120 | display dialog "Could not run AEI Updater. Please ask for help in the Anniversary Edition sub-forum of the Oni Central Forum." buttons {"Go to forum", "OK"} default button 2 with title "AE Setup"
|
---|
| 121 | set quitOrForum to button returned of the result
|
---|
| 122 | if (quitOrForum is "Go to forum") then
|
---|
| 123 | open location "http://oni.bungie.org/community/forum/index.php"
|
---|
| 124 | end if
|
---|
| 125 | end if
|
---|
| 126 | else if (installResult is 1) then
|
---|
| 127 | display dialog "Could not install the AEI Updater because Java was not installed or new enough. Please obtain a Java installer from Java.com." buttons {"Go to Java.com", "OK"} default button 2 with title "AE Setup"
|
---|
| 128 | set quitOrJava to button returned of the result
|
---|
| 129 | if (quitOrJava is "Go to Java.com") then
|
---|
| 130 | open location "http://www.java.com/"
|
---|
| 131 | end if
|
---|
| 132 | else if (installResult is 2) then -- file operation failure
|
---|
| 133 | display dialog "Could not install the AEI Updater. Please ask for help in the Anniversary Edition sub-forum of the Oni Central Forum." buttons {"Go to forum", "OK"} default button 2 with title "AE Setup"
|
---|
| 134 | set quitOrForum to button returned of the result
|
---|
| 135 | if (quitOrForum is "Go to forum") then
|
---|
| 136 | open location "http://oni.bungie.org/community/forum/index.php"
|
---|
| 137 | end if
|
---|
| 138 | else
|
---|
| 139 | display dialog "Unknown error returned from install_AEI_Updater()! Please ask for help in the Anniversary Edition sub-forum of the Oni Central Forum." buttons {"Go to forum", "OK"} default button 2 with title "AE Setup"
|
---|
| 140 | set quitOrForum to button returned of the result
|
---|
| 141 | if (quitOrForum is "Go to forum") then
|
---|
| 142 | open location "http://oni.bungie.org/community/forum/index.php"
|
---|
| 143 | end if
|
---|
| 144 | end if
|
---|
| 145 | end if
|
---|
| 146 | end clickStart_
|
---|
| 147 |
|
---|
| 148 | -- The user must pick an acceptable folder to install the AE in, or die trying (or give up)
|
---|
| 149 | -- Returns "Gave up" if user clicked Quit after being told his choice was not the Oni folder,
|
---|
| 150 | -- "AE exists" if user clicked Quit after being told that the AE folder was already present, and
|
---|
| 151 | -- returns the user's chosen path if validation was successful
|
---|
| 152 | -- Called by clickStart_()
|
---|
| 153 | on find_Oni_folder()
|
---|
| 154 | tell me
|
---|
| 155 | tell me
|
---|
| 156 | activate
|
---|
| 157 | end tell
|
---|
| 158 | set tryAgain to true
|
---|
| 159 | set isOniRetail to false
|
---|
| 160 | set pathProblem to ""
|
---|
| 161 | set folderTest to 0
|
---|
| 162 | repeat while (tryAgain is true)
|
---|
| 163 | set chosenPath to (choose folder with prompt "Please locate your Oni installation.")
|
---|
| 164 | if (chosenPath is "") then
|
---|
| 165 | display dialog "There was an error in choosing the Oni folder." buttons {"OK"} default button 1 with title "AE Setup"
|
---|
| 166 | return chosenPath
|
---|
| 167 | end if
|
---|
| 168 | set folderTest to my validate_Oni_folder(chosenPath)
|
---|
| 169 | tell me
|
---|
| 170 | activate
|
---|
| 171 | end tell
|
---|
| 172 | if (folderTest is 1) then
|
---|
| 173 | display dialog "This doesn't seem to be your Oni installation. Click \"Try again\" to locate another folder." buttons {"Cancel", "Try again"} default button 2 with title "AE Setup"
|
---|
| 174 | set cancelOrTryAgain to the button returned of the result
|
---|
| 175 | if (cancelOrTryAgain is "Cancel") then
|
---|
| 176 | set tryAgain to false
|
---|
| 177 | set pathProblem to "Gave up"
|
---|
| 178 | end if
|
---|
| 179 | else if (folderTest is 2) then
|
---|
| 180 | display dialog "This Oni installation already has an AE/ folder! This means that you've probably already run this Setup app, and now you should be opening the \"Run AE Installer\" script in the AE/ folder. You can also click \"Try again\" to find another Oni installation in which to install the AE." buttons {"Cancel", "Try again"} default button 2 with title "AE Setup"
|
---|
| 181 | set cancelOrTryAgain to the button returned of the result
|
---|
| 182 | if (cancelOrTryAgain is "Cancel") then
|
---|
| 183 | set tryAgain to false
|
---|
| 184 | set pathProblem to "AE exists"
|
---|
| 185 | end if
|
---|
| 186 | else
|
---|
| 187 | set tryAgain to false -- we got it, let's get out of this loop
|
---|
| 188 | end if
|
---|
| 189 | end repeat
|
---|
| 190 | if (folderTest is 0) then
|
---|
| 191 | return chosenPath
|
---|
| 192 | else
|
---|
| 193 | return pathProblem
|
---|
| 194 | end if
|
---|
| 195 | end tell
|
---|
| 196 | end find_Oni_folder
|
---|
| 197 |
|
---|
| 198 | -- Returns 0 if this is a valid target for the AE installation,
|
---|
| 199 | -- 1 if this is not a valid target, and
|
---|
| 200 | -- 2 if the AE is already here
|
---|
| 201 | -- Called by find_Oni_folder()
|
---|
| 202 | on validate_Oni_folder(folderPath)
|
---|
| 203 | tell application "Finder"
|
---|
| 204 | tell me
|
---|
| 205 | activate
|
---|
| 206 | end tell
|
---|
| 207 | -- Is the GDF here?
|
---|
| 208 | if not (exists folder "GameDataFolder" in folder folderPath) then
|
---|
| 209 | display dialog "GameDataFolder not detected here." buttons {"OK"} default button 1 with title "AE Setup"
|
---|
| 210 | return 1
|
---|
| 211 | end if
|
---|
| 212 | -- Is the AE folder here? Because we won't install over it.
|
---|
| 213 | if (exists folder "AE" in folder folderPath) then
|
---|
| 214 | return 2
|
---|
| 215 | end if
|
---|
| 216 |
|
---|
| 217 | -- Now see if this is the full installation or demo
|
---|
| 218 | set retailLevelList to {0, 1, 2, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14, 18, 19}
|
---|
| 219 | set demoLevelList to {0, 1, 4} -- there's also a separate demo release of just level 2 to be dropped into the demo's GDF, but 1 and 4 were the only core demo levels
|
---|
| 220 | set isRetail to true
|
---|
| 221 | set isDemo to true
|
---|
| 222 | -- Look for levels until one is missing and we know this isn't a complete retail release
|
---|
| 223 | repeat with thisLevel in retailLevelList
|
---|
| 224 | if not (exists file ((folderPath & "GameDataFolder:level" & (thisLevel as string) & "_Final.dat") as string)) then
|
---|
| 225 | set isRetail to false
|
---|
| 226 | exit repeat
|
---|
| 227 | end if
|
---|
| 228 | end repeat
|
---|
| 229 | if (isRetail) then
|
---|
| 230 | -- Don't return here if we add demo support below
|
---|
| 231 | return 0
|
---|
| 232 | end if
|
---|
| 233 | -- Look for levels until one is missing and we know this isn't a complete demo release
|
---|
| 234 | repeat with thisLevel in demoLevelList
|
---|
| 235 | if not (exists file ((folderPath & "GameDataFolder:level" & (thisLevel as string) & "_Final.dat") as string)) then
|
---|
| 236 | set isDemo to false
|
---|
| 237 | exit repeat
|
---|
| 238 | end if
|
---|
| 239 | end repeat
|
---|
| 240 | if (isDemo) then
|
---|
| 241 | -- Insert handling of demo status here if we ever support a demo AE
|
---|
| 242 | return 1
|
---|
| 243 | else
|
---|
| 244 | return 1
|
---|
| 245 | end if
|
---|
| 246 | end tell
|
---|
| 247 | end validate_Oni_folder
|
---|
| 248 |
|
---|
| 249 | -- If Java is found, creates the AE/ folder with the Updater
|
---|
| 250 | -- Returns 0 if the Updater was installed (which will install the Installer itself afterward),
|
---|
| 251 | -- 1 if Java fails verification, and
|
---|
| 252 | -- 2 if a file operation or other error occurs
|
---|
| 253 | -- Called by clickStart_()
|
---|
| 254 | on install_AEI_Updater(pathToOni)
|
---|
| 255 | tell me
|
---|
| 256 | set javaResult to my verify_Java()
|
---|
| 257 | if (javaResult is 1) then
|
---|
| 258 | return 1
|
---|
| 259 | end if
|
---|
| 260 | end tell
|
---|
| 261 | -- Make "Oni/AE" folder
|
---|
| 262 | tell application "Finder"
|
---|
| 263 | if ((pathToOni & "AE") exists) then -- shouldn't happen because we already looked for it in validate_Oni_folder()
|
---|
| 264 | display alert "AE folder already present!"
|
---|
| 265 | return 2
|
---|
| 266 | end if
|
---|
| 267 | try
|
---|
| 268 | make new folder at pathToOni with properties {name:"AE"}
|
---|
| 269 | delay 0.5
|
---|
| 270 | make new folder at ((pathToOni as string) & "AE") with properties {name:"AEInstaller"}
|
---|
| 271 | on error
|
---|
| 272 | display alert "Couldn't make AE or AEI folder!"
|
---|
| 273 | return 2
|
---|
| 274 | end try
|
---|
| 275 |
|
---|
| 276 | -- Copy AEI Updater into "AE/"
|
---|
| 277 | set AEIU to POSIX file (pathToMe & "/AEInstaller2Updater.jar") as alias
|
---|
| 278 | if (AEIU exists) then
|
---|
| 279 | set AEIfolder to (pathToOni & "AE:AEInstaller" as string)
|
---|
| 280 | try
|
---|
| 281 | duplicate file AEIU to folder AEIfolder
|
---|
| 282 | on error copyError
|
---|
| 283 | return 2
|
---|
| 284 | end try
|
---|
| 285 | else
|
---|
| 286 | display dialog "AE Installer Updater is not present in the Setup app!"
|
---|
| 287 | return 2
|
---|
| 288 | end if
|
---|
| 289 | end tell
|
---|
| 290 | return 0
|
---|
| 291 | end install_AEI_Updater
|
---|
| 292 |
|
---|
| 293 | -- Checks for an acceptable Java installation
|
---|
| 294 | -- This function was going to support a bundled JRE for those without Java,
|
---|
| 295 | -- but it adds too many complications, so just make the user install it himself
|
---|
| 296 | -- Returns 1 if Java is not found or too old, and
|
---|
| 297 | -- 0 if Java is found and the version is acceptable
|
---|
| 298 | -- Called by install_AEI_Updater()
|
---|
| 299 | on verify_Java()
|
---|
| 300 | tell me
|
---|
| 301 | set origDelimiters to AppleScript's text item delimiters
|
---|
| 302 | set OSversion to (system version of (system info) as string)
|
---|
| 303 | set AppleScript's text item delimiters to "."
|
---|
| 304 |
|
---|
| 305 | -- Java's location is different in 10.6 than in 10.7+
|
---|
| 306 | if ((second text item of OSversion) as number > 6) then
|
---|
| 307 | set javaPath to "/Library/Internet\\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"
|
---|
| 308 | else
|
---|
| 309 | set javaPath to "/usr/bin/java"
|
---|
| 310 | end if
|
---|
| 311 |
|
---|
| 312 | -- Test for Java before talking to it
|
---|
| 313 | set javaExistsTest to ("if [ -f " & javaPath & " ]; then echo okay; fi") as string
|
---|
| 314 | set javaExists to do shell script javaExistsTest without altering line endings
|
---|
| 315 | if (javaExists is "") then
|
---|
| 316 | return 1
|
---|
| 317 | end if
|
---|
| 318 |
|
---|
| 319 | -- Get Java's version
|
---|
| 320 | set javaVersionCmd to ((javaPath & " -version 2>&1") as string) -- Java's version output is sometimes on stderr, not stdout :-/
|
---|
| 321 | set javaVersionText to do shell script javaVersionCmd without altering line endings
|
---|
| 322 | if (javaVersionText is "") then
|
---|
| 323 | return 1
|
---|
| 324 | end if
|
---|
| 325 |
|
---|
| 326 | -- Isolate version number from output with format:
|
---|
| 327 | (* java version "1.7.0_17"
|
---|
| 328 | Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
|
---|
| 329 | Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode) *)
|
---|
| 330 | -- Get first line
|
---|
| 331 | set AppleScript's text item delimiters to "
|
---|
| 332 | "
|
---|
| 333 | set javaVersionText to first text item of javaVersionText
|
---|
| 334 | -- Get text after first quote mark
|
---|
| 335 | set AppleScript's text item delimiters to "\""
|
---|
| 336 | set javaVersionText to second text item of javaVersionText
|
---|
| 337 | -- Get first and second version numbers, third doesn't matter
|
---|
| 338 | set AppleScript's text item delimiters to "."
|
---|
| 339 | set versionMajor to first text item of javaVersionText
|
---|
| 340 | set versionMinor to second text item of javaVersionText
|
---|
| 341 | set AppleScript's text item delimiters to origDelimiters
|
---|
| 342 | -- Inform user if Java is too old
|
---|
[1065] | 343 | if (versionMajor ≥ gNeedsJavaVersionMajor) then
|
---|
[1029] | 344 | if (versionMinor < gNeedsJavaVersionMinor) then
|
---|
| 345 | display dialog (("Sorry, Java v" & gNeedsJavaVersionMajor & "." & gNeedsJavaVersionMinor & " is required; found v" & versionMajor & "." & versionMinor & " instead.") as string) buttons {"OK"} default button 1 with title "AE Setup"
|
---|
| 346 | return 1
|
---|
| 347 | end if
|
---|
| 348 | else
|
---|
| 349 | display dialog (("Sorry, Java v" & gNeedsJavaVersionMajor & "." & gNeedsJavaVersionMinor & " is required; found v" & versionMajor & "." & versionMinor & " instead.") as string) buttons {"OK"} default button 1 with title "AE Setup"
|
---|
| 350 | return 1
|
---|
| 351 | end if
|
---|
| 352 | end tell
|
---|
| 353 | return 0
|
---|
| 354 | end verify_Java
|
---|
| 355 |
|
---|
| 356 | -- Drops an applet into the new "AE/" folder and runs it;
|
---|
| 357 | -- the applet will try to run the AEI, but if it's not found,
|
---|
| 358 | -- it runs the AEI Updater, which is what we want to happen
|
---|
| 359 | -- so that the AEI can be installed.
|
---|
| 360 | -- Returns 0 if this is a valid target for the AE installation,
|
---|
| 361 | -- 1 if the applet cannot be dropped, and
|
---|
| 362 | -- 2 if the applet cannot be run
|
---|
| 363 | -- Called by clickStart_()
|
---|
| 364 | on run_AEIU(pathToOni)
|
---|
| 365 | tell application "Finder"
|
---|
| 366 | -- Copy applet to AE/ that opens AEI or AEIU if AEI is not around
|
---|
| 367 | set RAEI to POSIX file (pathToMe & "/Run AE Installer.app") as alias
|
---|
| 368 | set pathToAE to alias ((pathToOni & "AE") as string)
|
---|
| 369 | try
|
---|
| 370 | duplicate RAEI to pathToAE
|
---|
| 371 | on error copyError
|
---|
| 372 | return 1
|
---|
| 373 | end try
|
---|
| 374 | set RAEI to ((pathToAE as string) & "Run AE Installer.app")
|
---|
| 375 | try
|
---|
| 376 | open RAEI
|
---|
| 377 | on error runError
|
---|
| 378 | return 2
|
---|
| 379 | end try
|
---|
| 380 | end tell
|
---|
| 381 | return 0
|
---|
| 382 | end run_AEIU
|
---|
| 383 |
|
---|
| 384 | on play_error_sound()
|
---|
| 385 | tell sosumi
|
---|
| 386 | play()
|
---|
| 387 | end tell
|
---|
| 388 | end play_error_sound
|
---|
[1065] | 389 | end script
|
---|