]> git.r.bdr.sh - rbdr/map/blobdiff - Map.xcodeproj/project.pbxproj
Fix performance and undo
[rbdr/map] / Map.xcodeproj / project.pbxproj
index b7dc2fa9465e087986e91f98dc6e5c8fb58427c9..b212de6ee8128558dc1ed803e815508ac46b9ade 100644 (file)
@@ -7,6 +7,16 @@
        objects = {
 
 /* Begin PBXBuildFile section */
        objects = {
 
 /* Begin PBXBuildFile section */
+               B523C73D25C98D9800C44061 /* NSImage+writePNG.swift in Sources */ = {isa = PBXBuildFile; fileRef = B523C73C25C98D9800C44061 /* NSImage+writePNG.swift */; };
+               B523C74625C9BD3500C44061 /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B523C74525C9BD3500C44061 /* CloudKit.framework */; };
+               B523C74B25C9C1BA00C44061 /* DefaultMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B523C74A25C9C1BA00C44061 /* DefaultMapView.swift */; };
+               B523C75A25C9FD4900C44061 /* MapAxes.swift in Sources */ = {isa = PBXBuildFile; fileRef = B523C75925C9FD4900C44061 /* MapAxes.swift */; };
+               B523C76225CA05A300C44061 /* MapStages.swift in Sources */ = {isa = PBXBuildFile; fileRef = B523C76125CA05A300C44061 /* MapStages.swift */; };
+               B523C76725CA071B00C44061 /* MapVertices.swift in Sources */ = {isa = PBXBuildFile; fileRef = B523C76625CA071B00C44061 /* MapVertices.swift */; };
+               B523C76C25CA0DFA00C44061 /* MapEdges.swift in Sources */ = {isa = PBXBuildFile; fileRef = B523C76B25CA0DFA00C44061 /* MapEdges.swift */; };
+               B523C77125CA121300C44061 /* MapBlockers.swift in Sources */ = {isa = PBXBuildFile; fileRef = B523C77025CA121300C44061 /* MapBlockers.swift */; };
+               B523C77625CA181100C44061 /* MapColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B523C77525CA181100C44061 /* MapColor.swift */; };
+               B523C77E25CA294C00C44061 /* MapOpportunities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B523C77D25CA294C00C44061 /* MapOpportunities.swift */; };
                B526257225C874F9003E73B7 /* MapApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B526257125C874F9003E73B7 /* MapApp.swift */; };
                B526257425C874F9003E73B7 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B526257325C874F9003E73B7 /* ContentView.swift */; };
                B526257625C874FA003E73B7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B526257525C874FA003E73B7 /* Assets.xcassets */; };
                B526257225C874F9003E73B7 /* MapApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B526257125C874F9003E73B7 /* MapApp.swift */; };
                B526257425C874F9003E73B7 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B526257325C874F9003E73B7 /* ContentView.swift */; };
                B526257625C874FA003E73B7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B526257525C874FA003E73B7 /* Assets.xcassets */; };
                B52625A625C876C3003E73B7 /* MapDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52625A525C876C3003E73B7 /* MapDetail.swift */; };
                B52625AB25C87909003E73B7 /* Date+format.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52625AA25C87909003E73B7 /* Date+format.swift */; };
                B52625B025C87C14003E73B7 /* MapRender.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52625AF25C87C14003E73B7 /* MapRender.swift */; };
                B52625A625C876C3003E73B7 /* MapDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52625A525C876C3003E73B7 /* MapDetail.swift */; };
                B52625AB25C87909003E73B7 /* Date+format.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52625AA25C87909003E73B7 /* Date+format.swift */; };
                B52625B025C87C14003E73B7 /* MapRender.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52625AF25C87C14003E73B7 /* MapRender.swift */; };
-               B52625B625C87D69003E73B7 /* Binding+unwrap.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52625B525C87D69003E73B7 /* Binding+unwrap.swift */; };
                B52625BB25C884C2003E73B7 /* Map+parse.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52625BA25C884C2003E73B7 /* Map+parse.swift */; };
                B52625C625C8BD2A003E73B7 /* Stage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52625C525C8BD2A003E73B7 /* Stage.swift */; };
                B52625BB25C884C2003E73B7 /* Map+parse.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52625BA25C884C2003E73B7 /* Map+parse.swift */; };
                B52625C625C8BD2A003E73B7 /* Stage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52625C525C8BD2A003E73B7 /* Stage.swift */; };
