├── StartAtLogin
├── Assets.xcassets
│ ├── Contents.json
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── StartAtLogin.entitlements
├── AppDelegate.swift
├── Info.plist
└── Base.lproj
│ └── MainMenu.xib
├── StartAtLogin.Launcher
├── Assets.xcassets
│ ├── Contents.json
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── StartAtLogin_Launcher.entitlements
├── Info.plist
├── AppDelegate.swift
└── Base.lproj
│ └── MainMenu.xib
├── StartAtLogin.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── project.pbxproj
├── README.md
├── LICENSE
└── .gitignore
/StartAtLogin/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/StartAtLogin.Launcher/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/StartAtLogin.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/StartAtLogin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # macOS-login-item-example
2 | Sample project that creates and enables a macOS Login Item.
3 |
4 | I have no idea if this is the "real" or "correct" way to go about things, but it's work for my apps for years.
5 |
6 | Credit goes to whatever random blog post I found when first implementing this. If anyone wants to take credit, let me know and I'll link them here.
7 |
--------------------------------------------------------------------------------
/StartAtLogin/StartAtLogin.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/StartAtLogin.Launcher/StartAtLogin_Launcher.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/StartAtLogin/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // StartAtLogin
4 | //
5 | // Created by Tyler Hall on 9/18/20.
6 | // Copyright © 2020 Tyler Hall. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 | import ServiceManagement
11 |
12 | @NSApplicationMain
13 | class AppDelegate: NSObject, NSApplicationDelegate {
14 |
15 | @IBOutlet weak var window: NSWindow!
16 |
17 |
18 | func applicationDidFinishLaunching(_ aNotification: Notification) {
19 | // Insert code here to initialize your application
20 | }
21 |
22 | func applicationWillTerminate(_ aNotification: Notification) {
23 | // Insert code here to tear down your application
24 | }
25 |
26 | func setLaunchOnLogin(shouldLaunch: Bool) {
27 | if let launcherBundleID = Bundle.main.bundleIdentifier?.appending(".Launcher") {
28 | SMLoginItemSetEnabled(launcherBundleID as CFString, shouldLaunch)
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Tyler Hall
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/StartAtLogin/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "scale" : "1x",
6 | "size" : "16x16"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "scale" : "2x",
11 | "size" : "16x16"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "scale" : "1x",
16 | "size" : "32x32"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "scale" : "2x",
21 | "size" : "32x32"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "scale" : "1x",
26 | "size" : "128x128"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "scale" : "2x",
31 | "size" : "128x128"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "scale" : "1x",
36 | "size" : "256x256"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "scale" : "2x",
41 | "size" : "256x256"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "scale" : "1x",
46 | "size" : "512x512"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "scale" : "2x",
51 | "size" : "512x512"
52 | }
53 | ],
54 | "info" : {
55 | "author" : "xcode",
56 | "version" : 1
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/StartAtLogin.Launcher/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "scale" : "1x",
6 | "size" : "16x16"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "scale" : "2x",
11 | "size" : "16x16"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "scale" : "1x",
16 | "size" : "32x32"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "scale" : "2x",
21 | "size" : "32x32"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "scale" : "1x",
26 | "size" : "128x128"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "scale" : "2x",
31 | "size" : "128x128"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "scale" : "1x",
36 | "size" : "256x256"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "scale" : "2x",
41 | "size" : "256x256"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "scale" : "1x",
46 | "size" : "512x512"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "scale" : "2x",
51 | "size" : "512x512"
52 | }
53 | ],
54 | "info" : {
55 | "author" : "xcode",
56 | "version" : 1
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/StartAtLogin/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSHumanReadableCopyright
26 | Copyright © 2020 Tyler Hall. All rights reserved.
27 | NSMainNibFile
28 | MainMenu
29 | NSPrincipalClass
30 | NSApplication
31 | NSSupportsAutomaticTermination
32 |
33 | NSSupportsSuddenTermination
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/StartAtLogin.Launcher/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSHumanReadableCopyright
26 | Copyright © 2020 Tyler Hall. All rights reserved.
27 | NSMainNibFile
28 | MainMenu
29 | NSPrincipalClass
30 | NSApplication
31 | NSSupportsAutomaticTermination
32 |
33 | LSUIElement
34 |
35 | NSSupportsSuddenTermination
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/StartAtLogin.Launcher/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // StartAtLogin.Launcher
4 | //
5 | // Created by Tyler Hall on 9/18/20.
6 | // Copyright © 2020 Tyler Hall. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 |
11 | @NSApplicationMain
12 | class AppDelegate: NSObject, NSApplicationDelegate {
13 |
14 | func applicationDidFinishLaunching(_ aNotification: Notification) {
15 | let mainAppIdentifier = Bundle.main.bundleIdentifier!.replacingOccurrences(of: ".Launcher", with: "")
16 | let runningApps = NSWorkspace.shared.runningApplications
17 | let isRunning = !runningApps.filter { $0.bundleIdentifier == mainAppIdentifier }.isEmpty
18 |
19 | if !isRunning {
20 | // Surely there's a better way I just don't know about, right?
21 | // The old launchAppWithBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifier:
22 | // has been deprecated.
23 | let path = Bundle.main.bundlePath as NSString
24 | var components = path.pathComponents
25 | components.removeLast()
26 | components.removeLast()
27 | components.removeLast()
28 | components.removeLast()
29 |
30 | let mainAppPath = NSString.path(withComponents: components)
31 | let mainAppURL = URL(fileURLWithPath: mainAppPath)
32 |
33 | NSWorkspace.shared.openApplication(at: mainAppURL, configuration: .init()) { (_, _) in
34 | NSApp.terminate(nil)
35 | }
36 | } else {
37 | NSApp.terminate(nil)
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## User settings
6 | xcuserdata/
7 |
8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
9 | *.xcscmblueprint
10 | *.xccheckout
11 |
12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
13 | build/
14 | DerivedData/
15 | *.moved-aside
16 | *.pbxuser
17 | !default.pbxuser
18 | *.mode1v3
19 | !default.mode1v3
20 | *.mode2v3
21 | !default.mode2v3
22 | *.perspectivev3
23 | !default.perspectivev3
24 |
25 | ## Obj-C/Swift specific
26 | *.hmap
27 |
28 | ## App packaging
29 | *.ipa
30 | *.dSYM.zip
31 | *.dSYM
32 |
33 | ## Playgrounds
34 | timeline.xctimeline
35 | playground.xcworkspace
36 |
37 | # Swift Package Manager
38 | #
39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
40 | # Packages/
41 | # Package.pins
42 | # Package.resolved
43 | # *.xcodeproj
44 | #
45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
46 | # hence it is not needed unless you have added a package configuration file to your project
47 | # .swiftpm
48 |
49 | .build/
50 |
51 | # CocoaPods
52 | #
53 | # We recommend against adding the Pods directory to your .gitignore. However
54 | # you should judge for yourself, the pros and cons are mentioned at:
55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
56 | #
57 | # Pods/
58 | #
59 | # Add this line if you want to avoid checking in source code from the Xcode workspace
60 | # *.xcworkspace
61 |
62 | # Carthage
63 | #
64 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
65 | # Carthage/Checkouts
66 |
67 | Carthage/Build/
68 |
69 | # Accio dependency management
70 | Dependencies/
71 | .accio/
72 |
73 | # fastlane
74 | #
75 | # It is recommended to not store the screenshots in the git repo.
76 | # Instead, use fastlane to re-generate the screenshots whenever they are needed.
77 | # For more information about the recommended setup visit:
78 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
79 |
80 | fastlane/report.xml
81 | fastlane/Preview.html
82 | fastlane/screenshots/**/*.png
83 | fastlane/test_output
84 |
85 | # Code Injection
86 | #
87 | # After new code Injection tools there's a generated folder /iOSInjectionProject
88 | # https://github.com/johnno1962/injectionforxcode
89 |
90 | iOSInjectionProject/
91 | .DS_Store
92 |
--------------------------------------------------------------------------------
/StartAtLogin.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | C64486FD2514D82C007F4EC5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C64486FC2514D82C007F4EC5 /* AppDelegate.swift */; };
11 | C64486FF2514D831007F4EC5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C64486FE2514D831007F4EC5 /* Assets.xcassets */; };
12 | C64487022514D831007F4EC5 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = C64487002514D831007F4EC5 /* MainMenu.xib */; };
13 | C64487122514D8B8007F4EC5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C64487112514D8B8007F4EC5 /* AppDelegate.swift */; };
14 | C64487142514D8B8007F4EC5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C64487132514D8B8007F4EC5 /* Assets.xcassets */; };
15 | C64487172514D8B8007F4EC5 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = C64487152514D8B8007F4EC5 /* MainMenu.xib */; };
16 | C644872025150DE9007F4EC5 /* StartAtLogin.Launcher.app in Launcher */ = {isa = PBXBuildFile; fileRef = C644870F2514D8B8007F4EC5 /* StartAtLogin.Launcher.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXContainerItemProxy section */
20 | C644871D25150DCE007F4EC5 /* PBXContainerItemProxy */ = {
21 | isa = PBXContainerItemProxy;
22 | containerPortal = C64486F12514D82C007F4EC5 /* Project object */;
23 | proxyType = 1;
24 | remoteGlobalIDString = C644870E2514D8B8007F4EC5;
25 | remoteInfo = StartAtLogin.Launcher;
26 | };
27 | /* End PBXContainerItemProxy section */
28 |
29 | /* Begin PBXCopyFilesBuildPhase section */
30 | C644871F25150DDA007F4EC5 /* Launcher */ = {
31 | isa = PBXCopyFilesBuildPhase;
32 | buildActionMask = 2147483647;
33 | dstPath = Contents/Library/LoginItems;
34 | dstSubfolderSpec = 1;
35 | files = (
36 | C644872025150DE9007F4EC5 /* StartAtLogin.Launcher.app in Launcher */,
37 | );
38 | name = Launcher;
39 | runOnlyForDeploymentPostprocessing = 0;
40 | };
41 | /* End PBXCopyFilesBuildPhase section */
42 |
43 | /* Begin PBXFileReference section */
44 | C64486F92514D82C007F4EC5 /* StartAtLogin.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StartAtLogin.app; sourceTree = BUILT_PRODUCTS_DIR; };
45 | C64486FC2514D82C007F4EC5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
46 | C64486FE2514D831007F4EC5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
47 | C64487012514D831007F4EC5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
48 | C64487032514D831007F4EC5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
49 | C64487042514D831007F4EC5 /* StartAtLogin.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StartAtLogin.entitlements; sourceTree = ""; };
50 | C644870F2514D8B8007F4EC5 /* StartAtLogin.Launcher.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StartAtLogin.Launcher.app; sourceTree = BUILT_PRODUCTS_DIR; };
51 | C64487112514D8B8007F4EC5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
52 | C64487132514D8B8007F4EC5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
53 | C64487162514D8B8007F4EC5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
54 | C64487182514D8B8007F4EC5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
55 | C64487192514D8B8007F4EC5 /* StartAtLogin_Launcher.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StartAtLogin_Launcher.entitlements; sourceTree = ""; };
56 | /* End PBXFileReference section */
57 |
58 | /* Begin PBXFrameworksBuildPhase section */
59 | C64486F62514D82C007F4EC5 /* Frameworks */ = {
60 | isa = PBXFrameworksBuildPhase;
61 | buildActionMask = 2147483647;
62 | files = (
63 | );
64 | runOnlyForDeploymentPostprocessing = 0;
65 | };
66 | C644870C2514D8B8007F4EC5 /* Frameworks */ = {
67 | isa = PBXFrameworksBuildPhase;
68 | buildActionMask = 2147483647;
69 | files = (
70 | );
71 | runOnlyForDeploymentPostprocessing = 0;
72 | };
73 | /* End PBXFrameworksBuildPhase section */
74 |
75 | /* Begin PBXGroup section */
76 | C64486F02514D82C007F4EC5 = {
77 | isa = PBXGroup;
78 | children = (
79 | C64486FB2514D82C007F4EC5 /* StartAtLogin */,
80 | C64487102514D8B8007F4EC5 /* StartAtLogin.Launcher */,
81 | C64486FA2514D82C007F4EC5 /* Products */,
82 | );
83 | sourceTree = "";
84 | };
85 | C64486FA2514D82C007F4EC5 /* Products */ = {
86 | isa = PBXGroup;
87 | children = (
88 | C64486F92514D82C007F4EC5 /* StartAtLogin.app */,
89 | C644870F2514D8B8007F4EC5 /* StartAtLogin.Launcher.app */,
90 | );
91 | name = Products;
92 | sourceTree = "";
93 | };
94 | C64486FB2514D82C007F4EC5 /* StartAtLogin */ = {
95 | isa = PBXGroup;
96 | children = (
97 | C64486FC2514D82C007F4EC5 /* AppDelegate.swift */,
98 | C64486FE2514D831007F4EC5 /* Assets.xcassets */,
99 | C64487002514D831007F4EC5 /* MainMenu.xib */,
100 | C64487032514D831007F4EC5 /* Info.plist */,
101 | C64487042514D831007F4EC5 /* StartAtLogin.entitlements */,
102 | );
103 | path = StartAtLogin;
104 | sourceTree = "";
105 | };
106 | C64487102514D8B8007F4EC5 /* StartAtLogin.Launcher */ = {
107 | isa = PBXGroup;
108 | children = (
109 | C64487112514D8B8007F4EC5 /* AppDelegate.swift */,
110 | C64487132514D8B8007F4EC5 /* Assets.xcassets */,
111 | C64487152514D8B8007F4EC5 /* MainMenu.xib */,
112 | C64487182514D8B8007F4EC5 /* Info.plist */,
113 | C64487192514D8B8007F4EC5 /* StartAtLogin_Launcher.entitlements */,
114 | );
115 | path = StartAtLogin.Launcher;
116 | sourceTree = "";
117 | };
118 | /* End PBXGroup section */
119 |
120 | /* Begin PBXNativeTarget section */
121 | C64486F82514D82C007F4EC5 /* StartAtLogin */ = {
122 | isa = PBXNativeTarget;
123 | buildConfigurationList = C64487072514D831007F4EC5 /* Build configuration list for PBXNativeTarget "StartAtLogin" */;
124 | buildPhases = (
125 | C64486F52514D82C007F4EC5 /* Sources */,
126 | C64486F62514D82C007F4EC5 /* Frameworks */,
127 | C64486F72514D82C007F4EC5 /* Resources */,
128 | C644871F25150DDA007F4EC5 /* Launcher */,
129 | );
130 | buildRules = (
131 | );
132 | dependencies = (
133 | C644871E25150DCE007F4EC5 /* PBXTargetDependency */,
134 | );
135 | name = StartAtLogin;
136 | productName = StartAtLogin;
137 | productReference = C64486F92514D82C007F4EC5 /* StartAtLogin.app */;
138 | productType = "com.apple.product-type.application";
139 | };
140 | C644870E2514D8B8007F4EC5 /* StartAtLogin.Launcher */ = {
141 | isa = PBXNativeTarget;
142 | buildConfigurationList = C644871A2514D8B8007F4EC5 /* Build configuration list for PBXNativeTarget "StartAtLogin.Launcher" */;
143 | buildPhases = (
144 | C644870B2514D8B8007F4EC5 /* Sources */,
145 | C644870C2514D8B8007F4EC5 /* Frameworks */,
146 | C644870D2514D8B8007F4EC5 /* Resources */,
147 | );
148 | buildRules = (
149 | );
150 | dependencies = (
151 | );
152 | name = StartAtLogin.Launcher;
153 | productName = StartAtLogin.Launcher;
154 | productReference = C644870F2514D8B8007F4EC5 /* StartAtLogin.Launcher.app */;
155 | productType = "com.apple.product-type.application";
156 | };
157 | /* End PBXNativeTarget section */
158 |
159 | /* Begin PBXProject section */
160 | C64486F12514D82C007F4EC5 /* Project object */ = {
161 | isa = PBXProject;
162 | attributes = {
163 | LastSwiftUpdateCheck = 1170;
164 | LastUpgradeCheck = 1170;
165 | ORGANIZATIONNAME = "Tyler Hall";
166 | TargetAttributes = {
167 | C64486F82514D82C007F4EC5 = {
168 | CreatedOnToolsVersion = 11.7;
169 | };
170 | C644870E2514D8B8007F4EC5 = {
171 | CreatedOnToolsVersion = 11.7;
172 | };
173 | };
174 | };
175 | buildConfigurationList = C64486F42514D82C007F4EC5 /* Build configuration list for PBXProject "StartAtLogin" */;
176 | compatibilityVersion = "Xcode 9.3";
177 | developmentRegion = en;
178 | hasScannedForEncodings = 0;
179 | knownRegions = (
180 | en,
181 | Base,
182 | );
183 | mainGroup = C64486F02514D82C007F4EC5;
184 | productRefGroup = C64486FA2514D82C007F4EC5 /* Products */;
185 | projectDirPath = "";
186 | projectRoot = "";
187 | targets = (
188 | C64486F82514D82C007F4EC5 /* StartAtLogin */,
189 | C644870E2514D8B8007F4EC5 /* StartAtLogin.Launcher */,
190 | );
191 | };
192 | /* End PBXProject section */
193 |
194 | /* Begin PBXResourcesBuildPhase section */
195 | C64486F72514D82C007F4EC5 /* Resources */ = {
196 | isa = PBXResourcesBuildPhase;
197 | buildActionMask = 2147483647;
198 | files = (
199 | C64486FF2514D831007F4EC5 /* Assets.xcassets in Resources */,
200 | C64487022514D831007F4EC5 /* MainMenu.xib in Resources */,
201 | );
202 | runOnlyForDeploymentPostprocessing = 0;
203 | };
204 | C644870D2514D8B8007F4EC5 /* Resources */ = {
205 | isa = PBXResourcesBuildPhase;
206 | buildActionMask = 2147483647;
207 | files = (
208 | C64487142514D8B8007F4EC5 /* Assets.xcassets in Resources */,
209 | C64487172514D8B8007F4EC5 /* MainMenu.xib in Resources */,
210 | );
211 | runOnlyForDeploymentPostprocessing = 0;
212 | };
213 | /* End PBXResourcesBuildPhase section */
214 |
215 | /* Begin PBXSourcesBuildPhase section */
216 | C64486F52514D82C007F4EC5 /* Sources */ = {
217 | isa = PBXSourcesBuildPhase;
218 | buildActionMask = 2147483647;
219 | files = (
220 | C64486FD2514D82C007F4EC5 /* AppDelegate.swift in Sources */,
221 | );
222 | runOnlyForDeploymentPostprocessing = 0;
223 | };
224 | C644870B2514D8B8007F4EC5 /* Sources */ = {
225 | isa = PBXSourcesBuildPhase;
226 | buildActionMask = 2147483647;
227 | files = (
228 | C64487122514D8B8007F4EC5 /* AppDelegate.swift in Sources */,
229 | );
230 | runOnlyForDeploymentPostprocessing = 0;
231 | };
232 | /* End PBXSourcesBuildPhase section */
233 |
234 | /* Begin PBXTargetDependency section */
235 | C644871E25150DCE007F4EC5 /* PBXTargetDependency */ = {
236 | isa = PBXTargetDependency;
237 | target = C644870E2514D8B8007F4EC5 /* StartAtLogin.Launcher */;
238 | targetProxy = C644871D25150DCE007F4EC5 /* PBXContainerItemProxy */;
239 | };
240 | /* End PBXTargetDependency section */
241 |
242 | /* Begin PBXVariantGroup section */
243 | C64487002514D831007F4EC5 /* MainMenu.xib */ = {
244 | isa = PBXVariantGroup;
245 | children = (
246 | C64487012514D831007F4EC5 /* Base */,
247 | );
248 | name = MainMenu.xib;
249 | sourceTree = "";
250 | };
251 | C64487152514D8B8007F4EC5 /* MainMenu.xib */ = {
252 | isa = PBXVariantGroup;
253 | children = (
254 | C64487162514D8B8007F4EC5 /* Base */,
255 | );
256 | name = MainMenu.xib;
257 | sourceTree = "";
258 | };
259 | /* End PBXVariantGroup section */
260 |
261 | /* Begin XCBuildConfiguration section */
262 | C64487052514D831007F4EC5 /* Debug */ = {
263 | isa = XCBuildConfiguration;
264 | buildSettings = {
265 | ALWAYS_SEARCH_USER_PATHS = NO;
266 | CLANG_ANALYZER_NONNULL = YES;
267 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
268 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
269 | CLANG_CXX_LIBRARY = "libc++";
270 | CLANG_ENABLE_MODULES = YES;
271 | CLANG_ENABLE_OBJC_ARC = YES;
272 | CLANG_ENABLE_OBJC_WEAK = YES;
273 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
274 | CLANG_WARN_BOOL_CONVERSION = YES;
275 | CLANG_WARN_COMMA = YES;
276 | CLANG_WARN_CONSTANT_CONVERSION = YES;
277 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
278 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
279 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
280 | CLANG_WARN_EMPTY_BODY = YES;
281 | CLANG_WARN_ENUM_CONVERSION = YES;
282 | CLANG_WARN_INFINITE_RECURSION = YES;
283 | CLANG_WARN_INT_CONVERSION = YES;
284 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
285 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
286 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
287 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
288 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
289 | CLANG_WARN_STRICT_PROTOTYPES = YES;
290 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
291 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
292 | CLANG_WARN_UNREACHABLE_CODE = YES;
293 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
294 | COPY_PHASE_STRIP = NO;
295 | DEBUG_INFORMATION_FORMAT = dwarf;
296 | ENABLE_STRICT_OBJC_MSGSEND = YES;
297 | ENABLE_TESTABILITY = YES;
298 | GCC_C_LANGUAGE_STANDARD = gnu11;
299 | GCC_DYNAMIC_NO_PIC = NO;
300 | GCC_NO_COMMON_BLOCKS = YES;
301 | GCC_OPTIMIZATION_LEVEL = 0;
302 | GCC_PREPROCESSOR_DEFINITIONS = (
303 | "DEBUG=1",
304 | "$(inherited)",
305 | );
306 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
307 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
308 | GCC_WARN_UNDECLARED_SELECTOR = YES;
309 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
310 | GCC_WARN_UNUSED_FUNCTION = YES;
311 | GCC_WARN_UNUSED_VARIABLE = YES;
312 | MACOSX_DEPLOYMENT_TARGET = 10.16;
313 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
314 | MTL_FAST_MATH = YES;
315 | ONLY_ACTIVE_ARCH = YES;
316 | SDKROOT = macosx;
317 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
318 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
319 | };
320 | name = Debug;
321 | };
322 | C64487062514D831007F4EC5 /* Release */ = {
323 | isa = XCBuildConfiguration;
324 | buildSettings = {
325 | ALWAYS_SEARCH_USER_PATHS = NO;
326 | CLANG_ANALYZER_NONNULL = YES;
327 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
328 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
329 | CLANG_CXX_LIBRARY = "libc++";
330 | CLANG_ENABLE_MODULES = YES;
331 | CLANG_ENABLE_OBJC_ARC = YES;
332 | CLANG_ENABLE_OBJC_WEAK = YES;
333 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
334 | CLANG_WARN_BOOL_CONVERSION = YES;
335 | CLANG_WARN_COMMA = YES;
336 | CLANG_WARN_CONSTANT_CONVERSION = YES;
337 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
338 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
339 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
340 | CLANG_WARN_EMPTY_BODY = YES;
341 | CLANG_WARN_ENUM_CONVERSION = YES;
342 | CLANG_WARN_INFINITE_RECURSION = YES;
343 | CLANG_WARN_INT_CONVERSION = YES;
344 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
345 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
346 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
347 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
348 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
349 | CLANG_WARN_STRICT_PROTOTYPES = YES;
350 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
351 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
352 | CLANG_WARN_UNREACHABLE_CODE = YES;
353 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
354 | COPY_PHASE_STRIP = NO;
355 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
356 | ENABLE_NS_ASSERTIONS = NO;
357 | ENABLE_STRICT_OBJC_MSGSEND = YES;
358 | GCC_C_LANGUAGE_STANDARD = gnu11;
359 | GCC_NO_COMMON_BLOCKS = YES;
360 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
361 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
362 | GCC_WARN_UNDECLARED_SELECTOR = YES;
363 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
364 | GCC_WARN_UNUSED_FUNCTION = YES;
365 | GCC_WARN_UNUSED_VARIABLE = YES;
366 | MACOSX_DEPLOYMENT_TARGET = 10.16;
367 | MTL_ENABLE_DEBUG_INFO = NO;
368 | MTL_FAST_MATH = YES;
369 | SDKROOT = macosx;
370 | SWIFT_COMPILATION_MODE = wholemodule;
371 | SWIFT_OPTIMIZATION_LEVEL = "-O";
372 | };
373 | name = Release;
374 | };
375 | C64487082514D831007F4EC5 /* Debug */ = {
376 | isa = XCBuildConfiguration;
377 | buildSettings = {
378 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
379 | CODE_SIGN_ENTITLEMENTS = StartAtLogin/StartAtLogin.entitlements;
380 | CODE_SIGN_STYLE = Automatic;
381 | COMBINE_HIDPI_IMAGES = YES;
382 | DEVELOPMENT_TEAM = 3A6K89K388;
383 | ENABLE_HARDENED_RUNTIME = YES;
384 | INFOPLIST_FILE = StartAtLogin/Info.plist;
385 | LD_RUNPATH_SEARCH_PATHS = (
386 | "$(inherited)",
387 | "@executable_path/../Frameworks",
388 | );
389 | PRODUCT_BUNDLE_IDENTIFIER = io.tyler.StartAtLogin;
390 | PRODUCT_NAME = "$(TARGET_NAME)";
391 | SWIFT_VERSION = 5.0;
392 | };
393 | name = Debug;
394 | };
395 | C64487092514D831007F4EC5 /* Release */ = {
396 | isa = XCBuildConfiguration;
397 | buildSettings = {
398 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
399 | CODE_SIGN_ENTITLEMENTS = StartAtLogin/StartAtLogin.entitlements;
400 | CODE_SIGN_STYLE = Automatic;
401 | COMBINE_HIDPI_IMAGES = YES;
402 | DEVELOPMENT_TEAM = 3A6K89K388;
403 | ENABLE_HARDENED_RUNTIME = YES;
404 | INFOPLIST_FILE = StartAtLogin/Info.plist;
405 | LD_RUNPATH_SEARCH_PATHS = (
406 | "$(inherited)",
407 | "@executable_path/../Frameworks",
408 | );
409 | PRODUCT_BUNDLE_IDENTIFIER = io.tyler.StartAtLogin;
410 | PRODUCT_NAME = "$(TARGET_NAME)";
411 | SWIFT_VERSION = 5.0;
412 | };
413 | name = Release;
414 | };
415 | C644871B2514D8B8007F4EC5 /* Debug */ = {
416 | isa = XCBuildConfiguration;
417 | buildSettings = {
418 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
419 | CODE_SIGN_ENTITLEMENTS = StartAtLogin.Launcher/StartAtLogin_Launcher.entitlements;
420 | CODE_SIGN_STYLE = Automatic;
421 | COMBINE_HIDPI_IMAGES = YES;
422 | DEVELOPMENT_TEAM = 3A6K89K388;
423 | ENABLE_HARDENED_RUNTIME = YES;
424 | INFOPLIST_FILE = StartAtLogin.Launcher/Info.plist;
425 | LD_RUNPATH_SEARCH_PATHS = (
426 | "$(inherited)",
427 | "@executable_path/../Frameworks",
428 | );
429 | PRODUCT_BUNDLE_IDENTIFIER = io.tyler.StartAtLogin.Launcher;
430 | PRODUCT_NAME = "$(TARGET_NAME)";
431 | SWIFT_VERSION = 5.0;
432 | };
433 | name = Debug;
434 | };
435 | C644871C2514D8B8007F4EC5 /* Release */ = {
436 | isa = XCBuildConfiguration;
437 | buildSettings = {
438 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
439 | CODE_SIGN_ENTITLEMENTS = StartAtLogin.Launcher/StartAtLogin_Launcher.entitlements;
440 | CODE_SIGN_STYLE = Automatic;
441 | COMBINE_HIDPI_IMAGES = YES;
442 | DEVELOPMENT_TEAM = 3A6K89K388;
443 | ENABLE_HARDENED_RUNTIME = YES;
444 | INFOPLIST_FILE = StartAtLogin.Launcher/Info.plist;
445 | LD_RUNPATH_SEARCH_PATHS = (
446 | "$(inherited)",
447 | "@executable_path/../Frameworks",
448 | );
449 | PRODUCT_BUNDLE_IDENTIFIER = io.tyler.StartAtLogin.Launcher;
450 | PRODUCT_NAME = "$(TARGET_NAME)";
451 | SWIFT_VERSION = 5.0;
452 | };
453 | name = Release;
454 | };
455 | /* End XCBuildConfiguration section */
456 |
457 | /* Begin XCConfigurationList section */
458 | C64486F42514D82C007F4EC5 /* Build configuration list for PBXProject "StartAtLogin" */ = {
459 | isa = XCConfigurationList;
460 | buildConfigurations = (
461 | C64487052514D831007F4EC5 /* Debug */,
462 | C64487062514D831007F4EC5 /* Release */,
463 | );
464 | defaultConfigurationIsVisible = 0;
465 | defaultConfigurationName = Release;
466 | };
467 | C64487072514D831007F4EC5 /* Build configuration list for PBXNativeTarget "StartAtLogin" */ = {
468 | isa = XCConfigurationList;
469 | buildConfigurations = (
470 | C64487082514D831007F4EC5 /* Debug */,
471 | C64487092514D831007F4EC5 /* Release */,
472 | );
473 | defaultConfigurationIsVisible = 0;
474 | defaultConfigurationName = Release;
475 | };
476 | C644871A2514D8B8007F4EC5 /* Build configuration list for PBXNativeTarget "StartAtLogin.Launcher" */ = {
477 | isa = XCConfigurationList;
478 | buildConfigurations = (
479 | C644871B2514D8B8007F4EC5 /* Debug */,
480 | C644871C2514D8B8007F4EC5 /* Release */,
481 | );
482 | defaultConfigurationIsVisible = 0;
483 | defaultConfigurationName = Release;
484 | };
485 | /* End XCConfigurationList section */
486 | };
487 | rootObject = C64486F12514D82C007F4EC5 /* Project object */;
488 | }
489 |
--------------------------------------------------------------------------------
/StartAtLogin.Launcher/Base.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
678 |
679 |
680 |
--------------------------------------------------------------------------------
/StartAtLogin/Base.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
522 |
523 |
524 |
525 |
526 |
527 |
528 |
529 |
530 |
531 |
532 |
533 |
534 |
535 |
536 |
537 | Default
538 |
539 |
540 |
541 |
542 |
543 |
544 | Left to Right
545 |
546 |
547 |
548 |
549 |
550 |
551 | Right to Left
552 |
553 |
554 |
555 |
556 |
557 |
558 |
559 |
560 |
561 |
562 | Default
563 |
564 |
565 |
566 |
567 |
568 |
569 | Left to Right
570 |
571 |
572 |
573 |
574 |
575 |
576 | Right to Left
577 |
578 |
579 |
580 |
581 |
582 |
583 |
584 |
585 |
586 |
587 |
588 |
589 |
590 |
591 |
592 |
593 |
594 |
595 |
596 |
597 |
598 |
599 |
600 |
601 |
602 |
603 |
604 |
605 |
606 |
607 |
608 |
609 |
610 |
611 |
612 |
613 |
614 |
615 |
616 |
617 |
618 |
619 |
620 |
621 |
622 |
623 |
624 |
625 |
626 |
627 |
628 |
629 |
630 |
631 |
632 |
633 |
634 |
635 |
636 |
637 |
638 |
639 |
640 |
641 |
642 |
643 |
644 |
645 |
646 |
647 |
648 |
649 |
650 |
651 |
652 |
653 |
654 |
655 |
656 |
657 |
658 |
659 |
660 |
661 |
662 |
663 |
664 |
665 |
666 |
667 |
668 |
669 |
670 |
671 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
683 |
684 |
685 |
686 |
687 |
688 |
689 |
690 |
691 |
692 |
693 |
--------------------------------------------------------------------------------