├── Cleaner ├── Assets.xcassets │ ├── Contents.json │ ├── AccentColor.colorset │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── Test.swift ├── CleanerApp.swift ├── Cleaner.entitlements ├── Manager │ └── MergeConflictCleaner.swift └── ContentView.swift ├── Cleaner.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata ├── xcuserdata │ └── macbookair.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist └── project.pbxproj ├── CleanerUITests ├── CleanerUITestsLaunchTests.swift └── CleanerUITests.swift └── CleanerTests └── CleanerTests.swift /Cleaner/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Cleaner/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Cleaner/Test.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Test.swift 3 | // Cleaner 4 | // 5 | // Created by Daniel Jermaine on 05/07/2025. 6 | // 7 | import Foundation 8 | 9 | -------------------------------------------------------------------------------- /Cleaner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Cleaner/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Cleaner/CleanerApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CleanerApp.swift 3 | // Cleaner 4 | // 5 | // Created by Daniel Jermaine on 05/07/2025. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct CleanerApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | ContentView() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Cleaner/Cleaner.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 | -------------------------------------------------------------------------------- /Cleaner.xcodeproj/xcuserdata/macbookair.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Cleaner.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /CleanerUITests/CleanerUITestsLaunchTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CleanerUITestsLaunchTests.swift 3 | // CleanerUITests 4 | // 5 | // Created by Daniel Jermaine on 05/07/2025. 6 | // 7 | 8 | import XCTest 9 | 10 | final class CleanerUITestsLaunchTests: XCTestCase { 11 | 12 | override class var runsForEachTargetApplicationUIConfiguration: Bool { 13 | true 14 | } 15 | 16 | override func setUpWithError() throws { 17 | continueAfterFailure = false 18 | } 19 | 20 | @MainActor 21 | func testLaunch() throws { 22 | let app = XCUIApplication() 23 | app.launch() 24 | 25 | // Insert steps here to perform after app launch but before taking a screenshot, 26 | // such as logging into a test account or navigating somewhere in the app 27 | 28 | let attachment = XCTAttachment(screenshot: app.screenshot()) 29 | attachment.name = "Launch Screen" 30 | attachment.lifetime = .keepAlways 31 | add(attachment) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Cleaner/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 | -------------------------------------------------------------------------------- /CleanerUITests/CleanerUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CleanerUITests.swift 3 | // CleanerUITests 4 | // 5 | // Created by Daniel Jermaine on 05/07/2025. 6 | // 7 | 8 | import XCTest 9 | 10 | final class CleanerUITests: XCTestCase { 11 | 12 | override func setUpWithError() throws { 13 | // Put setup code here. This method is called before the invocation of each test method in the class. 14 | 15 | // In UI tests it is usually best to stop immediately when a failure occurs. 16 | continueAfterFailure = false 17 | 18 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 19 | } 20 | 21 | override func tearDownWithError() throws { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | } 24 | 25 | @MainActor 26 | func testExample() throws { 27 | // UI tests must launch the application that they test. 28 | let app = XCUIApplication() 29 | app.launch() 30 | 31 | // Use XCTAssert and related functions to verify your tests produce the correct results. 32 | } 33 | 34 | @MainActor 35 | func testLaunchPerformance() throws { 36 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { 37 | // This measures how long it takes to launch your application. 38 | measure(metrics: [XCTApplicationLaunchMetric()]) { 39 | XCUIApplication().launch() 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Cleaner/Manager/MergeConflictCleaner.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MergeConflictCleaner.swift 3 | // Cleaner 4 | // 5 | // Created by Daniel Jermaine on 05/07/2025. 6 | // 7 | 8 | import Foundation 9 | 10 | class MergeConflictCleaner { 11 | 12 | enum ConflictResolution { 13 | case head // Keep HEAD version (first section) 14 | case incoming // Keep incoming branch version (second section) 15 | case removeAll // Remove all conflicted sections 16 | } 17 | 18 | func clean(content: String, resolution: ConflictResolution = .head) -> String { 19 | var result = "" 20 | var conflictDepth = 0 21 | var inHeadSection = false 22 | var inIncomingSection = false 23 | 24 | for line in content.components(separatedBy: .newlines) { 25 | if line.hasPrefix("<<<<<<<") { 26 | conflictDepth += 1 27 | inHeadSection = true 28 | inIncomingSection = false 29 | continue 30 | } else if line.hasPrefix("=======") && conflictDepth > 0 { 31 | inHeadSection = false 32 | inIncomingSection = true 33 | continue 34 | } else if line.hasPrefix(">>>>>>>") { 35 | conflictDepth = max(0, conflictDepth - 1) 36 | inHeadSection = false 37 | inIncomingSection = false 38 | continue 39 | } 40 | 41 | // Determine if we should include this line 42 | let shouldIncludeLine: Bool 43 | 44 | if conflictDepth == 0 { 45 | // Always include lines outside conflicts 46 | shouldIncludeLine = true 47 | } else { 48 | // Inside a conflict - decide based on resolution strategy 49 | switch resolution { 50 | case .head: 51 | shouldIncludeLine = inHeadSection 52 | case .incoming: 53 | shouldIncludeLine = inIncomingSection 54 | case .removeAll: 55 | shouldIncludeLine = false 56 | } 57 | } 58 | 59 | if shouldIncludeLine { 60 | result += line + "\n" 61 | } 62 | } 63 | 64 | return result 65 | } 66 | } 67 | 68 | -------------------------------------------------------------------------------- /Cleaner/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // Cleaner 4 | // 5 | // Created by Daniel Jermaine on 05/07/2025. 6 | // 7 | import SwiftUI 8 | import AppKit 9 | 10 | struct ContentView: View { 11 | @State private var inputText = "" 12 | @State private var cleanedContent = "" 13 | @State private var showingCopyAlert = false 14 | @State private var selectedResolution: MergeConflictCleaner.ConflictResolution = .head 15 | 16 | let cleaner = MergeConflictCleaner() 17 | 18 | var body: some View { 19 | VStack(spacing: 20) { 20 | Text("Merge Conflict Cleaner") 21 | .font(.largeTitle) 22 | .fontWeight(.bold) 23 | .padding() 24 | 25 | VStack(alignment: .leading, spacing: 10) { 26 | Text("Paste your text with merge conflicts:") 27 | .font(.headline) 28 | 29 | TextEditor(text: $inputText) 30 | .border(Color.gray, width: 1) 31 | .frame(minHeight: 150) 32 | .padding(.horizontal) 33 | } 34 | 35 | VStack(alignment: .leading, spacing: 10) { 36 | Text("Resolution Strategy:") 37 | .font(.headline) 38 | .padding() 39 | 40 | Picker("Resolution Strategy", selection: $selectedResolution) { 41 | Text("Keep HEAD (first option)").tag(MergeConflictCleaner.ConflictResolution.head) 42 | Text("Keep Incoming (second option)").tag(MergeConflictCleaner.ConflictResolution.incoming) 43 | Text("Remove All Conflicts").tag(MergeConflictCleaner.ConflictResolution.removeAll) 44 | } 45 | .pickerStyle(SegmentedPickerStyle()) 46 | .padding(.horizontal) 47 | .padding() 48 | } 49 | 50 | Button("Clean Merge Conflicts") { 51 | cleanedContent = cleaner.clean(content: inputText, resolution: selectedResolution) 52 | } 53 | .padding() 54 | .background(Color.blue) 55 | .foregroundColor(.white) 56 | .cornerRadius(8) 57 | .disabled(inputText.isEmpty) 58 | 59 | if !cleanedContent.isEmpty { 60 | VStack(alignment: .leading, spacing: 10) { 61 | HStack { 62 | Text("Cleaned Content:") 63 | .font(.headline) 64 | 65 | Spacer() 66 | 67 | Button("Copy to Clipboard") { 68 | NSPasteboard.general.clearContents() 69 | NSPasteboard.general.setString(cleanedContent, forType: .string) 70 | showingCopyAlert = true 71 | } 72 | .padding(.horizontal, 12) 73 | .padding(.vertical, 6) 74 | .background(Color.green) 75 | .foregroundColor(.white) 76 | .cornerRadius(6) 77 | .font(.caption) 78 | } 79 | 80 | ScrollView { 81 | Text(cleanedContent) 82 | .font(.system(.body, design: .monospaced)) 83 | .padding() 84 | .frame(maxWidth: .infinity, alignment: .leading) 85 | .background(Color.gray.opacity(0.1)) 86 | .cornerRadius(8) 87 | } 88 | .frame(maxHeight: 300) 89 | } 90 | .padding(.horizontal) 91 | } 92 | 93 | Spacer() 94 | } 95 | .alert("Copied!", isPresented: $showingCopyAlert) { 96 | Button("OK", role: .cancel) { } 97 | } message: { 98 | Text("Cleaned content has been copied to clipboard") 99 | } 100 | } 101 | } 102 | 103 | #Preview { 104 | ContentView() 105 | } 106 | -------------------------------------------------------------------------------- /CleanerTests/CleanerTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CleanerTests.swift 3 | // CleanerTests 4 | // 5 | // Created by Daniel Jermaine on 05/07/2025. 6 | // 7 | 8 | import XCTest 9 | @testable import Cleaner 10 | import XCTest 11 | 12 | class MergeConflictCleanerTests: XCTestCase { 13 | 14 | var cleaner: MergeConflictCleaner! 15 | 16 | override func setUp() { 17 | super.setUp() 18 | cleaner = MergeConflictCleaner() 19 | } 20 | 21 | override func tearDown() { 22 | cleaner = nil 23 | super.tearDown() 24 | } 25 | 26 | // Test 1: Simple single conflict 27 | func testSimpleSingleConflict() { 28 | let input = """ 29 | func greet() { 30 | print("Hello") 31 | <<<<<<< HEAD 32 | print("Welcome to our app") 33 | ======= 34 | print("Welcome to the application") 35 | >>>>>>> feature/greeting 36 | } 37 | """ 38 | 39 | let expected = """ 40 | func greet() { 41 | print("Hello") 42 | } 43 | """ 44 | 45 | let result = cleaner.clean(content: input) 46 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines), 47 | expected.trimmingCharacters(in: .whitespacesAndNewlines)) 48 | } 49 | 50 | // Test 2: Multiple conflicts in same function 51 | func testMultipleConflictsInSameFunction() { 52 | let input = """ 53 | func processData() { 54 | let data = fetchData() 55 | <<<<<<< HEAD 56 | validateData(data) 57 | ======= 58 | sanitizeData(data) 59 | >>>>>>> feature/validation 60 | 61 | let processed = transform(data) 62 | 63 | <<<<<<< HEAD 64 | saveToDatabase(processed) 65 | ======= 66 | saveToCache(processed) 67 | saveToDatabase(processed) 68 | >>>>>>> feature/caching 69 | } 70 | """ 71 | 72 | let expected = """ 73 | func processData() { 74 | let data = fetchData() 75 | 76 | let processed = transform(data) 77 | 78 | } 79 | """ 80 | 81 | let result = cleaner.clean(content: input) 82 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines), 83 | expected.trimmingCharacters(in: .whitespacesAndNewlines)) 84 | } 85 | 86 | // Test 3: Nested conflicts (conflict within conflict) 87 | func testNestedConflicts() { 88 | let input = """ 89 | class APIClient { 90 | <<<<<<< HEAD 91 | func makeRequest() { 92 | let url = "https://api.example.com" 93 | <<<<<<< develop 94 | let method = "GET" 95 | ======= 96 | let method = "POST" 97 | >>>>>>> feature/post-support 98 | performRequest(url: url, method: method) 99 | } 100 | ======= 101 | func executeRequest() { 102 | let endpoint = "https://api.newservice.com" 103 | sendRequest(to: endpoint) 104 | } 105 | >>>>>>> feature/new-api 106 | } 107 | """ 108 | 109 | let expected = """ 110 | class APIClient { 111 | } 112 | """ 113 | 114 | let result = cleaner.clean(content: input) 115 | print(result) 116 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines), 117 | expected.trimmingCharacters(in: .whitespacesAndNewlines)) 118 | } 119 | 120 | // Test 4: Property conflicts 121 | func testPropertyConflicts() { 122 | let input = """ 123 | struct User { 124 | let id: String 125 | let name: String 126 | <<<<<<< HEAD 127 | let email: String 128 | let phone: String? 129 | ======= 130 | let emailAddress: String 131 | let phoneNumber: String? 132 | let isVerified: Bool 133 | >>>>>>> feature/user-verification 134 | 135 | init(id: String, name: String) { 136 | self.id = id 137 | self.name = name 138 | } 139 | } 140 | """ 141 | 142 | let expected = """ 143 | struct User { 144 | let id: String 145 | let name: String 146 | 147 | init(id: String, name: String) { 148 | self.id = id 149 | self.name = name 150 | } 151 | } 152 | """ 153 | 154 | let result = cleaner.clean(content: input) 155 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines), 156 | expected.trimmingCharacters(in: .whitespacesAndNewlines)) 157 | } 158 | 159 | // Test 5: Import conflicts 160 | func testImportConflicts() { 161 | let input = """ 162 | <<<<<<< HEAD 163 | import Foundation 164 | import UIKit 165 | import CoreData 166 | ======= 167 | import Foundation 168 | import SwiftUI 169 | import Combine 170 | >>>>>>> feature/swiftui-migration 171 | 172 | class ViewController { 173 | func viewDidLoad() { 174 | setupUI() 175 | } 176 | } 177 | """ 178 | 179 | let expected = """ 180 | 181 | class ViewController { 182 | func viewDidLoad() { 183 | setupUI() 184 | } 185 | } 186 | """ 187 | 188 | let result = cleaner.clean(content: input) 189 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines), 190 | expected.trimmingCharacters(in: .whitespacesAndNewlines)) 191 | } 192 | 193 | // Test 7: No conflicts (should return original) 194 | func testNoConflicts() { 195 | let input = """ 196 | func simpleFunction() { 197 | print("Hello, World!") 198 | return "Success" 199 | } 200 | 201 | class SimpleClass { 202 | var property: String = "value" 203 | 204 | func method() { 205 | // This is a comment 206 | doSomething() 207 | } 208 | } 209 | """ 210 | 211 | let result = cleaner.clean(content: input) 212 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines), 213 | input.trimmingCharacters(in: .whitespacesAndNewlines)) 214 | } 215 | 216 | 217 | // Test 9: Only conflict markers (edge case) 218 | func testOnlyConflictMarkers() { 219 | let input = """ 220 | <<<<<<< HEAD 221 | ======= 222 | >>>>>>> feature/test 223 | """ 224 | 225 | let expected = "" 226 | let result = cleaner.clean(content: input) 227 | XCTAssertEqual(result.trimmingCharacters(in: .whitespacesAndNewlines), expected) 228 | } 229 | 230 | // Test 10: Performance test with large content 231 | func testPerformanceWithLargeContent() { 232 | var largeInput = "" 233 | for i in 0..<1000 { 234 | largeInput += """ 235 | func function\(i)() { 236 | print("Function \(i)") 237 | <<<<<<< HEAD 238 | return "version1" 239 | ======= 240 | return "version2" 241 | >>>>>>> feature/branch\(i) 242 | } 243 | 244 | """ 245 | } 246 | 247 | measure { 248 | _ = cleaner.clean(content: largeInput) 249 | } 250 | } 251 | } 252 | 253 | // MARK: - Test Data Generator 254 | extension MergeConflictCleanerTests { 255 | 256 | /// Generates a test merge conflict for manual testing 257 | static func generateTestConflict() -> String { 258 | return """ 259 | // Test all scenarios with this comprehensive example 260 | import Foundation 261 | 262 | <<<<<<< HEAD 263 | import UIKit 264 | import CoreData 265 | ======= 266 | import SwiftUI 267 | import Combine 268 | >>>>>>> feature/swiftui 269 | 270 | class DataManager { 271 | 272 | <<<<<<< HEAD 273 | var storage: [String: Any] = [:] 274 | 275 | func save(key: String, value: Any) { 276 | storage[key] = value 277 | print("Saved to memory") 278 | } 279 | ======= 280 | var database: CoreDataStack = CoreDataStack() 281 | 282 | func save(key: String, value: Any) { 283 | database.save(key: key, value: value) 284 | print("Saved to database") 285 | } 286 | >>>>>>> feature/persistence 287 | 288 | func load(key: String) -> Any? { 289 | <<<<<<< HEAD 290 | return storage[key] 291 | ======= 292 | return database.load(key: key) 293 | >>>>>>> feature/persistence 294 | } 295 | } 296 | """ 297 | } 298 | } 299 | -------------------------------------------------------------------------------- /Cleaner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 77; 7 | objects = { 8 | 9 | /* Begin PBXContainerItemProxy section */ 10 | D04847F12E19BE1D00B269AF /* PBXContainerItemProxy */ = { 11 | isa = PBXContainerItemProxy; 12 | containerPortal = D04847D72E19BE1B00B269AF /* Project object */; 13 | proxyType = 1; 14 | remoteGlobalIDString = D04847DE2E19BE1B00B269AF; 15 | remoteInfo = Cleaner; 16 | }; 17 | D04847FB2E19BE1D00B269AF /* PBXContainerItemProxy */ = { 18 | isa = PBXContainerItemProxy; 19 | containerPortal = D04847D72E19BE1B00B269AF /* Project object */; 20 | proxyType = 1; 21 | remoteGlobalIDString = D04847DE2E19BE1B00B269AF; 22 | remoteInfo = Cleaner; 23 | }; 24 | /* End PBXContainerItemProxy section */ 25 | 26 | /* Begin PBXFileReference section */ 27 | D04847DF2E19BE1B00B269AF /* Cleaner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Cleaner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | D04847F02E19BE1D00B269AF /* CleanerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CleanerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 29 | D04847FA2E19BE1D00B269AF /* CleanerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CleanerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | /* End PBXFileReference section */ 31 | 32 | /* Begin PBXFileSystemSynchronizedRootGroup section */ 33 | D04847E12E19BE1B00B269AF /* Cleaner */ = { 34 | isa = PBXFileSystemSynchronizedRootGroup; 35 | path = Cleaner; 36 | sourceTree = ""; 37 | }; 38 | D04847F32E19BE1D00B269AF /* CleanerTests */ = { 39 | isa = PBXFileSystemSynchronizedRootGroup; 40 | path = CleanerTests; 41 | sourceTree = ""; 42 | }; 43 | D04847FD2E19BE1D00B269AF /* CleanerUITests */ = { 44 | isa = PBXFileSystemSynchronizedRootGroup; 45 | path = CleanerUITests; 46 | sourceTree = ""; 47 | }; 48 | /* End PBXFileSystemSynchronizedRootGroup section */ 49 | 50 | /* Begin PBXFrameworksBuildPhase section */ 51 | D04847DC2E19BE1B00B269AF /* Frameworks */ = { 52 | isa = PBXFrameworksBuildPhase; 53 | buildActionMask = 2147483647; 54 | files = ( 55 | ); 56 | runOnlyForDeploymentPostprocessing = 0; 57 | }; 58 | D04847ED2E19BE1D00B269AF /* Frameworks */ = { 59 | isa = PBXFrameworksBuildPhase; 60 | buildActionMask = 2147483647; 61 | files = ( 62 | ); 63 | runOnlyForDeploymentPostprocessing = 0; 64 | }; 65 | D04847F72E19BE1D00B269AF /* Frameworks */ = { 66 | isa = PBXFrameworksBuildPhase; 67 | buildActionMask = 2147483647; 68 | files = ( 69 | ); 70 | runOnlyForDeploymentPostprocessing = 0; 71 | }; 72 | /* End PBXFrameworksBuildPhase section */ 73 | 74 | /* Begin PBXGroup section */ 75 | D04847D62E19BE1B00B269AF = { 76 | isa = PBXGroup; 77 | children = ( 78 | D04847E12E19BE1B00B269AF /* Cleaner */, 79 | D04847F32E19BE1D00B269AF /* CleanerTests */, 80 | D04847FD2E19BE1D00B269AF /* CleanerUITests */, 81 | D04847E02E19BE1B00B269AF /* Products */, 82 | ); 83 | sourceTree = ""; 84 | }; 85 | D04847E02E19BE1B00B269AF /* Products */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | D04847DF2E19BE1B00B269AF /* Cleaner.app */, 89 | D04847F02E19BE1D00B269AF /* CleanerTests.xctest */, 90 | D04847FA2E19BE1D00B269AF /* CleanerUITests.xctest */, 91 | ); 92 | name = Products; 93 | sourceTree = ""; 94 | }; 95 | /* End PBXGroup section */ 96 | 97 | /* Begin PBXNativeTarget section */ 98 | D04847DE2E19BE1B00B269AF /* Cleaner */ = { 99 | isa = PBXNativeTarget; 100 | buildConfigurationList = D04848042E19BE1E00B269AF /* Build configuration list for PBXNativeTarget "Cleaner" */; 101 | buildPhases = ( 102 | D04847DB2E19BE1B00B269AF /* Sources */, 103 | D04847DC2E19BE1B00B269AF /* Frameworks */, 104 | D04847DD2E19BE1B00B269AF /* Resources */, 105 | ); 106 | buildRules = ( 107 | ); 108 | dependencies = ( 109 | ); 110 | fileSystemSynchronizedGroups = ( 111 | D04847E12E19BE1B00B269AF /* Cleaner */, 112 | ); 113 | name = Cleaner; 114 | packageProductDependencies = ( 115 | ); 116 | productName = Cleaner; 117 | productReference = D04847DF2E19BE1B00B269AF /* Cleaner.app */; 118 | productType = "com.apple.product-type.application"; 119 | }; 120 | D04847EF2E19BE1D00B269AF /* CleanerTests */ = { 121 | isa = PBXNativeTarget; 122 | buildConfigurationList = D04848072E19BE1E00B269AF /* Build configuration list for PBXNativeTarget "CleanerTests" */; 123 | buildPhases = ( 124 | D04847EC2E19BE1D00B269AF /* Sources */, 125 | D04847ED2E19BE1D00B269AF /* Frameworks */, 126 | D04847EE2E19BE1D00B269AF /* Resources */, 127 | ); 128 | buildRules = ( 129 | ); 130 | dependencies = ( 131 | D04847F22E19BE1D00B269AF /* PBXTargetDependency */, 132 | ); 133 | fileSystemSynchronizedGroups = ( 134 | D04847F32E19BE1D00B269AF /* CleanerTests */, 135 | ); 136 | name = CleanerTests; 137 | packageProductDependencies = ( 138 | ); 139 | productName = CleanerTests; 140 | productReference = D04847F02E19BE1D00B269AF /* CleanerTests.xctest */; 141 | productType = "com.apple.product-type.bundle.unit-test"; 142 | }; 143 | D04847F92E19BE1D00B269AF /* CleanerUITests */ = { 144 | isa = PBXNativeTarget; 145 | buildConfigurationList = D048480A2E19BE1E00B269AF /* Build configuration list for PBXNativeTarget "CleanerUITests" */; 146 | buildPhases = ( 147 | D04847F62E19BE1D00B269AF /* Sources */, 148 | D04847F72E19BE1D00B269AF /* Frameworks */, 149 | D04847F82E19BE1D00B269AF /* Resources */, 150 | ); 151 | buildRules = ( 152 | ); 153 | dependencies = ( 154 | D04847FC2E19BE1D00B269AF /* PBXTargetDependency */, 155 | ); 156 | fileSystemSynchronizedGroups = ( 157 | D04847FD2E19BE1D00B269AF /* CleanerUITests */, 158 | ); 159 | name = CleanerUITests; 160 | packageProductDependencies = ( 161 | ); 162 | productName = CleanerUITests; 163 | productReference = D04847FA2E19BE1D00B269AF /* CleanerUITests.xctest */; 164 | productType = "com.apple.product-type.bundle.ui-testing"; 165 | }; 166 | /* End PBXNativeTarget section */ 167 | 168 | /* Begin PBXProject section */ 169 | D04847D72E19BE1B00B269AF /* Project object */ = { 170 | isa = PBXProject; 171 | attributes = { 172 | BuildIndependentTargetsInParallel = 1; 173 | LastSwiftUpdateCheck = 1620; 174 | LastUpgradeCheck = 1620; 175 | TargetAttributes = { 176 | D04847DE2E19BE1B00B269AF = { 177 | CreatedOnToolsVersion = 16.2; 178 | }; 179 | D04847EF2E19BE1D00B269AF = { 180 | CreatedOnToolsVersion = 16.2; 181 | TestTargetID = D04847DE2E19BE1B00B269AF; 182 | }; 183 | D04847F92E19BE1D00B269AF = { 184 | CreatedOnToolsVersion = 16.2; 185 | TestTargetID = D04847DE2E19BE1B00B269AF; 186 | }; 187 | }; 188 | }; 189 | buildConfigurationList = D04847DA2E19BE1B00B269AF /* Build configuration list for PBXProject "Cleaner" */; 190 | developmentRegion = en; 191 | hasScannedForEncodings = 0; 192 | knownRegions = ( 193 | en, 194 | Base, 195 | ); 196 | mainGroup = D04847D62E19BE1B00B269AF; 197 | minimizedProjectReferenceProxies = 1; 198 | preferredProjectObjectVersion = 77; 199 | productRefGroup = D04847E02E19BE1B00B269AF /* Products */; 200 | projectDirPath = ""; 201 | projectRoot = ""; 202 | targets = ( 203 | D04847DE2E19BE1B00B269AF /* Cleaner */, 204 | D04847EF2E19BE1D00B269AF /* CleanerTests */, 205 | D04847F92E19BE1D00B269AF /* CleanerUITests */, 206 | ); 207 | }; 208 | /* End PBXProject section */ 209 | 210 | /* Begin PBXResourcesBuildPhase section */ 211 | D04847DD2E19BE1B00B269AF /* Resources */ = { 212 | isa = PBXResourcesBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | D04847EE2E19BE1D00B269AF /* Resources */ = { 219 | isa = PBXResourcesBuildPhase; 220 | buildActionMask = 2147483647; 221 | files = ( 222 | ); 223 | runOnlyForDeploymentPostprocessing = 0; 224 | }; 225 | D04847F82E19BE1D00B269AF /* Resources */ = { 226 | isa = PBXResourcesBuildPhase; 227 | buildActionMask = 2147483647; 228 | files = ( 229 | ); 230 | runOnlyForDeploymentPostprocessing = 0; 231 | }; 232 | /* End PBXResourcesBuildPhase section */ 233 | 234 | /* Begin PBXSourcesBuildPhase section */ 235 | D04847DB2E19BE1B00B269AF /* Sources */ = { 236 | isa = PBXSourcesBuildPhase; 237 | buildActionMask = 2147483647; 238 | files = ( 239 | ); 240 | runOnlyForDeploymentPostprocessing = 0; 241 | }; 242 | D04847EC2E19BE1D00B269AF /* Sources */ = { 243 | isa = PBXSourcesBuildPhase; 244 | buildActionMask = 2147483647; 245 | files = ( 246 | ); 247 | runOnlyForDeploymentPostprocessing = 0; 248 | }; 249 | D04847F62E19BE1D00B269AF /* Sources */ = { 250 | isa = PBXSourcesBuildPhase; 251 | buildActionMask = 2147483647; 252 | files = ( 253 | ); 254 | runOnlyForDeploymentPostprocessing = 0; 255 | }; 256 | /* End PBXSourcesBuildPhase section */ 257 | 258 | /* Begin PBXTargetDependency section */ 259 | D04847F22E19BE1D00B269AF /* PBXTargetDependency */ = { 260 | isa = PBXTargetDependency; 261 | target = D04847DE2E19BE1B00B269AF /* Cleaner */; 262 | targetProxy = D04847F12E19BE1D00B269AF /* PBXContainerItemProxy */; 263 | }; 264 | D04847FC2E19BE1D00B269AF /* PBXTargetDependency */ = { 265 | isa = PBXTargetDependency; 266 | target = D04847DE2E19BE1B00B269AF /* Cleaner */; 267 | targetProxy = D04847FB2E19BE1D00B269AF /* PBXContainerItemProxy */; 268 | }; 269 | /* End PBXTargetDependency section */ 270 | 271 | /* Begin XCBuildConfiguration section */ 272 | D04848022E19BE1E00B269AF /* Debug */ = { 273 | isa = XCBuildConfiguration; 274 | buildSettings = { 275 | ALWAYS_SEARCH_USER_PATHS = NO; 276 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 277 | CLANG_ANALYZER_NONNULL = YES; 278 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 279 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 280 | CLANG_ENABLE_MODULES = YES; 281 | CLANG_ENABLE_OBJC_ARC = YES; 282 | CLANG_ENABLE_OBJC_WEAK = YES; 283 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 284 | CLANG_WARN_BOOL_CONVERSION = YES; 285 | CLANG_WARN_COMMA = YES; 286 | CLANG_WARN_CONSTANT_CONVERSION = YES; 287 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 288 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 289 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 290 | CLANG_WARN_EMPTY_BODY = YES; 291 | CLANG_WARN_ENUM_CONVERSION = YES; 292 | CLANG_WARN_INFINITE_RECURSION = YES; 293 | CLANG_WARN_INT_CONVERSION = YES; 294 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 295 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 296 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 297 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 298 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 299 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 300 | CLANG_WARN_STRICT_PROTOTYPES = YES; 301 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 302 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 303 | CLANG_WARN_UNREACHABLE_CODE = YES; 304 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 305 | COPY_PHASE_STRIP = NO; 306 | DEBUG_INFORMATION_FORMAT = dwarf; 307 | ENABLE_STRICT_OBJC_MSGSEND = YES; 308 | ENABLE_TESTABILITY = YES; 309 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 310 | GCC_C_LANGUAGE_STANDARD = gnu17; 311 | GCC_DYNAMIC_NO_PIC = NO; 312 | GCC_NO_COMMON_BLOCKS = YES; 313 | GCC_OPTIMIZATION_LEVEL = 0; 314 | GCC_PREPROCESSOR_DEFINITIONS = ( 315 | "DEBUG=1", 316 | "$(inherited)", 317 | ); 318 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 319 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 320 | GCC_WARN_UNDECLARED_SELECTOR = YES; 321 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 322 | GCC_WARN_UNUSED_FUNCTION = YES; 323 | GCC_WARN_UNUSED_VARIABLE = YES; 324 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 325 | MACOSX_DEPLOYMENT_TARGET = 15.2; 326 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 327 | MTL_FAST_MATH = YES; 328 | ONLY_ACTIVE_ARCH = YES; 329 | SDKROOT = macosx; 330 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; 331 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 332 | }; 333 | name = Debug; 334 | }; 335 | D04848032E19BE1E00B269AF /* Release */ = { 336 | isa = XCBuildConfiguration; 337 | buildSettings = { 338 | ALWAYS_SEARCH_USER_PATHS = NO; 339 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 340 | CLANG_ANALYZER_NONNULL = YES; 341 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 342 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 343 | CLANG_ENABLE_MODULES = YES; 344 | CLANG_ENABLE_OBJC_ARC = YES; 345 | CLANG_ENABLE_OBJC_WEAK = YES; 346 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 347 | CLANG_WARN_BOOL_CONVERSION = YES; 348 | CLANG_WARN_COMMA = YES; 349 | CLANG_WARN_CONSTANT_CONVERSION = YES; 350 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 351 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 352 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 353 | CLANG_WARN_EMPTY_BODY = YES; 354 | CLANG_WARN_ENUM_CONVERSION = YES; 355 | CLANG_WARN_INFINITE_RECURSION = YES; 356 | CLANG_WARN_INT_CONVERSION = YES; 357 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 358 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 359 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 360 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 361 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 362 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 363 | CLANG_WARN_STRICT_PROTOTYPES = YES; 364 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 365 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 366 | CLANG_WARN_UNREACHABLE_CODE = YES; 367 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 368 | COPY_PHASE_STRIP = NO; 369 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 370 | ENABLE_NS_ASSERTIONS = NO; 371 | ENABLE_STRICT_OBJC_MSGSEND = YES; 372 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 373 | GCC_C_LANGUAGE_STANDARD = gnu17; 374 | GCC_NO_COMMON_BLOCKS = YES; 375 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 376 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 377 | GCC_WARN_UNDECLARED_SELECTOR = YES; 378 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 379 | GCC_WARN_UNUSED_FUNCTION = YES; 380 | GCC_WARN_UNUSED_VARIABLE = YES; 381 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 382 | MACOSX_DEPLOYMENT_TARGET = 15.2; 383 | MTL_ENABLE_DEBUG_INFO = NO; 384 | MTL_FAST_MATH = YES; 385 | SDKROOT = macosx; 386 | SWIFT_COMPILATION_MODE = wholemodule; 387 | }; 388 | name = Release; 389 | }; 390 | D04848052E19BE1E00B269AF /* Debug */ = { 391 | isa = XCBuildConfiguration; 392 | buildSettings = { 393 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 394 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 395 | CODE_SIGN_ENTITLEMENTS = Cleaner/Cleaner.entitlements; 396 | CODE_SIGN_STYLE = Automatic; 397 | COMBINE_HIDPI_IMAGES = YES; 398 | CURRENT_PROJECT_VERSION = 1; 399 | DEVELOPMENT_ASSET_PATHS = "\"Cleaner/Preview Content\""; 400 | ENABLE_PREVIEWS = YES; 401 | GENERATE_INFOPLIST_FILE = YES; 402 | INFOPLIST_KEY_NSDesktopFolderUsageDescription = "This app needs access to files you select to clean merge conflicts"; 403 | INFOPLIST_KEY_NSDocumentsFolderUsageDescription = "This app needs access to files you select to clean merge conflicts"; 404 | INFOPLIST_KEY_NSDownloadsFolderUsageDescription = "This app needs access to files you select to clean merge conflicts"; 405 | LD_RUNPATH_SEARCH_PATHS = ( 406 | "$(inherited)", 407 | "@executable_path/../Frameworks", 408 | ); 409 | MARKETING_VERSION = 1.0; 410 | PRODUCT_BUNDLE_IDENTIFIER = Best.com.Cleaner; 411 | PRODUCT_NAME = "$(TARGET_NAME)"; 412 | SWIFT_EMIT_LOC_STRINGS = YES; 413 | SWIFT_VERSION = 5.0; 414 | }; 415 | name = Debug; 416 | }; 417 | D04848062E19BE1E00B269AF /* Release */ = { 418 | isa = XCBuildConfiguration; 419 | buildSettings = { 420 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 421 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 422 | CODE_SIGN_ENTITLEMENTS = Cleaner/Cleaner.entitlements; 423 | CODE_SIGN_STYLE = Automatic; 424 | COMBINE_HIDPI_IMAGES = YES; 425 | CURRENT_PROJECT_VERSION = 1; 426 | DEVELOPMENT_ASSET_PATHS = "\"Cleaner/Preview Content\""; 427 | ENABLE_PREVIEWS = YES; 428 | GENERATE_INFOPLIST_FILE = YES; 429 | INFOPLIST_KEY_NSDesktopFolderUsageDescription = "This app needs access to files you select to clean merge conflicts"; 430 | INFOPLIST_KEY_NSDocumentsFolderUsageDescription = "This app needs access to files you select to clean merge conflicts"; 431 | INFOPLIST_KEY_NSDownloadsFolderUsageDescription = "This app needs access to files you select to clean merge conflicts"; 432 | LD_RUNPATH_SEARCH_PATHS = ( 433 | "$(inherited)", 434 | "@executable_path/../Frameworks", 435 | ); 436 | MARKETING_VERSION = 1.0; 437 | PRODUCT_BUNDLE_IDENTIFIER = Best.com.Cleaner; 438 | PRODUCT_NAME = "$(TARGET_NAME)"; 439 | SWIFT_EMIT_LOC_STRINGS = YES; 440 | SWIFT_VERSION = 5.0; 441 | }; 442 | name = Release; 443 | }; 444 | D04848082E19BE1E00B269AF /* Debug */ = { 445 | isa = XCBuildConfiguration; 446 | buildSettings = { 447 | BUNDLE_LOADER = "$(TEST_HOST)"; 448 | CODE_SIGN_STYLE = Automatic; 449 | CURRENT_PROJECT_VERSION = 1; 450 | GENERATE_INFOPLIST_FILE = YES; 451 | MACOSX_DEPLOYMENT_TARGET = 15.2; 452 | MARKETING_VERSION = 1.0; 453 | PRODUCT_BUNDLE_IDENTIFIER = Best.com.CleanerTests; 454 | PRODUCT_NAME = "$(TARGET_NAME)"; 455 | SWIFT_EMIT_LOC_STRINGS = NO; 456 | SWIFT_VERSION = 5.0; 457 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Cleaner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Cleaner"; 458 | }; 459 | name = Debug; 460 | }; 461 | D04848092E19BE1E00B269AF /* Release */ = { 462 | isa = XCBuildConfiguration; 463 | buildSettings = { 464 | BUNDLE_LOADER = "$(TEST_HOST)"; 465 | CODE_SIGN_STYLE = Automatic; 466 | CURRENT_PROJECT_VERSION = 1; 467 | GENERATE_INFOPLIST_FILE = YES; 468 | MACOSX_DEPLOYMENT_TARGET = 15.2; 469 | MARKETING_VERSION = 1.0; 470 | PRODUCT_BUNDLE_IDENTIFIER = Best.com.CleanerTests; 471 | PRODUCT_NAME = "$(TARGET_NAME)"; 472 | SWIFT_EMIT_LOC_STRINGS = NO; 473 | SWIFT_VERSION = 5.0; 474 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Cleaner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Cleaner"; 475 | }; 476 | name = Release; 477 | }; 478 | D048480B2E19BE1E00B269AF /* Debug */ = { 479 | isa = XCBuildConfiguration; 480 | buildSettings = { 481 | CODE_SIGN_STYLE = Automatic; 482 | CURRENT_PROJECT_VERSION = 1; 483 | GENERATE_INFOPLIST_FILE = YES; 484 | MARKETING_VERSION = 1.0; 485 | PRODUCT_BUNDLE_IDENTIFIER = Best.com.CleanerUITests; 486 | PRODUCT_NAME = "$(TARGET_NAME)"; 487 | SWIFT_EMIT_LOC_STRINGS = NO; 488 | SWIFT_VERSION = 5.0; 489 | TEST_TARGET_NAME = Cleaner; 490 | }; 491 | name = Debug; 492 | }; 493 | D048480C2E19BE1E00B269AF /* Release */ = { 494 | isa = XCBuildConfiguration; 495 | buildSettings = { 496 | CODE_SIGN_STYLE = Automatic; 497 | CURRENT_PROJECT_VERSION = 1; 498 | GENERATE_INFOPLIST_FILE = YES; 499 | MARKETING_VERSION = 1.0; 500 | PRODUCT_BUNDLE_IDENTIFIER = Best.com.CleanerUITests; 501 | PRODUCT_NAME = "$(TARGET_NAME)"; 502 | SWIFT_EMIT_LOC_STRINGS = NO; 503 | SWIFT_VERSION = 5.0; 504 | TEST_TARGET_NAME = Cleaner; 505 | }; 506 | name = Release; 507 | }; 508 | /* End XCBuildConfiguration section */ 509 | 510 | /* Begin XCConfigurationList section */ 511 | D04847DA2E19BE1B00B269AF /* Build configuration list for PBXProject "Cleaner" */ = { 512 | isa = XCConfigurationList; 513 | buildConfigurations = ( 514 | D04848022E19BE1E00B269AF /* Debug */, 515 | D04848032E19BE1E00B269AF /* Release */, 516 | ); 517 | defaultConfigurationIsVisible = 0; 518 | defaultConfigurationName = Release; 519 | }; 520 | D04848042E19BE1E00B269AF /* Build configuration list for PBXNativeTarget "Cleaner" */ = { 521 | isa = XCConfigurationList; 522 | buildConfigurations = ( 523 | D04848052E19BE1E00B269AF /* Debug */, 524 | D04848062E19BE1E00B269AF /* Release */, 525 | ); 526 | defaultConfigurationIsVisible = 0; 527 | defaultConfigurationName = Release; 528 | }; 529 | D04848072E19BE1E00B269AF /* Build configuration list for PBXNativeTarget "CleanerTests" */ = { 530 | isa = XCConfigurationList; 531 | buildConfigurations = ( 532 | D04848082E19BE1E00B269AF /* Debug */, 533 | D04848092E19BE1E00B269AF /* Release */, 534 | ); 535 | defaultConfigurationIsVisible = 0; 536 | defaultConfigurationName = Release; 537 | }; 538 | D048480A2E19BE1E00B269AF /* Build configuration list for PBXNativeTarget "CleanerUITests" */ = { 539 | isa = XCConfigurationList; 540 | buildConfigurations = ( 541 | D048480B2E19BE1E00B269AF /* Debug */, 542 | D048480C2E19BE1E00B269AF /* Release */, 543 | ); 544 | defaultConfigurationIsVisible = 0; 545 | defaultConfigurationName = Release; 546 | }; 547 | /* End XCConfigurationList section */ 548 | }; 549 | rootObject = D04847D72E19BE1B00B269AF /* Project object */; 550 | } 551 | --------------------------------------------------------------------------------