From eb0c5ce77355e1df1b3c4c0c8baf693495a382cf Mon Sep 17 00:00:00 2001 From: Dan Loewenherz Date: Wed, 25 Dec 2024 11:22:12 -0600 Subject: [PATCH] swift concurrency --- .../AppDelegate.swift | 2 +- .../DragTargetView.swift | 1 + .../ViewController.swift | 295 +++++++++--------- XML Splitter.xcodeproj/project.pbxproj | 10 +- .../UserInterfaceState.xcuserstate | Bin 84665 -> 97817 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 12 +- XML Splitter/Parser.swift | 93 +++--- 7 files changed, 217 insertions(+), 196 deletions(-) diff --git a/Health Data Importer XML Splitter/AppDelegate.swift b/Health Data Importer XML Splitter/AppDelegate.swift index ac2c996..af53382 100644 --- a/Health Data Importer XML Splitter/AppDelegate.swift +++ b/Health Data Importer XML Splitter/AppDelegate.swift @@ -8,7 +8,7 @@ import Cocoa -@NSApplicationMain +@main class AppDelegate: NSObject, NSApplicationDelegate { func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true diff --git a/Health Data Importer XML Splitter/DragTargetView.swift b/Health Data Importer XML Splitter/DragTargetView.swift index e636227..28a4524 100644 --- a/Health Data Importer XML Splitter/DragTargetView.swift +++ b/Health Data Importer XML Splitter/DragTargetView.swift @@ -90,6 +90,7 @@ class DragTargetView: NSView { } extension NSDraggingInfo { + @MainActor var draggedFileURL: URL? { guard let data = draggingPasteboard.data(forType: .fileURL), let string = String(data: data, encoding: .utf8), diff --git a/Health Data Importer XML Splitter/ViewController.swift b/Health Data Importer XML Splitter/ViewController.swift index 0446af3..0cd0fd7 100644 --- a/Health Data Importer XML Splitter/ViewController.swift +++ b/Health Data Importer XML Splitter/ViewController.swift @@ -33,89 +33,88 @@ final class ViewController: NSViewController, NSDraggingDestination { var fileName: String? var directoryPath: String? + var blah: Status = .waiting + + func changeStatus(to newStatus: Status) { + let oldStatus = blah + blah = newStatus + switch newStatus { + case .waiting: + self.inboxImageView.isHidden = false + self.progressIndicator.isHidden = true + self.horizontalProgressIndicator.isHidden = true + self.imageView.isHidden = false + self.label.isHidden = true + self.mainLabel.isHidden = false + self.inboxImageView.image = NSImage(named: "Inbox Light") + self.view.layer?.backgroundColor = NSColor.clear.cgColor + self.mainLabel.stringValue = "Drop Health Export Here" + + case .dragging(let valid): + self.inboxImageView.isHidden = false + self.progressIndicator.isHidden = true + self.horizontalProgressIndicator.isHidden = true + self.imageView.isHidden = false + self.label.isHidden = true + self.mainLabel.isHidden = false - var status = Status.waiting { - didSet { - DispatchQueue.main.async { - switch self.status { - case .waiting: - self.inboxImageView.isHidden = false - self.progressIndicator.isHidden = true - self.horizontalProgressIndicator.isHidden = true - self.imageView.isHidden = false - self.label.isHidden = true - self.mainLabel.isHidden = false - self.inboxImageView.image = NSImage(named: "Inbox Light") - self.view.layer?.backgroundColor = NSColor.clear.cgColor - self.mainLabel.stringValue = "Drop Health Export Here" - - case .dragging(let valid): - self.inboxImageView.isHidden = false - self.progressIndicator.isHidden = true - self.horizontalProgressIndicator.isHidden = true - self.imageView.isHidden = false - self.label.isHidden = true - self.mainLabel.isHidden = false - - if valid { - self.mainLabel.stringValue = "Drop it!" - - self.inboxImageView.image = NSImage(named: "Inbox") - self.imageView.isHidden = false - self.view.layer?.backgroundColor = NSColor.white.cgColor - } else { - self.mainLabel.stringValue = "Please provide a export.xml or export.zip file to continue." - - self.inboxImageView.image = NSImage(named: "Warning") - self.imageView.isHidden = true - let color = NSColor(calibratedRed: 1, green: 0, blue: 0, alpha: 0.2) - self.view.layer?.backgroundColor = color.cgColor - } - - case .unzipping: - self.inboxImageView.isHidden = true - self.progressIndicator.isHidden = false - self.progressIndicator.startAnimation(nil) - self.imageView.isHidden = true - self.label.stringValue = "Unzipping..." - self.label.isHidden = false - self.mainLabel.isHidden = true - - case .splitting(let chunk, let current, let maximum): - if self.status != oldValue { - self.inboxImageView.isHidden = true - self.progressIndicator.isHidden = true - self.horizontalProgressIndicator.isHidden = false - self.horizontalProgressIndicator.startAnimation(nil) - self.label.stringValue = "Splitting chunk \(chunk + 1)..." - self.label.isHidden = false - self.mainLabel.isHidden = true - self.horizontalProgressIndicator.isIndeterminate = false - } else { - self.horizontalProgressIndicator.maxValue = Double(maximum) - self.horizontalProgressIndicator.doubleValue = Double(current) - } + if valid { + self.mainLabel.stringValue = "Drop it!" + + self.inboxImageView.image = NSImage(named: "Inbox") + self.imageView.isHidden = false + self.view.layer?.backgroundColor = NSColor.white.cgColor + } else { + self.mainLabel.stringValue = "Please provide a export.xml or export.zip file to continue." - case .saving(let current): - self.inboxImageView.isHidden = true - self.progressIndicator.isHidden = true - self.horizontalProgressIndicator.isHidden = false - self.horizontalProgressIndicator.startAnimation(nil) - self.label.stringValue = "Saving chunk \(current + 1)..." - self.label.isHidden = false - self.mainLabel.isHidden = true - self.horizontalProgressIndicator.isIndeterminate = true - - case .complete: - self.inboxImageView.isHidden = false - self.progressIndicator.isHidden = true - self.horizontalProgressIndicator.isHidden = true - self.imageView.isHidden = false - self.label.isHidden = true - self.mainLabel.isHidden = false - self.label.stringValue = "All Done!" - } + self.inboxImageView.image = NSImage(named: "Warning") + self.imageView.isHidden = true + let color = NSColor(calibratedRed: 1, green: 0, blue: 0, alpha: 0.2) + self.view.layer?.backgroundColor = color.cgColor + } + + case .unzipping: + self.inboxImageView.isHidden = true + self.progressIndicator.isHidden = false + self.progressIndicator.startAnimation(nil) + self.imageView.isHidden = true + self.label.stringValue = "Unzipping..." + self.label.isHidden = false + self.mainLabel.isHidden = true + + case .splitting(let chunk, let current, let maximum): + if newStatus != oldStatus { + self.inboxImageView.isHidden = true + self.progressIndicator.isHidden = true + self.horizontalProgressIndicator.isHidden = false + self.horizontalProgressIndicator.startAnimation(nil) + self.label.stringValue = "Splitting chunk \(chunk + 1)..." + self.label.isHidden = false + self.mainLabel.isHidden = true + self.horizontalProgressIndicator.isIndeterminate = false + } else { + self.horizontalProgressIndicator.maxValue = Double(maximum) + self.horizontalProgressIndicator.doubleValue = Double(current) } + + case .saving(let current): + self.inboxImageView.isHidden = true + self.progressIndicator.isHidden = true + self.horizontalProgressIndicator.isHidden = false + self.horizontalProgressIndicator.startAnimation(nil) + self.label.stringValue = "Saving chunk \(current + 1)..." + self.label.isHidden = false + self.mainLabel.isHidden = true + self.horizontalProgressIndicator.isIndeterminate = true + + case .complete: + self.inboxImageView.isHidden = false + self.progressIndicator.isHidden = true + self.horizontalProgressIndicator.isHidden = true + self.imageView.isHidden = false + self.label.isHidden = true + self.mainLabel.isHidden = false + self.label.stringValue = "All Done!" } } @@ -139,10 +138,12 @@ final class ViewController: NSViewController, NSDraggingDestination { alert.messageText = "Please provide a valid Health.app XML export in either ZIP or XML format to use this utility." alert.alertStyle = .informational - if let window = view.window { - alert.beginSheetModal(for: window) { response in - self.status = .waiting - } + guard let window = view.window else { + return + } + + alert.beginSheetModal(for: window) { response in + self.changeStatus(to: .waiting) } } @@ -176,25 +177,25 @@ final class ViewController: NSViewController, NSDraggingDestination { } } -extension ViewController: DragViewDelegate { +extension ViewController: @preconcurrency DragViewDelegate { func dragDidStart() { - status = .dragging(valid: true) + changeStatus(to: .dragging(valid: true)) } func dragDidEnd() { - status = .waiting + changeStatus(to: .waiting) } func invalidFileTypeDragged() { - status = .dragging(valid: false) + changeStatus(to: .dragging(valid: false)) } func invalidFileTypeDropped() { - status = .waiting + changeStatus(to: .waiting) } var busy: Bool { - return ![Status.waiting, Status.complete].contains(status) + return ![Status.waiting, Status.complete].contains(blah) } func dragView(didDragFileWith url: URL) { @@ -203,7 +204,7 @@ extension ViewController: DragViewDelegate { func processZipFile(url: URL) { fileName = url.lastPathComponent - status = .unzipping + changeStatus(to: .unzipping) let zip = url.path @@ -248,21 +249,24 @@ extension ViewController: DragViewDelegate { } guard let item = exportItem else { - self.status = .waiting - DispatchQueue.main.async { + Task { @MainActor in + self.changeStatus(to: .waiting) self.displayInvalidFileTypeAlert() } return } - - self.processXMLDocument(url: item) + + Task { @MainActor in + self.processXMLDocument(url: item) + } } } } + @MainActor func processXMLDocument(url: URL) { - DispatchQueue.global(qos: .default).async { + Task { @MainActor in let parser = Parser(filename: url.path) parser.delegate = self parser.start() @@ -308,76 +312,79 @@ extension ViewController: DragViewDelegate { extension ViewController: ParserDelegate { func savingChunk(part: Int) { - status = .saving(part) + changeStatus(to: .saving(part)) } - + func parsingFailed(error: Error) { - status = .waiting + changeStatus(to: .waiting) print(error) } func chunkUpdate(part: Int, current: Int, total: Int) { - status = .splitting(part, current, total) + changeStatus(to: .splitting(part, current, total)) } func parsingStarted() { - status = .splitting(0, 0, 1) + changeStatus(to: .splitting(0, 0, 1)) } - func parsingDidComplete() { - status = .complete - print("ended") + nonisolated func parsingDidComplete() { + Task { @MainActor in + changeStatus(to: .complete) - guard let directory = directoryPath, - let scriptUrl = Bundle.main.url(forResource: "zipItUp", withExtension: "sh") else { - return - } - - let directoryUrl = URL(fileURLWithPath: directory) - let newFileUrl = directoryUrl.appendingPathComponent("zipItUp.sh") - - try? FileManager.default.removeItem(at: newFileUrl) - try? FileManager.default.copyItem(at: scriptUrl, to: newFileUrl) - - do { - let process = Process() - process.executableURL = URL(fileURLWithPath: "/bin/bash") - process.arguments = [newFileUrl.path] - process.currentDirectoryURL = directoryUrl - try process.run() + print("ended") - status = .waiting - DispatchQueue.main.async { - let alert = NSAlert() - alert.addButton(withTitle: "OK") - alert.messageText = "Your health export has been split successfully! Click 'OK' to open the split files in Finder." - alert.alertStyle = .informational - - if let window = self.view.window { - alert.beginSheetModal(for: window) { response in - self.status = .waiting + guard let directory = directoryPath, + let scriptUrl = Bundle.main.url(forResource: "zipItUp", withExtension: "sh") else { + return + } + + let directoryUrl = URL(fileURLWithPath: directory) + let newFileUrl = directoryUrl.appendingPathComponent("zipItUp.sh") + + try? FileManager.default.removeItem(at: newFileUrl) + try? FileManager.default.copyItem(at: scriptUrl, to: newFileUrl) + + do { + let process = Process() + process.executableURL = URL(fileURLWithPath: "/bin/bash") + process.arguments = [newFileUrl.path] + process.currentDirectoryURL = directoryUrl + try process.run() + + changeStatus(to: .waiting) + DispatchQueue.main.async { + let alert = NSAlert() + alert.addButton(withTitle: "OK") + alert.messageText = "Your health export has been split successfully! Click 'OK' to open the split files in Finder." + alert.alertStyle = .informational + + if let window = self.view.window { + alert.beginSheetModal(for: window) { response in + self.changeStatus(to: .waiting) - Process.launchedProcess(launchPath: "/usr/bin/open", arguments: [directory]) + Process.launchedProcess(launchPath: "/usr/bin/open", arguments: [directory]) + } } } - } - } catch let error { - DispatchQueue.main.async { - let alert = NSAlert() - alert.addButton(withTitle: "OK") - alert.messageText = "An error was encountered while completing the splitting process (\(error.localizedDescription)). Please try again." - alert.alertStyle = .critical - - if let window = self.view.window { - alert.beginSheetModal(for: window) { response in - self.status = .waiting + } catch let error { + DispatchQueue.main.async { + let alert = NSAlert() + alert.addButton(withTitle: "OK") + alert.messageText = "An error was encountered while completing the splitting process (\(error.localizedDescription)). Please try again." + alert.alertStyle = .critical + + if let window = self.view.window { + alert.beginSheetModal(for: window) { response in + self.changeStatus(to: .waiting) + } } } } } } - func chunkCompleted(part: Int) { + nonisolated func chunkCompleted(part: Int) { } var targetDirectoryPath: String? { diff --git a/XML Splitter.xcodeproj/project.pbxproj b/XML Splitter.xcodeproj/project.pbxproj index b8834ec..d1bdfc9 100644 --- a/XML Splitter.xcodeproj/project.pbxproj +++ b/XML Splitter.xcodeproj/project.pbxproj @@ -367,6 +367,7 @@ SDKROOT = macosx; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 6.0; }; name = Debug; }; @@ -422,6 +423,7 @@ SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 6.0; }; name = Release; }; @@ -435,7 +437,7 @@ DEVELOPMENT_TEAM = 63553QQ62F; MACOSX_DEPLOYMENT_TARGET = 11.5; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 6.0; }; name = Debug; }; @@ -449,7 +451,7 @@ DEVELOPMENT_TEAM = 63553QQ62F; MACOSX_DEPLOYMENT_TARGET = 11.5; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 6.0; }; name = Release; }; @@ -477,7 +479,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.lionheartsw.HealthDataImporter.XMLSplitter; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; }; name = Debug; }; @@ -504,7 +506,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.lionheartsw.HealthDataImporter.XMLSplitter; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; }; name = Release; }; diff --git a/XML Splitter.xcodeproj/project.xcworkspace/xcuserdata/dan.xcuserdatad/UserInterfaceState.xcuserstate b/XML Splitter.xcodeproj/project.xcworkspace/xcuserdata/dan.xcuserdatad/UserInterfaceState.xcuserstate index 4d7811ed932406b52d2edcd3f81c733c925f5702..9490cc558240e2d8dc5eb7d9d8c5b6e2cb8812f2 100644 GIT binary patch literal 97817 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

(mio!W+SK-cT=Zwa4 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

;d~|4uRv-r*`ht3N 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 literal 84665 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 @MyI^ssW%Ys9Q(`02WBncd zJj_DoZ^G|rm>@YdS!Pj1XGc?GONeWv)_n$Fc7$7O7XHBA5bu8x9!>XPO~Ab zxUn%%mS*I{{)`)vALwvyWVqnm>R@Ji49>({H7flrD`H1B7};4uiG(UIVMH|M8uPk| zLpa@-k76G==h(i5qbXEUqvCIug4lwyrS+dmT6;n+GDJwdjJSyhN#943NI%k_3?Ku^ zATrokXe=@o8%vC(M$p*bs56!s^+v;G!gw-F7)yqm=VT-q$;B)giQ+YcrtNZLg|X87 z#|7?6zA(<3O$K2x1w>51VsG50jT5Y>KHwMJW-4rLHW^2#0kK)X%CvZqEpn4LQJ2A8 z5A$Alqj14`i_>zOs?e68I40L#lH$KJQH5V70GgX>eHZDisuMM3ZfbKmA1}XSD+qcA z;WONPQ;2i1)?_hvKHHw+IwLPLBCbiMDPFzA6t*OnOxQYfTuMP@Vu*-<_zFjg5&Mzhgkv~DFuCjMuU*+!eGmb%RJEw2 zw6>(81*hKFi0VfJ(&6qQBYTGziU?=#Mh*HNEEh@?@m!KwU-v>pT3+79jrP*^Bh|?3 zNR`pvMQV&N=XJbi%N>$$c433gCkupB5&>(F3DXp=c0ZSW&u_lacIg8daVwbrjP zi8Q`1V}Ha(G}ilT-PTS)99kS$f0r^t}4qhBTW{ z&Lrmx1GgfI&PEiSOAbLK9gRpj#xS;$3(&W7jLFZFtI0LwTERoEBiEA~$c^}OGr5J_ielV$S(dien-YI%O!`#T zaktWdsFhWP8Z76F*7w-5xvsG#2F@8C+9c~LmfL;Co*9C168@ZHoM@blRz_50B`i8M zur5^J$(4ja%bLda))wwcwMMa4bcfKoh1^N*B6pK}jFXMij5CZgjnO;F{p0~$+k=MSF(^Gs-#_4MU!<*?Tu|uUT@~I#bEZTicWWbpQA1cgP>sf7WtdCvR9D*91(*=AEeSb(1&w(zu8A zFTp1qnm$BVW=6)wjb70{PVbSAImdaQd_X=V9~l=K7a5z3t}VjL1+Jk?tTa)j}k6c9jU~K6kKN(y9OqC|T2|tlP{!Ep=xWY#s>7h#}kNF?!(tEC- zfAuA@%iDk8&^<=%P*kU0(}o9k0s6*5>t>^WrAu2J&jr204&wIcOGBIqM{O)qE%!Zo z-E-K3uV1&8R8!g75cV>J9iT@Z-t#R!95kd`8~j(eEov#mJ+irPU>wNnARKKvgI^lK<9l9TbgFY6%Km+JEA`l7HST8ECL(q1c zh~Yrls4(S|eJx`mYOn1XH7?9wNOgp&DWxjv2$WHgO4PyI8kZQC8rzM_P~B>|m^!J( zRW0hK9^-Q38dKT2&bZ#Bay)3ZFf`e|rTK9Gx^@204Uq7>AcR~X6jg{Va8vy)EaQTu zGaP*uRk%iBZ981SXdz@fg8`ZSvo^-OMY3+(@*gd4tjA##;#tpF^a%gUXu12TPG9mRUZxY>$ z?oFrDedr82ljhR`T1bm%fELqPbT%!a`_ehI)VRsG*|^2H)ws>L-MGWJ)40pH+qlQL z*SOEP-*~`y(0Isrn0Hl9D`+L%k5&ogw1x|OI*-n$3-GT+bTM5*m(rl|2#}#b#sL`* zWP-5~$Rw^00NE2rF`#;l-|P!shPf`9CB!k{b7HxBVwXVG}+{$f>P_Py`LPW8R8_?SiJBh5rQnpaE@>oUd(hN0->W=l? z<3FIsJWS;)ytJ%tU1KxeH`vNpN}GjH8`_MAY)Hh5O^_XQEt=xAlddryH6H7x>*#vp zapMWYzr@;_h@S&BL8~`wlY+ZK_vjhOPVBx9p{SB~Q-gx>r14ZYJ&Yc1JZ=1J_!s1J zUtSApjx}YdblLF7&=Z7#o9VIiIC{MCjIqPmxtXF`K~FZGMIGWtet;(?%)(s1AAF9NZm%yqvz8L=!Ntm zx`}of&l@ioFB&fyFB`8IuWqB8=@z<`UX1@Pp_dx38Lt~38lU37?~Lz}m2f4KtMS~n zUS!SRoGr@jU1=_Ob`ms}a`Uo#h|Tf(cs9&_7Q6F{I@1@~&uXhm(FxGjxvZ(NJ~iCh z*q8FqS?GE3i@AD4dGd}O49~fU4{)LUvee8K#Y4O?UJ!)Yq zx@to0$ZtBrQN4L5{Y>!C&*>NROZwF!8v#fN3%FM&+)>xuW_)dYYkU**k+yaIbsW8Z zQ)lsqEdoKE%eus!Hf72b&cMP`8tPi6R9aUi;VG69??Il?jW@?w4yHD87?>PPeRq}Q9?Gy z(7BWTjKuK^xq<#hzu+N7%j&|RMfm^rP!pQZYeIMgelWf^XU7Ca&?kqK)6LMaY#s{6 zkXfmAu(|huE<`T-8$M}V-6oZX2tH&gvwTtyLevKY6 zHjs_@GX~5?vSc=jjb$0wX8aDs31k2eR9prE8N|e>-AeAK0FuNV6$y%egn6=N`X#vmNPpy$LeSgH zxy%1IW{7&=8Xj`g*pT1W7OHEXFcE|1qG;ark?-@Avu1vxaU~Yw*Ky)m4`hfj8ZV+_ zp8E8(?3|tlcq2Om1rtN9e^?hYfb7A~ln@qFBY`AuW+w_`*~vggaXVwQQMLqojXAy+^S@$Ya9;eAk5*Q<0v)iO z4WR{54LoJ$5qF!`tWD)-Gjw?N9u9q->>?mz_;6!wvoPKyNSWDam>r=skEoBOq2(Pl ztyPUHR(5#t;?%<~24eZx*d^>zRC#a~QTk4Z>a#lFMoc%`&e`~10kv0fIlCgkEM!-+ zYxy=@17va+yAFt-Z^K{H&FwyKVz+P=1B|D-*sVZPqc;ic4t7s3CVek*zx#n;h#!z5 zn@c~$2?vi%T8vFU#&-S%HvJrXp1r_cL^l1h@f(nIAk%^511T{1bYW~Nud%l|M}D2X z!QNzV0YL_w2_y?h_7?Vz$&%j(l4G&tY5!R)`7@53&w=FHEcq+WlD}r(@E;&kf#g}A z$ddbeC)wNbGyBbA$-i=zyccK5e{hz(cW;&~-o?$$Q*vq zmPQVmIE}AzFCeASgC_1H7XSG{6K9JhTptokxjqD>49HwtAzET8ME3M6#acXQ;(lV4 zSS{87L7`p&q!P$}Tg18aHgP@|^Hs(>fcKIc|4j#Nw^rR>F$^sd*qoYrDrjac~Paun#w__!iXEhjUvj&`9Kx`S=hG< zW9uC8x=Q3b@fb@FS@ak6kcf4Jf~OBHASV7}E~tnxV3`QkyiemOJRL}|?^6`7!i#5% z7vOz|c#e3kc%FDZ5XAg4AoV~Rwul#s7m*QS7myH;1B?|w@b-N^mzn&uFEGU>|81cq z46Tb{Gmya!!;bpB?47zqM9H^Byj0vSUM5}+WH}J*b|sL;E$DwP$1v%!<{dRE4O|2c zn~QEX9{+-xLTD}b@rA4E)>`-H=&eY68VTsBuE*dsZkxw9HJjsYE5?4;w>P%&Fmu$6 z5&@c581gFKBHk+ACf+XIA>Jw8CEhLG17sDDCLql~T7a|yX#=tvNIQ`5 zrML*|Upf9C^CN`urYoJti)_Rno*rQ)NO13YR9|jD7ecs|$LxmcY`Z_=8IQP>_S_YC zY2&hXbh0Kw^HBLdJ4gR&*fbXZB7BYQOh|Dl)wU>oD z>Kf3skO)3yS3RSzf=707FIr-YNxN)OQdEP_tOy+wwf0`WAiji5U3?KpXP5XgkTtu} zgT>cT4;J4L-vqK2$bnHkSbRtPpby1V{7@Jxehg$CS4`I%WzhqaGShf5Ua=Lw5HU2a zmtre^i|xM$au9F7!6=KJyOf!S&Nn+)SkV@0DQQ6k6+^+%Toivr3tmJ4aY%G>k|4== z10)fNN=y#hXXm{Vo8xy$%&u3fI{y`AV&eY%lzeCPPcJhe3ZKu z$H74{ktRZ?{jBe1qt6}_74S<8`&eRq$H^o;bI(QGo|uF8erD+Ga6ELKO%43$Rbrk` zRcJNFV|O5Li5Y1WvPNk%kmHQeFG^#jang8cg5Z%RN|U5LrO9lhlqyY;(xk~!hLnlH z0=8={!SJ>GwxhVgXnTND!{+^aqBkCmyf6=>h&r$__+%1cFA`o%k1!^MG8CAn~MZDM!jBH%oaOeP;qW5y;ux&OhN_w(}))O>CC- zk!DCUft&>7R3N8Eg(Tv!h#TQJms56W=;Jn9(GgOKW$K^yH%)!1+!C>8>`KH+)s}*M z)-Dy~NPzf1;rGNKR%yPpKw7wvUwI>sL?1VhbAgq`te;&Y`x%F{ALaD*hz|Zf~2eR8)Sx(}A z)gk=1Jsy^KURo)Ih1Bg*qjZ3@N@|jtr534GYLiw=D1p%dun7oiEZsmh1K9#(E0BwU zYy)!1cB#V>&eA$=Y6@ee4Z>I;mzpx!3mAsP??I5s-fk%$yS)tQt?Y)8iIp|B;H4*K z74>lof{*#VN?|KjF+ndlhL6RxIg3T6@-9j+tjNqrLh;n|(#iY>$YnrKALO5C zK&xJ#&HB%h&PCl`I$J_6btRCix~20ZR8y}8a=mG{6or~lV=(V|Ej2WX9Ml0T5nn4X zudW5}NyB)b9LX(=g4ly}Nn7|J-4fCaI$^HumbMD0lwOBMcTdmhB7TKs3Y1XTmz!hv zaJh6f%5Lcj=}PG;;BLhmf!wrNx<;|x= zb$wA|m^X~wK4G|CuNGmvX2N{a)U`bOa))#avZ7n1+c2~+wX?IaVcB}j&a3cx?;E_b zP9L~$?n%qs`{lS#L6hW{P&$lb=|9n$kS=NF_G@m{vxiURG`2ng!*@ARz>yehqBs{;`M zi=hUzNDi4-H(>Ud+0Ao zya7Wkg5FL`k;gB7QLv=VE8jweUJO<=(AWr~!63A0Po(A#^kR3pFZg;pW z#_8}`jMFhd7z^ZCn{hsGGtRgE%Q#I&WHR!97vprKAmen50rFggaXQBDl5yHQo$5$O ze&(3sNCWZ$kQcih8IDXKF9CUj^PoTFi^$G*%~$O~raJaUmgmTGOmmxSNfFGDjuHb2*nAZ|+`h*iGg- z7GM+lpkqGggKz&CA9MsA`{ONaPhMx5R^5&|&ItQ{h&rEbY6UHh=M@rc0Y}KOJjSX% z1@b`;R^@0yR^@1Rv^dbm@gb0pfPDP-S(W2Ji&cH{w^-F-jw7P>xC8Cb&keuHJ{`xP z?d>?$aU75@fP5P@ZyhH(PUXaSlH+8@DL}pi@)eM;H`8Qctm6!fa6zr^o4ntwgdUWUdk1MvDtB@<0=R0GCuu{rAMoilZ^yKJ?YrdS0_7h@})p2N{Lj?hWKovg%fy3_9R|% zyo%<&<7LMyK(W+`)Qt_tVk^rh$h`$&p0N^%x#PaQXlByL=usO%0Th1-1gO>Lt#L)lTu6o$6Qr2e+4!6`Bl*;T=7CD1utq6y&>G;z_1+0 z=MFRKf_t(meBv`bVyO!Xqg4%~Wej_iH#DmnUgaGuW1zIAyWB%YCXd2oTz_U(_SC(n z?~`w3<>GYmax;=Md5Msz_>q~LXVnME&Pl_HA?dlvbFpN}v`lnk^mz$`eiOuhbnaG> zlS+%7*pVhN?Q$p203I-SHx+97^~d@zdiTIVSP`b5F>vS5VLnXPMYRi4zRdb9mU_;$ zNy`Yv2_!z^)fEi0+6-2<38WRL=N9H<`ZLlqvi(_EX?gy%%=7|(ATKvBuP8mepfD?Y z@j)55SiIB5#~XKyP8l<{ujF9N{f(bM_n2|f9AQ4m2@^*cE+j1t2Q4VdESg%7k>fAU z$}RF|=jRpsaT4kNw5%+wr4z_c%PlNS7<6aq6kl3;26~Fht1S##t4t_oGcxg6{AA4Z zKh&dqMiTaM&_S8}hCU;k=fS6Ertzg=xtEO?gAsR+Z?8E$7gO#=r{v_~0^`T-&Kbw2 zl{YQJtomYgjHEI-*>5J;b8_K0nREp&zfDb@0`-I@`}p+s;V&?cHaDX3l}Y3vNX7V-4c7M=E9MhY8pFu46F}H z)mj4@YTW*5$INf;TI7MX2v!nCe<8O;N=k}w_e#P%!qmLyD{gG(3BlpER?H=6$E&DqxmZwVJ{DC0ESABGf<7obftlHF3LltR z*`H%x_BXeb#BGvs!Pe!SdjBwDqyM2 zF?1ZAfYIVh=rSy%*@0y=H_}5WU>xg>^fvl1eT=?LKV>d94CAJ9SpnOZ?T0})&1^k8 zo}JCEWVf(;*)wb>d(OPFe~G<-e|XyX<`|V)?Pj%40d;%dEfcPxcv5r)i=& zzH)qx`x(hnYrQ>_Y4~`!lKRJGO{Nni4@tfm!#~-pF z6Pd~ks1DQx6orciD3+4)0Zjth4`_d&1Aq<$Itb`sphK>dCD|d%vLckrPGP*P%P!e1 zdt@(uGZyGjpnHOZwJH_7Zf5ZzXlt5te^s}xgtYoZNn2i`}N4TNZb6(k{Wd#A0XEn z00q~q|Iq+3FKvA9dt1F@k%$aCEVrq31+JnXkeiVo$jI~ua?>;YS%t;<{=Do!k-s1} zuQ;b5H#;K@eNC~j2|3^D2qV0Dbd;S}m>0+|%<&f$Waav^(xztnu>@L?zc`Rqm{(k! zn^l~dAKy{2)e&ZR{c{m;J(3#D*xL9x%(3P$F6a&S#(Cs;{ZC!QC^GFG?o&nC>1!`^1pNwIa z1F<-D&p7%--kyq8=0Y8KyIzOq?eE?^#D~E45tU&F8TPec6G54_i0EwN{Iut46JYF3 z3(J_ovl+SMczKP<6Ol7!ZI;)`>*WK1<^Y`zbSB0g#qoqgEE3A@#S?PU3ySmdi?J+Z zW^S54s~}^lKW}Pofj=jsC^Ij;AT5xQm2HoEsC+n@tMXw$bGzgtfKKK6JjCYz_J-Oq z?3Qm|J_cP>GLlA~G5R^4m>{1(Ka)?CPa-!6)8u^lG}P40RL%x7L*9(QuyQ~7g%nWa ziVD!tK&N4Bmwblck~`wqjmandbsiQ!}`(0w8%ynG2?_oYB*^tJB2<wxBW$u|Hk_$vs$g%5Nq(89h3Iz+z59w-}VQ8YeIzE2$C^&-0Lp&yhV z=0iUOw75%t1nBHU`gzi#pIQG)Y&e3SXXNKGL`dEt@06dFp95L~bYGxzfR=8NUyz@Z zUy@%2T84iDtpHk;fIY0yhzfd44MQa;QXvjAnD7v;!TXSQ9;;gr<1lE9TGiLMmmp^F za#ATMtZP}rON7QhuvD41_=daiIa8Aoqf7){Yyfy1=M87Y8$PxVk(8@0PBcS`4 zv*dc$oEA*xkE^$1R+mhf*}A`}U)$|Jm%qbc4fzZCOZhALYxx`bTcFiIYk<}QoeOjx z(D@h3-^)Ls3jCA&GrbMy0-y_d71l+7>7MUktj5CD*5=|mUXF87A?kxza*`LaLqadB zt1rTO6Fp(|U~`q$0% zryba`aQ^aH{-*u>d25Rn7ECSjrNTD(Qr476eBKn(-N9EGo)TIAa$f3~f5X%2kSm3! zSQtrN8Obt>0{D5{NO(G?hty-JMO?&)-Fa-frY3wf^r> zZG?YX(KO*HR-W(w^=1A~GM>kEU|swAmFRc~Pp@xnPDNqb6iRLANR57{?YQX~u}T|LO|yx`K(4|0)ZnI8J0t|MyPnf0cz$yQN(9Qm6i_ELcS( zcZHt+DhvOxBL81y;cu2l`Mb(O#ETM8_C>d#Qmo8UW-I6uYy-L)XgkpG7G;i7s+1|^ zKs$i01G*mQf!v|8+W`K5GHyODFy3;o)S|agLBCyRB!p90fFYd9LS>P%5M$rz8lY?W zCy#yik#w(?GBeA%Z}$;9lU!*~R+xc<%5n@Gqz7T(pwh_QN0<`Uv$#js%MnMS(xPCl z#1^GhX;W4!h^&Kw9s<+=3R{#8rBhj>;J}9hMMwXUK+QV3|2bGYm}3p6dzg*2LpjzC zV_)OXH$XAW9KBEYiMI|u`fSR~NVR$&eZpS;@ybaS&Q9bwJDTI{6ppiFdgE+kk=^J_ z$q#2Wq!^^?rYsxV$5V<=0gBW%yCOTkdW zZA!PYS=pj&RW4SxDVG2}5$H)kk&I3OdMZ%7bU1yRvR%1Mxm>wIxl*}GxfP_2@t24!b(D zrk&RU_w(BPk*_>W=ngK%%3M5}0D+cpSH~Lk_?geGQ*kRfX_M`Oyu?J9 zM&o{|ORbrg;>6`An1LZ^IBjsb|6QH;wc$sq_(5HaD0`v!9 zA}|lIp}?{dsqIUP+PeCTcR;<@d<}A+)w;N<6jzdK7x50tch&%#|H=FR#0!+j<#g=g zQu*1M!`7fTu$v>*V?jOs+|~O2u=?H>^d7LAzOAGAua-MQmoA3OV^OY-P_M-J9IWu8-Z<`O z&El$mfAEAlP#uO6R2`%aR)?rVfnEdjTA+A)d;J!551tOA;>G+8JOc*kP5)6^hdK`B zr;0&TH%8>AItk?`CO(?~FdX0dXIDK`(^V{Af|&_wCKr}Bqp(zSxUjsXx3KI#Ai{~& zz0{c;J$tLu)qT_%z;7aN2YLt4JGZF$CVGm1-esZZp8qWL%;D(4TjaZK^i&{v`mX3> zuXe6#C2y!ad4t}IDB4vuAG<|R#rFViQ}GishB$nWR>LORPd?YN(|l6<@D~ zm7{h8gc<1=fnwF+{P*d=ee`6e-{ZBrIW23vF@HKQbNai@G{slW8a8qdR5w}_yMb@V zle?i&?f|-Ti+YSnuEzs?)*{yz|Fg)I7j;oj2drXh z)dW<}LUL8lR?p!-K%WQtg7t~{v%1%g`A|2hn=Kr5a~!?IakQ16>X&<;YSL|^X}fv@ zsypgs>gDPc>XqtM>ecEs>b2^1>h(Zh1^OD$*MYtP6t$nXfMOT~(&@WE-`lRAeE21)mK#9UDQv%__w82t8c0JKD%!9ZA_7)m}GWsxB8y? zKG4sAe%_k`haYZQ2I?o~3r%fm{9OGS(}~nC)GyVqfPM)SKfm6rej{C{eh2g$%rXS} zEuZnfJ!SeYr)%#}e-S+Duf3B8(*vLWT7G`%)+_cO^1>Upe2=MYx9m{=5IjzyH*DR8 zJI)xov*5|g|G0f)#guojY{4xN6gZjFVV+{A#82_}-Rk=){{M5tV=pAyO>}2}lsrzC z)9v&)y-uGq$=MI+k3fF{`ZLg9fc^^fH=w_7a}H3?b`C;K=4|Hx=P;mua6W=XU{Rw% zuJQ*k@?Xh=#;$i@%H5V%MzC=_-Z{zImWjA6j3RS&PDbX+Sg&32k#p@v=}ruz+2YJ_ zW;(N+*}x=V4q!4cWs5VHvrXqTV5%vDnEoFngPi%uV4MZOoDl}&3~-fchI1DG;YDc~ zrjqkdltK0zHl1Zoo+L{jbXIUAxj2%lIFj7GktA=nku=Y_m?LSvbAfZAa}h8vFdwia zVEwi@mzYS}A6S12NoFD7-HMVv)RTXrbh*jAoGUnzRstJfBWV>P$=O6k@E>3Uv5*@7 zz`O>_wdrhkc3KGP;0PMb5ww;gXh?4aQ9Dl8xxsl9ifHFX=fTcHoQ4yehdK{)9_~EC zc_gr5!1e$(92gEa5?C@Y>}@o#6kubvJCC+RwDWjNL_1GL5smc(d1W%h^7x2|W*Pq# z(f|Hre&>apI52{KoJ}0vNF04vL9xl>Qs?DJ9?tE~%YaP)HnH1zh4V^alYpiD+miX6 z*ExBIR9Gt zksZ$a5%z)JGPaMze;dyaJ0IhCegriYmd-U5X)9_f1WoFciT86PUgT?E@*mFD_Od=kd)@YGzjyv*A?Qbrpy|7jkamkdG<=QdR!z`|Mm46P zV{`_vd|-vZ0>EZ%)f}3vDVnM|ft3I&1y%uUKVTRM9v4`mc}$lOo7pQFVrq8A)WY=4 zOn*T-=2vAErltAwG75_Qd6`+5aT_R{iqGOZ>Th*a(5s`|!rZBOIq3oa)U3=5%up^Y z@aJa*vi)iKnHf`yiZOjTFQKC$R!2p>I?Bt=N>9(vPV?tx1~5G%P@L}13uI6AXJ+Fk zCTL`)Wn{(AXoS^Kaj%XF1DRRrQ`2(&m>rEX!W3Ws)Z&Z`%$decataFb($W)Vlwx%> zyH`h9ndwDo>47|dQ4vof!>lnsCZ`qqr>3Q)A=eW zLLc*aAL;3_PI9!Vu}<=U;XAu6n9Q8$K-0AuF&JyI5xUa~wLt7qF|ca8dE5~DYULQp zt<90gX=T7_dB!4}w^^&uDmA3Q1t4An;wOo8IM>4Q+@QB$HxAMs{@%nt`%ER&7Fiw7 z?=w;HZ`=&T^=|1S+ET57pTMBDzgDL$)9QgO1gzrE76V%XZ0S}lq%GH0Xe+fwU_oF9 z09ys(RUqOUw(KMti+%_?o!M*yOTW!<*GEtsU6@U0MgQI==W_ zRL=k5Wx!TOt9)o1H9)DW9jqOq8Nd+H4ZuR1wL^um+Tp;Kqo;(e`1@5p zM#V0*63Y0;F8ESrhGv?kjJ=xUwUhgp2rr+aoo1FcVU4`B$*~WctuP^MmxwfVVC`&_ z6xun!nvBuUYUksdYOpYdc7b-Gc9FJefpzJKu0dd}!0@vf#4GPOw&F_s{Ptc+MSr>qus3CqTQ<9rroaH0cb$~B#U`Q$l0o!mf z8KK=xMhNBFeL^`Gt{c&C*a+-kbfY1?jgH#}Jo1>a(6OE;Vn>R@S*3ZS$$QD>dXgi6 z=G(N!#C4E(AQHMri3798F{>~qLPcMYoH)|@WW3M~t!QmGha4W)SK^R-x)!#cFcVU& z-=7wYt9&F?dq&%#?bM#tp3|P!UeI3DUeaFHUeR9FUejLJ-q7CE-qPOI-qGIG-qYUK zKF~hYKGHtcKG8naKGQzezRig+cdbM7o*XncidHQ^P zfxb{*q%YQ&=u7pWzQ10lFVpMw20f%N*H`E(^+x>weU;v%H|s5WtKO!s*4y>4-l2Eu zYxK4HI(@xKE(V^h@+h_3ip) z`sMl+`jz@s`qlb1`nCFX`t|w^`i=Tc`px<+`mOqH`tAB1`kne+`rZ0H`n~#n`u+L? z`h)sI`osDo`lI?|`s4Z&`jh%o`qTO|`VM`k{;d9-{=EKz{-XYp{<8jx{;K|({<{8# z{-*wx{{=WW!{-OSn{;~dv{;B?%{<;2z{-yqv{WfgJ`6IqwmGZ#iK{0XrJlF~E)mb{yclP1p&*P6T!m;CoHj zDZowzb{eqLft>;DOkigLI~y2sy>o$`2kd-c7XZ5u@U0|l6R<8|-M}^j+X8GW;G0Gm za->UuT?%YFFyuy;1G@s)mB6k7b~WJ3K-jf_F9Tu7HEsZgR@qI!ZU%M>;QKuoT4c8a zLymDLu)BcW4eTCZ_X4{Q@Vy@F0bmaTdkFAt9_$fdj{=|G? zfb9hKEU@Q*JrC>!U@roD3E0cPUIF$hu-Aa0h4KclH-Wtc>}_E00DBkMd%)fY_5rXD zfqew*V_=^E`xLM?2)-hNeF5xCU|#|I8Zb_WeGBY6VBZ7#0oaegeggJ0uwQ`v3hXyv zi2Of56hI^(QVHfanF$2VxS4{Xpyw;s6i_ zf;b59)e+(l5Ql;|48%P^91h|L5J!TT4B{vdM}wFG;usLef;bNFy$<385GR5-3B)}? zoDBFr2Qd}IDIlhSm=0nFh?yW}ftU?q4v4uRP6aU!#AzVz1>)WyP6u%x5NCim6U2NF z3qULcu?WNfh{Yhz0&zBoB_Qq#;v5i5K`aBY9K;F`D?!{3#3~T00bkD`)`B<}#Cagj z2NAW%g&-~haWRNXKwJu95XAifUx^?t1F;^&1`tCaE(dW1h$}&C1n~e6Q3GoN5d~=r zh^-*Dfw&sPb`ZlLc7WIk;u;Xwg18RE^&lPy;z1y80C6MWs}00MKr}!E5Dx|MFc1$1 z@dyx)1o0>kj|TA=5RV1%I1rBq@dOZ01o0#gPX_T65Kjg1G!Rb*@eB~p1o12o&j#@v z5YGkiJiwO;h!=o(A&3`&xCz8A5W7L#4B{3Lw}N;vh}%HC1jI{0+z#SpfUg4(ufT$x zg2zQ%)WsHHmC~?PEtwfu?25$KPYG|>kY9vJl9>9Kj|px?bE?gfG%m^IFtf((SErlp zH{;i`(1~?}tin_F5KiD759rl#RpD&x&YFhHgc;Nm21l%_sHm}_ye3piFR0qe%8II* zKoKTo=GPQgRFy^h?Ps#nX2)C4Q@3+DvO^2q!+HYGDl81n4OH=TU>iNT zCgh$yA^8$YFe?~0qbM*Rr&UoE2wK~0x146SoYb>rV18j~Exy(^Xi-407`q9U=a!iu6O&CTq4xRUZe8?Ml7IJ4()(S3^a5S$&z zN3y977FSi2A-$KB;t{f_KVdJ6&F)frc9&m?dD(^eW-4}Ieoes2xz4XF!BbI+S=AP= zC@~vn^lV&Rm|q^`Bp-(}oCxN3Mapu=|2YgydZ zE;1n}>;kefP*qk^&1n`KddE0-k^o}Qurj}9w%yel6K-q*oGlHof}hE( zk&Bzv2<$fN%{KmoHc?T4{Jd&bfQ!1Kz}%8ToOpg&N$hBB=wn{hb4n_0abS;ehzU15 zVT{6x$_2s7+4c6M8MFoLx~Ks6gftqd^Nr_FPUhTP1EmS$-iF8Q683Q_MCg z2_x0a-Q6gsn=KOQd|p1v(cLvV%WO27VAv+FOt4{txdk>0t*R{#)}rEpbYidNT(iNL zT{MUQo3tE7+688lVPp=zGCb6jjJ7|PhuE+IiM}=>QtZyrc0x66k6l2bOs$G?M6|9D zbXT3CoQo0SwE7NDF* zF;|8s55w9^OKKMM6wqkuVVjY?+SFE6ajw;49%v6D^zb-nlxn6NwN6H59Irx?5n;#2 zU{U7IL6KinQjN+eDkiAP%__wsk|4d&zQk6OW35n-RtKu)29PH0p*VA>4st~hg-A@J zMT<0XDX6(v7_b=-AIU}*nym;uDmGAW&|m=`c^e+B+r-|n^ogZfqo&6XqbWUXXf%Nl zx?ik!oJ)B{u(BlDAKJzUF)#+fR~1BISc3w_?gs5<1R56u;y4V>E2){i8&wW%Y-}_j z)(8(ZYOTSV1(nf`(fmf3{xKL+sZCe{8s-SHM;u7aY}`JisG5q3(gX>QraOYhk!OVk zT9g2Vc0EGHk!MsTE6cCOoeZKX%*(`ZDQqJET>#i74ogT5CJt~K(UXks0R$Qmo9UcD zpc1vKlDS;L;ObIUc@!932nd`T1IC@%ueJgKBlL-4q?Su;OGAokszumc?5Lst0ecw} z>!m6XrHA4wB(r%HRdW(48$A`+WOScREOmTAVgvMO{AmL&Qlm>l&j&V$BWYY3@=6Ya zm3+8OhgMr0JUU1aJ`Qiyfy#VSN47}XtO8{31UgX=IBt*aok-YY^spe*kk}%taYrMx z6|WPb1152*wdGO#^>v=mPm|d1y!@(iuEUom(3o2=;o_ErD2OAo%6Q^(GZT0$;jbpD zTVe85u4gYmq@f;&LL508O8$7Q(CskWq{g=?tO{^CD=9Cou!<+~HS>~4*a2#b`Bk=l z?pDplL*pBpx(*IziJb_t-MR^w91j?nA1JJ?F%99U0bqlBOz`2m0LP7r+2!se6L!yd z*x1a?a!y62d4d*JpaywS)JS#@Fk6m_Zy7~x<(yf(mjv_){$qd^+rjllG-tGM;;GX;%50nxzk;~NwKbKs$bHaBl5fj%_n6%cmoQLF zX|>Ozd;IQ(vvwt77TOy*$!w8;28%Gt@)JqdZvrL|NNgpsdD;D@nc(B%7tTqWA0Pxa zTY}v_en<1n1_`Io zHUuJC4i*(FuPG@miLzh!-e#MT@q^fHdh2iQ87B1LzM$hY0(XH4HYNegEQZEs8$`j} zn>+$$lLWk0))t_p9y9lQV`#S7XhQrrT(`%QW*#4Vq(C|PC-7Svv2)C335R@M74j>@ ze=mkmZo-Zy)%a%j`jyGN$YsnS6cGirxa|q@;QzIDA7D{jYXip*WY;e2uDxSL5R~4m zbWxf#u_7W-6D*;rv4pXAu|{u}eR6$D%Ieb4jz z?!7W|&U@bXOxc;)S*s3mt%lF7^=z9h<``lXBiE_-+&aejQQSets-s+?{&Ops4uHjV z(OIrh=eaea0y`JmemA*vi|3X$UpC_MSu9tmIG-%gRYG*EAJ^05q3YQ+F{>WMHf6pf z^d?Ou$)+5hiz>Pk=RILu5;C1I6o|>Z7kOK*YFGTKFG+M?xn9lZ)}!kAbCX?)X=DoJ)BzAu*wW@-)iSNvbKHqKg|h@EG%P zGD9v}t+n>(UF1vg?37cT&?!YS2IO4S}t6{BF6XwA;X5nsF%_CP;5T* zjFU^a6j(w%&q$CLtJrU=pG`Pp<{Y&E1L#3N3PbO$ZCa`E_5z3?*);`m^c>+3F@Stf|)*dSk2GxB95yM zTunDl@BGiiOaS>g<+)RsPvk1KEefuZzlc0HEEG?UT)5$j7dD;^^P$&2)HLj+avhr& zuVXx=FfG3PRf|W*1{F9jT=nAc)zbvyuFBN*TDfrD7l$J68$3H+eG@_#^m`$?r)j>n1!hxIU&*H2U)@wN zw_(&13O-76Gtalc^<%4@vW+&c*M@mNAv4DLy*djDUU#(GC7bhm!{+49$}~E;RhZND zy=>6!^%@N5#Mv9CTJpMzzbQ?7-(-l!JsP`EZaO4vcvv?08naa`WBz>LvRQawC_4l5(akj4W3n~-S0_x}=n_I>B1|iu zkSn^rdPOyis6h3!A^#-R)WT`mg2(H%K#jPP62`{n$Bhv6X1Tm$W%aXc#P`*W7 z7nfvHy>7_nirGLj_&JMyHtLVM@S`ZHHbE(gz4^qEf0|Y3pr8Aq?7Xyz$k13W8^=Z$ zYU++`s+cKQd{d@tM*f8wx%Yx0h4P$u25)`jgo!fwbNf9ZB%1pU>Ip7at<`@pW#yr4 z!nsJ53OA9zG5bb`sc*vO0%3q@{U>t$qE#-uzJG#xXpH5MpiVe>AK%o#Q`vySD+2Im zPekX@oj8)3p3|_ll&d{=tu*FCMv%C(CghKgOA9Wom$$Fj(X5cRgKd=R2jfdZg))i$duc~sf zt5$if0P+(opHAT7Wl(H*p|ct5>avxhTYs^Mj`ZcZ1D-iBUfRf?sn)e*6GabLg`0?O z%dHiTezE4eJJvRG#g?x~q47AC|B#F6(F^0J>H_7cFWV}*gEj@hnW=x1CZ-cc|M>V9 zZh6*?WK%ERbc<=qIO9wSv6BtFcpEY`pzeh7>*F68$t55EKn{k_PBpC^WJ515&I=lf z;v%mpmS(bv&M(X{O&D*Js&{0K=joy9`As;-b$Q)Q-A5Xqn30#y&7TnSFK?SSFc;a; zi?`UK9pw)_|LUIkjMNmlyKK<=4I(eppgAxv*-rB}XvY{4r;xER5$c}K6j5{8lK;zE zGXAawZ_2mvHy&j2W8yv-wJuWNR`_*oIRO7PgwiP=32dW zfX3zuhRA8HX|w^dv7%?SFORKYV;uv1&AAJftrguS_-@X?)B#C+Vw4}q^H z->FFZvApy1?Y{k!d)fFU_esp`J0P{_M_e9xRG)L9VZXq(zHuRR`|Q&$ho-<_^XF&l zNZC)f|Nnl%V?#rIjZX%c#uP34Dmu+NCZ?*_L2M!isIT5jW*4BQO+BX~Gi`aiK>fHG zD*u69t$B-zlg$;~Exn|<$iM)eHViROu1>OvqLZumCSv4evix&Bd37u>Dk>t%98g!; zTG2U?-&z{`9^aG{o0R<1Kl83mj#Pen;bb8)hAVAyo9BKsCjkWxE(x;z_C;#-;`YsX z^lux;L$y5OqdsP;eyAvP1=YHzY`N%Fl-Fq4*N^)bOl$QNgJuJY9@~>;FTicyKfw+Il)0ZHZ0HF zef`x34!EYIo=HE8w7+b+=#J+#GRzrYfcct~^?S0Rz<-xbKc25pV=H`t(K=nW8S?Mi zG!3MDZ;I^`TGGu4bC- z;Z3$Xa}UN{WKj;U-}`-{WIv{$s8@t6?gdI%Ul#r0RXr!e@dTWq(D_s$ZNOwSxKmnTBDyNFs05 zsZY+Q1bH`&e$lqOcaq{ug# z_-eNE?-|Ac)O0D^`p|!lkS`0xnp1f6Kc`TB_l&RqnNs+pY_aI2 zqXKiMz_mL$XSkNasg8Q>gN>A3CHH6xd>%aY>JiHZ&8bsQ&f-F%Vq!Ttd)A&QzMoz* zK67(?mx$-v%q^OxjCpGRDjR&^r(gBc)AIw4;ywY-Gjkt^r{sM@J4J_>TRSUTd+7n; z`PQPJ?YzUdCv6(&1=-R|H@U)jGoH4Dgd4wN8W9x41Evu{+<^0sGToN6z9bthdS&({ z)#dW6Q~a|>;LIbvBAa^YDM~Sy%Zwjq<+EVw^XUHE^YP{K&$IjR*4JgbFa5amqIMGk zVvS$p3rt|6Ya0=u-hK2peJ9HLrfm78r^hd9*%+$nnB*H1q23thbbzM=V+!17x&7~B zmpzz1lN3F6=l#dn3!G}IF?W)8sW@SNHgg}mVeIA&jH^;yqc)x(aQ{lZU&HCFe}w6g z59`POKK24vRLmui7j2B^0j6!`AKAl852J-DYmPnt#LoCTyj&qHIA3%YvelP<*eSkM z_0l7!0P6RNO)cj~s?*3eUwUXR)MkM*37G)(yMPJ&qxn2pS5meZ|FScm0xjAk_U~oG zg=NzX2Dv@TmU$w|_?cCHe=)i(-`y*4FH%=Vb`$%byD^`i@=1{Ajno90PPBC8|DXEc zQnUJ%fdKWoass=+0@uFzxpeiL4zIftC^lW{^Co;W4hi5O;IBU8z!B@&wR&9z*@JUL zv~T|HdX6B*udkcGI&QpguP$NyqISU>=DNyqeb<++Z(frfv--US_1pXAFJtPe$rf5f zr}JP|l8tZw#FQaC`=wrZRsU;R-!$Vz<{`s|sbBRoPBG&%7RKWl&x4ufYfafy#A`HF zY%}tqKlRN5@;KRXTivh|k#sdZCZ^<-NCMca~(sF8<|w6qNMvbr(Q{D9PZ z5xxQPfiU&I$ZyJ<4sp7MvPphQ{`owPFXsE^^s)d#h=u8_NF*B+=&o zi}}Kl&RMn}_5aeo@sc&iNcDkK(*WFL2SNX?1DO+!Soy!kZk_<1vQh7U*J!Z6>9U#5 zN469G@7m!yt)Kc>rt#Z*MNSQLEoI}y%u;jd%=>>w^M2nv{pHYoV|ZxAbU#SfMmFgG zl4xJqAlnjW1?Cq0WsAk^MP5Hd_FG-s3jp;&Vvw{DmS@n1+uSS|Ce#CzdHUCiTAHf}LQ?pUB*|3*{8l9Y!k=i$% zqsVi6RKA}V8>N01THX#&KPJhRpB+?UW!oYDscjzd;*tU<5YHZ5*Tu_rn^Mz7cEh`doeH2}yZ2rI1w%`ExJZ#?8^^$GBY*T-;xibuB6RP_##=@Y>ic&3vqvrY`2YNa?#7oy@I`xhNlSf1mB}uriuuUVPqx+Ob=wN$ z%bmP%Nqs7XhcMNzPx<<*&q|o4+`u;rO$O+i{{cIkBRyYsGhJBFrOCFOiiT!x?}HZleuQp}Y^QONc1%zDnDSfr=Cy9TT+OA(YK6a{Xey0-=~AIDC+a522AUUX zzfqzR@5&M$?uS;A0Z1ok)oR_Tk?DTmR|fs$$KJIm#v%5D>01k6y?>V>hB>2 z@UxTZ+mKAJ16!<{p_?f(UbPr6j0lK}d4A>mH_7T|>*f^tNl4v1-Tw;z!^gU1qUmzo z0^KLNg}Oz$9Nl8w5*=^4+n{JRDw<7-X0xK%qG+}%nr(_^`*Pic(Z~5P;Grh&Q$%~hiA2K8R zB&H>s-+Ao+;-%&5=3;n^+|*lGsEvG^aC&lT0`I4O_CMbAJD zpU$!gI-3_P7t}X}StA#z>gws_92Df|<{aed>B4*Xot#{}T%6rK6Lh9Oxfk;%e}Csd z=RmhWPghTWH@`r4Zx3J3KySA|xt1qa@ZExF#KYIyDZt6e*~Qhxo44cBp!}16(LXiF z55wd6z8oV{GI$q7Y#LuZcotHT#d!Hhe&a>@ExrZU=R0~9UO>_COpymZ|0nrMWZkv= zAIo(c>gd(f+sn(%!`;J^clMJ;FZbjou1=l~HZS_i@JQ1hEmwD|@MOKK%Pag34|ER; z|HBjA--Z4`FZ33L|3RbY*Bc7_GOxarzI5S#D5o!9_#bq7ec^wosIOG`AFArB75;~s z`Z}U%j=q+@wxT(sXnxAk+vw{mnx7TTFY5HJX`F}Z`EfF{&iq>H{NFRKWBjve=V9Ez z6?l`iOtPL|&s>;QFPeuD6LbdS8pXT^Uf)FTP&l?`dY9*7b5&zID`PV@?J1i!{&yc< z46bjkXwDaSQ@XyDzO}whSzem@hoZTtXfDY2qX!rL{Qw@vecc}be)gLG`o7;!b#GF` zF)n{1=mYg_)rf=i!HVXRqWLpNAEIxkXf7+7D@9+8UQ8+qz3$x9Xa{{%;k?A^`9-H? z`Z#?@eZ0PtzO%lIqPebUZYY|+6wOUVldEWMEz@_?ch@KAd*~DOyzKV2qPe4J9x0l~ zisp%;)u^>C?&x9q(SZEpzpNeSdzZK+l_j?=I5wX5c(Ei7)t_0(~04Q=m`R^Sa=Bispg& zcM9}_^~3mifD)TZY%Z}yv3RIhJW?zkFV+v2zf+*OpZ_}ry!_}{Vqfsf1E#P>>Bkk* zqWXga`ib%f2Q&}W9~>C9E&m4xikWt%rl#q$jWf--L8-r!spp-$pO{vhen_M!!x}UZh{EXiF^8uUE7s`Jo8)O%5EnjjuW8e72ZV zprgWCzgf|imhVf}Z`E&$3y%)ZNJ+`jZxtEF41P`qg+9yD{8I(`9r~S2BK6-E>Az95 z{3@Ms$?rs#aY@sUz3KPp4^UVAUj07(eno4gXss2kZn6HL{*eB#qSY(fDvGwI{2eJ` zjmqe+{K;)FddI;l^x@x&uR=U&_bq5P_REaxYz86aQXAirDgH^jK2Ji};I z+>@AxsJTA zI=yedWOeuImZx9XQ_)s3Ci#N?B1sP5V3ec3K$7Jem-Of4j@Yh?ZEuz|g>yxJT@B}| z{+gn#s%Wd_=x^x%Qnb|-ZH?Cp$N0@&{ayJf%YonPaq@6-b#~-G-8`MVJ)B%T`4Jyy z|Ac;tNdwXb8~-CAF}0tETmI*7{rxvz)fD|h{bO}!^GMOwTBK)>U0dDRyjc)xaty+p z9J{j5l4E$wP+nACVbB<~h7yL7hEj&ohBAh-hH{G5M$y()wDlBieMQ?q(Kb}HjTEh| zqHVlFG&EQXTZ7(UFjO#9G*l7|*;{Gt_^CUsy`pWRXdM)-qoQrfuib@p?wb~v(zkct zo++IBRpf_~dncy{Bxm+bN{&oPOn-YoYCm3vSMZ-h(mM7{<%f>b_&E@r@ejNiJT5V{ zZ({%S=bA8m8s%)lxMacinRha;%&P+n_MrYIMv8icsYuUkIZ3I>>B(`%O2*3n;0<@Z zGShp>m>p9FBqgReCh?`<3{Jm& z;DFThn7-+18mkuhL;f2&iu+Uk9nb`wQ<1gQo24nq>YF5@Gy3&QOdVp}$wepkRzK>e z#mWyS@y;Ip?oO^QiMp$D2W4n3vKAX!7+M-yDOxW@%m4Q^AJq)L27d8rvBA&aZwOGd z-ip>o(KcUf2r>j4nkw2Binb-AR0pT-QVI{QQ0I}Ue8Y%w^SSEf3;OYCGQ#H3>_8APKvg*qHUAqm?Uf(S_+$E zCHMgzLzfaaBlMcGJ^2Zyv~(w@A1y53(r8PREEC@#)A*v5P7Tx-R`Hd%)R+e80|v%7 z7|>ImUmAqP*oE@N`s_KAd&!y0LPtxLj!7LbAU(@sovvEhauq7ptYv5KZZau5| z4H`DGZOp$#^EwmydRtzuq!W%7NvVAYl6P8Zo5*(CE4`0;=;Lr%zfB`~mLc@xby+1# zWtGUP!h~)rZ<0n2NlQ=e7aOAX;Wr?q*Kw;R4vtNmalAJ6`>b8_+^zonUkVJcvLVZ2 zv?i;RIx=VX8jD?A-Lgt&mB}i**u&E+t6Wz3tV&rGIB*-APzPaNnUB}pmW@#Z2}({( z&qz%+T_`EANLAA!u_5v!tocvJDqFQ`v#2$Dxr%Dvet|V|`~$MAvvfH@!CCq&gW78i zS~sM3kwnZI_ zx)${H<)EK6IKwJdL`vou&%w5)9DW*Kf7X&GhN(XyxIyOx73hgy!doM1WEa=zsf%Pp2) zSRS%GYI)J}ie;|l9m@xAm48cToY$5X#{U#a`Tv>!A8$2OEX$a7DBTUod_H4u*u#)$ z2rwiWddYpFpQ80=x2R~@MFuW2ylqk2(8ti15!F_-LHr_>HdxWNO#@!L(~JzE0&DmluRyJzfCFQu;uxeAuazD!zuO{L##AFrx!6) zx0gs1Lxc_gKb`;YES!W7_4l@ECVT~7Yp`N3I!OLF6>X{QRYN^Ez!^ShjSh%IS9BMm z%so62qHJmCQ4{si81`WOvaDa$6&~01n}Z5akH1oHcCG2h;H-e#0Xn%2z^V5KDP)1c8{!CxV$&J{i5y7w@7U2H-uU zAp?VujTx8)#!;SelxG~}8Atg~z!=Ie1@V_(g*8}*Z*c-w@I(kJ;;|xUR?!%VX;_Ty zU|d#bKR5>L@*-J1-+00Vz+)Dqd>gY#A{8w*2HT~yw>F1 zn!H;Rvo(3QChyk23!!5k=x9qf6l?K^5c;z4MLTpt50ESU2N;W)piTV>e2E>{3C6Ae z4&Q^i>8Tr^s)U}p>CfQ;)b<&lp7H4!pPupQZ{im2AWsNG1$ZM2)XhM@24Xhs!X+Up zlm_*!P#+Cp3p+G{BbuQFTA>a65P%@G1>>sF57f2-W3KQct_o4n0_3A&Jk%}WR2~$8#D^3TwsYq@rlJAP-yJ8NAz2Y)3zbhUEeO1!J0Om#| z>RYKgYN9q6dzDq#gzX@{D&()qd62^@9@d!`wj}TRfzbf%pZ4F=e;{lsH zW2n_k zh(%b8rT7#pz__Zf!8&|~jo6H>V64>{Yjwt0!xGg&4QjMR6y65?)?jYeSP$k{4dSnH z46Ik>L0Oas(TGJy zbOPIXE%IOM9k8v}>W_g)MLIG;O=``>22j^pe}Zw>)}sP!z}RXtw%UxXHe;*p3?H-r z|{a2kxY_C+w(+KjbMIaC7UsYAPUJm8OTL?Q|?h(kP*kc{5wi+9lv z1MnfX;TwDp>RM+X7)PBv{3C>o1>S-dwL$DQ#A`#_Hne3k4ihj5Q!owFF%v)F2+rVV z{0ioY4P&yQem1#yEJR)Us7oJp>7#B*kgK}Xr!MuVOFwl7VKl~KJSKwn>n=nNmS7n+ zVl%da`BL{59&xy(?Rrh&itZrpdZRD~Gw=~U#wS>W#aNBCSPyDjZxg6Vy@MeBdbC@g zI@EVUOOTWLeh5S`LeLB3x<2vNpNy$OG-OUS?1Kz2u7*P}6vOcW6sXH(gV-9*!W_)S z|1cknv*CFm8d;zrT;L8*Fs~XhuNpD08bzWTdY~tg(HqQzMwy`hM&z~8I8ehz#Mp?w z8_{oNT zoHsp;(>RCwAV19vhyZh<8M$dT5UEHuA6PZ*I*lKwg>xg z0LO6xr$Efje!(B0Ce4Vw8L>BGZa9@f8I%LLb<%-&oGPL+8p0Ng%gF)F-~xA$XD1(! zW2bI-8+|~oo%(}3JH3zLU<^(QsH+ooby|$QxWUI6`gX2_s;GflXaxFlrY~pua;7im z=4c6W>+FkgL?agQAO`0I^aOcyP6PRKo`xBijSoR>o#%tvIv>FqoCVvE^CeutH9Wv$ z{EeqVxR4K*`XDx!#;^x5xKLM@?qFMXp>LM~7zW1d!kAr{UoLlqaMgmbxcVUgK?p$< z7=tTgaP17@c4a$oWj)uin1IQc3g)5fDy+vwY{53{#sM70F`NK3cl{mAHP?$^Y_4~O zaI*mQb*l|(>*fY>>(&b7)s5KPn7eL_&5hc+MT7Xu0ajoiA;#SZKOxpTV* z=C&L8b9*F&dr2_I+{;6U3aA8X>D~@(r|uCT5AO8i-VxN#oq6QWHtSA4-I+`7gE17t zL4MpvViL%U`*h62Laf7QAV2P#u@&3#1-=4#azBKl_z|b@6Mn^6oX1TNzx!kSBZLPz z^U#1XcrXSJ1IVFA6;y)etgJ}54HBG2Kx6Q=RQs03^x#i z54rcDUmyDPA@4rq(1-c#(-ED~74Kp+*nWH_f_(Z+#dI)#eaNfNVl2Z7tj1c9PapE> zLq2`J#bGdSe8{U0dG)z~OJMH!T*ZAMnrpze*PJ{yFAL&o9s}ZOPCU(tr+Ee#bMr|c zj^@PCd=@^$LJ&)HVrjk{tFQ*txH)k&-w*n2&OB}Y5Kr(_h!&P$Zndz24hB?2Wl+x+ z9*9OJrhzfHSceVRjBQ}NEf{Z$Z}1&{z&`v6_GvAcKP~9H#UJ<+S8xqCa1*zLXla9R zP}`Q|uqAnG$=_Sm1pnTOy0;n+#@=cw7<((m-f9k3g8AHvSXvQFD`IKIm|Gphk2r;& zKs>FOC#{H~6*08Bj=w9UTF0Xcy5SuR!uuGG zER4cfOaSq=o(J;Snz`FL2TSoOR$vqM;5QIo>jy%#sS4t0LmX|0p-nTmz!N@bfmWbS zZQjNJq=Na zpg+io-=DaRJUkG>pLPBHKcngn&2zm=8P#Wc64e}I3o`Nc&9vDNAJsjZzcX)w$5Jb&_-Us6iBDSDun1K)R zKg`Dhtig7CiM=?2<2Z>kAif~#7DU~Gh%@M#5Wy8eje^NZ@IWxPgR{Z7gK0N-F_z;q z>;O3k{t>@|ITy@0gBfS=T|C5N{3AqL0mj+3Dw=`%v}F#ojRE6n+ZkPv3~JhT6vpCH zti)=p19@+|8Qbs$h@tH%`~+fX%b41p#~=6;xwwx<_*-x*2bLg~5Ch0}NEI}IE$q+) zT~hj9!)f_6jyz->^k(1&;;M3@EMLJ5=twF+y9R-HyRuH#<3eu zh6$L2DWLW}N}vL2q7LezAsU0+_aOH@$bAoT-=ig3gKenC0FdtWqf8iGH;xYafB1zya(0>wrB?W^vlG4Dol*G1_G!&yT2IH_0 zYrwoo+Kg@Z3Om8rl6K=5e#A+f5#rrk(BHdHg-9W0_|k9S9_S;(5?YYc404)L9^^E`0P>nq8%;nR zGhE;f=1m6uXV8C!FCsw=GkTye$ZH03DI*mb7y$+3CWE|WOvGfYz+v1GB9s0y=`WN1 zGV7u~96*1WUT6+#n@N9}{s;oK&5S|{C=v8Ks5h7kgZhDf2hs1KObo^h zECB5f`WnY@5x4OePwt8~i=?;sB__U}7750;lmaa&ZUu@DRj0 zm^m|qIWvSgGlY1DFlUBXL5EtX1M)Yd0f=kJ2xMU-#vo6K_gVja4N9Oi7|;9N(E~k^ z3}SizcbvloToPg^^I@nr$j4A>GnCp4T@S`Il-v&e2Hy!W%mdVHSRjJY4zrPiRalG9 zunAj1K8BHxVY~4I_JN!XyCTGJYq%l`T|k_}sr&FGq#y(2efSUz#c+Ip$(W9rn1he- zF&2V2hSUFW`X5fr!|8AMK^(zxoCISZejdz~;f#H_8p|~yMv(In%*_$RGvYnG5BeOD zg^`$qS)leKnCBzta|C^kpwAJ^^AYqpVhgro2N?SZ#y*0vkN6SfdjxeKLET5(!$VN_ z5l@Bqz!F+iL={v=P1Hd>G(=ZK%KGz(H3D~ zy)4F-6$5gdH4x-BYZ%CD7GumBgQ+0DS>!j1+Ga7&vlwsIR{Sc2VgVc2fqA3Qr$V2K z59m_~LI^@ZpGpTrBNjc;8+}2ImG_W_Obo_2OawVrR%0DDU^BMi3y@odaVyM6g*l~A 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 QERFwZpiTw;&q8eeKfo{)iU0rr diff --git a/XML Splitter.xcodeproj/xcuserdata/dan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/XML Splitter.xcodeproj/xcuserdata/dan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 0108dbf..0e19096 100644 --- a/XML Splitter.xcodeproj/xcuserdata/dan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/XML Splitter.xcodeproj/xcuserdata/dan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -15,10 +15,10 @@ timestampString = "563743689.077457" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "262" - endingLineNumber = "262" + startingLineNumber = "273" + endingLineNumber = "273" landmarkName = "parser(_:didStartElement:namespaceURI:qualifiedName:attributes:)" - landmarkType = "7"> + landmarkType = "9"> + landmarkType = "9"> diff --git a/XML Splitter/Parser.swift b/XML Splitter/Parser.swift index 9a0a5de..5311082 100644 --- a/XML Splitter/Parser.swift +++ b/XML Splitter/Parser.swift @@ -12,15 +12,16 @@ enum ParserError: Error { case dataCouldNotBeRead } -protocol ParserDelegate { +@MainActor +protocol ParserDelegate: Sendable { var targetDirectoryPath: String? { get } - func savingChunk(part: Int) - func parsingStarted() - func chunkUpdate(part: Int, current: Int, total: Int) - func chunkCompleted(part: Int) - func parsingDidComplete() - func parsingFailed(error: Error) + func savingChunk(part: Int) async + func parsingStarted() async + func chunkUpdate(part: Int, current: Int, total: Int) async + func chunkCompleted(part: Int) async + func parsingDidComplete() async + func parsingFailed(error: Error) async } let XMLCharacterMap: [(String, String)] = [ @@ -37,7 +38,8 @@ extension String { } } -class Element { +@MainActor +final class Element { var parent: Element? var name: String var attributes: [String: String] @@ -64,6 +66,7 @@ class Element { } } +@MainActor final class Parser: NSObject { var root: Element? var element: Element? @@ -72,6 +75,8 @@ final class Parser: NSObject { var url: URL! var currentChunk = 0 var elementCount = 0 + + @MainActor var delegate: ParserDelegate? init(filename: String, threshold: Int = 500000) { @@ -134,8 +139,9 @@ final class Parser: NSObject { parser.parse() } - func writeToFile() throws { - delegate?.savingChunk(part: currentChunk) + @MainActor + func writeToFile() async throws { + await delegate?.savingChunk(part: currentChunk) // Write to queue. let target = delegate?.targetDirectoryPath ?? "/tmp" @@ -160,7 +166,7 @@ final class Parser: NSObject { } outputStream.close() - delegate?.chunkCompleted(part: currentChunk) + await delegate?.chunkCompleted(part: currentChunk) elementCount = 0 currentChunk += 1 @@ -199,48 +205,53 @@ extension OutputStream { } // MARK: - XMLParserDelegate -extension Parser: XMLParserDelegate { - func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { - guard let element = element, elementName == element.name else { - // Keep going. - return - } - - // The element is closed. Add it to the parent, if it exists. - element.parent?.children.append(element) - elementCount += 1 - self.element = element.parent - - delegate?.chunkUpdate(part: currentChunk, current: elementCount, total: threshold) - - if elementCount > threshold && element.parent?.name == root?.name { - do { - try writeToFile() - } catch { - delegate?.parsingFailed(error: error) +extension Parser: @preconcurrency XMLParserDelegate { + nonisolated func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { + Task { @MainActor in + guard let element, elementName == element.name else { + // Keep going. return } + + // The element is closed. Add it to the parent, if it exists. + element.parent?.children.append(element) + elementCount += 1 + self.element = element.parent + + await delegate?.chunkUpdate(part: currentChunk, current: elementCount, total: threshold) + + if elementCount > threshold && element.parent?.name == root?.name { + do { + try await writeToFile() + } catch { + await delegate?.parsingFailed(error: error) + } + } } } - func parserDidStartDocument(_ parser: XMLParser) { + nonisolated func parserDidStartDocument(_ parser: XMLParser) { print("Parsing started.") - delegate?.parsingStarted() + Task { @MainActor in + await delegate?.parsingStarted() + } } - func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) { + nonisolated func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) { print("Parse error occurred: \(parseError.localizedDescription)") } - func parserDidEndDocument(_ parser: XMLParser) { - do { - try writeToFile() - } catch { - delegate?.parsingFailed(error: error) - return - } + nonisolated func parserDidEndDocument(_ parser: XMLParser) { + Task { @MainActor in + do { + try await writeToFile() + } catch { + await delegate?.parsingFailed(error: error) + return + } - delegate?.parsingDidComplete() + await delegate?.parsingDidComplete() + } } func parser(_ parser: XMLParser, validationErrorOccurred validationError: Error) {