+               B539516C25CB0C9300959F72 /* Store.swift in Sources */ = {isa = PBXBuildFile; fileRef = B539516B25CB0C9200959F72 /* Store.swift */; };
+               B539517425CB0CA400959F72 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B539517325CB0CA400959F72 /* AppState.swift */; };
+               B539518125CB2D7A00959F72 /* MapTextEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B539518025CB2D7A00959F72 /* MapTextEditor.swift */; };
+               B587BB6025CDCECB00F328ED /* SlowMapRender.swift in Sources */ = {isa = PBXBuildFile; fileRef = B587BB5F25CDCECB00F328ED /* SlowMapRender.swift */; };
+               B5CF75C925CC19FC003BFF3D /* EvolutionPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5CF75C825CC19FC003BFF3D /* EvolutionPicker.swift */; };
+               B5CF75CF25CC7965003BFF3D /* MapParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5CF75CE25CC7965003BFF3D /* MapParser.swift */; };
+               B5CF75D825CC79BC003BFF3D /* VertexParserStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5CF75D725CC79BC003BFF3D /* VertexParserStrategy.swift */; };
+               B5CF75DD25CC79D7003BFF3D /* EdgeParserStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5CF75DC25CC79D7003BFF3D /* EdgeParserStrategy.swift */; };
+               B5CF75E225CC79ED003BFF3D /* BlockerParserStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5CF75E125CC79ED003BFF3D /* BlockerParserStrategy.swift */; };
+               B5CF75EA25CC7A13003BFF3D /* OpportunityParserStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5CF75E925CC7A13003BFF3D /* OpportunityParserStrategy.swift */; };
+               B5CF75EF25CC7A4A003BFF3D /* StageParserStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5CF75EE25CC7A4A003BFF3D /* StageParserStrategy.swift */; };
+               B5CF75F725CC97CA003BFF3D /* Debouncer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5CF75F625CC97CA003BFF3D /* Debouncer.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
+               B523C73C25C98D9800C44061 /* NSImage+writePNG.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSImage+writePNG.swift"; sourceTree = "<group>"; };
+               B523C74525C9BD3500C44061 /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; };
+               B523C74A25C9C1BA00C44061 /* DefaultMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultMapView.swift; sourceTree = "<group>"; };
+               B523C75925C9FD4900C44061 /* MapAxes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapAxes.swift; sourceTree = "<group>"; };
+               B523C76125CA05A300C44061 /* MapStages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapStages.swift; sourceTree = "<group>"; };
+               B523C76625CA071B00C44061 /* MapVertices.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapVertices.swift; sourceTree = "<group>"; };
+               B523C76B25CA0DFA00C44061 /* MapEdges.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapEdges.swift; sourceTree = "<group>"; };
+               B523C77025CA121300C44061 /* MapBlockers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapBlockers.swift; sourceTree = "<group>"; };
+               B523C77525CA181100C44061 /* MapColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapColor.swift; sourceTree = "<group>"; };
+               B523C77D25CA294C00C44061 /* MapOpportunities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapOpportunities.swift; sourceTree = "<group>"; };
                B526256E25C874F9003E73B7 /* Map.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Map.app; sourceTree = BUILT_PRODUCTS_DIR; };
                B526257125C874F9003E73B7 /* MapApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapApp.swift; sourceTree = "<group>"; };
                B526257325C874F9003E73B7 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
                B526256E25C874F9003E73B7 /* Map.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Map.app; sourceTree = BUILT_PRODUCTS_DIR; };
                B526257125C874F9003E73B7 /* MapApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapApp.swift; sourceTree = "<group>"; };
                B526257325C874F9003E73B7 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
                B52625A525C876C3003E73B7 /* MapDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapDetail.swift; sourceTree = "<group>"; };
                B52625AA25C87909003E73B7 /* Date+format.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+format.swift"; sourceTree = "<group>"; };
                B52625AF25C87C14003E73B7 /* MapRender.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapRender.swift; sourceTree = "<group>"; };
                B52625A525C876C3003E73B7 /* MapDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapDetail.swift; sourceTree = "<group>"; };
                B52625AA25C87909003E73B7 /* Date+format.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+format.swift"; sourceTree = "<group>"; };
                B52625AF25C87C14003E73B7 /* MapRender.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapRender.swift; sourceTree = "<group>"; };
-               B52625B525C87D69003E73B7 /* Binding+unwrap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Binding+unwrap.swift"; sourceTree = "<group>"; };
                B52625BA25C884C2003E73B7 /* Map+parse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Map+parse.swift"; sourceTree = "<group>"; };
                B52625C525C8BD2A003E73B7 /* Stage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Stage.swift; sourceTree = "<group>"; };
                B52625BA25C884C2003E73B7 /* Map+parse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Map+parse.swift"; sourceTree = "<group>"; };
                B52625C525C8BD2A003E73B7 /* Stage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Stage.swift; sourceTree = "<group>"; };
+               B539516B25CB0C9200959F72 /* Store.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Store.swift; sourceTree = "<group>"; };
+               B539517325CB0CA400959F72 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = "<group>"; };
+               B539518025CB2D7A00959F72 /* MapTextEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapTextEditor.swift; sourceTree = "<group>"; };
+               B587BB5F25CDCECB00F328ED /* SlowMapRender.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SlowMapRender.swift; sourceTree = "<group>"; };
+               B5CF75C825CC19FC003BFF3D /* EvolutionPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EvolutionPicker.swift; sourceTree = "<group>"; };
+               B5CF75CE25CC7965003BFF3D /* MapParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapParser.swift; sourceTree = "<group>"; };
+               B5CF75D725CC79BC003BFF3D /* VertexParserStrategy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VertexParserStrategy.swift; sourceTree = "<group>"; };
+               B5CF75DC25CC79D7003BFF3D /* EdgeParserStrategy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EdgeParserStrategy.swift; sourceTree = "<group>"; };
+               B5CF75E125CC79ED003BFF3D /* BlockerParserStrategy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockerParserStrategy.swift; sourceTree = "<group>"; };
+               B5CF75E925CC7A13003BFF3D /* OpportunityParserStrategy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpportunityParserStrategy.swift; sourceTree = "<group>"; };
+               B5CF75EE25CC7A4A003BFF3D /* StageParserStrategy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StageParserStrategy.swift; sourceTree = "<group>"; };
+               B5CF75F625CC97CA003BFF3D /* Debouncer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Debouncer.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               B523C74625C9BD3500C44061 /* CloudKit.framework in Frameworks */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+               B523C74425C9BD3500C44061 /* Frameworks */ = {
+                       isa = PBXGroup;
+                       children = (
+                               B523C74525C9BD3500C44061 /* CloudKit.framework */,
+                       );
+                       name = Frameworks;
+                       sourceTree = "<group>";
+               };
+               B523C75825C9FD3A00C44061 /* MapRenderComponents */ = {
+                       isa = PBXGroup;
+                       children = (
+                               B523C75925C9FD4900C44061 /* MapAxes.swift */,
+                               B523C76125CA05A300C44061 /* MapStages.swift */,
+                               B523C76625CA071B00C44061 /* MapVertices.swift */,
+                               B523C76B25CA0DFA00C44061 /* MapEdges.swift */,
+                               B523C77025CA121300C44061 /* MapBlockers.swift */,
+                               B523C77D25CA294C00C44061 /* MapOpportunities.swift */,
+                       );
+                       path = MapRenderComponents;
+                       sourceTree = "<group>";
+               };
                B526256525C874F9003E73B7 = {
                        isa = PBXGroup;
                        children = (
                B526256525C874F9003E73B7 = {
                        isa = PBXGroup;
                        children = (
                                B526258825C874FA003E73B7 /* MapTests */,
                                B526259325C874FA003E73B7 /* MapUITests */,
                                B526256F25C874F9003E73B7 /* Products */,
                                B526258825C874FA003E73B7 /* MapTests */,
                                B526259325C874FA003E73B7 /* MapUITests */,
                                B526256F25C874F9003E73B7 /* Products */,
+                               B523C74425C9BD3500C44061 /* Frameworks */,
                        );
                        sourceTree = "<group>";
                };
                        );
                        sourceTree = "<group>";
                };
                B526257025C874F9003E73B7 /* Map */ = {
                        isa = PBXGroup;
                        children = (
                B526257025C874F9003E73B7 /* Map */ = {
                        isa = PBXGroup;
                        children = (
+                               B523C77525CA181100C44061 /* MapColor.swift */,
+                               B5CF75CD25CC7953003BFF3D /* MapParser */,
+                               B539516A25CB0C7800959F72 /* State */,
                                B52625B425C87D54003E73B7 /* Extensions */,
                                B52625B425C87D54003E73B7 /* Extensions */,
-                               B526257125C874F9003E73B7 /* MapApp.swift */,
-                               B526257325C874F9003E73B7 /* ContentView.swift */,
+                               B539517925CB0D6100959F72 /* Views */,
+                               B523C75825C9FD3A00C44061 /* MapRenderComponents */,
                                B526257525C874FA003E73B7 /* Assets.xcassets */,
                                B526257525C874FA003E73B7 /* Assets.xcassets */,
-                               B526257A25C874FA003E73B7 /* Persistence.swift */,
                                B526257F25C874FA003E73B7 /* Info.plist */,
                                B526258025C874FA003E73B7 /* Map.entitlements */,
                                B526257C25C874FA003E73B7 /* Map.xcdatamodeld */,
                                B526257725C874FA003E73B7 /* Preview Content */,
                                B526257F25C874FA003E73B7 /* Info.plist */,
                                B526258025C874FA003E73B7 /* Map.entitlements */,
                                B526257C25C874FA003E73B7 /* Map.xcdatamodeld */,
                                B526257725C874FA003E73B7 /* Preview Content */,
-                               B52625A525C876C3003E73B7 /* MapDetail.swift */,
-                               B52625AF25C87C14003E73B7 /* MapRender.swift */,
-                               B52625C525C8BD2A003E73B7 /* Stage.swift */,
+                               B5CF75F625CC97CA003BFF3D /* Debouncer.swift */,
                        );
                        path = Map;
                        sourceTree = "<group>";
                        );
                        path = Map;
                        sourceTree = "<group>";
                        children = (
                                B52625BA25C884C2003E73B7 /* Map+parse.swift */,
                                B52625AA25C87909003E73B7 /* Date+format.swift */,
                        children = (
                                B52625BA25C884C2003E73B7 /* Map+parse.swift */,
                                B52625AA25C87909003E73B7 /* Date+format.swift */,
-                               B52625B525C87D69003E73B7 /* Binding+unwrap.swift */,
+                               B523C73C25C98D9800C44061 /* NSImage+writePNG.swift */,
                        );
                        path = Extensions;
                        sourceTree = "<group>";
                };
                        );
                        path = Extensions;
                        sourceTree = "<group>";
                };
