[
  {
    "path": ".gitignore",
    "content": "\n# Created by https://www.gitignore.io/api/swift\n\n### Swift ###\n# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## Build generated\nbuild/\nDerivedData/\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata/\n\n## Other\n*.moved-aside\n*.xccheckout\n*.xcscmblueprint\n\n## Obj-C/Swift specific\n*.hmap\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n# Package.pins\n.build/\n\n# CocoaPods - Refactored to standalone file\n\n# Carthage - Refactored to standalone file\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/#source-control\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots\nfastlane/test_output\n\n# End of https://www.gitignore.io/api/swift\nandroid/\nCarthage/\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: swift\nos: osx\n"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2018 Sam Khawase\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "LooLocator/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 14.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n        // Override point for customization after application launch.\n        return true\n    }\n\n    func applicationWillResignActive(_ application: UIApplication) {\n        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.\n    }\n\n    func applicationDidEnterBackground(_ application: UIApplication) {\n        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n    }\n\n    func applicationWillEnterForeground(_ application: UIApplication) {\n        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.\n    }\n\n    func applicationDidBecomeActive(_ application: UIApplication) {\n        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n    }\n\n    func applicationWillTerminate(_ application: UIApplication) {\n        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n    }\n\n\n}\n\n"
  },
  {
    "path": "LooLocator/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"filename\" : \"Icon-App-20x20@3x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"1x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon-App-29x29@3x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"filename\" : \"Icon-App-40x40@3x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"filename\" : \"Icon-App-57x57@1x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"1x\",\n      \"size\" : \"57x57\"\n    },\n    {\n      \"filename\" : \"Icon-App-57x57@2x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"57x57\"\n    },\n    {\n      \"filename\" : \"Icon-App-60x60@2x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"filename\" : \"Icon-App-60x60@3x.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"filename\" : \"Icon-App-20x20@1x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon-App-40x40@1x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"filename\" : \"Icon-Small-50x50@1x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"50x50\"\n    },\n    {\n      \"filename\" : \"Icon-Small-50x50@2x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"50x50\"\n    },\n    {\n      \"filename\" : \"Icon-App-72x72@1x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"72x72\"\n    },\n    {\n      \"filename\" : \"Icon-App-72x72@2x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"72x72\"\n    },\n    {\n      \"filename\" : \"Icon-App-76x76@1x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"filename\" : \"Icon-App-76x76@2x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"filename\" : \"Icon-App-83.5x83.5@2x.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"83.5x83.5\"\n    },\n    {\n      \"filename\" : \"ItunesArtwork@2x.png\",\n      \"idiom\" : \"ios-marketing\",\n      \"scale\" : \"1x\",\n      \"size\" : \"1024x1024\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "LooLocator/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "LooLocator/Assets.xcassets/Image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Amenity_toilets.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "LooLocator/Assets.xcassets/location.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icons8-near-me-50.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icons8-near-me-100.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icons8-near-me-500.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "LooLocator/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>\n\t<string>We need your current location to find the Amenities near you</string>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string>We need your current location to find the Amenities near you</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "LooLocator/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13122.16\" systemVersion=\"17A277\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "LooLocator/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"14113\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14088\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" customModule=\"LooLocator\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <mapView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" mapType=\"standard\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"LUD-2e-Zm3\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                            </mapView>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"J3Y-ve-Woo\">\n                                <rect key=\"frame\" x=\"309\" y=\"20\" width=\"50\" height=\"50\"/>\n                                <state key=\"normal\" image=\"location\">\n                                    <color key=\"titleColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"resetLocation:\" destination=\"BYZ-38-t0r\" eventType=\"touchUpInside\" id=\"QAV-RY-6ts\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"LUD-2e-Zm3\" secondAttribute=\"trailing\" id=\"1eP-z4-Ezv\"/>\n                            <constraint firstItem=\"LUD-2e-Zm3\" firstAttribute=\"top\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"top\" id=\"HKr-6I-Ciq\"/>\n                            <constraint firstItem=\"J3Y-ve-Woo\" firstAttribute=\"leading\" secondItem=\"LUD-2e-Zm3\" secondAttribute=\"trailing\" constant=\"-66\" id=\"HlH-Gl-1Im\"/>\n                            <constraint firstItem=\"LUD-2e-Zm3\" firstAttribute=\"top\" secondItem=\"J3Y-ve-Woo\" secondAttribute=\"bottom\" constant=\"-70\" id=\"UMb-do-wV1\"/>\n                            <constraint firstItem=\"LUD-2e-Zm3\" firstAttribute=\"bottom\" secondItem=\"6Tk-OE-BBY\" secondAttribute=\"bottom\" id=\"anx-VV-IpK\"/>\n                            <constraint firstItem=\"LUD-2e-Zm3\" firstAttribute=\"leading\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"leading\" id=\"pvL-je-9Se\"/>\n                        </constraints>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                    <connections>\n                        <outlet property=\"mapView\" destination=\"LUD-2e-Zm3\" id=\"cVc-DX-XNR\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"136.80000000000001\" y=\"132.68365817091455\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"location\" width=\"50\" height=\"50\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "LooLocator/Models/Location.swift",
    "content": "//\n//  Location.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 15.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport Contacts\nimport MapKit\n\nclass OSMData: Codable {\n    var elements: [Location]?\n    \n    // MARK: - Codable methods\n    enum CodingKeys: String, CodingKey {\n        case elements\n        case id, lat, lon, tags\n    }\n    \n    required init(from decoder: Decoder) throws {\n        let container = try decoder.container(keyedBy: CodingKeys.self)\n        self.elements = try container.decode([Location].self, forKey: .elements)\n    }\n    func encode(to encoder: Encoder) throws {\n    }\n}\n\nclass Location: NSObject, Codable {\n    \n    // MARK: - variable declarations\n    let id: Int\n    let title: String?\n    let locationDescription: String?\n    let coordinates: (Double, Double)\n    var amenity: String?\n    var fee: Bool?\n    var feeAmount: String?\n    let isAccessible: Bool\n    \n    // MARK: - Convenience initializers\n    init(id: Int, title:String, locationDescription: String, coordintes: (Double, Double), isAccessible: Bool ) {\n        self.id = id\n        self.title = title\n        self.locationDescription = locationDescription\n        self.coordinates = coordintes\n        self.isAccessible = isAccessible\n    }\n        \n    // MARK: - Codable methods\n    enum CodingKeys: String, CodingKey  {\n        case id, lat, lon, tags\n        // tags container\n        case name, wheelchair, fee, amenity\n        case englishName = \"name:en\"\n\n    }\n\n    required init(from decoder: Decoder) throws {\n        let container = try decoder.container(keyedBy: CodingKeys.self)\n        self.id =  try container.decode(Int.self, forKey: .id)\n        \n        if let lat = try? container.decode(Double.self, forKey: .lat),\n           let lon = try? container.decode(Double.self, forKey: .lon) {\n            self.coordinates = (lat, lon)\n        } else {\n            self.coordinates = (0.0, 0.0)\n        }\n        \n        let tagsContainer = try? container.nestedContainer(keyedBy: CodingKeys.self, forKey: .tags)\n        \n        self.locationDescription = try? tagsContainer?.decode(String.self, forKey: .name)\n        if let _name = try? tagsContainer?.decode(String.self, forKey: .englishName) {\n            self.title = _name\n        } else {\n            self.title = self.locationDescription\n        }\n        self.isAccessible =  ((try? tagsContainer?.decode(String.self, forKey: .wheelchair)) != nil)\n    }\n    \n    func encode(to encoder: Encoder) throws {\n    }\n}\n\n// MARK: - MKAnnotation support\nextension Location: MKAnnotation {\n    var coordinate: CLLocationCoordinate2D {\n        return CLLocationCoordinate2D(latitude: CLLocationDegrees(coordinates.0), longitude: CLLocationDegrees(coordinates.1))\n    }\n    var subtitle: String? {\n        return \"\\(isAccessible ? \"♿︎\" : \"\")\"\n    }\n    // Annotation right callout accessory opens this mapItem in Maps app\n    func mapItem() -> MKMapItem {\n        let addressDict = [CNPostalAddressStreetKey: title!]\n        let mapCoordinates = CLLocationCoordinate2D(latitude: CLLocationDegrees(coordinates.0), longitude: CLLocationDegrees(coordinates.1))\n        let placemark = MKPlacemark(coordinate: mapCoordinates, addressDictionary: addressDict)\n        let mapItem = MKMapItem(placemark: placemark)\n        mapItem.name = title\n        return mapItem\n    }\n}\n"
  },
  {
    "path": "LooLocator/Protocols/ApiResourceProviding.swift",
    "content": "//\n//  ApiResourceProviding.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 15.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport Foundation\n\nprotocol ApiResourceProviding {\n    var data: Data { get }\n    var headers:Dictionary<String, String> { get }\n}\n"
  },
  {
    "path": "LooLocator/Protocols/Extensions/CLLocationManagerExtension.swift",
    "content": "//\n//  CLLocationManagerExtension.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 15.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport CoreLocation\n\n// CoreLocation extenstion for protocol conformance\nextension CLLocationManager: LocationManagerConfigurable {\n    func setDelegate(to instance: CLLocationManagerDelegate?) {\n        guard let delegate = instance else {\n            return\n        }\n        self.delegate = delegate\n    }\n\t// Changed this because CLLocationAccuracy is just a typealias for Double\n    func setDesiredAccuracy(to accuracy: CLLocationAccuracy) {\n        self.desiredAccuracy = accuracy\n    }\n}\n"
  },
  {
    "path": "LooLocator/Protocols/Extensions/NetworkReqeustProvidingExtension.swift",
    "content": "//\n//  NetworkReqeustProvidingExtension.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 15.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport Foundation\n\nextension NetworkRequestProviding {\n    internal var baseUrl: String {\n        let _baseUrl = \"https://overpass-api.de/api/interpreter\"\n        return _baseUrl\n    }\n    \n    func dataTask(request: NSMutableURLRequest,\n                  completion: @escaping (Result<SerializedType, Error>) -> Void) {\n        \n        let session = URLSession(configuration: URLSessionConfiguration.default)\n        \n        session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in\n            let decoder = JSONDecoder()\n            if let data = data,\n               let serverResponse = try? decoder.decode(SerializedType.self, from: data),\n               let response = response as? HTTPURLResponse, 200...299 ~= response.statusCode {\n                completion(.success(serverResponse))\n            } else {\n                completion(.failure(NSError(domain: \"in.b3rl\", code: 999, userInfo: nil)))\n            }\n        }.resume()\n    }\n}\n"
  },
  {
    "path": "LooLocator/Protocols/Implementations/AmenityRequest.swift",
    "content": "//\n//  AmenityRequest.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 15.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport Foundation\n\nclass AmenityRequest: NetworkRequestProviding {\n    \n    func getAmeneties(of type: AmenityType,\n                      latitude: Double,\n                      longitude: Double,\n                      radius: Double,\n                      completionBlock: @escaping (Result<SerializedType, Error>) -> Void) {\n        \n        let amenityResource = AmenityResource(latitude: String(latitude),\n                                              longitude: String(longitude),\n                                              amenity: type.rawValue,\n                                              radius: String(radius))\n        \n        guard let amenityUrlRequest = createURLRequest(from: amenityResource) else {\n            return\n        }\n        post(request: amenityUrlRequest, completion: completionBlock)\n//        post(request: amenityUrlRequest) { (success, result) in\n//            if success {\n//                guard let result = result as? OSMData,\n//                    let elements = result.elements else {\n//                        completionBlock(false, nil)\n//                        return\n//                }\n//                var jsonElements: [Location] = []\n//                for element in elements {\n//                    jsonElements.append(Location(jsonElement: element))\n//                }\n//                completionBlock(success, elements as AnyObject)\n//            }\n//        }\n    }\n    \n    func get(request: NSMutableURLRequest, completion: @escaping (Result<SerializedType, Error>) -> Void) { }\n    \n    func post(request: NSMutableURLRequest, completion: @escaping (Result<SerializedType, Error>) -> Void) {\n        dataTask(request: request, completion: completion)\n    }\n    \n    func put(request: NSMutableURLRequest, completion: @escaping (Result<SerializedType, Error>) -> Void) { }\n    \n    func delete(request: NSMutableURLRequest, completion: @escaping (Result<SerializedType, Error>) -> Void) { }\n    \n    func createURLRequest<T>(from resource: T) -> NSMutableURLRequest? where T : ApiResourceProviding {\n        \n        guard let baseUrl = URL(string:self.baseUrl) else {\n            return nil\n        }\n        let locationRequest = NSMutableURLRequest(url:baseUrl,\n                                                  cachePolicy: .reloadIgnoringCacheData,\n                                                  timeoutInterval: 1.0)\n        locationRequest.httpMethod = \"POST\"\n        \n        locationRequest.httpBody = resource.data\n        resource.headers.forEach { (arg) in\n            let (key, value) = arg\n            locationRequest.addValue(value, forHTTPHeaderField: key)\n        }\n        return locationRequest\n    }\n    \n    typealias SerializedType = OSMData\n    \n}\n\n"
  },
  {
    "path": "LooLocator/Protocols/Implementations/AmentityResource.swift",
    "content": "//\n//  AmentityResource.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 15.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport Foundation\n\nclass AmenityResource: ApiResourceProviding {\n    \n    var latitude: String\n    var longitude: String\n    var amenityType: String\n    var radius: String\n    \n    init(latitude: String, longitude: String, amenity: String, radius: String) {\n        self.longitude = longitude\n        self.latitude = latitude\n        self.amenityType = amenity\n        self.radius = radius\n    }\n    \n    // OSM Needs the data in XML format\n    var data: Data {\n        if let _data = \"\"\"\n            <osm-script output=\"json\">\n            <query into=\"_\" type=\"node\">\n            <has-kv k=\"amenity\" modv=\"\" v=\"\\(amenityType)\"/>\n            <around from=\"_\" into=\"_\" lat=\"\\(latitude)\" lon=\"\\(longitude)\" radius=\"\\(radius)\"/>\n            </query>\n            <print e=\"\" from=\"_\" geometry=\"skeleton\" limit=\"\" mode=\"body\" n=\"\" order=\"id\" s=\"\" w=\"\"/>\n            </osm-script>\n            \"\"\".data(using: String.Encoding.utf8) {\n            return _data\n        } else {\n            return Data()\n        }\n    }\n    \n    var headers: Dictionary<String, String> {\n        var _headers = Dictionary<String, String>()\n        \n        _headers[\"Content-Type\"] = \"application/xml\"\n        _headers[\"Access-Control-Allow-Origin\"] = \"*\"\n        _headers[\"Access-Control-Allow-Origin\"] = \"*/*\"\n        \n        return _headers\n    }\n    \n}\n"
  },
  {
    "path": "LooLocator/Protocols/Implementations/LocationProvider.swift",
    "content": "//\n//  LocationProvider.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 14.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\nimport CoreLocation\n\nclass LocationProvider: NSObject, LocationProvidable, CLLocationManagerDelegate {\n    var listener: LocationObservable?\n    \n    func setListener(listener: LocationObservable) {\n        self.listener = listener\n    }\n\n    fileprivate var locationManager: LocationManagerConfigurable\n    fileprivate var currentLocation: CLLocation?\n    //fileprivate var observer: LocationObservable?\n    \n    // inject\n    init(locationManager:LocationManagerConfigurable){\n        self.locationManager = locationManager        \n    }\n    \n    func startLocationUpdates() {\n        if (CLLocationManager.locationServicesEnabled())\n        {\n            locationManager.setDelegate(to: self)\n            locationManager.setDesiredAccuracy(to: kCLLocationAccuracyBest)\n            locationManager.requestAlwaysAuthorization()\n            locationManager.startUpdatingLocation()\n        }\n    }\n    \n    func getCurrentLocation() -> (Double, Double) {\n        guard let currentLocation = currentLocation else {\n            return (0,0)\n        }\n        return (currentLocation.coordinate.latitude, currentLocation.coordinate.longitude)\n    }\n    \n    // CLLocationManager delegate methods\n    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {\n        guard let lastLocation = locations.last,\n            let listener = self.listener else {\n                return\n        }\n        \n        if currentLocation != nil && Double((currentLocation?.distance(from: lastLocation))!) < 100.0 {\n            //print(\"current Location \\(String(describing: currentLocation?.coordinate)) is same as last Location: \\(String(describing: lastLocation.coordinate))\")\n            return\n        }\n        \n        currentLocation = lastLocation\n        listener.setCurrentLocation(latitude: lastLocation.coordinate.latitude, longitude: lastLocation.coordinate.longitude)\n    }\n}\n"
  },
  {
    "path": "LooLocator/Protocols/LocationManagerConfigurable.swift",
    "content": "//\n//  LocationManagerConfigurable.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 15.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport CoreLocation\n\nprotocol LocationManagerConfigurable {\n    // wrap var delegate and desiredAccuracy to keep it platform agnostic\n    func setDelegate(to instance: CLLocationManagerDelegate?)\n    func setDesiredAccuracy(to accuracy: CLLocationAccuracy)\n    func requestAlwaysAuthorization()\n    func startUpdatingLocation()\n}\n"
  },
  {
    "path": "LooLocator/Protocols/LocationProvidable.swift",
    "content": "//\n//  LocationProvidable.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 15.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nprotocol LocationProvidable {\n    var listener: LocationObservable? { get set }\n    func setListener(listener: LocationObservable)\n    func startLocationUpdates()\n    func getCurrentLocation() -> (Double, Double)\n}\n\n// to be implemented by the VM\nprotocol LocationObservable {\n    func setCurrentLocation(latitude: Double, longitude: Double)\n}\n"
  },
  {
    "path": "LooLocator/Protocols/NetworkRequestProviding.swift",
    "content": "//\n//  NetworkRequest.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 15.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\nimport Foundation\n\n//typealias CompletionBlock = (_ success: Bool, _ object: AnyObject?) -> ()\n\nprotocol NetworkRequestProviding {\n    \n    // The model that the request deals with\n    associatedtype SerializedType : Codable\n    \n    // CRUD interface\n    func get(request: NSMutableURLRequest, completion: @escaping (Result<SerializedType, Error>) -> Void )\n    func post(request: NSMutableURLRequest, completion: @escaping (Result<SerializedType, Error>) -> Void)\n    func put(request: NSMutableURLRequest, completion: @escaping (Result<SerializedType, Error>) -> Void)\n    func delete(request: NSMutableURLRequest, completion: @escaping (Result<SerializedType, Error>) -> Void)\n    \n    // Internal workhorse function: implemented in default extension\n    func dataTask(request: NSMutableURLRequest, completion: @escaping (Result<SerializedType, Error>) -> Void)\n    \n    // The implementor needs to implement this to provide the ApiResource that the request needs\n    func createURLRequest<T: ApiResourceProviding>(from resource: T) -> NSMutableURLRequest?\n}\n\n\n"
  },
  {
    "path": "LooLocator/ViewControllers/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 14.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport UIKit\nimport MapKit\n\nclass ViewController: UIViewController {\n\n    @IBOutlet weak var mapView: MKMapView!\n    \n    private(set) lazy var viewModel: MapViewModel<ViewController> = {\n        let _viewModel = MapViewModel(locationProvider: amenityLocationProvider, amenityRequest: amenityRequest, listener: self)\n        return _viewModel\n    }()\n    private(set) lazy var amenityLocationProvider: LocationProvidable = {\n        let _locationProvider = LocationProvider(locationManager: locationManager)\n        return _locationProvider\n    }()\n    \n    private(set) lazy var amenityRequest: AmenityRequest = {\n        let _amenityRequest = AmenityRequest()\n        return _amenityRequest\n    }()\n    \n    private(set) lazy var locationManager: LocationManagerConfigurable = {\n        let _clLocationManager = CLLocationManager()\n        return _clLocationManager\n    }()\n\n    let regionRadius: CLLocationDistance = 500\n    \n    required init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n        _ = viewModel.getCurrentLocation()\n    }\n    \n    fileprivate func getAmenities() {\n        viewModel.getAmenities(in: 1000, type: .Toilets) { [weak self] result in\n            switch result {\n            case .success(let locations):\n                for location in locations {\n                    print(\"Location.coordinate: \\(location.coordinate.latitude) : \\(location.coordinate.longitude)\")\n                    DispatchQueue.main.async { [weak self] in\n                        self?.mapView.addAnnotation(location)\n                    }\n                }\n                break\n            case .failure(let error):\n                self?.showAlert(error.localizedDescription)\n                break\n            }\n        }\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        mapView.delegate = self\n        mapView.showsUserLocation = true\n    }\n    \n    @IBAction func resetLocation(_ sender: Any) {\n        viewModel.centerMapToCurrentLocationAction()\n    }\n    \n    func centerMapOnLocation(location: CLLocation) {\n        let coordinateRegion = MKCoordinateRegion.init(center: location.coordinate,\n                                                                  latitudinalMeters: regionRadius,\n                                                                  longitudinalMeters: regionRadius)\n        DispatchQueue.main.async { [weak self] in\n            self?.mapView.setRegion(coordinateRegion, animated: true)\n        }\n    }\n    \n    fileprivate func showAlert(_ message: String){\n        let alertController = UIAlertController(title: \"Loolocator Alert\", message: message, preferredStyle: .alert)\n\n        let cancelAction = UIAlertAction(title: \"Cancel\", style: .cancel, handler: nil)\n        alertController.addAction(cancelAction)\n\n        let OKAction = UIAlertAction(title: \"OK\", style: .default, handler: nil)\n        alertController.addAction(OKAction)\n        \n        DispatchQueue.main.async { [weak self] in\n            self?.present(alertController, animated: true, completion: nil)\n        }\n\n    }\n}\n\nextension ViewController: MapViewModelObservable{\n    typealias Amenity = Location\n    func addAmenityToMap(amenity: Location) { }\n    func setCurrentLocation(latitude: Double, longitude: Double) {\n        print(\"current latitude: \\(latitude), longitude: \\(longitude)\")\n        let currentLocation = CLLocation(latitude: CLLocationDegrees(latitude), longitude: CLLocationDegrees(longitude))\n        centerMapOnLocation(location: currentLocation)\n        getAmenities()\n    }\n    func centerMapToCurrentLocation(latitude: Double, longitude: Double) {\n        let currentLocation = CLLocation(latitude: CLLocationDegrees(latitude), longitude: CLLocationDegrees(longitude))\n        centerMapOnLocation(location: currentLocation)\n    }\n}\n\nextension ViewController: MKMapViewDelegate {\n    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {\n        guard let annotation = annotation as? Location else {\n            return nil\n        }\n        let identifier = \"marker\"\n        var view: MKMarkerAnnotationView\n        \n        if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)\n            as? MKMarkerAnnotationView {\n            dequeuedView.annotation = annotation\n            view = dequeuedView\n        } else {\n            view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)\n            view.canShowCallout = true\n            view.calloutOffset = CGPoint(x: -5, y: 5)\n            view.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)\n        }\n        return view\n    }\n    func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView,\n                 calloutAccessoryControlTapped control: UIControl) {\n        guard let location = view.annotation as? Location else {\n            return\n        }\n        let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeWalking]\n        location.mapItem().openInMaps(launchOptions: launchOptions)\n    }\n}\n\n\n"
  },
  {
    "path": "LooLocator/ViewModels/AmenityViewModel.swift",
    "content": "//\n//  AmenityViewModel.swift\n//  LooLocator\n//\n//  Created by Sam Khawase on 14.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport CoreLocation\n\nprotocol MapViewModelConfirming {\n    func getCurrentLocation() -> (Double, Double)\n    func getAmenities(in range: Int, type: AmenityType, completion: @escaping (Result<[Location], Error>) -> Void)\n    func centerMapToCurrentLocationAction()\n}\n\nprotocol MapViewModelObservable {\n    // This needs to be supplied by the VM Observer\n    associatedtype Amenity\n    \n    func setCurrentLocation(latitude: Double, longitude: Double)\n    func addAmenityToMap(amenity:Amenity)\n    func centerMapToCurrentLocation(latitude: Double, longitude: Double)\n}\n\nenum AmenityType: String {\n    case Toilets = \"toilets\"\n}\n\n// MapviewModel: Protocol implementation\nclass MapViewModel<S:MapViewModelObservable>: MapViewModelConfirming, LocationObservable {\n\n    var locationProvider: LocationProvidable\n    var amenityRequest: AmenityRequest\n    var listenerView: S\n    \n    // inject the dependencies in ctor\n    init(locationProvider: LocationProvidable, amenityRequest: AmenityRequest, listener: S) {\n        self.locationProvider = locationProvider\n        self.locationProvider.startLocationUpdates()\n        self.amenityRequest = amenityRequest\n        self.listenerView = listener\n        \n        defer {\n            self.locationProvider.setListener(listener: self)\n        }\n    }\n    \n    func getCurrentLocation() -> (Double, Double) {\n        let (lat, lon) = locationProvider.getCurrentLocation()\n        return (lat, lon)\n    }\n    \n    func getAmenities(in range: Int, type: AmenityType, completion: @escaping (Result<[Location], Error>) -> Void) {\n        let (lat, lon) = getCurrentLocation()\n        print(\"latitude: \\(lat) longitude: \\(lon)\")\n        if lat == 0 && lon == 0 {\n            completion(.failure(NSError(domain: \"in.b3rl.loolocator\", code: 666, userInfo: nil)))\n        }\n        amenityRequest.getAmeneties(of: AmenityType.Toilets,\n                                    latitude: lat,\n                                    longitude: lon,\n                                    radius: Double(range)) { result in\n            switch result {\n            case .success(let osmElement):\n                if let locations = osmElement.elements {\n                    completion(.success(locations))\n                }\n            case .failure(let error):\n                completion(.failure(error))\n            }\n        }\n    }\n    \n    // This is a message from the location provider\n    func setCurrentLocation(latitude: Double, longitude: Double) {\n        listenerView.setCurrentLocation(latitude: latitude, longitude: longitude)\n    }\n    func centerMapToCurrentLocationAction() {\n        let currentLocation = getCurrentLocation()\n        listenerView.centerMapToCurrentLocation(latitude: currentLocation.0, longitude: currentLocation.1)\n    }\n}\n"
  },
  {
    "path": "LooLocator.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 52;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t22801B3A2035B0F100D4C2D2 /* LocationMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B392035B0F100D4C2D2 /* LocationMocks.swift */; };\n\t\t22801B3C2035B1E000D4C2D2 /* LocationProvidable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B3B2035B1E000D4C2D2 /* LocationProvidable.swift */; };\n\t\t22801B3E2035B20100D4C2D2 /* LocationManagerConfigurable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B3D2035B20100D4C2D2 /* LocationManagerConfigurable.swift */; };\n\t\t22801B412035B25500D4C2D2 /* CLLocationManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B402035B25500D4C2D2 /* CLLocationManagerExtension.swift */; };\n\t\t22801B552035BEC400D4C2D2 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 22801B532035BEC400D4C2D2 /* LaunchScreen.storyboard */; };\n\t\t22801B562035BEC400D4C2D2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 22801B542035BEC400D4C2D2 /* Main.storyboard */; };\n\t\t22801B5A2035E07800D4C2D2 /* ApiResourceProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B592035E07800D4C2D2 /* ApiResourceProviding.swift */; };\n\t\t22801B5C2035E10C00D4C2D2 /* NetworkRequestProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B5B2035E10B00D4C2D2 /* NetworkRequestProviding.swift */; };\n\t\t22801B5E2035E40A00D4C2D2 /* AmentityResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B5D2035E40A00D4C2D2 /* AmentityResource.swift */; };\n\t\t22801B602035E48200D4C2D2 /* AmenityRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B5F2035E48200D4C2D2 /* AmenityRequest.swift */; };\n\t\t22801B652035E59300D4C2D2 /* NetworkReqeustProvidingExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B642035E59300D4C2D2 /* NetworkReqeustProvidingExtension.swift */; };\n\t\t22801B672036209C00D4C2D2 /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B662036209C00D4C2D2 /* Location.swift */; };\n\t\t22801B692036D9D700D4C2D2 /* AmenityMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B682036D9D700D4C2D2 /* AmenityMocks.swift */; };\n\t\t229B3291203455CA0098E456 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 229B3290203455CA0098E456 /* AppDelegate.swift */; };\n\t\t229B3293203455CA0098E456 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 229B3292203455CA0098E456 /* ViewController.swift */; };\n\t\t229B3298203455CA0098E456 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 229B3297203455CA0098E456 /* Assets.xcassets */; };\n\t\t229B32BA203459660098E456 /* AmenityViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 229B32B9203459660098E456 /* AmenityViewModel.swift */; };\n\t\t229B32BC203460AE0098E456 /* LocationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 229B32BB203460AE0098E456 /* LocationProvider.swift */; };\n\t\t22D1387D20386A2A0077E457 /* ApiClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22D1387C20386A2A0077E457 /* ApiClientTests.swift */; };\n\t\t22D1387F20386D3D0077E457 /* stubbedRepsonse.json in Resources */ = {isa = PBXBuildFile; fileRef = 22D1387E20386D3D0077E457 /* stubbedRepsonse.json */; };\n\t\t22D13882203A19450077E457 /* AmenityRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B5F2035E48200D4C2D2 /* AmenityRequest.swift */; };\n\t\t22D13883203A19FE0077E457 /* LocationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 229B32BB203460AE0098E456 /* LocationProvider.swift */; };\n\t\t22D13884203A19FE0077E457 /* AmentityResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B5D2035E40A00D4C2D2 /* AmentityResource.swift */; };\n\t\t22D13885203A1A040077E457 /* CLLocationManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B402035B25500D4C2D2 /* CLLocationManagerExtension.swift */; };\n\t\t22D13886203A1A040077E457 /* NetworkReqeustProvidingExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B642035E59300D4C2D2 /* NetworkReqeustProvidingExtension.swift */; };\n\t\t22D13887203A1A040077E457 /* LocationProvidable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B3B2035B1E000D4C2D2 /* LocationProvidable.swift */; };\n\t\t22D13888203A1A040077E457 /* LocationManagerConfigurable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B3D2035B20100D4C2D2 /* LocationManagerConfigurable.swift */; };\n\t\t22D13889203A1A040077E457 /* NetworkRequestProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B5B2035E10B00D4C2D2 /* NetworkRequestProviding.swift */; };\n\t\t22D1388A203A1A040077E457 /* ApiResourceProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B592035E07800D4C2D2 /* ApiResourceProviding.swift */; };\n\t\t22D1388C203A1A080077E457 /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22801B662036209C00D4C2D2 /* Location.swift */; };\n\t\t22D1388D203A1A2A0077E457 /* AmenityViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 229B32B9203459660098E456 /* AmenityViewModel.swift */; };\n\t\t22D13890203AD0D30077E457 /* LocationProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 229B32A5203455CA0098E456 /* LocationProviderTests.swift */; };\n\t\t22D13892203C94AB0077E457 /* berlin.gpx in Resources */ = {isa = PBXBuildFile; fileRef = 22D13891203C94AB0077E457 /* berlin.gpx */; };\n\t\t22D13893204022E70077E457 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 229B3292203455CA0098E456 /* ViewController.swift */; };\n\t\t22D13895204023640077E457 /* MockViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22D13894204023640077E457 /* MockViewController.swift */; };\n\t\t22D138972040269C0077E457 /* MapViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22D138962040269C0077E457 /* MapViewModelTests.swift */; };\n\t\t8A048946253F41EA00037931 /* OSMModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A048945253F41EA00037931 /* OSMModelTests.swift */; };\n\t\t8A2413F9253636AD005B7E5C /* Quick in Frameworks */ = {isa = PBXBuildFile; productRef = 8A2413F8253636AD005B7E5C /* Quick */; };\n\t\t8A2413FE253636E2005B7E5C /* Nimble in Frameworks */ = {isa = PBXBuildFile; productRef = 8A2413FD253636E2005B7E5C /* Nimble */; };\n\t\t8A2414032536370D005B7E5C /* OHHTTPStubsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 8A2414022536370D005B7E5C /* OHHTTPStubsSwift */; };\n\t\t8A2414052536370D005B7E5C /* OHHTTPStubs in Frameworks */ = {isa = PBXBuildFile; productRef = 8A2414042536370D005B7E5C /* OHHTTPStubs */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t229B32A2203455CA0098E456 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 229B3285203455C90098E456 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 229B328C203455CA0098E456;\n\t\t\tremoteInfo = LooLocator;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t22801B392035B0F100D4C2D2 /* LocationMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationMocks.swift; sourceTree = \"<group>\"; };\n\t\t22801B3B2035B1E000D4C2D2 /* LocationProvidable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationProvidable.swift; sourceTree = \"<group>\"; };\n\t\t22801B3D2035B20100D4C2D2 /* LocationManagerConfigurable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationManagerConfigurable.swift; sourceTree = \"<group>\"; };\n\t\t22801B402035B25500D4C2D2 /* CLLocationManagerExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CLLocationManagerExtension.swift; sourceTree = \"<group>\"; };\n\t\t22801B532035BEC400D4C2D2 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t22801B542035BEC400D4C2D2 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = \"<group>\"; };\n\t\t22801B592035E07800D4C2D2 /* ApiResourceProviding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiResourceProviding.swift; sourceTree = \"<group>\"; };\n\t\t22801B5B2035E10B00D4C2D2 /* NetworkRequestProviding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkRequestProviding.swift; sourceTree = \"<group>\"; };\n\t\t22801B5D2035E40A00D4C2D2 /* AmentityResource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AmentityResource.swift; sourceTree = \"<group>\"; };\n\t\t22801B5F2035E48200D4C2D2 /* AmenityRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AmenityRequest.swift; sourceTree = \"<group>\"; };\n\t\t22801B642035E59300D4C2D2 /* NetworkReqeustProvidingExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkReqeustProvidingExtension.swift; sourceTree = \"<group>\"; };\n\t\t22801B662036209C00D4C2D2 /* Location.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Location.swift; sourceTree = \"<group>\"; };\n\t\t22801B682036D9D700D4C2D2 /* AmenityMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AmenityMocks.swift; sourceTree = \"<group>\"; };\n\t\t22801B6A2036DF8300D4C2D2 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/iOS/RxSwift.framework; sourceTree = \"<group>\"; };\n\t\t22801B6C2036DFA100D4C2D2 /* RxCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxCocoa.framework; path = Carthage/Build/iOS/RxCocoa.framework; sourceTree = \"<group>\"; };\n\t\t22801B712036DFC800D4C2D2 /* RxTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxTest.framework; path = Carthage/Build/iOS/RxTest.framework; sourceTree = \"<group>\"; };\n\t\t22801B722036DFC800D4C2D2 /* RxBlocking.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxBlocking.framework; path = Carthage/Build/iOS/RxBlocking.framework; sourceTree = \"<group>\"; };\n\t\t229B328D203455CA0098E456 /* LooLocator.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LooLocator.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t229B3290203455CA0098E456 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t229B3292203455CA0098E456 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t229B3297203455CA0098E456 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t229B329C203455CA0098E456 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t229B32A1203455CA0098E456 /* LooLocatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LooLocatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t229B32A5203455CA0098E456 /* LocationProviderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationProviderTests.swift; sourceTree = \"<group>\"; };\n\t\t229B32A7203455CA0098E456 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t229B32B1203457AC0098E456 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/iOS/Nimble.framework; sourceTree = \"<group>\"; };\n\t\t229B32B2203457AC0098E456 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/iOS/Quick.framework; sourceTree = \"<group>\"; };\n\t\t229B32B9203459660098E456 /* AmenityViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AmenityViewModel.swift; sourceTree = \"<group>\"; };\n\t\t229B32BB203460AE0098E456 /* LocationProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationProvider.swift; sourceTree = \"<group>\"; };\n\t\t22D13879203862940077E457 /* OHHTTPStubs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OHHTTPStubs.framework; path = Carthage/Build/iOS/OHHTTPStubs.framework; sourceTree = \"<group>\"; };\n\t\t22D1387C20386A2A0077E457 /* ApiClientTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiClientTests.swift; sourceTree = \"<group>\"; };\n\t\t22D1387E20386D3D0077E457 /* stubbedRepsonse.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = stubbedRepsonse.json; sourceTree = \"<group>\"; };\n\t\t22D13891203C94AB0077E457 /* berlin.gpx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = berlin.gpx; sourceTree = SOURCE_ROOT; };\n\t\t22D13894204023640077E457 /* MockViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockViewController.swift; sourceTree = \"<group>\"; };\n\t\t22D138962040269C0077E457 /* MapViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapViewModelTests.swift; sourceTree = \"<group>\"; };\n\t\t8A048945253F41EA00037931 /* OSMModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSMModelTests.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t229B328A203455CA0098E456 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t229B329E203455CA0098E456 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8A2413F9253636AD005B7E5C /* Quick in Frameworks */,\n\t\t\t\t8A2414032536370D005B7E5C /* OHHTTPStubsSwift in Frameworks */,\n\t\t\t\t8A2413FE253636E2005B7E5C /* Nimble in Frameworks */,\n\t\t\t\t8A2414052536370D005B7E5C /* OHHTTPStubs in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t22801B382035B0E200D4C2D2 /* Mocks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t22801B392035B0F100D4C2D2 /* LocationMocks.swift */,\n\t\t\t\t22801B682036D9D700D4C2D2 /* AmenityMocks.swift */,\n\t\t\t\t22D13894204023640077E457 /* MockViewController.swift */,\n\t\t\t);\n\t\t\tname = Mocks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t22801B462035BA1800D4C2D2 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t22D13891203C94AB0077E457 /* berlin.gpx */,\n\t\t\t\t229B3297203455CA0098E456 /* Assets.xcassets */,\n\t\t\t\t229B329C203455CA0098E456 /* Info.plist */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t22801B4C2035BB9F00D4C2D2 /* Protocols */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t22801B4E2035BBC100D4C2D2 /* Implementations */,\n\t\t\t\t22801B4D2035BBB900D4C2D2 /* Extensions */,\n\t\t\t\t22801B3B2035B1E000D4C2D2 /* LocationProvidable.swift */,\n\t\t\t\t22801B3D2035B20100D4C2D2 /* LocationManagerConfigurable.swift */,\n\t\t\t\t22801B5B2035E10B00D4C2D2 /* NetworkRequestProviding.swift */,\n\t\t\t\t22801B592035E07800D4C2D2 /* ApiResourceProviding.swift */,\n\t\t\t);\n\t\t\tpath = Protocols;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t22801B4D2035BBB900D4C2D2 /* Extensions */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t22801B402035B25500D4C2D2 /* CLLocationManagerExtension.swift */,\n\t\t\t\t22801B642035E59300D4C2D2 /* NetworkReqeustProvidingExtension.swift */,\n\t\t\t);\n\t\t\tpath = Extensions;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t22801B4E2035BBC100D4C2D2 /* Implementations */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t229B32BB203460AE0098E456 /* LocationProvider.swift */,\n\t\t\t\t22801B5D2035E40A00D4C2D2 /* AmentityResource.swift */,\n\t\t\t\t22801B5F2035E48200D4C2D2 /* AmenityRequest.swift */,\n\t\t\t);\n\t\t\tpath = Implementations;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t22801B502035BE1800D4C2D2 /* ViewModels */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t229B32B9203459660098E456 /* AmenityViewModel.swift */,\n\t\t\t);\n\t\t\tpath = ViewModels;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t22801B512035BE2800D4C2D2 /* ViewControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t229B3292203455CA0098E456 /* ViewController.swift */,\n\t\t\t);\n\t\t\tpath = ViewControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t22801B612035E4D500D4C2D2 /* Models */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t22801B662036209C00D4C2D2 /* Location.swift */,\n\t\t\t);\n\t\t\tpath = Models;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t229B3284203455C90098E456 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t229B328F203455CA0098E456 /* LooLocator */,\n\t\t\t\t229B32A4203455CA0098E456 /* LooLocatorTests */,\n\t\t\t\t229B328E203455CA0098E456 /* Products */,\n\t\t\t\t229B32B0203457AC0098E456 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t229B328E203455CA0098E456 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t229B328D203455CA0098E456 /* LooLocator.app */,\n\t\t\t\t229B32A1203455CA0098E456 /* LooLocatorTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t229B328F203455CA0098E456 /* LooLocator */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t22801B612035E4D500D4C2D2 /* Models */,\n\t\t\t\t22801B532035BEC400D4C2D2 /* LaunchScreen.storyboard */,\n\t\t\t\t22801B542035BEC400D4C2D2 /* Main.storyboard */,\n\t\t\t\t229B3290203455CA0098E456 /* AppDelegate.swift */,\n\t\t\t\t22801B502035BE1800D4C2D2 /* ViewModels */,\n\t\t\t\t22801B4C2035BB9F00D4C2D2 /* Protocols */,\n\t\t\t\t22801B462035BA1800D4C2D2 /* Resources */,\n\t\t\t\t22801B512035BE2800D4C2D2 /* ViewControllers */,\n\t\t\t);\n\t\t\tpath = LooLocator;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t229B32A4203455CA0098E456 /* LooLocatorTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t22D1387E20386D3D0077E457 /* stubbedRepsonse.json */,\n\t\t\t\t22801B382035B0E200D4C2D2 /* Mocks */,\n\t\t\t\t229B32A5203455CA0098E456 /* LocationProviderTests.swift */,\n\t\t\t\t229B32A7203455CA0098E456 /* Info.plist */,\n\t\t\t\t22D1387C20386A2A0077E457 /* ApiClientTests.swift */,\n\t\t\t\t22D138962040269C0077E457 /* MapViewModelTests.swift */,\n\t\t\t\t8A048945253F41EA00037931 /* OSMModelTests.swift */,\n\t\t\t);\n\t\t\tpath = LooLocatorTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t229B32B0203457AC0098E456 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t22D13879203862940077E457 /* OHHTTPStubs.framework */,\n\t\t\t\t22801B722036DFC800D4C2D2 /* RxBlocking.framework */,\n\t\t\t\t22801B712036DFC800D4C2D2 /* RxTest.framework */,\n\t\t\t\t22801B6C2036DFA100D4C2D2 /* RxCocoa.framework */,\n\t\t\t\t22801B6A2036DF8300D4C2D2 /* RxSwift.framework */,\n\t\t\t\t229B32B1203457AC0098E456 /* Nimble.framework */,\n\t\t\t\t229B32B2203457AC0098E456 /* Quick.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t229B328C203455CA0098E456 /* LooLocator */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 229B32AA203455CA0098E456 /* Build configuration list for PBXNativeTarget \"LooLocator\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t229B3289203455CA0098E456 /* Sources */,\n\t\t\t\t229B328A203455CA0098E456 /* Frameworks */,\n\t\t\t\t229B328B203455CA0098E456 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = LooLocator;\n\t\t\tproductName = LooLocator;\n\t\t\tproductReference = 229B328D203455CA0098E456 /* LooLocator.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t229B32A0203455CA0098E456 /* LooLocatorTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 229B32AD203455CA0098E456 /* Build configuration list for PBXNativeTarget \"LooLocatorTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t229B329D203455CA0098E456 /* Sources */,\n\t\t\t\t229B329E203455CA0098E456 /* Frameworks */,\n\t\t\t\t229B329F203455CA0098E456 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t229B32A3203455CA0098E456 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = LooLocatorTests;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t8A2413F8253636AD005B7E5C /* Quick */,\n\t\t\t\t8A2413FD253636E2005B7E5C /* Nimble */,\n\t\t\t\t8A2414022536370D005B7E5C /* OHHTTPStubsSwift */,\n\t\t\t\t8A2414042536370D005B7E5C /* OHHTTPStubs */,\n\t\t\t);\n\t\t\tproductName = LooLocatorTests;\n\t\t\tproductReference = 229B32A1203455CA0098E456 /* LooLocatorTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t229B3285203455C90098E456 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0920;\n\t\t\t\tLastUpgradeCheck = 1200;\n\t\t\t\tORGANIZATIONNAME = LooLocator;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t229B328C203455CA0098E456 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.2;\n\t\t\t\t\t\tLastSwiftMigration = 1200;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t229B32A0203455CA0098E456 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.2;\n\t\t\t\t\t\tLastSwiftMigration = 1200;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 229B3288203455C90098E456 /* Build configuration list for PBXProject \"LooLocator\" */;\n\t\t\tcompatibilityVersion = \"Xcode 8.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 229B3284203455C90098E456;\n\t\t\tpackageReferences = (\n\t\t\t\t8A2413F7253636AD005B7E5C /* XCRemoteSwiftPackageReference \"Quick\" */,\n\t\t\t\t8A2413FC253636E2005B7E5C /* XCRemoteSwiftPackageReference \"Nimble\" */,\n\t\t\t\t8A2414012536370D005B7E5C /* XCRemoteSwiftPackageReference \"OHHTTPStubs\" */,\n\t\t\t);\n\t\t\tproductRefGroup = 229B328E203455CA0098E456 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t229B328C203455CA0098E456 /* LooLocator */,\n\t\t\t\t229B32A0203455CA0098E456 /* LooLocatorTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t229B328B203455CA0098E456 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t22801B562035BEC400D4C2D2 /* Main.storyboard in Resources */,\n\t\t\t\t22801B552035BEC400D4C2D2 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t229B3298203455CA0098E456 /* Assets.xcassets in Resources */,\n\t\t\t\t22D13892203C94AB0077E457 /* berlin.gpx in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t229B329F203455CA0098E456 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t22D1387F20386D3D0077E457 /* stubbedRepsonse.json in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t229B3289203455CA0098E456 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t22801B5E2035E40A00D4C2D2 /* AmentityResource.swift in Sources */,\n\t\t\t\t22801B5C2035E10C00D4C2D2 /* NetworkRequestProviding.swift in Sources */,\n\t\t\t\t229B3293203455CA0098E456 /* ViewController.swift in Sources */,\n\t\t\t\t22801B3E2035B20100D4C2D2 /* LocationManagerConfigurable.swift in Sources */,\n\t\t\t\t229B32BC203460AE0098E456 /* LocationProvider.swift in Sources */,\n\t\t\t\t22801B672036209C00D4C2D2 /* Location.swift in Sources */,\n\t\t\t\t229B3291203455CA0098E456 /* AppDelegate.swift in Sources */,\n\t\t\t\t22801B5A2035E07800D4C2D2 /* ApiResourceProviding.swift in Sources */,\n\t\t\t\t22801B652035E59300D4C2D2 /* NetworkReqeustProvidingExtension.swift in Sources */,\n\t\t\t\t229B32BA203459660098E456 /* AmenityViewModel.swift in Sources */,\n\t\t\t\t22801B3C2035B1E000D4C2D2 /* LocationProvidable.swift in Sources */,\n\t\t\t\t22801B602035E48200D4C2D2 /* AmenityRequest.swift in Sources */,\n\t\t\t\t22801B412035B25500D4C2D2 /* CLLocationManagerExtension.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t229B329D203455CA0098E456 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t22D13890203AD0D30077E457 /* LocationProviderTests.swift in Sources */,\n\t\t\t\t22801B3A2035B0F100D4C2D2 /* LocationMocks.swift in Sources */,\n\t\t\t\t22D1388D203A1A2A0077E457 /* AmenityViewModel.swift in Sources */,\n\t\t\t\t22D138972040269C0077E457 /* MapViewModelTests.swift in Sources */,\n\t\t\t\t22D13886203A1A040077E457 /* NetworkReqeustProvidingExtension.swift in Sources */,\n\t\t\t\t22D1388C203A1A080077E457 /* Location.swift in Sources */,\n\t\t\t\t22D13889203A1A040077E457 /* NetworkRequestProviding.swift in Sources */,\n\t\t\t\t22D13887203A1A040077E457 /* LocationProvidable.swift in Sources */,\n\t\t\t\t22D1388A203A1A040077E457 /* ApiResourceProviding.swift in Sources */,\n\t\t\t\t22801B692036D9D700D4C2D2 /* AmenityMocks.swift in Sources */,\n\t\t\t\t22D1387D20386A2A0077E457 /* ApiClientTests.swift in Sources */,\n\t\t\t\t22D13884203A19FE0077E457 /* AmentityResource.swift in Sources */,\n\t\t\t\t22D13893204022E70077E457 /* ViewController.swift in Sources */,\n\t\t\t\t22D13895204023640077E457 /* MockViewController.swift in Sources */,\n\t\t\t\t22D13888203A1A040077E457 /* LocationManagerConfigurable.swift in Sources */,\n\t\t\t\t22D13882203A19450077E457 /* AmenityRequest.swift in Sources */,\n\t\t\t\t8A048946253F41EA00037931 /* OSMModelTests.swift in Sources */,\n\t\t\t\t22D13883203A19FE0077E457 /* LocationProvider.swift in Sources */,\n\t\t\t\t22D13885203A1A040077E457 /* CLLocationManagerExtension.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t229B32A3203455CA0098E456 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 229B328C203455CA0098E456 /* LooLocator */;\n\t\t\ttargetProxy = 229B32A2203455CA0098E456 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t229B32A8203455CA0098E456 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t229B32A9203455CA0098E456 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t229B32AB203455CA0098E456 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = CWXKC246LH;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = LooLocator/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.sam.LooLocator;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t229B32AC203455CA0098E456 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = CWXKC246LH;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = LooLocator/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.sam.LooLocator;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t229B32AE203455CA0098E456 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = CWXKC246LH;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = LooLocatorTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.sam.LooLocatorTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t229B32AF203455CA0098E456 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = CWXKC246LH;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = LooLocatorTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.sam.LooLocatorTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t229B3288203455C90098E456 /* Build configuration list for PBXProject \"LooLocator\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t229B32A8203455CA0098E456 /* Debug */,\n\t\t\t\t229B32A9203455CA0098E456 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t229B32AA203455CA0098E456 /* Build configuration list for PBXNativeTarget \"LooLocator\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t229B32AB203455CA0098E456 /* Debug */,\n\t\t\t\t229B32AC203455CA0098E456 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t229B32AD203455CA0098E456 /* Build configuration list for PBXNativeTarget \"LooLocatorTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t229B32AE203455CA0098E456 /* Debug */,\n\t\t\t\t229B32AF203455CA0098E456 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCRemoteSwiftPackageReference section */\n\t\t8A2413F7253636AD005B7E5C /* XCRemoteSwiftPackageReference \"Quick\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/Quick/Quick.git\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 3.0.0;\n\t\t\t};\n\t\t};\n\t\t8A2413FC253636E2005B7E5C /* XCRemoteSwiftPackageReference \"Nimble\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/Quick/Nimble.git\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 9.0.0;\n\t\t\t};\n\t\t};\n\t\t8A2414012536370D005B7E5C /* XCRemoteSwiftPackageReference \"OHHTTPStubs\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/AliSoftware/OHHTTPStubs.git\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 9.0.0;\n\t\t\t};\n\t\t};\n/* End XCRemoteSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t8A2413F8253636AD005B7E5C /* Quick */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 8A2413F7253636AD005B7E5C /* XCRemoteSwiftPackageReference \"Quick\" */;\n\t\t\tproductName = Quick;\n\t\t};\n\t\t8A2413FD253636E2005B7E5C /* Nimble */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 8A2413FC253636E2005B7E5C /* XCRemoteSwiftPackageReference \"Nimble\" */;\n\t\t\tproductName = Nimble;\n\t\t};\n\t\t8A2414022536370D005B7E5C /* OHHTTPStubsSwift */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 8A2414012536370D005B7E5C /* XCRemoteSwiftPackageReference \"OHHTTPStubs\" */;\n\t\t\tproductName = OHHTTPStubsSwift;\n\t\t};\n\t\t8A2414042536370D005B7E5C /* OHHTTPStubs */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = 8A2414012536370D005B7E5C /* XCRemoteSwiftPackageReference \"OHHTTPStubs\" */;\n\t\t\tproductName = OHHTTPStubs;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 229B3285203455C90098E456 /* Project object */;\n}\n"
  },
  {
    "path": "LooLocator.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "LooLocator.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "LooLocator.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
    "content": "{\n  \"object\": {\n    \"pins\": [\n      {\n        \"package\": \"CwlCatchException\",\n        \"repositoryURL\": \"https://github.com/mattgallagher/CwlCatchException.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"f809deb30dc5c9d9b78c872e553261a61177721a\",\n          \"version\": \"2.0.0\"\n        }\n      },\n      {\n        \"package\": \"CwlPreconditionTesting\",\n        \"repositoryURL\": \"https://github.com/mattgallagher/CwlPreconditionTesting.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"02b7a39a99c4da27abe03cab2053a9034379639f\",\n          \"version\": \"2.0.0\"\n        }\n      },\n      {\n        \"package\": \"Nimble\",\n        \"repositoryURL\": \"https://github.com/Quick/Nimble.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"e491a6731307bb23783bf664d003be9b2fa59ab5\",\n          \"version\": \"9.0.0\"\n        }\n      },\n      {\n        \"package\": \"OHHTTPStubs\",\n        \"repositoryURL\": \"https://github.com/AliSoftware/OHHTTPStubs.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"e92b5a5746ef16add2a1424f1fc19529d9a75cde\",\n          \"version\": \"9.0.0\"\n        }\n      },\n      {\n        \"package\": \"Quick\",\n        \"repositoryURL\": \"https://github.com/Quick/Quick.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"0038bcbab4292f3b028632556507c124e5ba69f3\",\n          \"version\": \"3.0.0\"\n        }\n      }\n    ]\n  },\n  \"version\": 1\n}\n"
  },
  {
    "path": "LooLocator.xcodeproj/xcshareddata/xcschemes/LooLocator.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1200\"\n   version = \"1.7\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"229B328C203455CA0098E456\"\n               BuildableName = \"LooLocator.app\"\n               BlueprintName = \"LooLocator\"\n               ReferencedContainer = \"container:LooLocator.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"229B328C203455CA0098E456\"\n            BuildableName = \"LooLocator.app\"\n            BlueprintName = \"LooLocator\"\n            ReferencedContainer = \"container:LooLocator.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"229B32A0203455CA0098E456\"\n               BuildableName = \"LooLocatorTests.xctest\"\n               BlueprintName = \"LooLocatorTests\"\n               ReferencedContainer = \"container:LooLocator.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"229B328C203455CA0098E456\"\n            BuildableName = \"LooLocator.app\"\n            BlueprintName = \"LooLocator\"\n            ReferencedContainer = \"container:LooLocator.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <LocationScenarioReference\n         identifier = \"../../berlin.gpx\"\n         referenceType = \"0\">\n      </LocationScenarioReference>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"229B328C203455CA0098E456\"\n            BuildableName = \"LooLocator.app\"\n            BlueprintName = \"LooLocator\"\n            ReferencedContainer = \"container:LooLocator.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "LooLocatorTests/AmenityMocks.swift",
    "content": "//\n//  AmenityMocks.swift\n//  LooLocatorTests\n//\n//  Created by Sam Khawase on 16.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport Foundation\n\nclass MockAmenityRequest: AmenityRequest {\n    override func getAmeneties(of type: AmenityType,\n                               latitude: Double,\n                               longitude: Double,\n                               radius: Double,\n                               completionBlock: @escaping (Result<AmenityRequest.SerializedType, Error>) -> Void) {\n        let jsonDecoder = JSONDecoder()\n        if let jsonData = \"\"\"\n            {\n                \"elements\": [\n                             {\n                                 \"type\": \"node\",\n                                 \"id\": 66917214,\n                                 \"lat\": 52.5168607,\n                                 \"lon\": 13.3829509,\n                                 \"tags\": {\n                                     \"amenity\": \"toilets\",\n                                     \"fee\": \"yes\",\n                                     \"name\": \"City Toilette\",\n                                     \"toilets:wheelchair\": \"yes\",\n                                     \"wheelchair\": \"yes\"\n                                }\n                            }\n                    ]\n            }\n            \"\"\".data(using: .utf8),\n           let dummyOSMData = try? jsonDecoder.decode(OSMData.self, from: jsonData) {\n            completionBlock(.success(dummyOSMData))\n        }\n    }\n}\n"
  },
  {
    "path": "LooLocatorTests/AmenityRequestTests.swift",
    "content": "//\n//  AmenityRequestTests.swift\n//  LooLocatorTests\n//\n//  Created by Sam Khawase on 17.02.18.\n//  Copyright © 2018 LooLocator. All rights reserved.\n//\n\nimport XCTest\nimport OHHTTPStubs\n\n//@testable import LooLocator\n\nclass AmenityRequestTests: XCTestCase {\n    \n    override func setUp() {\n        super.setUp()\n        let testHost = \"overpass-api.de\"\n        stub(condition: isHost(testHost), response: { _ in\n            guard let path = OHPathForFile(\"stubbedRepsonse.json\", type(of: self)) else {\n                preconditionFailure(\"Could not find expected file in test bundle\")\n            }\n            return fixture(filePath: path, status: 200, headers: [\"Content-Type\":\"application/json\"])\n        })\n    }\n    \n    override func tearDown() {\n        super.tearDown()\n        OHHTTPStubs.removeAllStubs()\n    }\n    \n    func testExample() {\n        // This is an example of a functional test case.\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n        let amenityReqeust = AmenityRequest()\n        \n        let expectation = self.expectation(description: \"calls the callback with a resource object\")\n        \n        var successFlag = false\n        var locations: [Location] = []\n        let timeout = 1.0\n        amenityReqeust.getAmeneties(of: AmenityType.Toilets,\n                                    latitude: 52.51631,\n                                    longitude: 13.37777,\n                                    radius: 1000,\n                                    completionBlock: { (success, results) in\n                                        print(\"success is \\(success)\")\n                                        successFlag = success\n                                        if successFlag, let results = results as? [Location] {\n                                            locations = results\n                                            expectation.fulfill()\n                                        }\n        })\n        self.waitForExpectations(timeout: timeout) { err in\n            XCTAssertNotNil(locations, \"Received data should not be nil\")\n        }\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "LooLocatorTests/ApiClientTests.swift",
    "content": "//\n//  ApiClientTests.swift\n//  LooLocatorTests\n//\n//  Created by Sam Khawase on 17.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport XCTest\nimport Quick\nimport Nimble\nimport CoreLocation\nimport OHHTTPStubs\nimport OHHTTPStubsSwift\n\n\nclass ApiClientTests: QuickSpec {\n    override func spec() {\n        describe(\"Amenity Request tests\") {\n            let amenityReqeust = AmenityRequest()\n            \n            beforeEach {\n                let testHost = \"overpass-api.de\"\n                stub(condition: isHost(testHost), response: { _ in\n                    guard let path = OHPathForFile(\"stubbedRepsonse.json\", type(of: self)) else {\n                        preconditionFailure(\"Could not find expected file in test bundle\")\n                    }\n                    return fixture(filePath: path, status: 200, headers: [\"Content-Type\":\"application/json\"])\n                })\n            }\n            afterEach {\n                HTTPStubs.removeAllStubs()\n            }\n            \n            it(\"should fetch amenities\", closure: {\n                // Arrange\n                var successFlag = false\n                var locations: [Location] = []\n                // Act\n                amenityReqeust.getAmeneties(of: AmenityType.Toilets,\n                                            latitude: 52.51631,\n                                            longitude: 13.37777,\n                                            radius: 1000) { result in\n                    switch result {\n                        case .success(let osmData):\n                            successFlag = true\n                            if let results = osmData.elements {\n                                locations = results\n                            }\n                            break\n                    case .failure( _):\n                        successFlag = false\n                        break\n                    }\n                }\n                //Assert\n                expect(successFlag).toEventuallyNot(beFalse())\n                expect(locations).toEventuallyNot(beEmpty())\n                \n                expect(locations.first?.id).toEventuallyNot(equal(0))\n                expect(locations.first?.coordinates.0).toEventuallyNot(equal(0))\n                expect(locations.first?.coordinates.1).toEventuallyNot(equal(0))\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "LooLocatorTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>\n\t<string>We need this information to locate you on the map, in order to find the amenities near you</string>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string>We need this information to locate you on the map, in order to find the amenities near you</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "LooLocatorTests/LocationMocks.swift",
    "content": "//\n//  LocationMocks.swift\n//  LooLocatorTests\n//\n//  Created by Sam Khawase on 15.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport MapKit\n\nclass MockLocationProvider: LocationProvidable {\n    var listener: LocationObservable?\n    \n    func setListener(listener: LocationObservable) {\n        self.listener = listener\n    }\n\n    func startLocationUpdates() {\n        listener?.setCurrentLocation(latitude: 52.51631, longitude: 13.37777)\n    }\n    \n    func getCurrentLocation() -> (Double, Double) {\n        return (52.51631, 13.37777)\n    }\n}\nclass MockLocationObservable: LocationObservable {\n    internal var coordinates: (Double, Double)?\n    func setCurrentLocation(latitude: Double, longitude: Double) {\n        coordinates = (latitude, longitude)\n    }\n}\n\nclass MockLocationManager: LocationManagerConfigurable {\n    internal var callCount = 0\n    fileprivate var delegate: LocationProvider?\n    \n    func setDelegate(to instance: CLLocationManagerDelegate?) {\n        callCount += 1\n        delegate = instance as? LocationProvider\n    }\n    \n    func setDesiredAccuracy(to accuracy: Double) {\n        callCount += 1\n    }\n    \n    func requestAlwaysAuthorization() {\n        callCount += 1\n    }\n    func startUpdatingLocation() {\n        callCount += 1\n        updateLocation()\n    }\n    func updateLocation() {\n        let mockLocation = CLLocation(latitude: CLLocationDegrees(52.51631), longitude: CLLocationDegrees(13.37777))\n        let mockLocationManager = CLLocationManager()\n        delegate?.locationManager(mockLocationManager, didUpdateLocations: [mockLocation])\n    }\n}\n"
  },
  {
    "path": "LooLocatorTests/LocationProviderTests.swift",
    "content": "//\n//  LooLocatorTests.swift\n//  LooLocatorTests\n//\n//  Created by Sam Khawase on 14.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport XCTest\nimport Quick\nimport Nimble\n\nclass LocationProviderTests: QuickSpec {\n    override func spec() {\n        describe(\"Given a LocationProvider\") {\n            context(\"When it's started with LocationManager\", closure: {\n                // Arrange\n                let mockLocationManager = MockLocationManager()\n                let mockLocationObservable = MockLocationObservable()\n                let locationProvider: LocationProvidable = LocationProvider(locationManager: mockLocationManager)\n                beforeEach {\n                    mockLocationManager.callCount = 0\n                    // Arrange\n                    locationProvider.setListener(listener: mockLocationObservable)\n                    //Act\n                    locationProvider.startLocationUpdates()\n                }\n                it(\"then starts location updates\", closure: {\n                    //Assert\n                    expect(mockLocationManager.callCount).toEventually(equal(4))\n                    expect(mockLocationObservable.coordinates).toEventuallyNot(beNil())\n                    expect(mockLocationObservable.coordinates?.0).toEventually(equal(52.51631))\n                    expect(mockLocationObservable.coordinates?.1).toEventually(equal(13.37777))\n                })\n                \n                it(\"then provides current location\", closure: {                    \n                    // Act\n                    let (lat, lon) = locationProvider.getCurrentLocation()\n                    //Assert\n                    expect(lat).to(equal(52.51631))\n                    expect(lon).to(equal(13.37777))\n                })\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "LooLocatorTests/MapViewModelTests.swift",
    "content": "//\n//  MapViewModelTests.swift\n//  LooLocatorTests\n//\n//  Created by Sam Khawase on 23.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport XCTest\nimport Quick\nimport Nimble\nimport CoreLocation\nimport OHHTTPStubs\n\nclass MapViewModelTests: QuickSpec {\n    override func spec() {\n        describe(\"Given a MapViewModel\") {\n            var viewModel: MapViewModel<MockViewController>?\n            beforeEach {\n                let mockLocationProvider = MockLocationProvider()\n                let mockAmenityRequest = MockAmenityRequest()\n                let mockViewController = MockViewController()\n                viewModel = MapViewModel(locationProvider: mockLocationProvider,\n                                         amenityRequest:mockAmenityRequest,\n                                         listener:mockViewController)\n            }\n            \n            it(\"get current location\", closure: {\n                if let (lat, lon) = viewModel?.getCurrentLocation() {\n                    expect(lat).to(equal(52.51631))\n                    expect(lon).to(equal(13.37777))\n                }\n            })\n            it(\"should get all amenities in range\", closure: {\n                var successFlag = false\n                var locations: [Location] = []\n                viewModel?.getAmenities(in: 1000, type: AmenityType.Toilets) { result in\n                    switch result {\n                    case .success(let _locations):\n                        locations = _locations\n                        successFlag = true\n                    case .failure(_):\n                        successFlag = false\n                    }\n                }\n                //Assert\n                expect(successFlag).toEventuallyNot(beFalse())\n                expect(locations).toEventuallyNot(beEmpty())\n                \n                expect(locations.first?.id).toEventually(equal(66917214))\n                expect(locations.first?.title).toEventually(equal(\"City Toilette\"))\n                \n                expect(locations.first?.coordinates.0).toEventually(equal(52.5168607))\n                expect(locations.first?.coordinates.1).toEventually(equal(13.3829509))\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "LooLocatorTests/MockViewController.swift",
    "content": "//\n//  MockViewController.swift\n//  LooLocatorTests\n//\n//  Created by Sam Khawase on 23.02.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport Foundation\n\nclass MockViewController: MapViewModelObservable {\n    func centerMapToCurrentLocation(latitude: Double, longitude: Double) {\n        \n    }\n    \n    func setCurrentLocation(latitude: Double, longitude: Double) {}\n    func addAmenityToMap(amenity: Location) {}\n    typealias Amenity = Location\n}\n"
  },
  {
    "path": "LooLocatorTests/OSMModelTests.swift",
    "content": "//\n//  OSMModelTests.swift\n//  LooLocatorTests\n//\n//  Created by Sam Khawase on 20.10.20.\n//  Copyright © 2020 LooLocator. All rights reserved.\n//\n\nimport Foundation\nimport Quick\nimport Nimble\n\nclass OSMModelTests: QuickSpec {\n    override func spec() {\n        var jsonData: Data?\n        beforeEach {\n            let currentBundle = Bundle(for: type(of: self))\n            guard let fileURL = currentBundle.url(forResource: \"stubbedRepsonse\", withExtension: \"json\"),\n                  let fileContents = try? String(contentsOf: fileURL),\n                  let _jsonData = fileContents.data(using: .utf8)\n            else {\n                preconditionFailure(\"Could not find expected file in test bundle\")\n            }\n            jsonData = _jsonData\n        }\n        context(\"Given a JSON data set\") {\n            describe(\"When loading data from json\") {\n                it(\"should parse the json to Location Model correctly\") {\n                    // Arrange\n                    let decoder = JSONDecoder()\n                    // Act\n                    let locations = try? decoder.decode(OSMData.self, from: jsonData!)\n                    // Assert\n                    expect(locations).toNot(beNil())\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "LooLocatorTests/stubbedRepsonse.json",
    "content": "{\n    \"version\": 0.6,\n    \"generator\": \"Overpass API 0.7.54.12 054bb0bb\",\n    \"osm3s\": {\n        \"timestamp_osm_base\": \"2018-02-18T20:06:02Z\",\n        \"copyright\": \"The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.\"\n    },\n    \"elements\": [\n                 {\n                 \"type\": \"node\",\n                 \"id\": 66917214,\n                 \"lat\": 52.5168607,\n                 \"lon\": 13.3829509,\n                 \"tags\": {\n                 \"amenity\": \"toilets\",\n                 \"fee\": \"yes\",\n                 \"name\": \"City Toilette\",\n                 \"toilets:wheelchair\": \"yes\",\n                 \"wheelchair\": \"yes\"\n                 }\n                 },\n                 {\n                 \"type\": \"node\",\n                 \"id\": 71180687,\n                 \"lat\": 52.5175448,\n                 \"lon\": 13.3738695,\n                 \"tags\": {\n                 \"amenity\": \"toilets\",\n                 \"fee\": \"yes\",\n                 \"toilets:wheelchair\": \"yes\",\n                 \"wheelchair\": \"yes\",\n                 \"wheelchair:description\": \"Euro-Schlüssel notwendig\"\n                 }\n                 },\n                 {\n                 \"type\": \"node\",\n                 \"id\": 304575905,\n                 \"lat\": 52.5163769,\n                 \"lon\": 13.3755227,\n                 \"tags\": {\n                 \"amenity\": \"toilets\",\n                 \"fee\": \"yes\",\n                 \"name\": \"City Toilette\",\n                 \"opening_hours\": \"24/7\",\n                 \"toilets:wheelchair\": \"yes\",\n                 \"wheelchair\": \"yes\"\n                 }\n                 },\n                 {\n                 \"type\": \"node\",\n                 \"id\": 599913127,\n                 \"lat\": 52.5081387,\n                 \"lon\": 13.3744541,\n                 \"tags\": {\n                 \"amenity\": \"toilets\",\n                 \"layer\": \"-1\",\n                 \"operator\": \"unknown\",\n                 \"wheelchair\": \"yes\"\n                 }\n                 },\n                 {\n                 \"type\": \"node\",\n                 \"id\": 927092067,\n                 \"lat\": 52.5141833,\n                 \"lon\": 13.3914532,\n                 \"tags\": {\n                 \"amenity\": \"toilets\",\n                 \"centralkey\": \"eurokey\",\n                 \"fee\": \"yes\",\n                 \"name\": \"City Toilette\",\n                 \"opening_hours\": \"24/7\",\n                 \"operator\": \"Wall\",\n                 \"toilets:wheelchair\": \"yes\",\n                 \"wheelchair\": \"yes\",\n                 \"wheelchair:description\": \"Wall City Toilette\"\n                 }\n                 },\n                 {\n                 \"type\": \"node\",\n                 \"id\": 1453830466,\n                 \"lat\": 52.5226503,\n                 \"lon\": 13.3720210,\n                 \"tags\": {\n                 \"amenity\": \"toilets\",\n                 \"wheelchair\": \"no\"\n                 }\n                 },\n                 {\n                 \"type\": \"node\",\n                 \"id\": 1453886966,\n                 \"lat\": 52.5225436,\n                 \"lon\": 13.3708178,\n                 \"tags\": {\n                 \"amenity\": \"toilets\",\n                 \"wheelchair\": \"no\"\n                 }\n                 },\n                 {\n                 \"type\": \"node\",\n                 \"id\": 2351691628,\n                 \"lat\": 52.5165754,\n                 \"lon\": 13.3811272,\n                 \"tags\": {\n                 \"amenity\": \"toilets\",\n                 \"fee\": \"yes\",\n                 \"name\": \"City Toilette\",\n                 \"toilets:wheelchair\": \"yes\",\n                 \"wheelchair\": \"yes\"\n                 }\n                 },\n                 {\n                 \"type\": \"node\",\n                 \"id\": 2378807163,\n                 \"lat\": 52.5207250,\n                 \"lon\": 13.3875590,\n                 \"tags\": {\n                 \"amenity\": \"toilets\",\n                 \"diaper\": \"yes\",\n                 \"fee\": \"yes\",\n                 \"female\": \"yes\",\n                 \"male\": \"yes\",\n                 \"name\": \"Bahnhof Friedrichstraße\",\n                 \"opening_hours\": \"24/7\",\n                 \"wheelchair\": \"yes\"\n                 }\n                 },\n                 {\n                 \"type\": \"node\",\n                 \"id\": 3338458355,\n                 \"lat\": 52.5106351,\n                 \"lon\": 13.3830226,\n                 \"tags\": {\n                 \"access\": \"customers\",\n                 \"amenity\": \"toilets\",\n                 \"fee\": \"yes\",\n                 \"toilets:disposal\": \"flush\",\n                 \"toilets:position\": \"seated\",\n                 \"wheelchair\": \"yes\"\n                 }\n                 },\n                 {\n                 \"type\": \"node\",\n                 \"id\": 3338459657,\n                 \"lat\": 52.5183901,\n                 \"lon\": 13.3890855,\n                 \"tags\": {\n                 \"access\": \"customers\",\n                 \"amenity\": \"toilets\",\n                 \"fee\": \"no\",\n                 \"toilets:disposal\": \"flush\",\n                 \"toilets:position\": \"seated\",\n                 \"wheelchair\": \"yes\"\n                 }\n                 },\n                 {\n                 \"type\": \"node\",\n                 \"id\": 4003667897,\n                 \"lat\": 52.5203163,\n                 \"lon\": 13.3876880,\n                 \"tags\": {\n                 \"access\": \"public\",\n                 \"amenity\": \"toilets\",\n                 \"fee\": \"yes\",\n                 \"indoor\": \"yes\",\n                 \"level\": \"-1\",\n                 \"operator\": \"Sanifair\",\n                 \"wheelchair\": \"yes\"\n                 }\n                 },\n                 {\n                 \"type\": \"node\",\n                 \"id\": 5022093422,\n                 \"lat\": 52.5191343,\n                 \"lon\": 13.3646383,\n                 \"tags\": {\n                 \"amenity\": \"toilets\"\n                 }\n                 }\n                 ]\n}\n"
  },
  {
    "path": "README.md",
    "content": "\n# LooLocator\n\nFind Amenities (*like toilets*) near you! The simple iOS  fetches the crowd-sourced data from OpenStreetMap, and shows toilets within walking distance. \nUser can then use AppleMaps to find walking directions to the amenity. \n\n## Design Rationale\n\nThe following series of bite-sized posts explain the design rationale behind creating the app:\n\n1. [Part 1: Introduction - Writing a modular, and testable iOS App in Swift using MVVM pattern](https://samkhawase.com/blog/mvvm_swift_introduction/)\n2. [Part 2: Defining the Data Model](https://samkhawase.com/blog/mvvm_swift_model/)\n3. [Part 3: The Location provider](https://samkhawase.com/blog/mvvm_swift_location_provider/)\n4. [Part 4: Defining the networking layer](https://samkhawase.com/blog/mvvm_swift_networking/)\n5. [Part 5: The ViewModel](https://samkhawase.com/blog/mvvm_swift_view_model/)\n6. [Part 6: The Final App - Putting it all together](https://samkhawase.com/blog/mvvm_swift_final_app/)\n\n\n\n## Getting Started\n\nHere are the steps to get started with the project on your local machine:\n1. Clone the git repositiory\n2. Run `carthage update --platform iOS --cache-builds --no-use-binaries` to fetch the dependencies.\n3. If running on the simulator, you can edit the scheme and set the simulated location in Xcode. (*E.g. Hongkong*)\n4. Run the project via Xcode.\n\n### Prerequisites\n\nWhat things you need to install the software and how to install them\n\n1. Mac OS X\n2. Xcode 9\n3. [Carthage](https://github.com/Carthage/Carthage) \n4. Optional: [xcpretty](https://github.com/supermarin/xcpretty)\n\n## Running the tests\n\nThe app uses BDD style tests using Quick and Nimble. There are unit tests written to test the LocationManager, APIClient (*with Network mocks*), and ViewModel behaviors. \nTo run the test, enter the command on the command line.\n\n```\nxcodebuild -scheme 'LooLocator' \\\n\t\t\t-sdk iphonesimulator \\\n\t\t\t-configuration Debug \\\n\t\t\t-destination 'platform=iOS Simulator,name=iPhone 6s,OS=latest' \\\n\t\t\ttest | xcpretty\n```\n\nThe output will be similar to \n\n```\nTest Suite LooLocatorTests.xctest started\nApiClientTests\n    ✓ Amenity_Request_tests__should_fetch_amenities (0.027 seconds)\nLocationProviderTests\n    ✓ Given_a_LocationProvider__When_it_s_started_with_LocationManager__then_starts_location_updates (1.547 seconds)\n    ✓ Given_a_LocationProvider__When_it_s_started_with_LocationManager__then_provides_current_location (0.001 seconds)\nMapViewModelTests\n    ✓ Given_a_MapViewModel__get_current_location (0.002 seconds)\n    ✓ Given_a_MapViewModel__should_get_all_amenities_in_range (0.004 seconds)\n``` \n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details\n\n## Acknowledgments\n\n* This project is inspired by the MapKit article from [RayWenderlich](https://www.raywenderlich.com/160517/mapkit-tutorial-getting-started)\n* The [Overpass Turbo API](https://overpass-turbo.eu/)\n\n"
  },
  {
    "path": "berlin.gpx",
    "content": "<?xml version=\"1.0\"?>\n<gpx version=\"1.1\" creator=\"gpxgenerator.com\">\n<wpt lat=\"52.516327366345344\" lon=\"13.378034122288227\">\n    <ele>34.65</ele>\n    <time>2017-08-10T13:15:24Z</time>\n</wpt>\n</gpx>"
  }
]