[
  {
    "path": ".gitignore",
    "content": "Sample app/TableViewPrototype.xcodeproj/project.xcworkspace/xcuserdata\n"
  },
  {
    "path": "Classes/RLDHandledViewProtocol.swift",
    "content": "import UIKit\n\npublic protocol RLDHandledViewProtocol:class {\n    var eventHandler:RLDTableViewEventHandler? {get set}\n}"
  },
  {
    "path": "Classes/RLDTableViewController.swift",
    "content": "import UIKit\nimport RLDTableViewSwift\n\n// MARK: UIView extension to find the first responder\n\nprivate extension UIView {\n    private weak static var _firstResponder:UIView?\n    \n    class func rld_firstResponder() -> UIView? {\n        UIApplication.sharedApplication().sendAction(Selector(\"setFirstResponder\"), to:nil, from:nil, forEvent:nil)\n        return _firstResponder\n    }\n    \n    func setFirstResponder() {\n        UIView._firstResponder = self\n    }\n}\n\n// MARK: UITableView extension to scroll to the first responder cell\n\nprivate extension UITableView {\n    func scrollToFirstResponder(animated:Bool) {\n        if let firstResponder = UIView.rld_firstResponder() {\n            let firstResponderFrame = firstResponder.convertRect(firstResponder.bounds, toView:self)\n            self.scrollRectToVisible(firstResponderFrame, animated:animated)\n        }\n    }\n}\n\n// MARK: UITableView extension to know wether multiple selection is enabled\n\nprivate extension UITableView {\n    var multipleSelectionModeEnabled: Bool {\n        return (self.editing\n            ? self.allowsMultipleSelectionDuringEditing\n            : self.allowsMultipleSelection)\n    }\n}\n\n// MARK: RLDTableViewController class\n\npublic class RLDTableViewController:UIViewController {\n    \n    // MARK: Initialization\n    required public init(style: UITableViewStyle) {\n        super.init(nibName:nil, bundle:nil)\n        tableView = UITableView(frame:CGRectZero, style:style)\n    }\n    \n    required public init?(coder aDecoder: NSCoder) {\n        super.init(coder:aDecoder)\n    }\n    \n    // MARK: Data source and delegate configuration\n    private var tableViewDataSource:RLDTableViewDataSource?\n    private var tableViewDelegate:RLDTableViewDelegate?\n    \n    public var tableViewModel:RLDTableViewModel? {\n        didSet {\n            if let tableViewModel = tableViewModel {\n                tableViewDataSource = RLDTableViewDataSource(tableViewModel:tableViewModel)\n                tableViewDelegate = RLDTableViewDelegate(tableViewModel:tableViewModel)\n                \n                tableView?.dataSource = tableViewDataSource\n                tableView?.delegate = tableViewDelegate\n                tableView?.reloadData()\n            }\n        }\n    }\n    \n    // MARK: View management\n    lazy public var tableView: UITableView? = {\n        return UITableView(frame:CGRectZero)\n        }()\n    \n    override public var view: UIView! {\n        get {\n            return super.view\n        }\n        set {\n            if let tableView = newValue as? UITableView {\n                self.tableView = tableView\n                super.view = tableView\n            } else {\n                fatalError(\"The view must be an UITableView\")\n            }\n        }\n    }\n    \n    var clearsSelectionOnViewWillAppear: Bool = true\n    var refreshControl: UIRefreshControl? {\n        didSet {\n            if let refreshControl = refreshControl {\n                self.tableView!.insertSubview(refreshControl, atIndex:0)\n            }\n        }\n    }\n    \n    override public func viewWillAppear(animated:Bool) {\n        startObservingKeyboardNotifications()\n        \n        if clearsSelectionOnViewWillAppear {\n            clearTableViewSelection(animated)\n        }\n        \n        super.viewWillAppear(animated)\n    }\n    \n    override public func viewWillDisappear(animated:Bool) {\n        super.viewWillDisappear(animated)\n        \n        stopObservingKeyboardNotifications()\n    }\n    \n    override public func viewDidAppear(animated:Bool) {\n        super.viewDidAppear(animated)\n        \n        tableView!.flashScrollIndicators()\n    }\n    \n    override public func setEditing(editing:Bool, animated:Bool) {\n        super.setEditing(editing, animated:animated)\n        \n        tableView!.setEditing(editing, animated:animated)\n    }\n    \n    // MARK: Keyboard notifications handling\n    private func startObservingKeyboardNotifications() {\n        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(RLDTableViewController.keyboardWillShowWithKeyboardChangeNotification(_:)), name:UIKeyboardWillShowNotification, object: nil)\n        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(RLDTableViewController.keyboardWillHideWithKeyboardChangeNotification(_:)), name:UIKeyboardWillHideNotification, object: nil)\n    }\n    \n    private func stopObservingKeyboardNotifications() {\n        NSNotificationCenter.defaultCenter().removeObserver(self)\n    }\n    \n    func keyboardWillShowWithKeyboardChangeNotification(notification:NSNotification) {\n        synchronizeAnimationWithKeyboardChangeNotification(notification,\n            animations: { () -> Void in\n                self.tableView!.frame = CGRect(x:self.tableView!.frame.origin.x,\n                    y:self.tableView!.frame.origin.y,\n                    width:self.tableView!.frame.size.width,\n                    height:self.tableView!.superview!.bounds.size.height - self.keyboardHeightWithKeyboardNotification(notification))\n                \n                self.tableView?.scrollToFirstResponder(false)\n        })\n    }\n    \n    func keyboardWillHideWithKeyboardChangeNotification(notification:NSNotification) {\n        synchronizeAnimationWithKeyboardChangeNotification(notification,\n            animations: { () -> Void in\n                self.tableView!.frame = self.tableView!.superview!.bounds\n        })\n    }\n    \n    private func synchronizeAnimationWithKeyboardChangeNotification(notification:NSNotification, animations:(()->Void)?) {\n        if let animations = animations,\n            let userInfo = notification.userInfo as? [String:AnyObject] {\n                \n                let animationDuration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue\n                \n                if (animationDuration == 0) {\n                    animations()\n                } else {\n                    let animationCurve = UIViewAnimationCurve(rawValue:(userInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).integerValue)!\n                    \n                    UIView.beginAnimations(nil, context:nil)\n                    UIView.setAnimationDuration(animationDuration)\n                    UIView.setAnimationCurve(animationCurve)\n                    UIView.setAnimationBeginsFromCurrentState(true)\n                    animations()\n                    \n                    UIView.commitAnimations()\n                }\n        }\n    }\n    \n    private func keyboardHeightWithKeyboardNotification(notification:NSNotification) -> CGFloat {\n        let keyboardBounds = keyboardBoundsWithKeyboardNotification(notification)\n        return keyboardBounds.size.height\n    }\n    \n    private func keyboardBoundsWithKeyboardNotification(notification:NSNotification) -> CGRect {\n        if let userInfo = notification.userInfo as? [String:NSValue],\n            let keyboardFrameValue = userInfo[UIKeyboardFrameEndUserInfoKey] {\n                return keyboardFrameValue.CGRectValue()\n        }\n        return CGRectZero\n    }\n    \n    // MARK: Selection clearing\n    private func clearTableViewSelection(animated:Bool) {\n        if !tableView!.multipleSelectionModeEnabled {\n            if let indexPathForSelectedRow = tableView?.indexPathForSelectedRow {\n                synchronizeDeselectionAnimationOfRow(indexPathForSelectedRow, animated:animated)\n            }\n        }\n    }\n    \n    private func synchronizeDeselectionAnimationOfRow(indexPathForSelectedRow:NSIndexPath, animated:Bool) {\n        if let transitionCoordinator = transitionCoordinator() {\n            transitionCoordinator.animateAlongsideTransitionInView(tableView,\n                animation: { (context:UIViewControllerTransitionCoordinatorContext!) -> Void in\n                    self.tableView!.deselectRowAtIndexPath(indexPathForSelectedRow, animated:animated)\n                }, completion: { (context:UIViewControllerTransitionCoordinatorContext!) -> Void in\n                    if context.isCancelled() {\n                        self.tableView!.selectRowAtIndexPath(indexPathForSelectedRow, animated:false, scrollPosition:UITableViewScrollPosition.None)\n                    }\n            })\n        }\n    }\n}"
  },
  {
    "path": "Classes/RLDTableViewDataSource.swift",
    "content": "import UIKit\n\npublic class RLDTableViewDataSource:NSObject, UITableViewDataSource {\n    \n    // MARK: Initialization\n    private(set) var tableViewModel:RLDTableViewModel?\n    required public init(tableViewModel:RLDTableViewModel) {\n        self.tableViewModel = tableViewModel\n    }\n    \n    // MARK: Cell generation\n    public func tableView(tableView:UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell {\n        let cellModel = self.cellModel(indexPath)\n        return tableView.dequeueReusableCellWithIdentifier(cellModel.reuseIdentifier, forIndexPath:indexPath) \n    }\n    \n    // MARK: Sections\n    public func numberOfSectionsInTableView(tableView:UITableView) -> Int {\n        return tableViewModel!.sectionModels.count\n    }\n    \n    public func tableView(tableView:UITableView, numberOfRowsInSection section:Int) -> Int {\n        let sectionModel = tableViewModel!.sectionModels[section]\n        return sectionModel.cellModels.count\n    }\n    \n    public func tableView(tableView:UITableView, titleForHeaderInSection section:Int) -> String? {\n        return title(forSection:section, sectionAccessoryViewModel:{ (sectionModel) -> RLDTableViewSectionAccessoryViewModel? in\n            return sectionModel.header\n        })\n    }\n    \n    public func tableView(tableView:UITableView, titleForFooterInSection section:Int) -> String? {\n        return title(forSection:section, sectionAccessoryViewModel:{ (sectionModel) -> RLDTableViewSectionAccessoryViewModel? in\n            return sectionModel.footer\n        })\n    }\n    \n    private func title(forSection section:Int, sectionAccessoryViewModel:((sectionModel:RLDTableViewSectionModel)->RLDTableViewSectionAccessoryViewModel?)) -> String? {\n        let sectionModel = tableViewModel!.sectionModels[section]\n        if let sectionAccessoryViewModel = sectionAccessoryViewModel(sectionModel:sectionModel) {\n            return sectionAccessoryViewModel.title\n        }\n        return nil\n    }\n    \n    // MARK: Sections index titles\n    public func sectionIndexTitlesForTableView(tableView:UITableView) -> [String]? {\n        return tableViewModel!.sectionIndexTitles\n    }\n    \n    public func tableView(tableView:UITableView, sectionForSectionIndexTitle title:String, atIndex index:Int) -> Int {\n        for (index, sectionModel) in tableViewModel!.sectionModels.enumerate() {\n            if let indexTitle = sectionModel.indexTitle {\n                if indexTitle == title {\n                    return index\n                }\n            }\n        }\n        return 0\n    }\n    \n    // MARK: Data source edition\n    public func tableView(tableView:UITableView, canEditRowAtIndexPath indexPath:NSIndexPath) -> Bool {\n        let cellModel = self.cellModel(indexPath)\n        if let editable = cellModel.editable {\n            return editable\n        }\n        return false\n    }\n    \n    public func tableView(tableView:UITableView, canMoveRowAtIndexPath indexPath:NSIndexPath) -> Bool {\n        let cellModel = self.cellModel(indexPath)\n        if let movable = cellModel.movable {\n            return movable\n        }\n        return false\n    }\n    \n    public func tableView(tableView:UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath:NSIndexPath) {\n        switch editingStyle {\n        case .Insert:\n            self.tableView(tableView, commitInsertionForRowAtIndexPath:indexPath)\n        case .Delete:\n            self.tableView(tableView, commitDeletionForRowAtIndexPath:indexPath)\n        case .None:\n            break\n        }\n    }\n    \n    public func tableView(tableView:UITableView, moveRowAtIndexPath sourceIndexPath:NSIndexPath, toIndexPath destinationIndexPath:NSIndexPath) {\n        let sourceSectionModel = tableViewModel!.sectionModels[sourceIndexPath.section]\n        let destinationSectionModel = tableViewModel!.sectionModels[destinationIndexPath.section]\n        let cellModel = sourceSectionModel.cellModels[sourceIndexPath.row]\n        \n        sourceSectionModel.remove(cellModel)\n        destinationSectionModel.insert(cellModel, atIndex:destinationIndexPath.row)\n    }\n    \n    private func tableView(tableView:UITableView, commitInsertionForRowAtIndexPath indexPath:NSIndexPath) {\n        let sectionModel = tableViewModel!.sectionModels[indexPath.section]\n        if let defaultCellModelClassForInsertions = sectionModel.defaultCellModelClassForInsertions {\n            let cellModelType = NSClassFromString(defaultCellModelClassForInsertions) as! RLDTableViewCellModel.Type\n            let cellModel = cellModelType.init()\n            \n            sectionModel.insert(cellModel, atIndex:indexPath.row)\n            tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation:UITableViewRowAnimation.Automatic)\n        }\n    }\n    \n    private func tableView(tableView:UITableView, commitDeletionForRowAtIndexPath indexPath:NSIndexPath) {\n        let sectionModel = tableViewModel!.sectionModels[indexPath.section]\n        let cellModel = sectionModel.cellModels[indexPath.row]\n        \n        sectionModel.remove(cellModel)\n        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation:UITableViewRowAnimation.Automatic)\n    }\n    \n    // MARK: Model accessors\n    private func cellModel(indexPath:NSIndexPath) -> RLDTableViewCellModel {\n        let sectionModel = tableViewModel!.sectionModels[indexPath.section]\n        return sectionModel.cellModels[indexPath.row]\n    }\n    \n}"
  },
  {
    "path": "Classes/RLDTableViewDelegate.swift",
    "content": "import UIKit\n\npublic class RLDTableViewDelegate:NSObject, UITableViewDelegate {\n    // Initialization\n    private var tableViewModel:RLDTableViewModel\n    required public init(tableViewModel:RLDTableViewModel) {\n        self.tableViewModel = tableViewModel\n    }\n    \n    // MARK: Display customization\n    public func tableView(tableView:UITableView, willDisplayCell cell:UITableViewCell, forRowAtIndexPath indexPath:NSIndexPath) {\n        link(eventHandler(tableView, indexPath:indexPath, cell:cell),\n            view:cell,\n            andExecute:{ (eventHandler) -> Void in\n                eventHandler.willDisplayView()\n        })\n    }\n    \n    public func tableView(tableView:UITableView, willDisplayHeaderView view:UIView, forSection section:Int) {\n        self.tableView(tableView, willDisplayHeaderFooterView:view, model:tableViewModel.sectionModels[section].header)\n    }\n    \n    public func tableView(tableView:UITableView, willDisplayFooterView view:UIView, forSection section:Int) {\n        self.tableView(tableView, willDisplayHeaderFooterView:view, model:tableViewModel.sectionModels[section].footer)\n    }\n    \n    private func tableView(tableView:UITableView, willDisplayHeaderFooterView view:UIView, model:RLDTableViewSectionAccessoryViewModel?) {\n        if let model = model {\n            link(eventHandler(tableView, viewModel:model, view:view),\n                view:view,\n                andExecute:{ (eventHandler) -> Void in\n                    eventHandler.willDisplayView()\n            })\n        }\n    }\n    \n    private func link(eventHandler:RLDTableViewEventHandler, view:UIView, andExecute closure:(eventHandler:RLDTableViewEventHandler)->Void) {\n        if let view = view as? RLDHandledViewProtocol {\n            view.eventHandler = eventHandler\n        }\n        closure(eventHandler:eventHandler)\n    }\n    \n    public func tableView(tableView:UITableView, didEndDisplayingCell cell:UITableViewCell, forRowAtIndexPath indexPath:NSIndexPath) {\n        eventHandler(tableView, indexPath:indexPath, cell:cell).didEndDisplayingView()\n    }\n    \n    public func tableView(tableView:UITableView, didEndDisplayingHeaderView view:UIView, forSection section:Int) {\n        if let headerViewModel = tableViewModel.sectionModels[section].header {\n            eventHandler(tableView, viewModel:headerViewModel, view:view).didEndDisplayingView()\n        }\n    }\n    \n    public func tableView(tableView:UITableView, didEndDisplayingFooterView view:UIView, forSection section:Int) {\n        if let footerViewModel = tableViewModel.sectionModels[section].footer {\n            eventHandler(tableView, viewModel:footerViewModel, view:view).didEndDisplayingView()\n        }\n    }\n    \n    // MARK: Variable height support\n    public func tableView(tableView:UITableView, heightForRowAtIndexPath indexPath:NSIndexPath) -> CGFloat {\n        if let height = cellModel(indexPath).height {\n            return height\n        }\n        return UITableViewAutomaticDimension\n    }\n    \n    public func tableView(tableView:UITableView, heightForHeaderInSection section:Int) -> CGFloat {\n        if let height = tableViewModel.sectionModels[section].header?.height {\n            return height\n        }\n        return UITableViewAutomaticDimension\n    }\n    \n    public func tableView(tableView:UITableView, heightForFooterInSection section:Int) -> CGFloat {\n        if let height = tableViewModel.sectionModels[section].footer?.height {\n            return height\n        }\n        return UITableViewAutomaticDimension\n    }\n    \n    public func tableView(tableView:UITableView, estimatedHeightForRowAtIndexPath indexPath:NSIndexPath) -> CGFloat {\n        if let estimatedHeight = cellModel(indexPath).estimatedHeight {\n            return estimatedHeight\n        }\n        return UITableViewAutomaticDimension\n    }\n    \n    public func tableView(tableView:UITableView, estimatedHeightForHeaderInSection section:Int) -> CGFloat {\n        if let estimatedHeight = tableViewModel.sectionModels[section].header?.estimatedHeight {\n            return estimatedHeight\n        }\n        return UITableViewAutomaticDimension\n    }\n    \n    public func tableView(tableView:UITableView, estimatedHeightForFooterInSection section:Int) -> CGFloat {\n        if let estimatedHeight = tableViewModel.sectionModels[section].footer?.estimatedHeight {\n            return estimatedHeight\n        }\n        return UITableViewAutomaticDimension\n    }\n    \n    // MARK: Section header and footer\n    public func tableView(tableView:UITableView, viewForHeaderInSection section:Int) -> UIView? {\n        if let reuseIdentifier = tableViewModel.sectionModels[section].header?.reuseIdentifier {\n            return tableView.dequeueReusableHeaderFooterViewWithIdentifier(reuseIdentifier)\n        }\n        return nil\n    }\n    \n    public func tableView(tableView:UITableView, viewForFooterInSection section:Int) -> UIView? {\n        if let reuseIdentifier = tableViewModel.sectionModels[section].footer?.reuseIdentifier {\n            return tableView.dequeueReusableHeaderFooterViewWithIdentifier(reuseIdentifier)\n        }\n        return nil\n    }\n    \n    // MARK: Accessories (disclosures)\n    public func tableView(tableView:UITableView, accessoryButtonTappedForRowWithIndexPath indexPath:NSIndexPath) {\n        eventHandler(tableView, indexPath:indexPath).accessoryButtonTapped()\n    }\n    \n    // MARK: Selection\n    public func tableView(tableView:UITableView, shouldHighlightRowAtIndexPath indexPath:NSIndexPath) -> Bool {\n        return eventHandler(tableView, indexPath:indexPath).shouldHighlightView()\n    }\n    \n    public func tableView(tableView:UITableView, didHighlightRowAtIndexPath indexPath:NSIndexPath) {\n        eventHandler(tableView, indexPath:indexPath).didHighlightView()\n    }\n    \n    public func tableView(tableView:UITableView, didUnhighlightRowAtIndexPath indexPath:NSIndexPath) {\n        eventHandler(tableView, indexPath:indexPath).didUnhighlightView()\n    }\n    \n    public func tableView(tableView:UITableView, willSelectRowAtIndexPath indexPath:NSIndexPath) -> NSIndexPath? {\n        let selectedIndexPath = eventHandler(tableView, indexPath:indexPath).willSelectView()\n        return (selectedIndexPath != nil ? selectedIndexPath : indexPath)\n    }\n    \n    public func tableView(tableView:UITableView, willDeselectRowAtIndexPath indexPath:NSIndexPath) -> NSIndexPath? {\n        let deselectedIndexPath = eventHandler(tableView, indexPath:indexPath).willDeselectView()\n        return (deselectedIndexPath != nil ? deselectedIndexPath : indexPath)\n    }\n    \n    public func tableView(tableView:UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath) {\n        eventHandler(tableView, indexPath:indexPath).didSelectView()\n    }\n    \n    public func tableView(tableView:UITableView, didDeselectRowAtIndexPath indexPath:NSIndexPath) {\n        eventHandler(tableView, indexPath:indexPath).didDeselectView()\n    }\n    \n    // MARK: Editing\n    public func tableView(tableView:UITableView, editingStyleForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCellEditingStyle {\n        if let editingStyle = cellModel(indexPath).editingStyle {\n            return editingStyle\n        }\n        return UITableViewCellEditingStyle.None\n    }\n    \n    public func tableView(tableView:UITableView, titleForDeleteConfirmationButtonForRowAtIndexPath indexPath:NSIndexPath) -> String? {\n        if let titleForDeleteConfirmationButton = cellModel(indexPath).titleForDeleteConfirmationButton {\n            return titleForDeleteConfirmationButton\n        }\n        return \"\"\n    }\n    \n    public func tableView(tableView:UITableView, editActionsForRowAtIndexPath indexPath:NSIndexPath) -> [UITableViewRowAction]? {\n        return eventHandler(tableView, indexPath:indexPath).editActions()\n    }\n    \n    public func tableView(tableView:UITableView, shouldIndentWhileEditingRowAtIndexPath indexPath:NSIndexPath) -> Bool {\n        if let shouldIndentWhileEditing = cellModel(indexPath).shouldIndentWhileEditing {\n            return shouldIndentWhileEditing\n        }\n        return false\n    }\n    \n    public func tableView(tableView:UITableView, willBeginEditingRowAtIndexPath indexPath:NSIndexPath) {\n        eventHandler(tableView, indexPath:indexPath).willBeginEditing()\n    }\n    \n    public func tableView(tableView:UITableView, didEndEditingRowAtIndexPath indexPath:NSIndexPath) {\n        eventHandler(tableView, indexPath:indexPath).didEndEditing()\n    }\n    \n    // MARK: Moving and reordering\n    public func tableView(tableView:UITableView, targetIndexPathForMoveFromRowAtIndexPath sourceIndexPath:NSIndexPath, toProposedIndexPath proposedDestinationIndexPath:NSIndexPath) -> NSIndexPath {\n        return proposedDestinationIndexPath\n    }\n    \n    // MARK: Indentation\n    public func tableView(tableView:UITableView, indentationLevelForRowAtIndexPath indexPath:NSIndexPath) -> Int {\n        if let indentationLevel = cellModel(indexPath).indentationLevel {\n            return indentationLevel\n        }\n        return 0\n    }\n    \n    // MARK: Copy and Paste\n    public func tableView(tableView:UITableView, shouldShowMenuForRowAtIndexPath indexPath:NSIndexPath) -> Bool {\n        if let shouldShowMenu = cellModel(indexPath).shouldShowMenu {\n            return shouldShowMenu\n        }\n        return false\n    }\n    \n    public func tableView(tableView:UITableView, canPerformAction action:Selector, forRowAtIndexPath indexPath:NSIndexPath, withSender sender:AnyObject?) -> Bool {\n        return eventHandler(tableView, indexPath:indexPath).canPerform(action, withSender:sender!)\n    }\n    \n    public func tableView(tableView:UITableView, performAction action:Selector, forRowAtIndexPath indexPath:NSIndexPath, withSender sender:AnyObject?) {\n        return eventHandler(tableView, indexPath:indexPath).performAction(action, withSender:sender!)\n    }\n    \n    // MARK: Event handler generation\n    private func eventHandler(tableView:UITableView, indexPath:NSIndexPath) -> RLDTableViewCellEventHandler {\n        let cellModel = self.cellModel(indexPath)\n        tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.None, animated:false)\n        let cell = tableView.cellForRowAtIndexPath(indexPath)!\n        return eventHandler(tableView, indexPath:indexPath, cell:cell)\n    }\n    \n    private func eventHandler(tableView:UITableView, indexPath:NSIndexPath, cell:UITableViewCell) -> RLDTableViewCellEventHandler {\n        let cellModel = self.cellModel(indexPath)\n        return eventHandler(tableView, viewModel:cellModel, view:cell) as! RLDTableViewCellEventHandler\n    }\n    \n    private func eventHandler(tableView:UITableView, viewModel:RLDTableViewReusableViewModel, view:UIView) -> RLDTableViewEventHandler {\n        if let eventHandler = reusableEventHandler(tableView, viewModel:viewModel, view:view) {\n            eventHandler.tableView = tableView\n            eventHandler.viewModel = viewModel\n            eventHandler.view = view\n            return eventHandler\n        } else {\n            let eventHandler = RLDTableViewEventHandlerProvider.eventHandler(tableView, viewModel:viewModel, view:view)\n            assert(eventHandler != nil, \"Unable to find suitable event hander for \\ntableView: \\(tableView)\\nviewModel: \\(viewModel)\\nview: \\(view)\")\n            return eventHandler!\n        }\n    }\n    \n    private func reusableEventHandler(tableView:UITableView, viewModel:RLDTableViewReusableViewModel, view:UIView) -> RLDTableViewEventHandler? {\n        if let handledView = view as? RLDHandledViewProtocol, let eventHandler = handledView.eventHandler {\n            let eventHandlerClass = eventHandler.dynamicType\n            if eventHandlerClass.canHandle(tableView, viewModel:viewModel, view:view) {\n                return eventHandler\n            }\n        }\n        return nil\n    }\n    \n    // MARK: Model accessors\n    private func cellModel(indexPath:NSIndexPath) -> RLDTableViewCellModel {\n        let sectionModel = tableViewModel.sectionModels[indexPath.section]\n        return sectionModel.cellModels[indexPath.row]\n    }\n}"
  },
  {
    "path": "Classes/RLDTableViewEventHandler.swift",
    "content": "import UIKit\n\n// MARK: RLDTableViewEventHandler class\n\npublic class RLDTableViewEventHandler {\n    // MARK: Event handler registration\n    public class func register() {\n        RLDTableViewEventHandlerProvider.register(self)\n    }\n    \n    // MARK: Suitability checking\n    public class func canHandle(tableView:UITableView, viewModel:RLDTableViewReusableViewModel, view:UIView) -> Bool {\n        return false\n    }\n    \n    // MARK: Initialization and dependencies\n    public var tableView:UITableView\n    public var viewModel:RLDTableViewReusableViewModel\n    public var view:UIView\n    required public init(tableView:UITableView, viewModel:RLDTableViewReusableViewModel, view:UIView) {\n        self.tableView = tableView\n        self.viewModel = viewModel\n        self.view = view\n    }\n    \n    // MARK: Display customization\n    public func willReuseView() {}\n    public func willDisplayView() {}\n    public func didEndDisplayingView() {}\n}\n\n// MARK: RLDTableViewCellEventHandler class\n\npublic class RLDTableViewCellEventHandler:RLDTableViewEventHandler {\n    \n    // MARK: Accessories (disclosures)\n    public func accessoryButtonTapped() {}\n    \n    // MARK: Selection\n    public func shouldHighlightView() -> Bool { return false }\n    public func didHighlightView() {}\n    public func didUnhighlightView() {}\n    public func willSelectView() -> NSIndexPath? { return nil }\n    public func willDeselectView() -> NSIndexPath? { return nil }\n    public func didSelectView() {}\n    public func didDeselectView() {}\n    \n    // MARK: Editing\n    public func willBeginEditing() {}\n    public func didEndEditing() {}\n    public func editActions() -> [UITableViewRowAction]? { return nil }\n    \n    // MARK: Copy and Paste\n    public func canPerform(action:Selector, withSender sender:AnyObject) -> Bool { return false }\n    public func performAction(action:Selector, withSender sender:AnyObject) {}\n}\n\n// MARK: RLDTableViewSectionAccessoryViewEventHandler class\n\npublic class RLDTableViewSectionAccessoryViewEventHandler:RLDTableViewEventHandler {\n}"
  },
  {
    "path": "Classes/RLDTableViewEventHandlerProvider.swift",
    "content": "import UIKit\n\nclass RLDTableViewEventHandlerProvider {\n    private static var availableEventHanlderClasses:[RLDTableViewEventHandler.Type] = []\n    \n    class func register(eventHandlerClass:RLDTableViewEventHandler.Type) {\n        availableEventHanlderClasses.append(eventHandlerClass)\n    }\n    \n    class func eventHandler(tableView:UITableView, viewModel:RLDTableViewReusableViewModel, view:UIView) -> RLDTableViewEventHandler? {\n        for eventHandler in availableEventHanlderClasses {\n            if eventHandler.canHandle(tableView, viewModel:viewModel, view:view) {\n                return eventHandler.init(tableView:tableView, viewModel:viewModel, view:view)\n            }\n        }\n        return nil\n    }\n}"
  },
  {
    "path": "Classes/RLDTableViewModel.swift",
    "content": "//\n//  RLDNavigation\n//\n//  Copyright (c) 2015 Rafael Lopez Diez. All rights reserved.\n//\n//  Licensed under the Apache License, Version 2.0 (the \"License\");\n//  you may not use this file except in compliance with the License.\n//  You may obtain a copy of the License at\n//\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS,\n//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//  See the License for the specific language governing permissions and\n//  limitations under the License.\n//\n\nimport UIKit\n\n// MARK: RLDTableViewReusableViewModel class\n\npublic class RLDTableViewReusableViewModel {\n    // MARK: Initialization\n    required public init() {\n        reuseIdentifier = NSStringFromClass(self.dynamicType)\n    }\n    \n    // MARK: Parent linking\n    weak private(set) var sectionModel:RLDTableViewSectionModel?\n    public func set(sectionModel newSectionModel:RLDTableViewSectionModel) {\n        sectionModel = newSectionModel\n    }\n    \n    // MARK: Reuse identifier\n    public var reuseIdentifier:String\n    \n    // MARK: Variable height support\n    public var height:CGFloat?\n    public var estimatedHeight:CGFloat?\n}\n\n// MARK: RLDTableViewCellModel class\n\npublic class RLDTableViewCellModel:RLDTableViewReusableViewModel {\n    // MARK: Indentation\n    public var indentationLevel:NSInteger?\n    \n    // MARK: Editing\n    public var editable:Bool?\n    public var movable:Bool?\n    public var shouldIndentWhileEditing:Bool?\n    public var editingStyle:UITableViewCellEditingStyle?\n    public var titleForDeleteConfirmationButton:String?\n    \n    // MARK: Copy and Paste\n    public var shouldShowMenu:Bool?\n}\n\n// MARK: RLDTableViewSectionAccessoryViewModel class\n\npublic class RLDTableViewSectionAccessoryViewModel:RLDTableViewReusableViewModel {\n    // MARK: Title\n    public var title:String?\n}\n\n// MARK: RLDTableViewSectionModel class\n\npublic class RLDTableViewSectionModel:Equatable {\n    // MARK: Parent linking\n    weak private(set) var tableModel:RLDTableViewModel?\n    public func set(tableModel newTableModel:RLDTableViewModel) {\n        tableModel = newTableModel\n    }\n    \n    // Listing cell models\n    private(set) var cellModels:[RLDTableViewCellModel] = []\n    \n    // MARK: Insertions\n    public var defaultCellModelClassForInsertions:String?\n    \n    public func add(cellModel:RLDTableViewCellModel) {\n        cellModel.set(sectionModel:self)\n        cellModels.append(cellModel)\n    }\n    \n    public func insert(cellModel:RLDTableViewCellModel, atIndex index:Int) {\n        cellModel.set(sectionModel:self)\n        cellModels.insert(cellModel, atIndex:index)\n    }\n    \n    // MARK: Deletions\n    public func remove(cellModel:RLDTableViewCellModel) {\n        cellModel.set(sectionModel:self)\n        cellModels = cellModels.filter( {!($0 === cellModel)} )\n    }\n    \n    // MARK: Index title\n    public var indexTitle:String?\n    \n    // MARK: Section header and footer\n    public var header:RLDTableViewSectionAccessoryViewModel? {\n        didSet {\n            header?.set(sectionModel:self)\n        }\n    }\n    \n    public var footer:RLDTableViewSectionAccessoryViewModel? {\n        didSet {\n            footer?.set(sectionModel:self)\n        }\n    }\n}\n\n// MARK: RLDTableViewSectionModel equality operator\n\npublic func == (lhs:RLDTableViewSectionModel, rhs:RLDTableViewSectionModel) -> Bool {\n    return lhs === rhs\n}\n\n// MARK: RLDTableViewModel class\n\npublic class RLDTableViewModel {\n    \n    public init() {\n        // XCode Version 6.3 (6D570) forces me to add this initializer\n    }\n    \n    // MARK: Listing section models\n    private(set) var sectionModels:[RLDTableViewSectionModel] = []\n    \n    // MARK: Adding section models\n    public func addNewSectionModel() -> RLDTableViewSectionModel {\n        let newSectionModel = RLDTableViewSectionModel()\n        add(newSectionModel)\n        return newSectionModel\n    }\n    \n    private func add(sectionModel:RLDTableViewSectionModel) {\n        sectionModel.set(tableModel:self)\n        sectionModels.append(sectionModel)\n    }\n    \n    // MARK: Adding cell models\n    public func add(cellModel:RLDTableViewCellModel) {\n        if sectionModels.count == 0 {\n            addNewSectionModel()\n        }\n        add(cellModel, toSectionModel:sectionModels.last!)\n    }\n    \n    public func add(cellModel:RLDTableViewCellModel, toSectionModel sectionModel:RLDTableViewSectionModel) {\n        if !sectionModels.contains(sectionModel) {\n            add(sectionModel)\n        }\n        sectionModel.add(cellModel)\n    }\n    \n    // MARK: Section index titles\n    private var _sectionIndexTitles:[String]?\n    public var sectionIndexTitles:[String]? {\n        set {\n            _sectionIndexTitles = newValue\n        }\n        get {\n            if (_sectionIndexTitles == nil) {\n                var indexTitles:[String] = []\n                \n                for sectionModel in sectionModels {\n                    if let indexTitle = sectionModel.indexTitle {\n                        indexTitles.append(indexTitle)\n                    }\n                }\n                \n                if indexTitles.count > 0 {\n                    _sectionIndexTitles = indexTitles\n                }\n            }\n            return _sectionIndexTitles\n        }\n    }\n}"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS"
  },
  {
    "path": "README.md",
    "content": "# RLDTableViewSwift\n\nThe ubiquitous `UITableView`, with its required data source and delegate, is one of the main sources of badly architected solutions in the iOS platform. SDK classes, as `UITableViewController`, enforce bad design practices, and lead you to the problem of the Massive View Controller, where the single responsibility principle is completely missed.\n\n`RLDTableViewSwift` is a set of ready-to-use Swift classes that will get you back in track, helping you to refine the shape of your app. They enforce the SOLID principles, with an adaptation of the Model-View-Presenter pattern.\n\n![RLDTableViewSwift sample app](https://raw.githubusercontent.com/rlopezdiez/RLDTableViewSwift/master/README.jpg)\n\n> [Objective-C version](https://github.com/rlopezdiez/RLDTableViewSuite) also available.\n\n## Foundations\n\n### RLDTableViewDataSource and RLDTableViewDelegate\n\nThese are reusable components for the data source and delegate of all your table views. With them, you won't need to write the same boilerplate code again and again –they will just use your table view model and event handlers to be able to manage any `UITableView`. \n\nThey fully implement the `UITableViewDataSource` and `UITableViewDelegate` protocols, and keep synchronized between themselves, giving you all the `UITableView` features with little effort from your side:\n- Display customization\n- Variable height support\n- Sections, with headers and footers\n- Sections index titles\n- Cell accessories (disclosures)\n- Highlighting and selection of cells\n- Editing, moving and reordering cells\n- Indentation\n- Copy and Paste\n\n\n### Table view model\n\nThe table view model defines the state, look and feel of the views in your table view, and the relationships between them. You can use the provided generic implementations, or subclass them to tailor them to yor needs:\n\n- `RLDTableViewCellModel`, for cells,\n- `RLDTableViewSectionModel`, for table sections,\n- `RLDTableViewSectionAccessoryViewModel`, for section headers and footers, and\n- `RLDTableViewModel`, for the table view itself.\n\n### Event handlers\n\nEvery view in your table view (like cells, section headers and section footers) should be managed by an event handler. It will receive all the view related actions from the table view delegate and react to user generated events on the view. \n\nEvent handlers are short-lived objects that will be instantiated on demand and destroyed once the event that caused its creation has been handled or when the view they manage is deallocated. They should not store state *(because we have a model, right?)* and they can either configure the look of the view by themselves, or pass the view model to the view, so it can autoconfigure. The provided sample app uses the latest approach.\n\nYou have two event handlers classes that you can subclass:\n- `RLDTableViewCellEventHandler`, for table view cells, and\n- `RLDTableViewSectionAccessoryViewEventHandler`, for section headers and footers.\n\nAlthough it is not mandatory, if the handled view conforms to the `RLDHandledViewProtocol` it will receive an event handler just before the view is displayed for the first time. The view will retain this event handler during all its lifecycle to be able to react to the user generated events on the view. This retained event handler will be reused together with the cell, improving the performance.\n\n### Event handler provider\n\nIn order to create the best suited event handler on demand, `RLDTableViewDelegate` will need an event handler provider to find the first event handler which supports a certain combination of table view, view and view model.\n\nTo make your event handlers available to the provider, you must register them using their  `register()` class method. \n\nThe best way to make sure all your classes are ready when needed is registering them in the same place. You can use a registar class with a function that is called once when the application has finished launching, or register them just before their first use. The included sample app uses this approach.\n\n### RLDTableViewController \n\nThis class is a drop-in replacement of `UITableViewController`. It just requires a table view model to be able to configure your table view. Internally, it uses the default implementations of `RLDTableViewDataSource`, `RLDTableViewDelegate` and `RLDTableViewEventHandlerProvider`, so it's the easiest way to use `RLDTableViewSwift` without worrying about its internals, while getting the most of having a proper architecture.\n\n## Installing\n\n### Using CocoaPods\n\nTo use the latest stable release of `RLDTableViewSwift`, just add the following to your project `Podfile`:\n\n```\npod 'RLDTableViewSwift', '~> 0.2.1' \n```\n\nIf you like to live on the bleeding edge, you can use the `master` branch with:\n\n```\npod 'RLDTableViewSwift', :git => 'https://github.com/rlopezdiez/RLDTableViewSwift'\n```\n\n### Manually\n\n1. Clone, add as a submodule or [download.](https://github.com/rlopezdiez/RLDTableViewSwift/zipball/master)\n2. Add all the files under `Classes` to your project.\n3. Enjoy.\n\n## License\n\n`RLDTableViewSwift` is available under the Apache License, Version 2.0. See LICENSE file for more info.\n\nThis README has been made with [(GitHub-Flavored) Markdown Editor](http://jbt.github.io/markdown-editor)"
  },
  {
    "path": "RLDTableViewSwift.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name         = 'RLDTableViewSwift'\n  s.version      = '0.2.1'\n  s.homepage     = 'https://github.com/rlopezdiez/RLDTableViewSwift.git'\n  s.summary      = 'Reusable table view controller, data source and delegate for all your UITableView needs in Swift'\n  s.authors      = { 'Rafael Lopez Diez' => 'https://www.linkedin.com/in/rafalopezdiez' }\n  s.source       = { :git => 'https://github.com/rlopezdiez/RLDTableViewSwift.git', :tag => s.version.to_s }\n  s.source_files = 'Classes/*.swift'\n  s.license      = { :type => 'Apache License, Version 2.0', :file => 'LICENSE' }\n  s.platform     = :ios, '8.0'\n  s.requires_arc = true\nend\n"
  },
  {
    "path": "Sample app/TableViewPrototype/AppDelegate.swift",
    "content": "import UIKit\n\n@UIApplicationMain\nclass AppDelegate:UIResponder, UIApplicationDelegate {\n    var window: UIWindow?\n    \n    func application(application:UIApplication, didFinishLaunchingWithOptions launchOptions:[NSObject:AnyObject]?) -> Bool {\n        return true\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Event handlers/RLDGenericTableViewCellEventHandler.swift",
    "content": "import UIKit\nimport RLDTableViewSwift\n\nclass RLDGenericTableViewCellEventHandler:RLDTableViewCellEventHandler {\n    // MARK: Suitability checking\n    override class func canHandle(tableView:UITableView, viewModel:RLDTableViewReusableViewModel, view:UIView) -> Bool {\n        if let viewModel = viewModel as? RLDGenericTableViewCellModel,\n            let view = view as? RLDGenericTableViewCell {\n                return true\n        }\n        \n        return false\n    }\n    \n    // MARK: Cell customization\n    override func willDisplayView() {\n        if let view = view as? RLDGenericTableViewCell {\n            view.model = (viewModel as! RLDGenericTableViewCellModel)\n        }\n    }\n    \n    // MARK: View highlighting\n    override func shouldHighlightView() -> Bool {\n        return true\n    }\n    \n    override func didHighlightView() {\n        if let view = view as? RLDGenericTableViewCell {\n            view.viewToHighlight.backgroundColor = UIColor(red:0.8, green:0.92, blue:1, alpha:1)\n        }\n        view.alpha = 0.75\n    }\n    \n    override func didUnhighlightView() {\n        if let view = view as? RLDGenericTableViewCell {\n            view.viewToHighlight.backgroundColor = UIColor.whiteColor()\n        }\n        view.alpha = 1\n    }\n    \n    // MARK: Cell interactions\n    override func didSelectView() {\n        if let viewModel = viewModel as? RLDGenericTableViewCellModel {\n            open(viewModel.imageURL, title: viewModel.title)\n        }\n    }\n    \n    func didTapCategoryButton() {\n        if let viewModel = viewModel as? RLDGenericTableViewCellModel {\n            open(viewModel.categoryURL, title: viewModel.category)\n        }\n    }\n    \n    private func open(url:String, title:String) {\n        /*\n        This way of navigating to another view controller is good enough for a sample app,\n        but in a real life situation you should consider moving navigation code elsewhere.\n        You can use flow controllers, routers or some kind of view model propagation.\n        You might want to use my navigation library, which is a good complement to this one:\n        https://github.com/rlopezdiez/RLDNavigationSwift\n        */\n        if let navigationController = navigationController() {\n            let storyboard = UIStoryboard(name:\"Main\", bundle:nil)\n            let detailViewController = storyboard.instantiateViewControllerWithIdentifier(\"RLDWebViewController\") as! RLDWebViewController\n            detailViewController.title = title\n            detailViewController.url = url\n            navigationController.pushViewController(detailViewController, animated:true)\n        }\n    }\n    \n    private func navigationController() -> UINavigationController? {\n        for var nextView:UIView? = view.superview; nextView != nil; nextView = nextView!.superview {\n            if let nextResponder = nextView?.nextResponder() as? UINavigationController {\n                return nextResponder\n            }\n        }\n        return nil\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Event handlers/RLDTableViewHeaderViewEventHandler.swift",
    "content": "import UIKit\nimport RLDTableViewSwift\n\nclass RLDTableViewHeaderViewEventHandler:RLDTableViewSectionAccessoryViewEventHandler {\n    // MARK: Suitability checking\n    override class func canHandle(tableView:UITableView, viewModel:RLDTableViewReusableViewModel, view:UIView) -> Bool {\n        if let viewModel = viewModel as? RLDTableViewHeaderViewModel,\n            let view = view as? RLDTableViewHeaderView {\n                return true\n        }\n        \n        return false\n    }\n    \n    // MARK: View customization\n    override func willDisplayView() {\n        if let view = view as? RLDTableViewHeaderView {\n            view.model = (viewModel as! RLDTableViewHeaderViewModel)\n        }\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/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>en</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>CFBundleSignature</key>\n\t<string>????</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</dict>\n</plist>\n"
  },
  {
    "path": "Sample app/TableViewPrototype/Models/RLDBigPictureTableViewCellModel.swift",
    "content": "class RLDBigPictureTableViewCellModel:RLDGenericTableViewCellModel {\n    required init() {\n        super.init()\n        reuseIdentifier = \"RLDBigPictureTableViewCell\"\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Models/RLDCommentTableViewCellModel.swift",
    "content": "class RLDCommentTableViewCellModel:RLDGenericTableViewCellModel {\n    \n    var comment:String = \"\"\n    \n    required init() {\n        super.init()\n        reuseIdentifier = \"RLDCommentTableViewCell\"\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Models/RLDGenericTableViewCellModel.swift",
    "content": "import RLDTableViewSwift\n\nclass RLDGenericTableViewCellModel:RLDTableViewCellModel {\n    var title:String = \"\"\n    var date:String = \"\"\n    var category:String = \"\"\n    var categoryURL:String = \"\"\n    var imageName:String = \"\"\n    var imageURL:String = \"\"\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Models/RLDSimpleTableViewCellModel.swift",
    "content": "class RLDSimpleTableViewCellModel:RLDGenericTableViewCellModel {\n    required init() {\n        super.init()\n        reuseIdentifier = \"RLDSimpleTableViewCell\"\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Models/RLDTableViewHeaderViewModel.swift",
    "content": "import RLDTableViewSwift\n\nclass RLDTableViewHeaderViewModel:RLDTableViewSectionAccessoryViewModel {\n    required init() {\n        super.init()\n        reuseIdentifier = \"RLDTableViewHeaderView\"\n        height = 60\n        estimatedHeight = height\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Models/RLDTableViewModelProvider.swift",
    "content": "import RLDTableViewSwift\nimport UIKit\n\nclass RLDTableViewModelProvider {\n    \n    static private let DataPlistFileName = \"viewModelData\"\n    static private let DictionaryTitleKey = \"title\"\n    static private let DictionaryCellsKey = \"cells\"\n    static private let DictionaryClassKey = \"class\"\n    static private let TableViewCellTitleForDeleteConfirmationButton = \"Delete\"\n    static private let TableViewHeaderViewReuseIdentifier = \"RLDTableViewHeaderView\"\n    \n    var headerFooterReuseIdentifiersToNibNames = [RLDTableViewModelProvider.TableViewHeaderViewReuseIdentifier:RLDTableViewModelProvider.TableViewHeaderViewReuseIdentifier]\n    lazy var tableViewModel:RLDTableViewModel = {\n        let modelArray = self.modelArray()\n        let tableViewModel = RLDTableViewModel()\n        for sectionDictionary in modelArray {\n            self.tableViewModel(tableViewModel, addSectionWithSectionDictionary:sectionDictionary)\n        }\n        return tableViewModel\n        }()\n    \n    \n    private func modelArray() -> [[String:AnyObject]] {\n        return NSArray(contentsOfFile:NSBundle.mainBundle().pathForResource(RLDTableViewModelProvider.DataPlistFileName, ofType:\"plist\")!)! as! [[String:AnyObject]]\n    }\n    \n    private func tableViewModel(tableViewModel:RLDTableViewModel, addSectionWithSectionDictionary sectionDictionary:[String:AnyObject]) {\n        let sectionModel = tableViewModel.addNewSectionModel()\n        \n        if let headerTitle = sectionDictionary[RLDTableViewModelProvider.DictionaryTitleKey] as? String {\n            let headerModel = RLDTableViewHeaderViewModel()\n            headerModel.title = headerTitle\n            sectionModel.header = headerModel\n        }\n        \n        for cellDictionary in sectionDictionary[RLDTableViewModelProvider.DictionaryCellsKey] as! [[String:AnyObject]] {\n            self.tableViewModel(tableViewModel, addCellWithCellDictionary:cellDictionary)\n        }\n    }\n    \n    private func tableViewModel(tableViewModel:RLDTableViewModel, addCellWithCellDictionary cellDictionary:[String:AnyObject]) {\n        let cellModel = RLDGenericTableViewCellModel.cellModelForClass(cellDictionary[RLDTableViewModelProvider.DictionaryClassKey] as! String)\n        \n        for (key, value) in cellDictionary {\n            cellModel.setValue(value, forKey:key)\n        }\n        \n        cellModel.titleForDeleteConfirmationButton = RLDTableViewModelProvider.TableViewCellTitleForDeleteConfirmationButton\n        \n        tableViewModel.add(cellModel)\n    }\n    \n}\n\nextension RLDGenericTableViewCellModel {\n    \n    class func cellModelForClass(cellModelClass:String) -> RLDGenericTableViewCellModel {\n        switch cellModelClass {\n        case \"RLDBigPictureTableViewCellModel\":\n            return RLDBigPictureTableViewCellModel()\n        case \"RLDCommentTableViewCellModel\":\n            return RLDCommentTableViewCellModel()\n        case \"RLDSimpleTableViewCellModel\":\n            return RLDSimpleTableViewCellModel()\n        default:\n            fatalError(\"Unable to find class for \\(cellModelClass)\")\n        }\n    }\n    \n    func setValue(value:AnyObject, forKey key:String) {\n        switch key {\n        case \"category\":\n            category = value as! String\n        case \"categoryURL\":\n            categoryURL = value as! String\n        case \"comment\":\n            (self as! RLDCommentTableViewCellModel).comment = value as! String\n        case \"date\":\n            date = value as! String\n        case \"editable\":\n            editable = (value as! Bool)\n        case \"editingStyle\":\n            editingStyle = (value as! Int == 1\n                ? UITableViewCellEditingStyle.Delete\n                : UITableViewCellEditingStyle.None)\n        case \"imageName\":\n            imageName = value as! String\n        case \"imageURL\":\n            imageURL = value as! String\n        case \"movable\":\n            movable = (value as! Bool)\n        case \"title\":\n            title = value as! String\n        case \"class\":\n            break\n        default:\n            fatalError(\"Unable to set the value for \\(key)\")\n        }\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/RLDTableViewSwift-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>en</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>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>0.2.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Images.xcassets/0_small.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"0_small.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Images.xcassets/1_small.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"1_small.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Images.xcassets/2_big.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"2_big.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Images.xcassets/2_small.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"2_small.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Images.xcassets/3_small.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"3_small.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Images.xcassets/4_big.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"4_big.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Images.xcassets/5_small.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"5_small.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Images.xcassets/6_big.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"6_big.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Images.xcassets/7_big.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"7_big.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Images.xcassets/8_small.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"8_small.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Images.xcassets/9_small.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"9_small.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"7531\" systemVersion=\"14D136\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7520\"/>\n        <capability name=\"Constraints with non-1.0 multipliers\" minToolsVersion=\"5.1\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"RLDTableViewSwift\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kId-c2-rCX\">\n                    <rect key=\"frame\" x=\"20\" y=\"140\" width=\"441\" height=\"43\"/>\n                    <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Sample app\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8ie-xW-0ye\">\n                    <rect key=\"frame\" x=\"20\" y=\"191\" width=\"441\" height=\"21\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n            <constraints>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"5cJ-9S-tgC\"/>\n                <constraint firstItem=\"8ie-xW-0ye\" firstAttribute=\"top\" secondItem=\"kId-c2-rCX\" secondAttribute=\"bottom\" constant=\"8\" id=\"Ael-S7-PCG\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"kId-c2-rCX\" secondAttribute=\"centerX\" id=\"Koa-jz-hwk\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"centerX\" id=\"ZEH-qu-HZ9\"/>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"fvb-Df-36g\"/>\n                <constraint firstItem=\"8ie-xW-0ye\" firstAttribute=\"width\" secondItem=\"kId-c2-rCX\" secondAttribute=\"width\" id=\"ula-XA-QNb\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"548\" y=\"455\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"7531\" systemVersion=\"14D136\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"Ncx-uH-Jsh\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7520\"/>\n        <capability name=\"Constraints to layout margins\" minToolsVersion=\"6.0\"/>\n    </dependencies>\n    <scenes>\n        <!--RLDMasterViewController-->\n        <scene sceneID=\"Kjn-h9-4al\">\n            <objects>\n                <tableViewController title=\"RLDTableViewSuite\" id=\"9Ww-mV-ZtW\" userLabel=\"RLDMasterViewController\" customClass=\"RLDMasterViewController\" customModule=\"TableViewPrototype\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" keyboardDismissMode=\"onDrag\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"none\" showsSelectionImmediatelyOnTouchBegin=\"NO\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"Fvc-Gm-gkE\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"890\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"0.87450980389999999\" green=\"0.87450980389999999\" blue=\"0.87450980389999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <view key=\"tableFooterView\" contentMode=\"scaleToFill\" id=\"dQs-WQ-sFE\" userLabel=\"Footer view\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"60\"/>\n                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                            <subviews>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Source code available under the Apache License, Version 2.0\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ICO-EO-gob\" userLabel=\"Title\">\n                                    <rect key=\"frame\" x=\"8\" y=\"23\" width=\"398\" height=\"15\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" weight=\"light\" pointSize=\"12\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <constraints>\n                                <constraint firstItem=\"ICO-EO-gob\" firstAttribute=\"leading\" secondItem=\"dQs-WQ-sFE\" secondAttribute=\"leadingMargin\" id=\"1eE-oO-pgw\"/>\n                                <constraint firstAttribute=\"centerY\" secondItem=\"ICO-EO-gob\" secondAttribute=\"centerY\" id=\"C7M-Nc-WO8\"/>\n                                <constraint firstItem=\"ICO-EO-gob\" firstAttribute=\"trailing\" secondItem=\"dQs-WQ-sFE\" secondAttribute=\"trailingMargin\" id=\"gaJ-5t-RfY\"/>\n                                <constraint firstAttribute=\"height\" constant=\"60\" id=\"paV-4F-UaT\"/>\n                            </constraints>\n                        </view>\n                        <prototypes>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"RLDSimpleTableViewCell\" rowHeight=\"116\" id=\"WqJ-bQ-aqm\" customClass=\"RLDSimpleTableViewCell\" customModule=\"TableViewPrototype\">\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"WqJ-bQ-aqm\" id=\"4h3-wr-OdE\">\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <view clipsSubviews=\"YES\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kX2-q5-VLD\" userLabel=\"Frame\">\n                                            <rect key=\"frame\" x=\"8\" y=\"8\" width=\"398\" height=\"108\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"f8f-tL-siP\" userLabel=\"Image\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"1\" width=\"145\" height=\"106\"/>\n                                                    <color key=\"backgroundColor\" red=\"0.52831865649999998\" green=\"0.70838541109999997\" blue=\"0.84556502529999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"145\" id=\"Rdz-lb-h1f\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"106\" id=\"qpm-qv-a9c\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Lorem ipsum dolor sit er elit consectetaur\" lineBreakMode=\"wordWrap\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" preferredMaxLayoutWidth=\"237\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Qp9-EF-CBv\" userLabel=\"Title\">\n                                                    <rect key=\"frame\" x=\"153\" y=\"6\" width=\"237\" height=\"46\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"19\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Loren\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3ef-5V-urY\" userLabel=\"Timestamp\">\n                                                    <rect key=\"frame\" x=\"153\" y=\"82\" width=\"37\" height=\"18\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" weight=\"light\" pointSize=\"15\"/>\n                                                    <color key=\"textColor\" red=\"0.3912036263\" green=\"0.3912036263\" blue=\"0.3912036263\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"|\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fff-4o-qCJ\" userLabel=\"Separator\">\n                                                    <rect key=\"frame\" x=\"196\" y=\"82\" width=\"4\" height=\"18\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" weight=\"light\" pointSize=\"15\"/>\n                                                    <color key=\"textColor\" red=\"0.3912036263\" green=\"0.3912036263\" blue=\"0.3912036263\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gTO-00-yFQ\" userLabel=\"Section\">\n                                                    <rect key=\"frame\" x=\"206\" y=\"76\" width=\"40\" height=\"30\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" weight=\"light\" pointSize=\"15\"/>\n                                                    <state key=\"normal\" title=\"Ipsum\">\n                                                        <color key=\"titleShadowColor\" white=\"0.5\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    </state>\n                                                    <connections>\n                                                        <action selector=\"categoryButtonTapped\" destination=\"WqJ-bQ-aqm\" eventType=\"touchUpInside\" id=\"Tdu-gn-oC1\"/>\n                                                    </connections>\n                                                </button>\n                                            </subviews>\n                                            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"3ef-5V-urY\" secondAttribute=\"bottom\" constant=\"8\" id=\"0sb-Aq-0o8\"/>\n                                                <constraint firstItem=\"Qp9-EF-CBv\" firstAttribute=\"top\" secondItem=\"kX2-q5-VLD\" secondAttribute=\"top\" constant=\"6\" id=\"BUx-Ib-ASU\"/>\n                                                <constraint firstItem=\"Qp9-EF-CBv\" firstAttribute=\"leading\" secondItem=\"f8f-tL-siP\" secondAttribute=\"trailing\" constant=\"8\" id=\"DGd-I9-tik\"/>\n                                                <constraint firstAttribute=\"centerY\" secondItem=\"f8f-tL-siP\" secondAttribute=\"centerY\" id=\"E86-Qt-eu3\"/>\n                                                <constraint firstItem=\"gTO-00-yFQ\" firstAttribute=\"leading\" secondItem=\"fff-4o-qCJ\" secondAttribute=\"trailing\" constant=\"6\" id=\"Gqh-Gn-exs\"/>\n                                                <constraint firstItem=\"f8f-tL-siP\" firstAttribute=\"leading\" secondItem=\"kX2-q5-VLD\" secondAttribute=\"leading\" id=\"I7e-Jw-c7A\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"Qp9-EF-CBv\" secondAttribute=\"trailing\" constant=\"8\" id=\"Xy7-yt-cp8\"/>\n                                                <constraint firstItem=\"fff-4o-qCJ\" firstAttribute=\"leading\" secondItem=\"3ef-5V-urY\" secondAttribute=\"trailing\" constant=\"6\" id=\"Yyb-W5-g9A\"/>\n                                                <constraint firstAttribute=\"height\" priority=\"750\" constant=\"106\" id=\"i5p-uU-Rg2\"/>\n                                                <constraint firstItem=\"3ef-5V-urY\" firstAttribute=\"leading\" secondItem=\"f8f-tL-siP\" secondAttribute=\"trailing\" constant=\"8\" id=\"lb5-kp-9WA\"/>\n                                                <constraint firstItem=\"fff-4o-qCJ\" firstAttribute=\"top\" relation=\"greaterThanOrEqual\" secondItem=\"kX2-q5-VLD\" secondAttribute=\"top\" constant=\"4\" id=\"peY-zz-xco\"/>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"gTO-00-yFQ\" secondAttribute=\"bottom\" constant=\"2\" id=\"tIh-a7-uQA\"/>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"fff-4o-qCJ\" secondAttribute=\"bottom\" constant=\"8\" id=\"tkf-xA-3XY\"/>\n                                            </constraints>\n                                        </view>\n                                    </subviews>\n                                    <color key=\"backgroundColor\" red=\"0.87450980392156863\" green=\"0.87450980392156863\" blue=\"0.87450980392156863\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    <constraints>\n                                        <constraint firstItem=\"kX2-q5-VLD\" firstAttribute=\"top\" secondItem=\"4h3-wr-OdE\" secondAttribute=\"top\" constant=\"8\" id=\"BNC-Ug-R3e\"/>\n                                        <constraint firstItem=\"kX2-q5-VLD\" firstAttribute=\"leading\" secondItem=\"4h3-wr-OdE\" secondAttribute=\"leading\" constant=\"8\" id=\"Rle-Ak-bUc\"/>\n                                        <constraint firstAttribute=\"bottom\" secondItem=\"kX2-q5-VLD\" secondAttribute=\"bottom\" id=\"mMO-1U-M9P\"/>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"kX2-q5-VLD\" secondAttribute=\"trailing\" constant=\"8\" id=\"maW-l8-KVX\"/>\n                                    </constraints>\n                                </tableViewCellContentView>\n                                <color key=\"backgroundColor\" red=\"0.87450980389999999\" green=\"0.87450980389999999\" blue=\"0.87450980389999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                <connections>\n                                    <outlet property=\"category\" destination=\"gTO-00-yFQ\" id=\"cXP-Ad-qtA\"/>\n                                    <outlet property=\"date\" destination=\"3ef-5V-urY\" id=\"H2E-za-zqx\"/>\n                                    <outlet property=\"picture\" destination=\"f8f-tL-siP\" id=\"alf-As-w01\"/>\n                                    <outlet property=\"title\" destination=\"Qp9-EF-CBv\" id=\"RoZ-jj-7KC\"/>\n                                    <outlet property=\"viewToHighlight\" destination=\"kX2-q5-VLD\" id=\"2dt-6e-hxE\"/>\n                                </connections>\n                            </tableViewCell>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"RLDCommentTableViewCell\" rowHeight=\"317\" id=\"fPA-ug-cX0\" userLabel=\"RLDCommentTableViewCell\" customClass=\"RLDCommentTableViewCell\" customModule=\"TableViewPrototype\">\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"fPA-ug-cX0\" id=\"TqF-TS-Zj0\">\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zaf-SL-8EC\" userLabel=\"Image\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"205\"/>\n                                            <color key=\"backgroundColor\" red=\"0.52831865649999998\" green=\"0.70838541109999997\" blue=\"0.84556502529999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"205\" id=\"4eD-Es-qn2\"/>\n                                            </constraints>\n                                        </imageView>\n                                        <view alpha=\"0.40000000000000002\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8sm-sU-eZq\" userLabel=\"Veil\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"155\" width=\"414\" height=\"50\"/>\n                                            <color key=\"backgroundColor\" white=\"0.0\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"50\" id=\"zAc-U4-h8B\"/>\n                                            </constraints>\n                                        </view>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Excepteur sint occaecat\" lineBreakMode=\"wordWrap\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Gst-02-5DO\" userLabel=\"Title\">\n                                            <rect key=\"frame\" x=\"10\" y=\"169\" width=\"394\" height=\"28\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" weight=\"semibold\" pointSize=\"23\"/>\n                                            <color key=\"textColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Comment, tap to edit\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iCh-9Q-VvL\" userLabel=\"Comment title\">\n                                            <rect key=\"frame\" x=\"8\" y=\"213\" width=\"139\" height=\"18\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" weight=\"light\" pointSize=\"15\"/>\n                                            <color key=\"textColor\" red=\"0.3912036263\" green=\"0.3912036263\" blue=\"0.3912036263\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                        <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" bounces=\"NO\" scrollEnabled=\"NO\" showsHorizontalScrollIndicator=\"NO\" showsVerticalScrollIndicator=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ZCe-oO-5gl\" userLabel=\"Comment text\">\n                                            <rect key=\"frame\" x=\"8\" y=\"237\" width=\"398\" height=\"70\"/>\n                                            <color key=\"backgroundColor\" red=\"0.94446719028520498\" green=\"0.94446719028520498\" blue=\"0.94446719028520498\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"70\" id=\"Ute-8s-4m1\"/>\n                                            </constraints>\n                                            <string key=\"text\">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.</string>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                            <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\" spellCheckingType=\"no\" enablesReturnKeyAutomatically=\"YES\"/>\n                                            <connections>\n                                                <outlet property=\"delegate\" destination=\"fPA-ug-cX0\" id=\"ecl-du-YAW\"/>\n                                            </connections>\n                                        </textView>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"8sm-sU-eZq\" firstAttribute=\"leading\" secondItem=\"Gst-02-5DO\" secondAttribute=\"leading\" constant=\"-10\" id=\"2Qa-4k-hHn\"/>\n                                        <constraint firstItem=\"zaf-SL-8EC\" firstAttribute=\"bottom\" secondItem=\"8sm-sU-eZq\" secondAttribute=\"bottom\" id=\"7hY-sf-Zt5\"/>\n                                        <constraint firstItem=\"zaf-SL-8EC\" firstAttribute=\"leading\" secondItem=\"8sm-sU-eZq\" secondAttribute=\"leading\" id=\"C4z-1S-AdS\"/>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"zaf-SL-8EC\" secondAttribute=\"trailing\" id=\"Ik8-0l-zrq\"/>\n                                        <constraint firstItem=\"ZCe-oO-5gl\" firstAttribute=\"top\" secondItem=\"8sm-sU-eZq\" secondAttribute=\"top\" constant=\"82\" id=\"WyV-a3-Myc\"/>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"ZCe-oO-5gl\" secondAttribute=\"trailing\" constant=\"8\" id=\"boc-FL-bSu\"/>\n                                        <constraint firstItem=\"zaf-SL-8EC\" firstAttribute=\"leading\" secondItem=\"TqF-TS-Zj0\" secondAttribute=\"leading\" id=\"bop-sa-fAA\"/>\n                                        <constraint firstItem=\"iCh-9Q-VvL\" firstAttribute=\"top\" secondItem=\"8sm-sU-eZq\" secondAttribute=\"bottom\" constant=\"8\" id=\"eJs-qa-bgM\"/>\n                                        <constraint firstItem=\"zaf-SL-8EC\" firstAttribute=\"top\" secondItem=\"TqF-TS-Zj0\" secondAttribute=\"top\" id=\"m6K-wy-bxg\"/>\n                                        <constraint firstItem=\"8sm-sU-eZq\" firstAttribute=\"bottom\" secondItem=\"Gst-02-5DO\" secondAttribute=\"bottom\" constant=\"8\" id=\"p57-BQ-ELc\"/>\n                                        <constraint firstItem=\"ZCe-oO-5gl\" firstAttribute=\"leading\" secondItem=\"TqF-TS-Zj0\" secondAttribute=\"leading\" constant=\"8\" id=\"q1B-8G-CyR\"/>\n                                        <constraint firstItem=\"zaf-SL-8EC\" firstAttribute=\"trailing\" secondItem=\"8sm-sU-eZq\" secondAttribute=\"trailing\" id=\"qpZ-80-TRU\"/>\n                                        <constraint firstItem=\"8sm-sU-eZq\" firstAttribute=\"trailing\" secondItem=\"Gst-02-5DO\" secondAttribute=\"trailing\" constant=\"10\" id=\"tM8-Xs-RPI\"/>\n                                        <constraint firstAttribute=\"bottom\" secondItem=\"ZCe-oO-5gl\" secondAttribute=\"bottom\" constant=\"10\" id=\"tNN-3C-Mjz\"/>\n                                        <constraint firstItem=\"iCh-9Q-VvL\" firstAttribute=\"leading\" secondItem=\"TqF-TS-Zj0\" secondAttribute=\"leading\" constant=\"8\" id=\"uyU-zh-JHg\"/>\n                                    </constraints>\n                                </tableViewCellContentView>\n                                <connections>\n                                    <outlet property=\"comment\" destination=\"ZCe-oO-5gl\" id=\"mq1-Wv-tyf\"/>\n                                    <outlet property=\"picture\" destination=\"zaf-SL-8EC\" id=\"XxF-ZC-a82\"/>\n                                    <outlet property=\"title\" destination=\"Gst-02-5DO\" id=\"7F8-zo-x2u\"/>\n                                    <outlet property=\"viewToHighlight\" destination=\"TqF-TS-Zj0\" id=\"kLj-k0-y8i\"/>\n                                </connections>\n                            </tableViewCell>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"RLDBigPictureTableViewCell\" rowHeight=\"310\" id=\"Onf-RL-efg\" userLabel=\"RLDBigPictureTableViewCell\" customClass=\"RLDBigPictureTableViewCell\" customModule=\"TableViewPrototype\">\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"Onf-RL-efg\" id=\"HoN-kJ-6R4\">\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"L05-sr-ilM\" userLabel=\"Image\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"205\"/>\n                                            <color key=\"backgroundColor\" red=\"0.52831865653999721\" green=\"0.70838541114296383\" blue=\"0.84556502525252519\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"205\" id=\"Cxe-Rw-JHj\"/>\n                                            </constraints>\n                                        </imageView>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Illium adipisicing pecu, sed eiusmod tempor\" lineBreakMode=\"wordWrap\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0tY-gY-zvz\" userLabel=\"Title\">\n                                            <rect key=\"frame\" x=\"8\" y=\"208\" width=\"398\" height=\"72\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"29\"/>\n                                            <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"|\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ZYr-2N-4SK\" userLabel=\"Separator\">\n                                            <rect key=\"frame\" x=\"51\" y=\"284\" width=\"4\" height=\"18\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" weight=\"light\" pointSize=\"15\"/>\n                                            <color key=\"textColor\" red=\"0.3912036263\" green=\"0.3912036263\" blue=\"0.3912036263\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                        <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lIN-5o-URb\" userLabel=\"Section\">\n                                            <rect key=\"frame\" x=\"61\" y=\"278\" width=\"40\" height=\"30\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" weight=\"light\" pointSize=\"15\"/>\n                                            <state key=\"normal\" title=\"Ipsum\">\n                                                <color key=\"titleShadowColor\" white=\"0.5\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                            </state>\n                                            <connections>\n                                                <action selector=\"categoryButtonTapped\" destination=\"Onf-RL-efg\" eventType=\"touchUpInside\" id=\"qKA-wr-bfp\"/>\n                                            </connections>\n                                        </button>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Loren\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"MTb-6D-D5K\" userLabel=\"Timestamp\">\n                                            <rect key=\"frame\" x=\"8\" y=\"284\" width=\"37\" height=\"18\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" weight=\"light\" pointSize=\"15\"/>\n                                            <color key=\"textColor\" red=\"0.39120362633689854\" green=\"0.39120362633689854\" blue=\"0.39120362633689854\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"L05-sr-ilM\" secondAttribute=\"trailing\" id=\"3Sj-Py-3Cf\"/>\n                                        <constraint firstItem=\"MTb-6D-D5K\" firstAttribute=\"leading\" secondItem=\"HoN-kJ-6R4\" secondAttribute=\"leading\" constant=\"8\" id=\"3mO-hN-Yoj\"/>\n                                        <constraint firstItem=\"L05-sr-ilM\" firstAttribute=\"top\" secondItem=\"HoN-kJ-6R4\" secondAttribute=\"top\" id=\"9tk-KY-Mfe\"/>\n                                        <constraint firstItem=\"0tY-gY-zvz\" firstAttribute=\"bottom\" secondItem=\"lIN-5o-URb\" secondAttribute=\"top\" constant=\"2\" id=\"Sdd-92-fWM\"/>\n                                        <constraint firstAttribute=\"bottom\" secondItem=\"ZYr-2N-4SK\" secondAttribute=\"bottom\" constant=\"8\" id=\"UGd-bT-XGG\"/>\n                                        <constraint firstItem=\"MTb-6D-D5K\" firstAttribute=\"top\" secondItem=\"0tY-gY-zvz\" secondAttribute=\"bottom\" constant=\"4\" id=\"Ue4-AJ-2nR\"/>\n                                        <constraint firstItem=\"lIN-5o-URb\" firstAttribute=\"leading\" secondItem=\"ZYr-2N-4SK\" secondAttribute=\"trailing\" constant=\"6\" id=\"W87-dT-cAC\"/>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"0tY-gY-zvz\" secondAttribute=\"trailing\" constant=\"8\" id=\"Wyz-lY-vih\"/>\n                                        <constraint firstAttribute=\"bottom\" secondItem=\"0tY-gY-zvz\" secondAttribute=\"bottom\" constant=\"30\" id=\"bRH-XL-TrG\"/>\n                                        <constraint firstAttribute=\"bottomMargin\" secondItem=\"lIN-5o-URb\" secondAttribute=\"bottom\" constant=\"-6\" id=\"cBY-Aw-iIr\"/>\n                                        <constraint firstItem=\"0tY-gY-zvz\" firstAttribute=\"top\" secondItem=\"L05-sr-ilM\" secondAttribute=\"bottom\" constant=\"3\" id=\"du2-LK-sxd\"/>\n                                        <constraint firstItem=\"0tY-gY-zvz\" firstAttribute=\"leading\" secondItem=\"HoN-kJ-6R4\" secondAttribute=\"leading\" constant=\"8\" id=\"qlo-C8-HqO\"/>\n                                        <constraint firstItem=\"ZYr-2N-4SK\" firstAttribute=\"leading\" secondItem=\"MTb-6D-D5K\" secondAttribute=\"trailing\" constant=\"6\" id=\"sXg-K5-NpL\"/>\n                                        <constraint firstItem=\"L05-sr-ilM\" firstAttribute=\"leading\" secondItem=\"HoN-kJ-6R4\" secondAttribute=\"leading\" id=\"tmr-e9-mAU\"/>\n                                        <constraint firstItem=\"ZYr-2N-4SK\" firstAttribute=\"top\" secondItem=\"0tY-gY-zvz\" secondAttribute=\"bottom\" constant=\"4\" id=\"uke-Ix-HbN\"/>\n                                        <constraint firstItem=\"MTb-6D-D5K\" firstAttribute=\"bottom\" secondItem=\"HoN-kJ-6R4\" secondAttribute=\"bottom\" constant=\"-8\" id=\"wkT-ub-eXw\"/>\n                                    </constraints>\n                                </tableViewCellContentView>\n                                <connections>\n                                    <outlet property=\"category\" destination=\"lIN-5o-URb\" id=\"mGH-KO-Iyl\"/>\n                                    <outlet property=\"date\" destination=\"MTb-6D-D5K\" id=\"Bnx-uK-h5T\"/>\n                                    <outlet property=\"picture\" destination=\"L05-sr-ilM\" id=\"0Vq-FI-9f6\"/>\n                                    <outlet property=\"title\" destination=\"0tY-gY-zvz\" id=\"6dn-Pd-Vsk\"/>\n                                    <outlet property=\"viewToHighlight\" destination=\"HoN-kJ-6R4\" id=\"c6e-C1-xKA\"/>\n                                </connections>\n                            </tableViewCell>\n                        </prototypes>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"RLDTableViewSwift\" id=\"o3E-jY-00A\"/>\n                    <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n                    <size key=\"freeformSize\" width=\"414\" height=\"890\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"7B2-LV-31Y\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1223\" y=\"326\"/>\n        </scene>\n        <!--RLDWebViewController-->\n        <scene sceneID=\"ZWB-jG-Egi\">\n            <objects>\n                <viewController storyboardIdentifier=\"RLDWebViewController\" id=\"iCO-A2-0sZ\" userLabel=\"RLDWebViewController\" customClass=\"RLDWebViewController\" customModule=\"TableViewPrototype\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"5AO-cQ-aQP\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"RCV-Nf-Zau\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"FGT-6P-mBu\" customClass=\"UIWebView\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    </view>\n                    <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n                    <size key=\"freeformSize\" width=\"414\" height=\"600\"/>\n                    <connections>\n                        <outlet property=\"view\" destination=\"FGT-6P-mBu\" id=\"qEz-So-eOV\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"OBa-tC-sBZ\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1851\" y=\"326\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"JeG-hF-Op9\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" hidesBarsOnSwipe=\"YES\" hidesBarsWhenVerticallyCompact=\"YES\" id=\"Ncx-uH-Jsh\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"PQC-QZ-zjp\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <toolbar key=\"toolbar\" opaque=\"NO\" clearsContextBeforeDrawing=\"NO\" contentMode=\"scaleToFill\" id=\"dsV-TP-fCC\">\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </toolbar>\n                    <connections>\n                        <segue destination=\"9Ww-mV-ZtW\" kind=\"relationship\" relationship=\"rootViewController\" id=\"2fw-sk-8B8\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"BTf-ZW-WC8\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"411\" y=\"326\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/RLDTableViewHeaderView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"7531\" systemVersion=\"14D136\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7520\"/>\n        <capability name=\"Constraints to layout margins\" minToolsVersion=\"6.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"43X-QC-Slb\" userLabel=\"RLDTableViewHeaderView\" customClass=\"RLDTableViewHeaderView\" customModule=\"TableViewPrototype\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"60\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6yK-8V-tMD\" userLabel=\"Content View\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"60\"/>\n                    <subviews>\n                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"In Picteris Luxum\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gMF-YT-BCB\" userLabel=\"Title\">\n                            <rect key=\"frame\" x=\"8\" y=\"23\" width=\"398\" height=\"32\"/>\n                            <fontDescription key=\"fontDescription\" type=\"system\" weight=\"light\" pointSize=\"26\"/>\n                            <nil key=\"highlightedColor\"/>\n                        </label>\n                    </subviews>\n                    <color key=\"backgroundColor\" red=\"0.84313725490196079\" green=\"0.84313725490196079\" blue=\"0.84313725490196079\" alpha=\"0.5\" colorSpace=\"calibratedRGB\"/>\n                    <constraints>\n                        <constraint firstItem=\"gMF-YT-BCB\" firstAttribute=\"top\" relation=\"lessThanOrEqual\" secondItem=\"6yK-8V-tMD\" secondAttribute=\"top\" constant=\"26\" id=\"4Nl-Qx-3t9\"/>\n                        <constraint firstItem=\"gMF-YT-BCB\" firstAttribute=\"trailing\" secondItem=\"6yK-8V-tMD\" secondAttribute=\"trailingMargin\" id=\"L8J-Bt-wxI\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"gMF-YT-BCB\" secondAttribute=\"bottom\" constant=\"5\" id=\"afn-5o-8Oz\"/>\n                        <constraint firstItem=\"gMF-YT-BCB\" firstAttribute=\"leading\" secondItem=\"6yK-8V-tMD\" secondAttribute=\"leadingMargin\" id=\"qPe-wJ-Qxd\"/>\n                    </constraints>\n                </view>\n            </subviews>\n            <constraints>\n                <constraint firstItem=\"6yK-8V-tMD\" firstAttribute=\"top\" secondItem=\"43X-QC-Slb\" secondAttribute=\"top\" id=\"LRR-gq-7JM\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"6yK-8V-tMD\" secondAttribute=\"trailing\" id=\"cpZ-Fg-hS3\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"6yK-8V-tMD\" secondAttribute=\"bottom\" id=\"sOR-aP-Y5p\"/>\n                <constraint firstItem=\"6yK-8V-tMD\" firstAttribute=\"leading\" secondItem=\"43X-QC-Slb\" secondAttribute=\"leading\" id=\"wRI-m9-jnF\"/>\n            </constraints>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <connections>\n                <outlet property=\"text\" destination=\"gMF-YT-BCB\" id=\"14f-n1-X38\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"418\" y=\"363\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "Sample app/TableViewPrototype/Resources/viewModelData.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<array>\n\t<dict>\n\t\t<key>cells</key>\n\t\t<array>\n\t\t\t<dict>\n\t\t\t\t<key>category</key>\n\t\t\t\t<string>Moscow</string>\n\t\t\t\t<key>categoryURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/sets/72157602083268883/</string>\n\t\t\t\t<key>class</key>\n\t\t\t\t<string>RLDBigPictureTableViewCellModel</string>\n\t\t\t\t<key>date</key>\n\t\t\t\t<string>2 years ago</string>\n\t\t\t\t<key>imageName</key>\n\t\t\t\t<string>6_big.jpg</string>\n\t\t\t\t<key>imageURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/1406925773/in/set-72157602083268883</string>\n\t\t\t\t<key>title</key>\n\t\t\t\t<string>The colorful Cathedral of Vasily the Blessed</string>\n\t\t\t</dict>\n\t\t\t<dict>\n\t\t\t\t<key>category</key>\n\t\t\t\t<string>Amsterdam</string>\n\t\t\t\t<key>categoryURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/sets/72157603544030165/</string>\n\t\t\t\t<key>class</key>\n\t\t\t\t<string>RLDSimpleTableViewCellModel</string>\n\t\t\t\t<key>date</key>\n\t\t\t\t<string>4 years ago</string>\n\t\t\t\t<key>imageName</key>\n\t\t\t\t<string>3_small.jpg</string>\n\t\t\t\t<key>imageURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/2135948414/in/set-72157603544030165</string>\n\t\t\t\t<key>title</key>\n\t\t\t\t<string>Quiet canals in the “Venice of the North”</string>\n\t\t\t\t<key>editable</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>editingStyle</key>\n\t\t\t\t<integer>1</integer>\n\t\t\t</dict>\n\t\t\t<dict>\n\t\t\t\t<key>category</key>\n\t\t\t\t<string>London</string>\n\t\t\t\t<key>categoryURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/sets/72157594446615513/</string>\n\t\t\t\t<key>class</key>\n\t\t\t\t<string>RLDSimpleTableViewCellModel</string>\n\t\t\t\t<key>date</key>\n\t\t\t\t<string>Today</string>\n\t\t\t\t<key>imageName</key>\n\t\t\t\t<string>9_small.jpg</string>\n\t\t\t\t<key>imageURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/337540114/in/set-72157594446615513</string>\n\t\t\t\t<key>title</key>\n\t\t\t\t<string>Tower Bridge, one of the most iconic bridges in the world</string>\n\t\t\t\t<key>editable</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>editingStyle</key>\n\t\t\t\t<integer>1</integer>\n\t\t\t</dict>\n\t\t</array>\n\t</dict>\n\t<dict>\n\t\t<key>cells</key>\n\t\t<array>\n\t\t\t<dict>\n\t\t\t\t<key>category</key>\n\t\t\t\t<string>Kuramathi</string>\n\t\t\t\t<key>categoryURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/sets/72157627990642402/</string>\n\t\t\t\t<key>class</key>\n\t\t\t\t<string>RLDBigPictureTableViewCellModel</string>\n\t\t\t\t<key>date</key>\n\t\t\t\t<string>3 weeks ago</string>\n\t\t\t\t<key>imageName</key>\n\t\t\t\t<string>4_big.jpg</string>\n\t\t\t\t<key>imageURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/6286531716/in/set-72157627990642402</string>\n\t\t\t\t<key>title</key>\n\t\t\t\t<string>Sea Salt&apos;s crab unwinding in the beach</string>\n\t\t\t</dict>\n\t\t\t<dict>\n\t\t\t\t<key>category</key>\n\t\t\t\t<string>Rasdhoo</string>\n\t\t\t\t<key>categoryURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/sets/72157627991759766/</string>\n\t\t\t\t<key>class</key>\n\t\t\t\t<string>RLDSimpleTableViewCellModel</string>\n\t\t\t\t<key>date</key>\n\t\t\t\t<string>Today</string>\n\t\t\t\t<key>imageName</key>\n\t\t\t\t<string>1_small.jpg</string>\n\t\t\t\t<key>imageURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/6286903694/in/set-72157627990642402</string>\n\t\t\t\t<key>title</key>\n\t\t\t\t<string>The Maldives, home of beautiful beaches</string>\n\t\t\t\t<key>editable</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>movable</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<dict>\n\t\t\t\t<key>category</key>\n\t\t\t\t<string>Swiss Alps</string>\n\t\t\t\t<key>categoryURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/sets/72157625889560426/</string>\n\t\t\t\t<key>class</key>\n\t\t\t\t<string>RLDSimpleTableViewCellModel</string>\n\t\t\t\t<key>date</key>\n\t\t\t\t<string>7 years ago</string>\n\t\t\t\t<key>imageName</key>\n\t\t\t\t<string>0_small.jpg</string>\n\t\t\t\t<key>imageURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/5384467483/in/set-72157625889560426</string>\n\t\t\t\t<key>title</key>\n\t\t\t\t<string>Picturesque peak covered with snow</string>\n\t\t\t\t<key>editable</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>movable</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t\t<dict>\n\t\t\t\t<key>category</key>\n\t\t\t\t<string>Tenerife</string>\n\t\t\t\t<key>categoryURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/sets/72157594446322517/</string>\n\t\t\t\t<key>class</key>\n\t\t\t\t<string>RLDSimpleTableViewCellModel</string>\n\t\t\t\t<key>date</key>\n\t\t\t\t<string>Yesterday</string>\n\t\t\t\t<key>imageName</key>\n\t\t\t\t<string>8_small.jpg</string>\n\t\t\t\t<key>imageURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/3556768497/in/set-72157594446322517</string>\n\t\t\t\t<key>title</key>\n\t\t\t\t<string>Mount Teide, a 3,718 meter high vulcano</string>\n\t\t\t\t<key>editable</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>movable</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t</array>\n\t\t<key>title</key>\n\t\t<string>Magnificent scenery</string>\n\t</dict>\n\t<dict>\n\t\t<key>cells</key>\n\t\t<array>\n\t\t\t<dict>\n\t\t\t\t<key>class</key>\n\t\t\t\t<string>RLDCommentTableViewCellModel</string>\n\t\t\t\t<key>comment</key>\n\t\t\t\t<string>This building is the seat of the National Assembly of Hungary, and one of the most awesome constructions in Budapest</string>\n\t\t\t\t<key>imageName</key>\n\t\t\t\t<string>7_big.jpg</string>\n\t\t\t\t<key>imageURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/336410485/in/set-72157594444731896</string>\n\t\t\t\t<key>title</key>\n\t\t\t\t<string>The Hungarian Parliament</string>\n\t\t\t</dict>\n\t\t\t<dict>\n\t\t\t\t<key>category</key>\n\t\t\t\t<string>Rome</string>\n\t\t\t\t<key>categoryURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/sets/72157594444449793/</string>\n\t\t\t\t<key>class</key>\n\t\t\t\t<string>RLDSimpleTableViewCellModel</string>\n\t\t\t\t<key>date</key>\n\t\t\t\t<string>3 weeks ago</string>\n\t\t\t\t<key>imageName</key>\n\t\t\t\t<string>5_small.jpg</string>\n\t\t\t\t<key>imageURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/188286231/in/set-72157594444449793</string>\n\t\t\t\t<key>title</key>\n\t\t\t\t<string>Coliseum, or Flavian Amphitheatre</string>\n\t\t\t</dict>\n\t\t\t<dict>\n\t\t\t\t<key>category</key>\n\t\t\t\t<string>Paris</string>\n\t\t\t\t<key>categoryURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/sets/72157594444442779/</string>\n\t\t\t\t<key>class</key>\n\t\t\t\t<string>RLDSimpleTableViewCellModel</string>\n\t\t\t\t<key>date</key>\n\t\t\t\t<string>1 month ago</string>\n\t\t\t\t<key>imageName</key>\n\t\t\t\t<string>2_small.jpg</string>\n\t\t\t\t<key>imageURL</key>\n\t\t\t\t<string>https://www.flickr.com/photos/keoki/188266460/in/set-72157594444442779</string>\n\t\t\t\t<key>title</key>\n\t\t\t\t<string>The Basilica of the Sacré-Cœur of Paris</string>\n\t\t\t</dict>\n\t\t</array>\n\t\t<key>title</key>\n\t\t<string>Singular buildings</string>\n\t</dict>\n</array>\n</plist>\n"
  },
  {
    "path": "Sample app/TableViewPrototype/View controllers/RLDMasterViewController.swift",
    "content": "import UIKit\n\nclass RLDMasterViewController: RLDTableViewController {\n    \n    let modelProvider = RLDTableViewModelProvider()\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        registerNibs()\n        registerEventHandlers()\n        setTableViewModel()\n        attachEditButton()\n    }\n    \n    private func registerNibs() {\n        for (reuseIdentifier, nibName) in modelProvider.headerFooterReuseIdentifiersToNibNames {\n            let nib = UINib(nibName:reuseIdentifier, bundle:nil)\n            tableView?.registerNib(nib, forHeaderFooterViewReuseIdentifier:nibName)\n        }\n    }\n    \n    private func registerEventHandlers() {\n        RLDGenericTableViewCellEventHandler.register()\n        RLDTableViewHeaderViewEventHandler.register()\n    }\n    \n    private func setTableViewModel() {\n        tableViewModel = modelProvider.tableViewModel\n    }\n    \n    private func attachEditButton() {\n        navigationItem.rightBarButtonItem = self.editButtonItem()\n    }\n    \n    override func setEditing(editing:Bool, animated:Bool) {\n        super.setEditing(editing, animated:animated)\n        \n        navigationController?.hidesBarsOnSwipe = !editing\n        navigationController?.hidesBarsWhenVerticallyCompact = !editing\n    }\n    \n    override func prefersStatusBarHidden() -> Bool {\n        return true\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/View controllers/RLDWebViewController.swift",
    "content": "import UIKit\n\nclass RLDWebViewController: UIViewController {\n    var url:String = \"\" {\n        didSet {\n            if let view = view as? UIWebView {\n                let urlRequest = NSURLRequest(URL:NSURL(string:url)!)\n                view.loadRequest(urlRequest)\n            }\n        }\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Views/RLDBigPictureTableViewCell.swift",
    "content": "class RLDBigPictureTableViewCell:RLDGenericTableViewCell {\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Views/RLDCommentTableViewCell.swift",
    "content": "import UIKit\n\nclass RLDCommentTableViewCell:RLDGenericTableViewCell {\n    @IBOutlet weak var comment:UITextView!\n    \n    override var model:RLDGenericTableViewCellModel? {\n        didSet {\n            if let model = model as? RLDCommentTableViewCellModel {\n                comment.text = model.comment\n            }\n        }\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Views/RLDGenericTableViewCell.swift",
    "content": "import UIKit\nimport RLDTableViewSwift\n\nclass RLDGenericTableViewCell:UITableViewCell, RLDHandledViewProtocol {\n    @IBOutlet weak var title:UILabel!\n    @IBOutlet weak var date:UILabel?\n    @IBOutlet weak var category:UIButton?\n    @IBOutlet weak var picture:UIImageView!\n    @IBOutlet weak var viewToHighlight:UIView!\n    \n    var eventHandler:RLDTableViewEventHandler? = nil\n    \n    var model:RLDGenericTableViewCellModel? {\n        didSet {\n            if let model = model {\n                title.text = model.title\n                picture.image = UIImage(named:model.imageName)\n                if let date = date {\n                    date.text = model.date\n                }\n                if let category = category {\n                    category.setTitle(model.category, forState:UIControlState.Normal)\n                }\n            }\n        }\n    }\n    \n    @IBAction func categoryButtonTapped() {\n        if let eventHandler = eventHandler as? RLDGenericTableViewCellEventHandler {\n            eventHandler.didTapCategoryButton()\n        }\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Views/RLDSimpleTableViewCell.swift",
    "content": "class RLDSimpleTableViewCell:RLDGenericTableViewCell {\n}"
  },
  {
    "path": "Sample app/TableViewPrototype/Views/RLDTableViewHeaderView.swift",
    "content": "import UIKit\nimport RLDTableViewSwift\n\nclass RLDTableViewHeaderView:UITableViewHeaderFooterView, RLDHandledViewProtocol {\n    @IBOutlet weak var text:UILabel!\n    \n    var eventHandler:RLDTableViewEventHandler? = nil\n    \n    var model:RLDTableViewHeaderViewModel? {\n        didSet {\n            text.text = model!.title\n        }\n    }\n}"
  },
  {
    "path": "Sample app/TableViewPrototype.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t454E32001AF008BF00AB44BC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 454E31FF1AF008BF00AB44BC /* AppDelegate.swift */; };\n\t\t457D00661AF0104E00AE3D52 /* RLDTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 457D00651AF0104E00AE3D52 /* RLDTableViewController.swift */; };\n\t\t457D7CF81AF009EA00388423 /* RLDMasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 457D7CF71AF009EA00388423 /* RLDMasterViewController.swift */; };\n\t\t457D7CFF1AF009F300388423 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 457D7CFA1AF009F300388423 /* Images.xcassets */; };\n\t\t457D7D001AF009F300388423 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 457D7CFB1AF009F300388423 /* LaunchScreen.xib */; };\n\t\t457D7D011AF009F300388423 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 457D7CFC1AF009F300388423 /* Main.storyboard */; };\n\t\t457D7D021AF009F300388423 /* RLDTableViewHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 457D7CFD1AF009F300388423 /* RLDTableViewHeaderView.xib */; };\n\t\t457D7D031AF009F300388423 /* viewModelData.plist in Resources */ = {isa = PBXBuildFile; fileRef = 457D7CFE1AF009F300388423 /* viewModelData.plist */; };\n\t\t457D7D451AF00AB700388423 /* RLDTableViewSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 457D7D2E1AF00AB700388423 /* RLDTableViewSwift.framework */; };\n\t\t457D7D461AF00AB700388423 /* RLDTableViewSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 457D7D2E1AF00AB700388423 /* RLDTableViewSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t45886C1A1AF177860085F7A4 /* RLDWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45886C191AF177860085F7A4 /* RLDWebViewController.swift */; };\n\t\t4596815E1AF031F300EC4B52 /* RLDTableViewModelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4596815D1AF031F300EC4B52 /* RLDTableViewModelProvider.swift */; };\n\t\t459681601AF0321000EC4B52 /* RLDGenericTableViewCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4596815F1AF0321000EC4B52 /* RLDGenericTableViewCellModel.swift */; };\n\t\t459681621AF0324E00EC4B52 /* RLDSimpleTableViewCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459681611AF0324E00EC4B52 /* RLDSimpleTableViewCellModel.swift */; };\n\t\t459681641AF0327000EC4B52 /* RLDBigPictureTableViewCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459681631AF0327000EC4B52 /* RLDBigPictureTableViewCellModel.swift */; };\n\t\t459681661AF0328D00EC4B52 /* RLDCommentTableViewCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459681651AF0328D00EC4B52 /* RLDCommentTableViewCellModel.swift */; };\n\t\t459681681AF032AE00EC4B52 /* RLDTableViewHeaderViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459681671AF032AE00EC4B52 /* RLDTableViewHeaderViewModel.swift */; };\n\t\t45AC03931AF16D2900944DB7 /* RLDGenericTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45AC03921AF16D2900944DB7 /* RLDGenericTableViewCell.swift */; };\n\t\t45AC03951AF170FD00944DB7 /* RLDSimpleTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45AC03941AF170FD00944DB7 /* RLDSimpleTableViewCell.swift */; };\n\t\t45AC03971AF1711D00944DB7 /* RLDBigPictureTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45AC03961AF1711D00944DB7 /* RLDBigPictureTableViewCell.swift */; };\n\t\t45AC03991AF1713800944DB7 /* RLDCommentTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45AC03981AF1713800944DB7 /* RLDCommentTableViewCell.swift */; };\n\t\t45AC039B1AF1715700944DB7 /* RLDTableViewHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45AC039A1AF1715700944DB7 /* RLDTableViewHeaderView.swift */; };\n\t\t45AC039D1AF172D900944DB7 /* RLDGenericTableViewCellEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45AC039C1AF172D900944DB7 /* RLDGenericTableViewCellEventHandler.swift */; };\n\t\t45AC039F1AF1731E00944DB7 /* RLDTableViewHeaderViewEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45AC039E1AF1731E00944DB7 /* RLDTableViewHeaderViewEventHandler.swift */; };\n\t\t45F6AEC11AF00DEB007F7AF5 /* RLDHandledViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F6AEBB1AF00DEB007F7AF5 /* RLDHandledViewProtocol.swift */; };\n\t\t45F6AEC21AF00DEB007F7AF5 /* RLDTableViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F6AEBC1AF00DEB007F7AF5 /* RLDTableViewDataSource.swift */; };\n\t\t45F6AEC31AF00DEB007F7AF5 /* RLDTableViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F6AEBD1AF00DEB007F7AF5 /* RLDTableViewDelegate.swift */; };\n\t\t45F6AEC41AF00DEB007F7AF5 /* RLDTableViewEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F6AEBE1AF00DEB007F7AF5 /* RLDTableViewEventHandler.swift */; };\n\t\t45F6AEC51AF00DEB007F7AF5 /* RLDTableViewEventHandlerProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F6AEBF1AF00DEB007F7AF5 /* RLDTableViewEventHandlerProvider.swift */; };\n\t\t45F6AEC61AF00DEB007F7AF5 /* RLDTableViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F6AEC01AF00DEB007F7AF5 /* RLDTableViewModel.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t457D7D431AF00AB700388423 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 454E31F21AF008BF00AB44BC /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 457D7D2D1AF00AB700388423;\n\t\t\tremoteInfo = RLDTableViewSwift;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t457D7D251AF00A2A00388423 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t457D7D461AF00AB700388423 /* RLDTableViewSwift.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t454E31FA1AF008BF00AB44BC /* TableViewPrototype.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TableViewPrototype.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t454E31FE1AF008BF00AB44BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t454E31FF1AF008BF00AB44BC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t457D00651AF0104E00AE3D52 /* RLDTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewController.swift; sourceTree = \"<group>\"; };\n\t\t457D7CF71AF009EA00388423 /* RLDMasterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDMasterViewController.swift; sourceTree = \"<group>\"; };\n\t\t457D7CFA1AF009F300388423 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t457D7CFB1AF009F300388423 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t457D7CFC1AF009F300388423 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = \"<group>\"; };\n\t\t457D7CFD1AF009F300388423 /* RLDTableViewHeaderView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RLDTableViewHeaderView.xib; sourceTree = \"<group>\"; };\n\t\t457D7CFE1AF009F300388423 /* viewModelData.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = viewModelData.plist; sourceTree = \"<group>\"; };\n\t\t457D7D2E1AF00AB700388423 /* RLDTableViewSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RLDTableViewSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t457D7D311AF00AB700388423 /* RLDTableViewSwift-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = \"RLDTableViewSwift-Info.plist\"; path = \"../Sample app/TableViewPrototype/RLDTableViewSwift-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t45886C191AF177860085F7A4 /* RLDWebViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDWebViewController.swift; sourceTree = \"<group>\"; };\n\t\t4596815D1AF031F300EC4B52 /* RLDTableViewModelProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewModelProvider.swift; sourceTree = \"<group>\"; };\n\t\t4596815F1AF0321000EC4B52 /* RLDGenericTableViewCellModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDGenericTableViewCellModel.swift; sourceTree = \"<group>\"; };\n\t\t459681611AF0324E00EC4B52 /* RLDSimpleTableViewCellModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDSimpleTableViewCellModel.swift; sourceTree = \"<group>\"; };\n\t\t459681631AF0327000EC4B52 /* RLDBigPictureTableViewCellModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDBigPictureTableViewCellModel.swift; sourceTree = \"<group>\"; };\n\t\t459681651AF0328D00EC4B52 /* RLDCommentTableViewCellModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDCommentTableViewCellModel.swift; sourceTree = \"<group>\"; };\n\t\t459681671AF032AE00EC4B52 /* RLDTableViewHeaderViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewHeaderViewModel.swift; sourceTree = \"<group>\"; };\n\t\t45AC03921AF16D2900944DB7 /* RLDGenericTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDGenericTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t45AC03941AF170FD00944DB7 /* RLDSimpleTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDSimpleTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t45AC03961AF1711D00944DB7 /* RLDBigPictureTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDBigPictureTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t45AC03981AF1713800944DB7 /* RLDCommentTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDCommentTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t45AC039A1AF1715700944DB7 /* RLDTableViewHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewHeaderView.swift; sourceTree = \"<group>\"; };\n\t\t45AC039C1AF172D900944DB7 /* RLDGenericTableViewCellEventHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDGenericTableViewCellEventHandler.swift; sourceTree = \"<group>\"; };\n\t\t45AC039E1AF1731E00944DB7 /* RLDTableViewHeaderViewEventHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewHeaderViewEventHandler.swift; sourceTree = \"<group>\"; };\n\t\t45F6AEBB1AF00DEB007F7AF5 /* RLDHandledViewProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDHandledViewProtocol.swift; sourceTree = \"<group>\"; };\n\t\t45F6AEBC1AF00DEB007F7AF5 /* RLDTableViewDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewDataSource.swift; sourceTree = \"<group>\"; };\n\t\t45F6AEBD1AF00DEB007F7AF5 /* RLDTableViewDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewDelegate.swift; sourceTree = \"<group>\"; };\n\t\t45F6AEBE1AF00DEB007F7AF5 /* RLDTableViewEventHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewEventHandler.swift; sourceTree = \"<group>\"; };\n\t\t45F6AEBF1AF00DEB007F7AF5 /* RLDTableViewEventHandlerProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewEventHandlerProvider.swift; sourceTree = \"<group>\"; };\n\t\t45F6AEC01AF00DEB007F7AF5 /* RLDTableViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewModel.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t454E31F71AF008BF00AB44BC /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t457D7D451AF00AB700388423 /* RLDTableViewSwift.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t457D7D2A1AF00AB700388423 /* 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/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t454E31F11AF008BF00AB44BC = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t457D7D2F1AF00AB700388423 /* RLDTableViewSwift */,\n\t\t\t\t454E31FC1AF008BF00AB44BC /* TableViewPrototype */,\n\t\t\t\t454E31FB1AF008BF00AB44BC /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t454E31FB1AF008BF00AB44BC /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t454E31FA1AF008BF00AB44BC /* TableViewPrototype.app */,\n\t\t\t\t457D7D2E1AF00AB700388423 /* RLDTableViewSwift.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t454E31FC1AF008BF00AB44BC /* TableViewPrototype */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t457D7CF31AF009D200388423 /* Models */,\n\t\t\t\t457D7CF41AF009D700388423 /* Views */,\n\t\t\t\t457D7CF51AF009DD00388423 /* Event handlers */,\n\t\t\t\t457D7CF61AF009EA00388423 /* View controllers */,\n\t\t\t\t457D7CF91AF009F300388423 /* Resources */,\n\t\t\t\t454E31FD1AF008BF00AB44BC /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = TableViewPrototype;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t454E31FD1AF008BF00AB44BC /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t454E31FF1AF008BF00AB44BC /* AppDelegate.swift */,\n\t\t\t\t454E31FE1AF008BF00AB44BC /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t457D7CF31AF009D200388423 /* Models */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4596815D1AF031F300EC4B52 /* RLDTableViewModelProvider.swift */,\n\t\t\t\t4596815F1AF0321000EC4B52 /* RLDGenericTableViewCellModel.swift */,\n\t\t\t\t459681611AF0324E00EC4B52 /* RLDSimpleTableViewCellModel.swift */,\n\t\t\t\t459681631AF0327000EC4B52 /* RLDBigPictureTableViewCellModel.swift */,\n\t\t\t\t459681651AF0328D00EC4B52 /* RLDCommentTableViewCellModel.swift */,\n\t\t\t\t459681671AF032AE00EC4B52 /* RLDTableViewHeaderViewModel.swift */,\n\t\t\t);\n\t\t\tpath = Models;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t457D7CF41AF009D700388423 /* Views */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t45AC03921AF16D2900944DB7 /* RLDGenericTableViewCell.swift */,\n\t\t\t\t45AC03941AF170FD00944DB7 /* RLDSimpleTableViewCell.swift */,\n\t\t\t\t45AC03961AF1711D00944DB7 /* RLDBigPictureTableViewCell.swift */,\n\t\t\t\t45AC03981AF1713800944DB7 /* RLDCommentTableViewCell.swift */,\n\t\t\t\t45AC039A1AF1715700944DB7 /* RLDTableViewHeaderView.swift */,\n\t\t\t);\n\t\t\tpath = Views;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t457D7CF51AF009DD00388423 /* Event handlers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t45AC039C1AF172D900944DB7 /* RLDGenericTableViewCellEventHandler.swift */,\n\t\t\t\t45AC039E1AF1731E00944DB7 /* RLDTableViewHeaderViewEventHandler.swift */,\n\t\t\t);\n\t\t\tname = \"Event handlers\";\n\t\t\tpath = \"TableViewPrototype/Event handlers\";\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t457D7CF61AF009EA00388423 /* View controllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t457D7CF71AF009EA00388423 /* RLDMasterViewController.swift */,\n\t\t\t\t45886C191AF177860085F7A4 /* RLDWebViewController.swift */,\n\t\t\t);\n\t\t\tpath = \"View controllers\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t457D7CF91AF009F300388423 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t457D7CFA1AF009F300388423 /* Images.xcassets */,\n\t\t\t\t457D7CFB1AF009F300388423 /* LaunchScreen.xib */,\n\t\t\t\t457D7CFC1AF009F300388423 /* Main.storyboard */,\n\t\t\t\t457D7CFD1AF009F300388423 /* RLDTableViewHeaderView.xib */,\n\t\t\t\t457D7CFE1AF009F300388423 /* viewModelData.plist */,\n\t\t\t);\n\t\t\tpath = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t457D7D2F1AF00AB700388423 /* RLDTableViewSwift */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t45F6AEC01AF00DEB007F7AF5 /* RLDTableViewModel.swift */,\n\t\t\t\t45F6AEBC1AF00DEB007F7AF5 /* RLDTableViewDataSource.swift */,\n\t\t\t\t45F6AEBD1AF00DEB007F7AF5 /* RLDTableViewDelegate.swift */,\n\t\t\t\t45F6AEBE1AF00DEB007F7AF5 /* RLDTableViewEventHandler.swift */,\n\t\t\t\t45F6AEBF1AF00DEB007F7AF5 /* RLDTableViewEventHandlerProvider.swift */,\n\t\t\t\t45F6AEBB1AF00DEB007F7AF5 /* RLDHandledViewProtocol.swift */,\n\t\t\t\t457D00651AF0104E00AE3D52 /* RLDTableViewController.swift */,\n\t\t\t\t457D7D301AF00AB700388423 /* Supporting Files */,\n\t\t\t);\n\t\t\tname = RLDTableViewSwift;\n\t\t\tpath = ../Classes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t457D7D301AF00AB700388423 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t457D7D311AF00AB700388423 /* RLDTableViewSwift-Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t457D7D2B1AF00AB700388423 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t454E31F91AF008BF00AB44BC /* TableViewPrototype */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 454E32191AF008BF00AB44BC /* Build configuration list for PBXNativeTarget \"TableViewPrototype\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t454E31F61AF008BF00AB44BC /* Sources */,\n\t\t\t\t454E31F71AF008BF00AB44BC /* Frameworks */,\n\t\t\t\t454E31F81AF008BF00AB44BC /* Resources */,\n\t\t\t\t457D7D251AF00A2A00388423 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t457D7D441AF00AB700388423 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = TableViewPrototype;\n\t\t\tproductName = TableViewPrototype;\n\t\t\tproductReference = 454E31FA1AF008BF00AB44BC /* TableViewPrototype.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t457D7D2D1AF00AB700388423 /* RLDTableViewSwift */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 457D7D471AF00AB700388423 /* Build configuration list for PBXNativeTarget \"RLDTableViewSwift\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t457D7D291AF00AB700388423 /* Sources */,\n\t\t\t\t457D7D2A1AF00AB700388423 /* Frameworks */,\n\t\t\t\t457D7D2B1AF00AB700388423 /* Headers */,\n\t\t\t\t457D7D2C1AF00AB700388423 /* 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 = RLDTableViewSwift;\n\t\t\tproductName = RLDTableViewSwift;\n\t\t\tproductReference = 457D7D2E1AF00AB700388423 /* RLDTableViewSwift.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t454E31F21AF008BF00AB44BC /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftMigration = 0730;\n\t\t\t\tLastSwiftUpdateCheck = 0730;\n\t\t\t\tLastUpgradeCheck = 0730;\n\t\t\t\tORGANIZATIONNAME = \"Rafael Lopez Diez\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t454E31F91AF008BF00AB44BC = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3;\n\t\t\t\t\t};\n\t\t\t\t\t457D7D2D1AF00AB700388423 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 454E31F51AF008BF00AB44BC /* Build configuration list for PBXProject \"TableViewPrototype\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 454E31F11AF008BF00AB44BC;\n\t\t\tproductRefGroup = 454E31FB1AF008BF00AB44BC /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t454E31F91AF008BF00AB44BC /* TableViewPrototype */,\n\t\t\t\t457D7D2D1AF00AB700388423 /* RLDTableViewSwift */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t454E31F81AF008BF00AB44BC /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t457D7D021AF009F300388423 /* RLDTableViewHeaderView.xib in Resources */,\n\t\t\t\t457D7D011AF009F300388423 /* Main.storyboard in Resources */,\n\t\t\t\t457D7D031AF009F300388423 /* viewModelData.plist in Resources */,\n\t\t\t\t457D7D001AF009F300388423 /* LaunchScreen.xib in Resources */,\n\t\t\t\t457D7CFF1AF009F300388423 /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t457D7D2C1AF00AB700388423 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t454E31F61AF008BF00AB44BC /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t45AC039B1AF1715700944DB7 /* RLDTableViewHeaderView.swift in Sources */,\n\t\t\t\t459681641AF0327000EC4B52 /* RLDBigPictureTableViewCellModel.swift in Sources */,\n\t\t\t\t45AC039D1AF172D900944DB7 /* RLDGenericTableViewCellEventHandler.swift in Sources */,\n\t\t\t\t45AC03991AF1713800944DB7 /* RLDCommentTableViewCell.swift in Sources */,\n\t\t\t\t459681621AF0324E00EC4B52 /* RLDSimpleTableViewCellModel.swift in Sources */,\n\t\t\t\t45AC03931AF16D2900944DB7 /* RLDGenericTableViewCell.swift in Sources */,\n\t\t\t\t457D00661AF0104E00AE3D52 /* RLDTableViewController.swift in Sources */,\n\t\t\t\t457D7CF81AF009EA00388423 /* RLDMasterViewController.swift in Sources */,\n\t\t\t\t45AC03951AF170FD00944DB7 /* RLDSimpleTableViewCell.swift in Sources */,\n\t\t\t\t459681601AF0321000EC4B52 /* RLDGenericTableViewCellModel.swift in Sources */,\n\t\t\t\t45886C1A1AF177860085F7A4 /* RLDWebViewController.swift in Sources */,\n\t\t\t\t459681681AF032AE00EC4B52 /* RLDTableViewHeaderViewModel.swift in Sources */,\n\t\t\t\t45AC03971AF1711D00944DB7 /* RLDBigPictureTableViewCell.swift in Sources */,\n\t\t\t\t45AC039F1AF1731E00944DB7 /* RLDTableViewHeaderViewEventHandler.swift in Sources */,\n\t\t\t\t454E32001AF008BF00AB44BC /* AppDelegate.swift in Sources */,\n\t\t\t\t459681661AF0328D00EC4B52 /* RLDCommentTableViewCellModel.swift in Sources */,\n\t\t\t\t4596815E1AF031F300EC4B52 /* RLDTableViewModelProvider.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t457D7D291AF00AB700388423 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t45F6AEC11AF00DEB007F7AF5 /* RLDHandledViewProtocol.swift in Sources */,\n\t\t\t\t45F6AEC21AF00DEB007F7AF5 /* RLDTableViewDataSource.swift in Sources */,\n\t\t\t\t45F6AEC61AF00DEB007F7AF5 /* RLDTableViewModel.swift in Sources */,\n\t\t\t\t45F6AEC51AF00DEB007F7AF5 /* RLDTableViewEventHandlerProvider.swift in Sources */,\n\t\t\t\t45F6AEC41AF00DEB007F7AF5 /* RLDTableViewEventHandler.swift in Sources */,\n\t\t\t\t45F6AEC31AF00DEB007F7AF5 /* RLDTableViewDelegate.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\t457D7D441AF00AB700388423 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 457D7D2D1AF00AB700388423 /* RLDTableViewSwift */;\n\t\t\ttargetProxy = 457D7D431AF00AB700388423 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t454E32171AF008BF00AB44BC /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\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_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"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_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\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_SYMBOLS_PRIVATE_EXTERN = NO;\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 = 8.1;\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_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t454E32181AF008BF00AB44BC /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\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_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"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 = gnu99;\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 = 8.1;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t454E321A1AF008BF00AB44BC /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tINFOPLIST_FILE = TableViewPrototype/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.rld.TableViewPrototype.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t454E321B1AF008BF00AB44BC /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tINFOPLIST_FILE = TableViewPrototype/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.rld.TableViewPrototype.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t457D7D481AF00AB700388423 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\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\tINFOPLIST_FILE = \"$(SRCROOT)/TableViewPrototype/RLDTableViewSwift-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.rld.RLDTableViewSwift;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t457D7D491AF00AB700388423 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/TableViewPrototype/RLDTableViewSwift-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.rld.RLDTableViewSwift;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t454E31F51AF008BF00AB44BC /* Build configuration list for PBXProject \"TableViewPrototype\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t454E32171AF008BF00AB44BC /* Debug */,\n\t\t\t\t454E32181AF008BF00AB44BC /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t454E32191AF008BF00AB44BC /* Build configuration list for PBXNativeTarget \"TableViewPrototype\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t454E321A1AF008BF00AB44BC /* Debug */,\n\t\t\t\t454E321B1AF008BF00AB44BC /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t457D7D471AF00AB700388423 /* Build configuration list for PBXNativeTarget \"RLDTableViewSwift\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t457D7D481AF00AB700388423 /* Debug */,\n\t\t\t\t457D7D491AF00AB700388423 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 454E31F21AF008BF00AB44BC /* Project object */;\n}\n"
  },
  {
    "path": "Sample app/TableViewPrototype.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:TableViewPrototype.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Sample app/TableViewPrototype.xcodeproj/project.xcworkspace/xcshareddata/TableViewPrototype.xccheckout",
    "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>IDESourceControlProjectFavoriteDictionaryKey</key>\n\t<false/>\n\t<key>IDESourceControlProjectIdentifier</key>\n\t<string>4E446F4C-7F72-491A-AB8F-295366F8824F</string>\n\t<key>IDESourceControlProjectName</key>\n\t<string>TableViewPrototype</string>\n\t<key>IDESourceControlProjectOriginsDictionary</key>\n\t<dict>\n\t\t<key>B6CC70124526FB1C79E8927A505A5CB9A7F81823</key>\n\t\t<string>https://github.com/rlopezdiez/RLDNavigationSwift.git</string>\n\t</dict>\n\t<key>IDESourceControlProjectPath</key>\n\t<string>Sample app/TableViewPrototype.xcodeproj</string>\n\t<key>IDESourceControlProjectRelativeInstallPathDictionary</key>\n\t<dict>\n\t\t<key>B6CC70124526FB1C79E8927A505A5CB9A7F81823</key>\n\t\t<string>../../..</string>\n\t</dict>\n\t<key>IDESourceControlProjectURL</key>\n\t<string>https://github.com/rlopezdiez/RLDNavigationSwift.git</string>\n\t<key>IDESourceControlProjectVersion</key>\n\t<integer>111</integer>\n\t<key>IDESourceControlProjectWCCIdentifier</key>\n\t<string>B6CC70124526FB1C79E8927A505A5CB9A7F81823</string>\n\t<key>IDESourceControlProjectWCConfigurations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>IDESourceControlRepositoryExtensionIdentifierKey</key>\n\t\t\t<string>public.vcs.git</string>\n\t\t\t<key>IDESourceControlWCCIdentifierKey</key>\n\t\t\t<string>B6CC70124526FB1C79E8927A505A5CB9A7F81823</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>RLDTableViewSwift</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sample app/TableViewPrototype.xcodeproj/xcuserdata/rhocassiopeiae.xcuserdatad/xcschemes/RLDTableViewSwift.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0730\"\n   version = \"1.3\">\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 = \"457D7D2D1AF00AB700388423\"\n               BuildableName = \"RLDTableViewSwift.framework\"\n               BlueprintName = \"RLDTableViewSwift\"\n               ReferencedContainer = \"container:TableViewPrototype.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      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\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      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"457D7D2D1AF00AB700388423\"\n            BuildableName = \"RLDTableViewSwift.framework\"\n            BlueprintName = \"RLDTableViewSwift\"\n            ReferencedContainer = \"container:TableViewPrototype.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"457D7D2D1AF00AB700388423\"\n            BuildableName = \"RLDTableViewSwift.framework\"\n            BlueprintName = \"RLDTableViewSwift\"\n            ReferencedContainer = \"container:TableViewPrototype.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Sample app/TableViewPrototype.xcodeproj/xcuserdata/rhocassiopeiae.xcuserdatad/xcschemes/TableViewPrototype.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0730\"\n   version = \"1.3\">\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 = \"454E31F91AF008BF00AB44BC\"\n               BuildableName = \"TableViewPrototype.app\"\n               BlueprintName = \"TableViewPrototype\"\n               ReferencedContainer = \"container:TableViewPrototype.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      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"454E31F91AF008BF00AB44BC\"\n            BuildableName = \"TableViewPrototype.app\"\n            BlueprintName = \"TableViewPrototype\"\n            ReferencedContainer = \"container:TableViewPrototype.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\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 = \"454E31F91AF008BF00AB44BC\"\n            BuildableName = \"TableViewPrototype.app\"\n            BlueprintName = \"TableViewPrototype\"\n            ReferencedContainer = \"container:TableViewPrototype.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\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 = \"454E31F91AF008BF00AB44BC\"\n            BuildableName = \"TableViewPrototype.app\"\n            BlueprintName = \"TableViewPrototype\"\n            ReferencedContainer = \"container:TableViewPrototype.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": "Sample app/TableViewPrototype.xcodeproj/xcuserdata/rhocassiopeiae.xcuserdatad/xcschemes/xcschememanagement.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>SchemeUserState</key>\n\t<dict>\n\t\t<key>RLDTableViewSwift.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<key>TableViewPrototype.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n\t<key>SuppressBuildableAutocreation</key>\n\t<dict>\n\t\t<key>454E31F91AF008BF00AB44BC</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>457D7D2D1AF00AB700388423</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "Tests/Tests/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>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.rld.RLDTableViewSwift</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>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Tests/Tests/RLDTableViewDataSourceTests.swift",
    "content": "import XCTest\nimport UIKit\n\nclass RLDTableViewDataSourceTests:XCTestCase {\n    // SUT\n    let dataModel = RLDTableViewModel()\n    \n    // Collaborators\n    lazy var dataSource:RLDTableViewDataSource = {\n        return RLDTableViewDataSource(tableViewModel:self.dataModel)\n        }()\n    var tableView = UITableView()\n    \n    // MARK: Sections test cases\n    func testAutomaticSectionCreation() {\n        // GIVEN:\n        //   A cell model\n        let cellModel = RLDTableViewCellModel()\n        \n        // WHEN:\n        //   We add the cell model to the table view model\n        dataModel.add(cellModel:cellModel)\n        \n        // THEN:\n        //   A section is automatically created in the data model\n        //   The data source should return one row for the first section\n        XCTAssertEqual(count(dataModel.sectionModels), 1)\n        XCTAssertEqual(dataSource.tableView(tableView, numberOfRowsInSection:0), 1)\n    }\n    \n    func testAutomaticSectionConfiguration() {\n        // GIVEN:\n        //   A cell model\n        let cellModel = RLDTableViewCellModel()\n        \n        // WHEN:\n        //   We add the cell model to the table view model\n        //   We set up the last section in the model\n        //     setting up its index title\n        //     setting up its header\n        //     setting up its footer\n        dataModel.add(cellModel:cellModel)\n        \n        let sectionModel = dataModel.sectionModels.last!\n        sectionModel.indexTitle = \"~\"\n        let header = RLDTableViewSectionAccessoryViewModel()\n        header.title = \"Header\"\n        sectionModel.header = header\n        let footer = RLDTableViewSectionAccessoryViewModel()\n        footer.title = \"Footer\"\n        sectionModel.footer = footer\n        \n        // THEN:\n        //   The data source should return one section\n        //   The data source should return one row for the first section\n        //   The first section header title must be equal to the title of the header\n        //   The first section footer title must be equal to the title of the footer\n        XCTAssertEqual(dataSource.numberOfSectionsInTableView(tableView), 1)\n        XCTAssertEqual(dataSource.tableView(tableView, numberOfRowsInSection:0), 1)\n        XCTAssertEqual(dataSource.tableView(tableView, titleForHeaderInSection:0)!, header.title!)\n        XCTAssertEqual(dataSource.tableView(tableView, titleForFooterInSection:0)!, footer.title!)\n    }\n    \n    func testManualSectionAdding() {\n        // GIVEN:\n        //   A cell model\n        //   A section created manually\n        //     with its index title set up\n        //     with its header set up\n        //     with its footer set up\n        let cellModel = RLDTableViewCellModel()\n        \n        let sectionModel = RLDTableViewSectionModel()\n        sectionModel.indexTitle = \"~\"\n        let header = RLDTableViewSectionAccessoryViewModel()\n        header.title = \"Header\"\n        sectionModel.header = header\n        let footer = RLDTableViewSectionAccessoryViewModel()\n        footer.title = \"Footer\"\n        sectionModel.footer = footer\n        \n        // WHEN:\n        //   We add the cell model to the table view model\n        //     specifying it should be added to the manually created section\n        dataModel.add(cellModel:cellModel, toSectionModel:sectionModel)\n        \n        // THEN:\n        //   The data source should return one section\n        //   The data source should return one row for the first section\n        //   The first section header title must be equal to the title of the header\n        //   The first section footer title must be equal to the title of the footer\n        //   The fist section in the model must be equal to the manually created section\n        XCTAssertEqual(dataSource.numberOfSectionsInTableView(tableView), 1)\n        XCTAssertEqual(dataSource.tableView(tableView, numberOfRowsInSection:0), 1)\n        XCTAssertEqual(dataSource.tableView(tableView, titleForHeaderInSection:0)!, header.title!)\n        XCTAssertEqual(dataSource.tableView(tableView, titleForFooterInSection:0)!, footer.title!)\n        XCTAssertEqual(dataModel.sectionModels[0], sectionModel)\n    }\n    \n    func testManualSectionAddingAfterAutomaticSectionAdded() {\n        // GIVEN:\n        //   A cell model\n        //   A section created manually\n        let cellModel = RLDTableViewCellModel()\n        \n        let sectionModel = RLDTableViewSectionModel()\n        \n        // WHEN:\n        //   We add the cell model to the table view model twice\n        //   We add the cell model to the table view model three times\n        //     specifying it should be added to the manually created section\n        repeat(2, closure:{\n            self.dataModel.add(cellModel:cellModel)\n        })\n        repeat(3, closure:{\n            self.dataModel.add(cellModel:cellModel, toSectionModel:sectionModel)\n        })\n        \n        // THEN:\n        //   The data source should return two sections\n        //   The data source should return two rows for the first section\n        //   The data source should return three rows for the second section\n        //   The second section in the model must be equal to the manually created section\n        XCTAssertEqual(dataSource.numberOfSectionsInTableView(tableView), 2)\n        XCTAssertEqual(dataSource.tableView(tableView, numberOfRowsInSection:0), 2)\n        XCTAssertEqual(dataSource.tableView(tableView, numberOfRowsInSection:1), 3)\n        XCTAssertEqual(dataModel.sectionModels[1], sectionModel)\n    }\n    \n    func testMultipleManualSectionAdding() {\n        // GIVEN:\n        //   A cell model\n        //   Two sections created manually\n        let cellModel = RLDTableViewCellModel()\n        \n        let firstSectionModel = RLDTableViewSectionModel()\n        let secondSectionModel = RLDTableViewSectionModel()\n        \n        // WHEN:\n        //   We add the cell model to the table view model three times\n        //     specifying it should be added to the first manually created section\n        //   We add the cell model to the table view model three times\n        //     specifying it should be added to the second manually created section\n        repeat(2, closure:{\n            self.dataModel.add(cellModel:cellModel, toSectionModel:firstSectionModel)\n        })\n        repeat(3, closure:{\n            self.dataModel.add(cellModel:cellModel, toSectionModel:secondSectionModel)\n        })\n        \n        // THEN:\n        //   The data source should return two sections\n        //   The data source should return two rows for the first section\n        //   The data source should return three rows for the second section\n        //   The first section in the model must be equal to the first manually created section\n        //   The second section in the model must be equal to the second manually created section\n        XCTAssertEqual(dataSource.numberOfSectionsInTableView(tableView), 2)\n        XCTAssertEqual(dataSource.tableView(tableView, numberOfRowsInSection:0), 2)\n        XCTAssertEqual(dataSource.tableView(tableView, numberOfRowsInSection:1), 3)\n        XCTAssertEqual(dataModel.sectionModels[0], firstSectionModel)\n        XCTAssertEqual(dataModel.sectionModels[1], secondSectionModel)\n    }\n    \n    // MARK: Section index titles test cases\n    func testAutomaticSectionIndexTitles() {\n        // GIVEN:\n        //   A cell model\n        //   Two sections created manually\n        //     with its indexes titles set up\n        let cellModel = RLDTableViewCellModel()\n        \n        let firstSectionModel = RLDTableViewSectionModel()\n        firstSectionModel.indexTitle = \"1\"\n        let secondSectionModel = RLDTableViewSectionModel()\n        secondSectionModel.indexTitle = \"2\"\n        \n        // WHEN:\n        //   We add the cell model to the table view model\n        //     specifying it should be added to the first manually created section\n        //   We add the cell model to the table view\n        //     specifying it should be added to the second manually created section\n        dataModel.add(cellModel:cellModel, toSectionModel:firstSectionModel)\n        dataModel.add(cellModel:cellModel, toSectionModel:secondSectionModel)\n        \n        // THEN:\n        //   The data source should return and array with two section index titles\n        //   The first one must be equal to the section index title of the first manually created section\n        //   The second one must be equal to the section index title of the second manually created section\n        let sectionIndexTitles = dataSource.sectionIndexTitlesForTableView(tableView) as! [String]\n        XCTAssertEqual(count(sectionIndexTitles), 2)\n        XCTAssertEqual(sectionIndexTitles[0], firstSectionModel.indexTitle!)\n        XCTAssertEqual(sectionIndexTitles[1], secondSectionModel.indexTitle!)\n    }\n    \n    func testManualSectionIndexTitles() {\n        // GIVEN:\n        //   A data model\n        //     with its section index titles set to numbers from 1 to 4\n        //   A cell model\n        //   Two sections created manually\n        //     with its indexes titles set up to 1 and 2\n        dataModel.sectionIndexTitles = [\"1\", \"2\", \"3\", \"4\"]\n        let cellModel = RLDTableViewCellModel()\n        \n        let firstSectionModel = RLDTableViewSectionModel()\n        firstSectionModel.indexTitle = \"1\"\n        let secondSectionModel = RLDTableViewSectionModel()\n        secondSectionModel.indexTitle = \"2\"\n        \n        // WHEN:\n        //   We add the cell model to the table view model\n        //     specifying it should be added to the first manually created section\n        //   We add the cell model to the table view\n        //     specifying it should be added to the second manually created section\n        dataModel.add(cellModel:cellModel, toSectionModel:firstSectionModel)\n        dataModel.add(cellModel:cellModel, toSectionModel:secondSectionModel)\n        \n        // THEN:\n        //   The data source should return and array equal to the previously set up index title array of the data model\n        let sectionIndexTitles = dataSource.sectionIndexTitlesForTableView(tableView) as! [String]\n        XCTAssertEqual(sectionIndexTitles, dataModel.sectionIndexTitles!)\n    }\n    \n    func testSectionIndexTitlesToSectionsRelationship() {\n        // GIVEN:\n        //   An data model\n        //     with its section index titles set to numbers from 1 to 4\n        //   A cell model\n        //   Two sections created manually\n        //     with its indexes titles set up to 1 and 4\n        dataModel.sectionIndexTitles = [\"1\", \"2\", \"3\", \"4\"]\n        let cellModel = RLDTableViewCellModel()\n        \n        let firstSectionModel = RLDTableViewSectionModel()\n        firstSectionModel.indexTitle = \"1\"\n        let secondSectionModel = RLDTableViewSectionModel()\n        secondSectionModel.indexTitle = \"4\"\n        \n        // WHEN:\n        //   We add the cell model to the table view model\n        //     specifying it should be added to the first manually created section\n        //   We add the cell model to the table view\n        //     specifying it should be added to the second manually created section\n        dataModel.add(cellModel:cellModel, toSectionModel:firstSectionModel)\n        dataModel.add(cellModel:cellModel, toSectionModel:secondSectionModel)\n        \n        // THEN:\n        //   The data source should return the second section when asked to provide an index for the fourth element of the section index titles array\n        XCTAssertEqual(dataSource.tableView(tableView,sectionForSectionIndexTitle:\"4\", atIndex:3), 1)\n    }\n    \n    // MARK: Data source edition test cases\n    func testCellModelEditionPreferences() {\n        // GIVEN:\n        //   A table view data source\n        //   A data model containing two cell models\n        //     the first one being non editable\n        //     the first one being editable\n        let firstCellModel = RLDTableViewCellModel()\n        firstCellModel.editable = true\n        let secondCellModel = RLDTableViewCellModel()\n        secondCellModel.editable = false\n        dataModel.add(cellModel:firstCellModel)\n        dataModel.add(cellModel:secondCellModel)\n        \n        // THEN:\n        //   The data source should identify the first cell in the first section as editable\n        //   The data source should identify the second cell in the first section as non editable\n        XCTAssertEqual(dataSource.tableView(tableView, canEditRowAtIndexPath:NSIndexPath(forRow:0, inSection:0)), true)\n        XCTAssertEqual(dataSource.tableView(tableView, canEditRowAtIndexPath:NSIndexPath(forRow:1, inSection:0)), false)\n    }\n    \n    func testCellModelReorderingPreferences() {\n        // GIVEN:\n        //   A table view data source\n        //   A data model containing two cell models\n        //     the first one being non movable\n        //     the first one being movable\n        let firstCellModel = RLDTableViewCellModel()\n        firstCellModel.movable = true\n        let secondCellModel = RLDTableViewCellModel()\n        secondCellModel.movable = false\n        dataModel.add(cellModel:firstCellModel)\n        dataModel.add(cellModel:secondCellModel)\n        \n        // THEN:\n        //   The data source should identify the first cell in the first section as movable\n        //   The data source should identify the second cell in the first section as non movable\n        XCTAssertEqual(dataSource.tableView(tableView, canMoveRowAtIndexPath:NSIndexPath(forRow:0, inSection:0)), true)\n        XCTAssertEqual(dataSource.tableView(tableView, canMoveRowAtIndexPath:NSIndexPath(forRow:1, inSection:0)), false)\n    }\n    \n    func testCellModelInsertion() {\n        // GIVEN:\n        //   A table view data source\n        //   A data model containing two cell models\n        let sectionModel = RLDTableViewSectionModel()\n        \n        let expectedClassForInsertedCellModel = \"Tests.RLDFirstTestCellModel\"\n        sectionModel.defaultCellModelClassForInsertions = expectedClassForInsertedCellModel\n        \n        var testCellModels:[RLDTableViewCellModel] = []\n        repeat(2, closure:{\n        let testCellModel = RLDSecondTestCellModel()\n            testCellModels.append(testCellModel)\n            self.dataModel.add(cellModel:testCellModel, toSectionModel:sectionModel)\n        })\n        \n        // WHEN:\n        //   We ask the data source to insert a new cell at the second row in the first section\n        dataSource.tableView(tableView,\n        commitEditingStyle:UITableViewCellEditingStyle.Insert,\n        forRowAtIndexPath:NSIndexPath(forRow:1, inSection:0))\n        \n        // THEN:\n        //   The data source must return three rows for the first section\n        //   The section model must contain three cell models\n        //   The second cell model must have the expected class\n        //   The first cell model must be the first one added\n        //   The third cell model must be the second one added\n        XCTAssertEqual(dataSource.tableView(tableView, numberOfRowsInSection:0), 3)\n        XCTAssertEqual(count(sectionModel.cellModels), 3)\n        XCTAssertEqual(NSStringFromClass(sectionModel.cellModels[1].dynamicType), expectedClassForInsertedCellModel)\n        XCTAssertTrue(sectionModel.cellModels[0] === testCellModels[0])\n        XCTAssertTrue(sectionModel.cellModels[2] === testCellModels[1])\n    }\n    \n    func testCellModelDeletion() {\n        // GIVEN:\n        //   A table view data source\n        //     with a cell provider\n        //   A data model\n        //     with a section with a default cell model class for insertions\n        //     containing three cell models\n        var testCellModels:[RLDTableViewCellModel] = []\n        repeat(3, closure:{\n            let cellModel = RLDTableViewCellModel()\n            testCellModels.append(cellModel)\n            self.dataModel.add(cellModel:cellModel)\n        })\n        let sectionModel = dataModel.sectionModels.last!\n        \n        // WHEN:\n        //   We ask the data source to delete the second row in the first section\n        dataSource.tableView(tableView,\n            commitEditingStyle:UITableViewCellEditingStyle.Delete,\n            forRowAtIndexPath:NSIndexPath(forRow:1, inSection:0))\n        \n        // THEN:\n        //   The data source should return two rows for the first section\n        //   The section model must contain two cell models\n        //   The first cell model must be the first one added\n        //   The second cell model must be the third one added\n        XCTAssertEqual(dataSource.tableView(tableView, numberOfRowsInSection:0), 2)\n        XCTAssertEqual(count(sectionModel.cellModels), 2)\n        XCTAssertTrue(sectionModel.cellModels[0] === testCellModels[0])\n        XCTAssertTrue(sectionModel.cellModels[1] === testCellModels[2])\n    }\n    \n    func testCellModelReordering() {\n        // GIVEN:\n        //   A table view data source\n        //     with a cell provider\n        //   A data model\n        //     with a first section with a cell model\n        //     with a second section with a cell model\n        var testCellModels:[RLDTableViewCellModel] = []\n        repeat(2, closure:{\n            let cellModel = RLDTableViewCellModel()\n            testCellModels.append(cellModel)\n            self.dataModel.add(cellModel:cellModel, toSectionModel:RLDTableViewSectionModel())\n        })\n        let firstSectionModel = dataModel.sectionModels[0]\n        let secondSectionModel = dataModel.sectionModels[1]\n        \n        // WHEN:\n        //   We ask the data source to move the first row of the first section to the second row of the second section\n        dataSource.tableView(tableView,\n            moveRowAtIndexPath:NSIndexPath(forRow:0, inSection:0),\n            toIndexPath:NSIndexPath(forRow:1, inSection:1))\n        \n        // THEN:\n        //   The data source should return zero rows for the first section\n        //   The data source should return two rows for the second section\n        //   The data model must contain zero cell models in its first section\n        //   The data model must contain two cell models in its second section\n        //   The first cell model in the second section must be the second one added\n        //   The second cell model in the second section must be the first one added\n        XCTAssertEqual(dataSource.tableView(tableView, numberOfRowsInSection:0), 0)\n        XCTAssertEqual(dataSource.tableView(tableView, numberOfRowsInSection:1), 2)\n        XCTAssertEqual(count(firstSectionModel.cellModels), 0)\n        XCTAssertEqual(count(secondSectionModel.cellModels), 2)\n        XCTAssertTrue(secondSectionModel.cellModels[0] === testCellModels[1])\n        XCTAssertTrue(secondSectionModel.cellModels[1] === testCellModels[0])\n    }\n    \n    // MARK: Test cell generation test cases\n    func testCellGeneration() {\n        // GIVEN:\n        //   A table view\n        //   A table view data source\n        //     assigned to the table view\n        //   A data model\n        //   A cell model\n        //     added to the data model\n        //   A UITableViewCell subclass\n        //     registered with the table view for the cell model reuse identifier\n        tableView.dataSource = dataSource\n        \n        let cellModel = RLDTableViewCellModel()\n        dataModel.add(cellModel:cellModel)\n        \n        let expectedCellClass = \"Tests.RLDTestTableViewCell\"\n        tableView.registerClass(NSClassFromString(expectedCellClass), forCellReuseIdentifier:cellModel.reuseIdentifier)\n        \n        // WHEN:\n        //  We ask the data source for a cell in the first row of the first section of the table\n        let returnedCell = dataSource.tableView(tableView, cellForRowAtIndexPath:NSIndexPath(forRow:0, inSection:0))\n        \n        // THEN:\n        //  The returned cell class must match the registered UITableViewCell subclass\n        XCTAssertEqual(NSStringFromClass(returnedCell.dynamicType), expectedCellClass)\n    }\n\n    // MARK: Helper functions\n    private func repeat(times:UInt, closure:(Void->Void)) {\n        for var counter:UInt = 0; counter < times; counter++ {\n            closure()\n        }\n    }\n}"
  },
  {
    "path": "Tests/Tests/RLDTableViewDelegateTests.swift",
    "content": "import UIKit\nimport XCTest\n\nclass RLDTableViewDelegateTests: XCTestCase {\n    \n    // SUT\n    var tableViewDelegate:RLDTableViewDelegate?\n    \n    // Collaborators\n    var tableDataSource:RLDTableViewDataSource?\n    let tableView = UITableView(frame:CGRect(x:0, y:0, width: 1, height:1))\n    let cell = UITableViewCell()\n    let view = UITableViewHeaderFooterView()\n    let indexPath = NSIndexPath(forRow:0, inSection:0)\n    \n    override func setUp() {\n        super.setUp()\n        \n        // GIVEN:\n        //   A table view delegate\n        //   An event handler\n        //     capable to handle any model, table view and view\n        //   A table view, a header/footer view, a cell and an index path\n        let cellModel = RLDTableViewCellModel()\n        let tableViewModel = RLDTableViewModel()\n        tableViewModel.add(cellModel:cellModel)\n        \n        tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier:cellModel.reuseIdentifier)\n        RLDTestEventHandler.register()\n        \n        tableViewDelegate = RLDTableViewDelegate(tableViewModel:tableViewModel)\n        tableView.delegate = tableViewDelegate\n        \n        tableDataSource = RLDTableViewDataSource(tableViewModel:tableViewModel)\n        tableView.dataSource = tableDataSource\n    }\n    \n    override func tearDown() {\n        RLDTestEventHandler.reset()\n        \n        super.tearDown()\n    }\n    \n    // MARK : Display customization test cases\n    func testWillDisplayCell() {\n        // WHEN:\n        //   We inform the delegate that the table view will display the cell for a row at the index path\n        tableViewDelegate!.tableView(tableView, willDisplayCell:cell, forRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The willDisplayView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"willDisplayView\")\n    }\n    \n    func testWillDisplayHeaderView() {\n        // WHEN:\n        //   We inform the delegate that the table view will display the header view of a section\n        tableViewDelegate!.tableView(tableView, willDisplayHeaderView:view, forSection:indexPath.section)\n        \n        // THEN:\n        //   The willDisplayView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"willDisplayView\")\n    }\n    \n    func testWillDisplayFooterView() {\n        // WHEN:\n        //   We inform the delegate that the table view will display the footer view of a section\n        tableViewDelegate!.tableView(tableView, willDisplayFooterView:view, forSection:indexPath.section)\n        \n        // THEN:\n        //   The willDisplayView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"willDisplayView\")\n    }\n    \n    func testDidEndDisplayingCell() {\n        // WHEN:\n        //   We inform the delegate that the table view did end displaying the cell for a row at the index path\n        tableViewDelegate!.tableView(tableView, didEndDisplayingCell:cell, forRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The didEndDisplayingView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"didEndDisplayingView\")\n    }\n    \n    func testDidEndDisplayingHeaderView() {\n        // WHEN:\n        //   We inform the delegate that the table view did end displaying the header view of a section\n        tableViewDelegate!.tableView(tableView, didEndDisplayingHeaderView:view, forSection:indexPath.section)\n        \n        // THEN:\n        //   The didEndDisplayingView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"didEndDisplayingView\")\n    }\n    \n    func testDidEndDisplayingFooterView() {\n        // WHEN:\n        //   We inform the delegate that the table view did end displaying the footer view of a section\n        tableViewDelegate!.tableView(tableView, didEndDisplayingFooterView:view, forSection:indexPath.section)\n        \n        // THEN:\n        //   The didEndDisplayingView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"didEndDisplayingView\")\n    }\n    \n    // MARK : Section header and footer reusing test cases\n    func testHeaderReusing() {\n        // GIVEN:\n        //   A table view data model\n        //     with an automatically created section model\n        //       with a cell model assigned to it\n        //     set as the model of the table view delegate\n        //   A header data model\n        //     with a certain reuse identifier\n        //       registered with the table view with a certain view class\n        //     assigned as the header of the section model\n        let dataModel = RLDTableViewModel()\n        dataModel.add(cellModel:RLDTableViewCellModel())\n        tableViewDelegate = RLDTableViewDelegate(tableViewModel:dataModel)\n        tableView.delegate = tableViewDelegate\n        \n        let headerModel = RLDTableViewSectionAccessoryViewModel()\n        headerModel.reuseIdentifier = \"HeaderReuseIdentifier\"\n        tableView.registerClass(RLDTestAccessoryView.self, forHeaderFooterViewReuseIdentifier:headerModel.reuseIdentifier)\n        dataModel.sectionModels.last!.header = headerModel\n        \n        // WHEN:\n        //   We ask the delegate for a view for the header of the section\n        let sectionHeader = tableViewDelegate!.tableView(tableView, viewForHeaderInSection:indexPath.section) as? RLDTestAccessoryView\n        \n        // THEN:\n        //   The returned view class must be the same as the registered class\n        //   Its reuse identifier must match the one for the header model\n        XCTAssertNotNil(sectionHeader)\n        XCTAssertTrue(sectionHeader!.dynamicType === RLDTestAccessoryView.self)\n        XCTAssertEqual(sectionHeader!.reuseIdentifier!, headerModel.reuseIdentifier)\n    }\n    \n    func testFooterReusing() {\n        // GIVEN:\n        //   A table view data model\n        //     with an automatically created section model\n        //       with a cell model assigned to it\n        //     set as the model of the table view delegate\n        //   A footer data model\n        //     with a certain reuse identifier\n        //       registered with the table view with a certain view class\n        //     assigned as the footer of the section model\n        let dataModel = RLDTableViewModel()\n        dataModel.add(cellModel:RLDTableViewCellModel())\n        tableViewDelegate = RLDTableViewDelegate(tableViewModel:dataModel)\n        tableView.delegate = tableViewDelegate\n        \n        let footerModel = RLDTableViewSectionAccessoryViewModel()\n        footerModel.reuseIdentifier = \"FooterReuseIdentifier\"\n        tableView.registerClass(RLDTestAccessoryView.self, forHeaderFooterViewReuseIdentifier:footerModel.reuseIdentifier)\n        dataModel.sectionModels.last!.footer = footerModel\n        \n        // WHEN:\n        //   We ask the delegate for a view for the footer of the section\n        let sectionFooter = tableViewDelegate!.tableView(tableView, viewForFooterInSection:indexPath.section) as? RLDTestAccessoryView\n        \n        // THEN:\n        //   The returned view class must be the same as the registered class\n        //   Its reuse identifier must match the one for the footer model\n        XCTAssertNotNil(sectionFooter)\n        XCTAssertTrue(sectionFooter!.dynamicType === RLDTestAccessoryView.self)\n        XCTAssertEqual(sectionFooter!.reuseIdentifier!, footerModel.reuseIdentifier)\n    }\n    \n    // MARK : Variable height support test cases\n    func testVariableHeightForRow() {\n        // GIVEN:\n        //   A table view data model\n        //     set as the model of the table view delegate\n        //   A cell model\n        //     with a certain estimated height\n        //     with a certain height\n        //     assigned to the table model\n        let cellModel = cellModelInTableViewDataModel()\n        cellModel.estimatedHeight = 1\n        cellModel.height = 2\n        \n        // WHEN:\n        //   We ask the delegate for\n        //     the estimated height of a given cell for a row at the index path\n        //     the height of a given cell for a row at the index path\n        let estimatedHeight = tableViewDelegate!.tableView(tableView, estimatedHeightForRowAtIndexPath:indexPath)\n        let height = tableViewDelegate!.tableView(tableView, heightForRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The returned estimated height must be equal to the height of the cell model\n        //   The returned height must be equal to the height of the cell model\n        XCTAssertEqual(estimatedHeight, cellModel.estimatedHeight!)\n        XCTAssertEqual(height, cellModel.height!)\n    }\n    \n    func testVariableHeightForHeader() {\n        // GIVEN:\n        //   A table view data model\n        //     with a cell model assigned to it\n        //     set as the model of the table view delegate\n        //   An automatically created section model\n        //   A header data model\n        //     with a certain estimated height\n        //     with a certain height\n        //     assigned to the section model\n        let dataModel = RLDTableViewModel()\n        dataModel.add(cellModel:RLDTableViewCellModel())\n        tableViewDelegate = RLDTableViewDelegate(tableViewModel:dataModel)\n        tableView.delegate = tableViewDelegate\n        \n        let sectionModel = dataModel.sectionModels.last!\n    \n        let headerModel = RLDTableViewSectionAccessoryViewModel()\n        headerModel.estimatedHeight = 1\n        headerModel.height = 2\n        sectionModel.header = headerModel\n        \n        // WHEN:\n        //   We ask the delegate for\n        //     the estimated height of a given cell for a row at the index path\n        //     the height of a given cell for a row at the index path\n        let estimatedHeight = tableViewDelegate!.tableView(tableView, estimatedHeightForHeaderInSection:indexPath.section)\n        let height = tableViewDelegate!.tableView(tableView, heightForHeaderInSection:indexPath.section)\n        \n        // THEN:\n        //   The returned estimated height must be equal to the height of the cell model\n        //   The returned height must be equal to the height of the cell model\n        XCTAssertEqual(estimatedHeight, headerModel.estimatedHeight!)\n        XCTAssertEqual(height, headerModel.height!)\n    }\n    \n    func testVariableHeightForFooter() {\n        // GIVEN:\n        //   A table view data model\n        //     with a cell model assigned to it\n        //     set as the model of the table view delegate\n        //   An automatically created section model\n        //   A footer data model\n        //     with a certain estimated height\n        //     with a certain height\n        //     assigned to the section model\n        let dataModel = RLDTableViewModel()\n        dataModel.add(cellModel:RLDTableViewCellModel())\n        tableViewDelegate = RLDTableViewDelegate(tableViewModel:dataModel)\n        tableView.delegate = tableViewDelegate\n        \n        let sectionModel = dataModel.sectionModels.last!\n        \n        let footerModel = RLDTableViewSectionAccessoryViewModel()\n        footerModel.estimatedHeight = 1\n        footerModel.height = 2\n        sectionModel.footer = footerModel\n        \n        // WHEN:\n        //   We ask the delegate for\n        //     the estimated height of a given cell for a row at the index path\n        //     the height of a given cell for a row at the index path\n        let estimatedHeight = tableViewDelegate!.tableView(tableView, estimatedHeightForFooterInSection:indexPath.section)\n        let height = tableViewDelegate!.tableView(tableView, heightForFooterInSection:indexPath.section)\n        \n        // THEN:\n        //   The returned estimated height must be equal to the height of the cell model\n        //   The returned height must be equal to the height of the cell model\n        XCTAssertEqual(estimatedHeight, footerModel.estimatedHeight!)\n        XCTAssertEqual(height, footerModel.height!)\n    }\n    \n    // MARK : Accessories (disclosures)\n    func testAccessoryButtonTapped() {\n        // WHEN:\n        //   We inform the delegate that the accessory button for a row with a certain index path has been tapped\n        tableViewDelegate!.tableView(tableView, accessoryButtonTappedForRowWithIndexPath:indexPath)\n        \n        // THEN:\n        //   The accessoryButtonTapped method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"accessoryButtonTapped\")\n    }\n    \n    // MARK : Selection\n    func testShouldHighlightRow() {\n        // WHEN:\n        //   We ask the delegate wether a row at a certain index path should be highlighted\n        tableViewDelegate!.tableView(tableView, shouldHighlightRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The shouldHighlightView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"shouldHighlightView\")\n    }\n    \n    func testDidHighlightRow() {\n        // WHEN:\n        //   We inform the delegate that the table view did highlight a row at the index path\n        tableViewDelegate!.tableView(tableView, didHighlightRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The didHighlightView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"didHighlightView\")\n    }\n    \n    func testDidUnhighlightRow() {\n        // WHEN:\n        //   We inform the delegate that the table view did unhighlight a row at the index path\n        tableViewDelegate!.tableView(tableView, didUnhighlightRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The didUnhighlightView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"didUnhighlightView\")\n    }\n    \n    func testWillSelectRowAtIndexPath() {\n        // WHEN:\n        //   We inform the delegate that the table view will select a row at the index path\n        tableViewDelegate!.tableView(tableView, willSelectRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The willSelectView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"willSelectView\")\n    }\n    \n    func testWillDeselectRowAtIndexPath() {\n        // WHEN:\n        //   We inform the delegate that the table view will deselect a row at the index path\n        tableViewDelegate!.tableView(tableView, willDeselectRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The willDeselectView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"willDeselectView\")\n    }\n    \n    func testDidSelectRowAtIndexPath() {\n        // WHEN:\n        //   We inform the delegate that the table view selected a row at the index path\n        tableViewDelegate!.tableView(tableView, didSelectRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The didSelectView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"didSelectView\")\n    }\n    \n    func testDidDeselectRowAtIndexPath() {\n        // WHEN:\n        //   We inform the delegate that the table view deselected a row at the index path\n        tableViewDelegate!.tableView(tableView, didDeselectRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The didDeselectView method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"didDeselectView\")\n    }\n    \n    // MARK : Editing\n    func testEditingStyleForRow() {\n        // GIVEN:\n        //   A table view data model\n        //     set as the model of the table view delegate\n        //   A cell data model\n        //     with a certain editing style\n        //     added to the table model\n        let cellModel = cellModelInTableViewDataModel()\n        cellModel.editingStyle = UITableViewCellEditingStyle.Delete\n        \n        // WHEN:\n        //   We ask the delegate for the editing style of a row at a certain index path\n        let editingStyle = tableViewDelegate!.tableView(tableView, editingStyleForRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The returned value must be equal to the editing style in the cell model\n        XCTAssertEqual(editingStyle, cellModel.editingStyle!)\n    }\n    \n    func testEditActions() {\n        // WHEN:\n        //   We ask the delegate for the edit actions of a row at a certain index path\n        let editActions = tableViewDelegate!.tableView(tableView, editActionsForRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The returned edit actions array must be equal to the one returned by the event handler\n        RLDTestEventHandler.isCallRegistered(\"editActions\")\n    }\n    \n    func testTitleForDeleteConfirmationButton() {\n        // GIVEN:\n        //   A table view data model\n        //     set as the model of the table view delegate\n        //   A cell data model\n        //     with a certain editing style\n        //     added to the table model\n        let cellModel = cellModelInTableViewDataModel()\n        cellModel.titleForDeleteConfirmationButton = \"TestTitleForDeleteConfirmationButton\"\n        \n        // WHEN:\n        //   We ask the delegate for the editing style of a row at a certain index path\n        let titleForDeleteConfirmationButton = tableViewDelegate!.tableView(tableView, titleForDeleteConfirmationButtonForRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The returned title must be equal to the one in the cell model\n        XCTAssertEqual(titleForDeleteConfirmationButton, cellModel.titleForDeleteConfirmationButton!)\n    }\n    \n    func testShouldIndentWhileEditing() {\n        // GIVEN:\n        //   A table view data model\n        //     set as the model of the table view delegate\n        //   A cell data model\n        //     that states that the cell should indent while editing\n        //     added to the table model\n        let cellModel = cellModelInTableViewDataModel()\n        cellModel.shouldIndentWhileEditing = true\n        \n        // WHEN:\n        //   We ask the delegate wether a row at a certain index path should indent while editing\n        let shouldIndentWhileEditing = tableViewDelegate!.tableView(tableView, shouldIndentWhileEditingRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The returned value must be equal to the one set in the cell model\n        XCTAssertEqual(shouldIndentWhileEditing, cellModel.shouldIndentWhileEditing!)\n    }\n    \n    func testWillBeginEditing() {\n        // WHEN:\n        //   We inform the delegate that the table view will beging editing a row at the index path\n        tableViewDelegate!.tableView(tableView, willBeginEditingRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The willBeginEditing method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"willBeginEditing\")\n    }\n    \n    func testDidEndEditing() {\n        // WHEN:\n        //   We inform the delegate that the table view ended editing a row at the index path\n        tableViewDelegate!.tableView(tableView, didEndEditingRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The didEndEditing method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"didEndEditing\")\n    }\n    \n    // MARK : Indentation\n    func testIndentationLevel() {\n        // GIVEN:\n        //   A table view data model\n        //     set as the model of the table view delegate\n        //   A cell data model\n        //     with a certain indentation level\n        //     added to the table model\n        let dataModel = RLDTableViewModel()\n        tableViewDelegate = RLDTableViewDelegate(tableViewModel:dataModel)\n        tableView.delegate = tableViewDelegate\n        \n        let cellModel = RLDTableViewCellModel()\n        cellModel.indentationLevel = 2\n        dataModel.add(cellModel:cellModel)\n        \n        // WHEN:\n        //   We ask the delegate for the indentation level of a row at a certain index path\n        let indentationLevel = tableViewDelegate!.tableView(tableView, indentationLevelForRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The returned value must be equal to the one set in the cell model\n        XCTAssertEqual(indentationLevel, cellModel.indentationLevel!)\n    }\n    \n    // MARK : Copy and Paste\n    func testShouldShowMenu() {\n        // GIVEN:\n        //   A table view data model\n        //     set as the model of the table view delegate\n        //   A cell data model\n        //     that states that the cell should show the copy and paste menu\n        //     added to the table model\n        let cellModel = cellModelInTableViewDataModel()\n        cellModel.shouldShowMenu = true\n        \n        // WHEN:\n        //   We ask the delegate wether a row at a certain index path should show the copy and paste menu\n        let shouldShowMenu = tableViewDelegate!.tableView(tableView, shouldShowMenuForRowAtIndexPath:indexPath)\n        \n        // THEN:\n        //   The returned value must be equal to the one set in the cell model\n        XCTAssertEqual(shouldShowMenu, cellModel.shouldShowMenu!)\n    }\n    \n    func testCanPerformAction() {\n        // WHEN:\n        //   We ask the delegate wether a row at a certain index path can perform an action\n        tableViewDelegate!.tableView(tableView, canPerformAction:nil, forRowAtIndexPath:indexPath, withSender:self)\n        \n        // THEN:\n        //   The canPerformAction:withSender: method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"canPerformAction:withSender:\")\n    }\n    \n    func testPerformAction() {\n        // WHEN:\n        //   We ask the delegate to perform an action for a row at a certain index path\n        tableViewDelegate!.tableView(tableView, performAction:nil, forRowAtIndexPath:indexPath, withSender:self)\n        \n        // THEN:\n        //   The performAction:withSender: method of the event handler will be called\n        RLDTestEventHandler.isCallRegistered(\"performAction:withSender:\")\n    }\n    \n    // MARK : Helper methods\n    func cellModelInTableViewDataModel() -> RLDTableViewCellModel {\n        let dataModel = RLDTableViewModel()\n        tableViewDelegate! = RLDTableViewDelegate(tableViewModel:dataModel)\n        \n        let cellModel = RLDTableViewCellModel()\n        dataModel.add(cellModel:cellModel)\n        return cellModel\n    }\n}"
  },
  {
    "path": "Tests/Tests/RLDTableViewEventHandlerProviderTests.swift",
    "content": "import XCTest\nimport UIKit\n\nclass RLDTableViewEventHandlerProviderTests: XCTestCase {\n    \n    func testFactoryMethod() {\n        // GIVEN:\n        // A table view\n        // A view model\n        // A view\n        //   An event hanlder\n        //     which is able to handle these three assets\n        //     registered with the event handler provider\n        let testTableView = UITableView()\n        let testViewModel = RLDTableViewReusableViewModel()\n        let testView = UIView()\n        \n        RLDTableViewEventHandlerProvider.register(RLDTestEventHandler)\n        RLDTestEventHandler.setCanHandleClosure { (tableView, viewModel, view) -> Bool in\n            return tableView === testTableView\n                && viewModel === testViewModel\n                && view === testView\n        }\n        \n        // WHEN:\n        //   We ask the event handler provider for an event handler with the three defined assets\n        //   We ask the event handler provider for an event handler with different assets\n        let firstEventHandler = RLDTableViewEventHandlerProvider.eventHandler(tableView:testTableView, viewModel:testViewModel, view:testView)\n        let secondEventHandler = RLDTableViewEventHandlerProvider.eventHandler(tableView:testTableView, viewModel:RLDTableViewReusableViewModel(), view:testView)\n        \n        // THEN:\n        //   It is able to provide an event handler for the first combination\n        //   It is not able to provide an event handler for the second combination\n        XCTAssertNotNil(firstEventHandler)\n        XCTAssertNil(secondEventHandler)\n    }\n}"
  },
  {
    "path": "Tests/Tests/RLDTableViewModelTests.swift",
    "content": "import UIKit\nimport XCTest\n\nclass RLDTableViewModelTests:XCTestCase {\n    // MARK: Section index titles test cases\n    func testSectionIndexTitlesAreTakenFromSectionsWhenNotSet() {\n        // GIVEN:\n        //   A table view data model\n        //     with a section with a certain index title\n        let indexTitle = \"~\"\n        let tableViewModel = tableViewModelWithSectionWithIndexTitle(indexTitle)\n        \n        // WHEN:\n        //   The data model is asked for its section index titles\n        let sectionIndexTitles = tableViewModel.sectionIndexTitles!\n        \n        // THEN:\n        //   The section index title of its section is returned\n        XCTAssertEqual(count(sectionIndexTitles), 1)\n        XCTAssert(contains(sectionIndexTitles, indexTitle))\n    }\n    \n    func testSectionIndexTitlesReturnedWhenSet() {\n        // GIVEN:\n        //   A table view data model\n        //     with a section with a certain index title\n        let indexTitle = \"~\"\n        let tableViewModel = tableViewModelWithSectionWithIndexTitle(indexTitle)\n        \n        // WHEN:\n        //   The sectionIndexTitles property of the data model is set\n        let sectionIndexTitles = [\"A\"]\n        tableViewModel.sectionIndexTitles = sectionIndexTitles\n        \n        // THEN:\n        //   The data model return the set object for its sectionIndexTitles property\n        XCTAssertEqual(tableViewModel.sectionIndexTitles!, sectionIndexTitles)\n    }\n    \n    // MARK: Helper methods\n    func tableViewModelWithSectionWithIndexTitle(indexTitle:String) -> RLDTableViewModel {\n        let cellModel = RLDTableViewCellModel()\n        let sectionModel = RLDTableViewSectionModel()\n        let tableViewModel = RLDTableViewModel()\n\n        sectionModel.indexTitle = indexTitle\n        tableViewModel.add(cellModel:cellModel, toSectionModel:sectionModel)\n        \n        return tableViewModel\n    }\n}"
  },
  {
    "path": "Tests/Tests/TestHelpers.swift",
    "content": "import UIKit\n\n// MARK: UITableViewCell subclass\nclass RLDTestTableViewCell:UITableViewCell {\n}\n\n// MARK: UITableViewHeaderFooterView subclass\nclass RLDTestAccessoryView : UITableViewHeaderFooterView {\n}\n\n// MARK: RLDTableViewCellModel subclasses\nclass RLDFirstTestCellModel:RLDTableViewCellModel {\n}\n\nclass RLDSecondTestCellModel:RLDTableViewCellModel {\n}\n\n// MARK: Event handler for testing\nclass RLDTestEventHandler:RLDTableViewCellEventHandler {\n    typealias canHandleClosureType = (tableView:UITableView, viewModel:RLDTableViewReusableViewModel, view:UIView) -> Bool\n    private static var canHandleClosure:canHandleClosureType = { canHandleClosureType in return true }\n    private static var callRegister:[String:String] = [:]\n\n    class func setCanHandleClosure(newCanHandleClosure:canHandleClosureType) {\n        canHandleClosure = newCanHandleClosure\n    }\n\n    class func reset() {\n        canHandleClosure = { canHandleClosureType in return true }\n    }\n\n    // MARK: Suitability checking\n    override class func canHandle(#tableView:UITableView, viewModel:RLDTableViewReusableViewModel, view:UIView) -> Bool {\n        return canHandleClosure(tableView:tableView, viewModel:viewModel, view:view)\n    }\n\n    // MARK: Call registering\n    override func willReuseView() { registerCall(\"willReuseView\") }\n    override func willDisplayView() { registerCall(\"willDisplayView\") }\n    override func didEndDisplayingView() { registerCall(\"didEndDisplayingView\") }\n    override func accessoryButtonTapped() { registerCall(\"accessoryButtonTapped\") }\n    override func shouldHighlightView() -> Bool {  registerCall(\"shouldHighlightView\"); return false }\n    override func didHighlightView() { registerCall(\"didHighlightView\") }\n    override func didUnhighlightView() { registerCall(\"didUnhighlightView\") }\n    override func willSelectView() -> NSIndexPath? {  registerCall(\"willSelectView\"); return nil }\n    override func willDeselectView() -> NSIndexPath? {  registerCall(\"willDeselectView\"); return nil }\n    override func didSelectView() { registerCall(\"didSelectView\") }\n    override func didDeselectView() { registerCall(\"didDeselectView\") }\n    override func willBeginEditing() { registerCall(\"willBeginEditing\") }\n    override func didEndEditing() { registerCall(\"didEndEditing\") }\n    override func editActions() -> [UITableViewRowAction]? {  registerCall(\"editActions\"); return nil }\n    override func canPerform(#action:Selector, withSender sender:AnyObject) -> Bool {  registerCall(\"canPerformAction:withSender:\"); return false }\n    override func performAction(#action:Selector, withSender sender:AnyObject) { registerCall(\"performAction:withSender:\") }\n    \n    func registerCall(selector:String) {\n        self.dynamicType.callRegister[NSStringFromClass(self.dynamicType)] = selector\n    }\n    \n    class func isCallRegistered(selector:String) -> Bool {\n        if let isCallRegistered = callRegister[selector] {\n            return true\n        } else {\n            return false\n        }\n    }\n}"
  },
  {
    "path": "Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t45054CEC1AEC6A75006DD0B9 /* RLDTableViewEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45054CEB1AEC6A75006DD0B9 /* RLDTableViewEventHandler.swift */; };\n\t\t4537E02F1AF003160051625F /* RLDTableViewEventHandlerProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4537E02E1AF003160051625F /* RLDTableViewEventHandlerProviderTests.swift */; };\n\t\t455CE3B81AEC65FD002EA10E /* RLDTableViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 455CE3B51AEC65FD002EA10E /* RLDTableViewDataSource.swift */; };\n\t\t455CE3B91AEC65FD002EA10E /* RLDTableViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 455CE3B61AEC65FD002EA10E /* RLDTableViewModel.swift */; };\n\t\t455CE3BE1AEC6606002EA10E /* RLDTableViewDataSourceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 455CE3BB1AEC6606002EA10E /* RLDTableViewDataSourceTests.swift */; };\n\t\t455CE3BF1AEC6606002EA10E /* RLDTableViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 455CE3BC1AEC6606002EA10E /* RLDTableViewModelTests.swift */; };\n\t\t455CE3C01AEC6606002EA10E /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 455CE3BD1AEC6606002EA10E /* TestHelpers.swift */; };\n\t\t45B3A15A1AED819200EECD76 /* RLDTableViewEventHandlerProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B3A1591AED819200EECD76 /* RLDTableViewEventHandlerProvider.swift */; };\n\t\t45CA62761AED0EBC00F46A6B /* RLDTableViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45CA62751AED0EBC00F46A6B /* RLDTableViewDelegate.swift */; };\n\t\t45CA62781AED114600F46A6B /* RLDTableViewDelegateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45CA62771AED114600F46A6B /* RLDTableViewDelegateTests.swift */; };\n\t\t45CA627A1AED48B300F46A6B /* RLDHandledViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45CA62791AED48B300F46A6B /* RLDHandledViewProtocol.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t45054CEB1AEC6A75006DD0B9 /* RLDTableViewEventHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewEventHandler.swift; sourceTree = \"<group>\"; };\n\t\t4537E02E1AF003160051625F /* RLDTableViewEventHandlerProviderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewEventHandlerProviderTests.swift; sourceTree = \"<group>\"; };\n\t\t455CE3B51AEC65FD002EA10E /* RLDTableViewDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewDataSource.swift; sourceTree = \"<group>\"; };\n\t\t455CE3B61AEC65FD002EA10E /* RLDTableViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewModel.swift; sourceTree = \"<group>\"; };\n\t\t455CE3BB1AEC6606002EA10E /* RLDTableViewDataSourceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewDataSourceTests.swift; sourceTree = \"<group>\"; };\n\t\t455CE3BC1AEC6606002EA10E /* RLDTableViewModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewModelTests.swift; sourceTree = \"<group>\"; };\n\t\t455CE3BD1AEC6606002EA10E /* TestHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestHelpers.swift; sourceTree = \"<group>\"; };\n\t\t45643EE21AB86EFC00FE7F17 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t45A60ED41AB8700A00488EA9 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t45B3A1591AED819200EECD76 /* RLDTableViewEventHandlerProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewEventHandlerProvider.swift; sourceTree = \"<group>\"; };\n\t\t45CA62751AED0EBC00F46A6B /* RLDTableViewDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewDelegate.swift; sourceTree = \"<group>\"; };\n\t\t45CA62771AED114600F46A6B /* RLDTableViewDelegateTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDTableViewDelegateTests.swift; sourceTree = \"<group>\"; };\n\t\t45CA62791AED48B300F46A6B /* RLDHandledViewProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLDHandledViewProtocol.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t45643EDF1AB86EFC00FE7F17 /* 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/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t455CE3B41AEC65FD002EA10E /* Classes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t455CE3B61AEC65FD002EA10E /* RLDTableViewModel.swift */,\n\t\t\t\t455CE3B51AEC65FD002EA10E /* RLDTableViewDataSource.swift */,\n\t\t\t\t45CA62791AED48B300F46A6B /* RLDHandledViewProtocol.swift */,\n\t\t\t\t45054CEB1AEC6A75006DD0B9 /* RLDTableViewEventHandler.swift */,\n\t\t\t\t45B3A1591AED819200EECD76 /* RLDTableViewEventHandlerProvider.swift */,\n\t\t\t\t45CA62751AED0EBC00F46A6B /* RLDTableViewDelegate.swift */,\n\t\t\t);\n\t\t\tname = Classes;\n\t\t\tpath = ../Classes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t45643EC41AB86EFC00FE7F17 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t455CE3B41AEC65FD002EA10E /* Classes */,\n\t\t\t\t45A60ED31AB8700A00488EA9 /* Tests */,\n\t\t\t\t45643ECE1AB86EFC00FE7F17 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t45643ECE1AB86EFC00FE7F17 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t45643EE21AB86EFC00FE7F17 /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t45A60ED31AB8700A00488EA9 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t455CE3BC1AEC6606002EA10E /* RLDTableViewModelTests.swift */,\n\t\t\t\t455CE3BB1AEC6606002EA10E /* RLDTableViewDataSourceTests.swift */,\n\t\t\t\t4537E02E1AF003160051625F /* RLDTableViewEventHandlerProviderTests.swift */,\n\t\t\t\t45CA62771AED114600F46A6B /* RLDTableViewDelegateTests.swift */,\n\t\t\t\t455CE3BD1AEC6606002EA10E /* TestHelpers.swift */,\n\t\t\t\t45A60ED41AB8700A00488EA9 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t45643EE11AB86EFC00FE7F17 /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 45643EEF1AB86EFD00FE7F17 /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t45643EDE1AB86EFC00FE7F17 /* Sources */,\n\t\t\t\t45643EDF1AB86EFC00FE7F17 /* Frameworks */,\n\t\t\t\t45643EE01AB86EFC00FE7F17 /* 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 = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 45643EE21AB86EFC00FE7F17 /* Tests.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\t45643EC51AB86EFC00FE7F17 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0630;\n\t\t\t\tORGANIZATIONNAME = \"Rafael Lopez Diez\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t45643EE11AB86EFC00FE7F17 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3;\n\t\t\t\t\t\tTestTargetID = 45643ECC1AB86EFC00FE7F17;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 45643EC81AB86EFC00FE7F17 /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\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 = 45643EC41AB86EFC00FE7F17;\n\t\t\tproductRefGroup = 45643ECE1AB86EFC00FE7F17 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t45643EE11AB86EFC00FE7F17 /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t45643EE01AB86EFC00FE7F17 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t45643EDE1AB86EFC00FE7F17 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t455CE3B91AEC65FD002EA10E /* RLDTableViewModel.swift in Sources */,\n\t\t\t\t45CA627A1AED48B300F46A6B /* RLDHandledViewProtocol.swift in Sources */,\n\t\t\t\t455CE3B81AEC65FD002EA10E /* RLDTableViewDataSource.swift in Sources */,\n\t\t\t\t455CE3BE1AEC6606002EA10E /* RLDTableViewDataSourceTests.swift in Sources */,\n\t\t\t\t455CE3BF1AEC6606002EA10E /* RLDTableViewModelTests.swift in Sources */,\n\t\t\t\t45054CEC1AEC6A75006DD0B9 /* RLDTableViewEventHandler.swift in Sources */,\n\t\t\t\t4537E02F1AF003160051625F /* RLDTableViewEventHandlerProviderTests.swift in Sources */,\n\t\t\t\t45CA62781AED114600F46A6B /* RLDTableViewDelegateTests.swift in Sources */,\n\t\t\t\t45B3A15A1AED819200EECD76 /* RLDTableViewEventHandlerProvider.swift in Sources */,\n\t\t\t\t45CA62761AED0EBC00F46A6B /* RLDTableViewDelegate.swift in Sources */,\n\t\t\t\t455CE3C01AEC6606002EA10E /* TestHelpers.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t45643EEA1AB86EFD00FE7F17 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\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_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"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_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;\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_SYMBOLS_PRIVATE_EXTERN = NO;\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 = 8.1;\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_OBJC_BRIDGING_HEADER = \"\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t45643EEB1AB86EFD00FE7F17 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\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_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"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 = gnu99;\n\t\t\t\tGCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;\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 = 8.1;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t45643EF01AB86EFD00FE7F17 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\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\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Tests.app/Tests\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t45643EF11AB86EFD00FE7F17 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Tests.app/Tests\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t45643EC81AB86EFC00FE7F17 /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t45643EEA1AB86EFD00FE7F17 /* Debug */,\n\t\t\t\t45643EEB1AB86EFD00FE7F17 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t45643EEF1AB86EFD00FE7F17 /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t45643EF01AB86EFD00FE7F17 /* Debug */,\n\t\t\t\t45643EF11AB86EFD00FE7F17 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 45643EC51AB86EFC00FE7F17 /* Project object */;\n}\n"
  },
  {
    "path": "Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/Tests.xccheckout",
    "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>IDESourceControlProjectFavoriteDictionaryKey</key>\n\t<false/>\n\t<key>IDESourceControlProjectIdentifier</key>\n\t<string>48D7CAE4-FB03-41CB-9AA5-81ABA97ABAFE</string>\n\t<key>IDESourceControlProjectName</key>\n\t<string>Tests</string>\n\t<key>IDESourceControlProjectOriginsDictionary</key>\n\t<dict>\n\t\t<key>B6CC70124526FB1C79E8927A505A5CB9A7F81823</key>\n\t\t<string>https://github.com/rlopezdiez/RLDNavigationSwift.git</string>\n\t</dict>\n\t<key>IDESourceControlProjectPath</key>\n\t<string>Tests/Tests.xcodeproj</string>\n\t<key>IDESourceControlProjectRelativeInstallPathDictionary</key>\n\t<dict>\n\t\t<key>B6CC70124526FB1C79E8927A505A5CB9A7F81823</key>\n\t\t<string>../../..</string>\n\t</dict>\n\t<key>IDESourceControlProjectURL</key>\n\t<string>https://github.com/rlopezdiez/RLDNavigationSwift.git</string>\n\t<key>IDESourceControlProjectVersion</key>\n\t<integer>111</integer>\n\t<key>IDESourceControlProjectWCCIdentifier</key>\n\t<string>B6CC70124526FB1C79E8927A505A5CB9A7F81823</string>\n\t<key>IDESourceControlProjectWCConfigurations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>IDESourceControlRepositoryExtensionIdentifierKey</key>\n\t\t\t<string>public.vcs.git</string>\n\t\t\t<key>IDESourceControlWCCIdentifierKey</key>\n\t\t\t<string>B6CC70124526FB1C79E8927A505A5CB9A7F81823</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>RLDTableViewSwift</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0630\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"45643EE11AB86EFC00FE7F17\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      buildConfiguration = \"Debug\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"45643EE11AB86EFC00FE7F17\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"45643EE11AB86EFC00FE7F17\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </TestAction>\n   <LaunchAction\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Debug\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"45643EE11AB86EFC00FE7F17\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Release\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  }
]