+               B539516A25CB0C7800959F72 /* State */ = {
+                       isa = PBXGroup;
+                       children = (
+                               B52625C525C8BD2A003E73B7 /* Stage.swift */,
+                               B526257A25C874FA003E73B7 /* Persistence.swift */,
+                               B539516B25CB0C9200959F72 /* Store.swift */,
+                               B539517325CB0CA400959F72 /* AppState.swift */,
+                       );
+                       path = State;
+                       sourceTree = "<group>";
+               };
+               B539517925CB0D6100959F72 /* Views */ = {
+                       isa = PBXGroup;
+                       children = (
+                               B526257125C874F9003E73B7 /* MapApp.swift */,
+                               B526257325C874F9003E73B7 /* ContentView.swift */,
+                               B52625A525C876C3003E73B7 /* MapDetail.swift */,
+                               B523C74A25C9C1BA00C44061 /* DefaultMapView.swift */,
+                               B539518025CB2D7A00959F72 /* MapTextEditor.swift */,
+                               B587BB5F25CDCECB00F328ED /* SlowMapRender.swift */,
+                               B52625AF25C87C14003E73B7 /* MapRender.swift */,
+                               B5CF75C825CC19FC003BFF3D /* EvolutionPicker.swift */,
+                       );
+                       path = Views;
+                       sourceTree = "<group>";
+               };
+               B5CF75CD25CC7953003BFF3D /* MapParser */ = {
+                       isa = PBXGroup;
+                       children = (
+                               B5CF75D625CC79A4003BFF3D /* Strategies */,
+                               B5CF75CE25CC7965003BFF3D /* MapParser.swift */,
+                       );
+                       path = MapParser;
+                       sourceTree = "<group>";
+               };
+               B5CF75D625CC79A4003BFF3D /* Strategies */ = {
+                       isa = PBXGroup;
+                       children = (
+                               B5CF75D725CC79BC003BFF3D /* VertexParserStrategy.swift */,
+                               B5CF75DC25CC79D7003BFF3D /* EdgeParserStrategy.swift */,
+                               B5CF75E125CC79ED003BFF3D /* BlockerParserStrategy.swift */,
+                               B5CF75E925CC7A13003BFF3D /* OpportunityParserStrategy.swift */,
+                               B5CF75EE25CC7A4A003BFF3D /* StageParserStrategy.swift */,
+                       );
+                       path = Strategies;
+                       sourceTree = "<group>";
+               };
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
                        buildActionMask = 2147483647;
                        files = (
                                B52625B025C87C14003E73B7 /* MapRender.swift in Sources */,
                        buildActionMask = 2147483647;
                        files = (
                                B52625B025C87C14003E73B7 /* MapRender.swift in Sources */,
+                               B523C77E25CA294C00C44061 /* MapOpportunities.swift in Sources */,
                                B52625AB25C87909003E73B7 /* Date+format.swift in Sources */,
                                B52625AB25C87909003E73B7 /* Date+format.swift in Sources */,
-                               B52625B625C87D69003E73B7 /* Binding+unwrap.swift in Sources */,
+                               B5CF75D825CC79BC003BFF3D /* VertexParserStrategy.swift in Sources */,
+                               B5CF75EA25CC7A13003BFF3D /* OpportunityParserStrategy.swift in Sources */,
+                               B523C77125CA121300C44061 /* MapBlockers.swift in Sources */,
+                               B523C76725CA071B00C44061 /* MapVertices.swift in Sources */,
+                               B5CF75CF25CC7965003BFF3D /* MapParser.swift in Sources */,
+                               B5CF75E225CC79ED003BFF3D /* BlockerParserStrategy.swift in Sources */,
+                               B539517425CB0CA400959F72 /* AppState.swift in Sources */,
+                               B523C75A25C9FD4900C44061 /* MapAxes.swift in Sources */,
+                               B539518125CB2D7A00959F72 /* MapTextEditor.swift in Sources */,
                                B52625BB25C884C2003E73B7 /* Map+parse.swift in Sources */,
                                B52625C625C8BD2A003E73B7 /* Stage.swift in Sources */,
                                B52625BB25C884C2003E73B7 /* Map+parse.swift in Sources */,
                                B52625C625C8BD2A003E73B7 /* Stage.swift in Sources */,
+                               B523C73D25C98D9800C44061 /* NSImage+writePNG.swift in Sources */,
                                B526257B25C874FA003E73B7 /* Persistence.swift in Sources */,
                                B526257B25C874FA003E73B7 /* Persistence.swift in Sources */,
+                               B5CF75EF25CC7A4A003BFF3D /* StageParserStrategy.swift in Sources */,
+                               B523C77625CA181100C44061 /* MapColor.swift in Sources */,
+                               B5CF75DD25CC79D7003BFF3D /* EdgeParserStrategy.swift in Sources */,
                                B526257425C874F9003E73B7 /* ContentView.swift in Sources */,
                                B526257E25C874FA003E73B7 /* Map.xcdatamodeld in Sources */,
                                B526257425C874F9003E73B7 /* ContentView.swift in Sources */,
                                B526257E25C874FA003E73B7 /* Map.xcdatamodeld in Sources */,
+                               B5CF75C925CC19FC003BFF3D /* EvolutionPicker.swift in Sources */,
+                               B523C74B25C9C1BA00C44061 /* DefaultMapView.swift in Sources */,
+                               B539516C25CB0C9300959F72 /* Store.swift in Sources */,
                                B526257225C874F9003E73B7 /* MapApp.swift in Sources */,
                                B52625A625C876C3003E73B7 /* MapDetail.swift in Sources */,
                                B526257225C874F9003E73B7 /* MapApp.swift in Sources */,
                                B52625A625C876C3003E73B7 /* MapDetail.swift in Sources */,
+                               B523C76225CA05A300C44061 /* MapStages.swift in Sources */,
+                               B587BB6025CDCECB00F328ED /* SlowMapRender.swift in Sources */,
+                               B5CF75F725CC97CA003BFF3D /* Debouncer.swift in Sources */,
+                               B523C76C25CA0DFA00C44061 /* MapEdges.swift in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                                CODE_SIGN_ENTITLEMENTS = Map/Map.entitlements;
                                CODE_SIGN_STYLE = Automatic;
                                COMBINE_HIDPI_IMAGES = YES;
                                CODE_SIGN_ENTITLEMENTS = Map/Map.entitlements;
                                CODE_SIGN_STYLE = Automatic;
                                COMBINE_HIDPI_IMAGES = YES;
+                               CURRENT_PROJECT_VERSION = 3;
                                DEVELOPMENT_ASSET_PATHS = "\"Map/Preview Content\"";
                                DEVELOPMENT_TEAM = S68NHQVJXW;
                                ENABLE_HARDENED_RUNTIME = YES;
                                DEVELOPMENT_ASSET_PATHS = "\"Map/Preview Content\"";
                                DEVELOPMENT_TEAM = S68NHQVJXW;
                                ENABLE_HARDENED_RUNTIME = YES;
                                        "$(inherited)",
                                        "@executable_path/../Frameworks",
                                );
                                        "$(inherited)",
                                        "@executable_path/../Frameworks",
                                );
-                               MACOSX_DEPLOYMENT_TARGET = 11.0;
+                               MACOSX_DEPLOYMENT_TARGET = 11;
+                               MARKETING_VERSION = 1.2.0;
                                PRODUCT_BUNDLE_IDENTIFIER = pizza.unlimited.Map;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                SWIFT_VERSION = 5.0;
                                PRODUCT_BUNDLE_IDENTIFIER = pizza.unlimited.Map;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                SWIFT_VERSION = 5.0;
                                CODE_SIGN_ENTITLEMENTS = Map/Map.entitlements;
                                CODE_SIGN_STYLE = Automatic;
                                COMBINE_HIDPI_IMAGES = YES;
                                CODE_SIGN_ENTITLEMENTS = Map/Map.entitlements;
                                CODE_SIGN_STYLE = Automatic;
                                COMBINE_HIDPI_IMAGES = YES;
+                               CURRENT_PROJECT_VERSION = 3;
                                DEVELOPMENT_ASSET_PATHS = "\"Map/Preview Content\"";
                                DEVELOPMENT_TEAM = S68NHQVJXW;
                                ENABLE_HARDENED_RUNTIME = YES;
                                DEVELOPMENT_ASSET_PATHS = "\"Map/Preview Content\"";
                                DEVELOPMENT_TEAM = S68NHQVJXW;
                                ENABLE_HARDENED_RUNTIME = YES;
                                        "$(inherited)",
                                        "@executable_path/../Frameworks",
                                );
                                        "$(inherited)",
                                        "@executable_path/../Frameworks",
                                );
-                               MACOSX_DEPLOYMENT_TARGET = 11.0;
+                               MACOSX_DEPLOYMENT_TARGET = 11;
+                               MARKETING_VERSION = 1.2.0;
                                PRODUCT_BUNDLE_IDENTIFIER = pizza.unlimited.Map;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                SWIFT_VERSION = 5.0;
                                PRODUCT_BUNDLE_IDENTIFIER = pizza.unlimited.Map;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                SWIFT_VERSION = 5.0;