[
  {
    "path": ".gitignore",
    "content": "# Generated by http://gitignore.io\n\n### Objective-C ###\n# Xcode\n.DS_Store\n*/build/*\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\n*.xcworkspace\n!default.xcworkspace\nxcuserdata\nprofile\n*.moved-aside\nDerivedData\n.idea/\n*.hmap\n\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: objective-c\nscript: make clean test\n\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "Copyright (c) 2013 Katsuma Tanaka\n \nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n \nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n \nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "Lin/DVTDualProxyWindow.h",
    "content": "//\n//  DVTDualProxyWindow.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/26.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DVTDualProxyWindow : NSWindow\n\n@end\n"
  },
  {
    "path": "Lin/DVTFilePath.h",
    "content": "//\n//  DVTFilePath.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/23.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DVTFilePath : NSObject\n\n@property (readonly) NSString *fileName;\n@property (readonly) NSURL *fileURL;\n@property (readonly) NSArray *pathComponents;\n@property (readonly) NSString *pathString;\n\n@end\n"
  },
  {
    "path": "Lin/DVTSourceTextView.h",
    "content": "//\n//  DVTSourceTextView.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/26.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DVTSourceTextView : NSTextView\n\n@end\n"
  },
  {
    "path": "Lin/IDEEditorDocument.h",
    "content": "//\n//  IDEEditorDocument.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/24.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class DVTFilePath;\n\n@interface IDEEditorDocument : NSDocument\n\n@property (retain) DVTFilePath *filePath;\n\n@end\n"
  },
  {
    "path": "Lin/IDEIndex+Lin.h",
    "content": "//\n//  IDEIndex+Lin.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/24.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"IDEIndex.h\"\n\n@interface IDEIndex (Lin)\n\n@end\n"
  },
  {
    "path": "Lin/IDEIndex+Lin.m",
    "content": "//\n//  IDEIndex+Lin.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/24.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"IDEIndex+Lin.h\"\n\n#import \"MethodSwizzle.h\"\n#import \"Lin.h\"\n\n@implementation IDEIndex (Lin)\n\n+ (void)load\n{\n    MethodSwizzle(self, @selector(close), @selector(jp_questbeat_lin_close));\n}\n\n- (void)jp_questbeat_lin_close\n{\n    [[Lin sharedPlugIn] removeLocalizationsForIndex:self];\n    \n    [self jp_questbeat_lin_close];\n}\n\n@end\n"
  },
  {
    "path": "Lin/IDEIndex.h",
    "content": "//\n//  IDEIndex.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/23.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class DVTFilePath;\n\n@interface IDEIndex : NSObject\n\n@property (readonly, nonatomic) DVTFilePath *workspaceFile;\n@property (readonly, nonatomic) NSString *workspaceName;\n\n- (void)close;\n- (id)filesContaining:(id)arg1 anchorStart:(BOOL)arg2 anchorEnd:(BOOL)arg3 subsequence:(BOOL)arg4 ignoreCase:(BOOL)arg5 cancelWhen:(id)arg6;\n\n@end\n"
  },
  {
    "path": "Lin/IDEIndexCollection.h",
    "content": "//\n//  IDEIndexCollection.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/23.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface IDEIndexCollection : NSObject <NSFastEnumeration>\n\n@end\n"
  },
  {
    "path": "Lin/IDEWorkspace.h",
    "content": "//\n//  IDEWorkspace.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class IDEIndex;\n@class DVTFilePath;\n\n@interface IDEWorkspace : NSObject\n\n@property (retain) IDEIndex *index;\n@property (readonly) DVTFilePath *representingFilePath;\n\n- (void)_updateIndexableFiles:(id)arg1;\n\n@end\n"
  },
  {
    "path": "Lin/IDEWorkspaceWindow.h",
    "content": "//\n//  IDEWorkspaceWindow.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/26.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"DVTDualProxyWindow.h\"\n\n@interface IDEWorkspaceWindow : DVTDualProxyWindow\n\n@end\n"
  },
  {
    "path": "Lin/LNAlertAccessoryView.h",
    "content": "//\n//  LNAlertAccessoryView.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/22.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@class LNLocalizationCollection;\n\n@interface LNAlertAccessoryView : NSView <NSTextFieldDelegate>\n\n@property (nonatomic, copy) NSArray *collections;\n@property (nonatomic, weak) NSButton *button;\n\n@property (nonatomic, copy, readonly) LNLocalizationCollection *selectedCollection;\n@property (nonatomic, copy, readonly) NSString *inputtedKey;\n@property (nonatomic, copy, readonly) NSString *inputtedValue;\n\n@end\n"
  },
  {
    "path": "Lin/LNAlertAccessoryView.m",
    "content": "//\n//  LNAlertAccessoryView.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/22.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNAlertAccessoryView.h\"\n\n// Models\n#import \"LNLocalizationCollection.h\"\n\n@interface LNAlertAccessoryView ()\n\n@property (weak) IBOutlet NSPopUpButton *tableButton;\n@property (weak) IBOutlet NSPopUpButton *languageButton;\n@property (weak) IBOutlet NSTextField *keyTextField;\n@property (weak) IBOutlet NSTextField *valueTextField;\n\n@end\n\n@implementation LNAlertAccessoryView\n\n- (void)awakeFromNib\n{\n    [super awakeFromNib];\n}\n\n\n#pragma mark - Accessors\n\n- (void)setCollections:(NSArray *)collections\n{\n    _collections = collections;\n    \n    // Update\n    [self configureView];\n}\n\n- (void)setButton:(NSButton *)button\n{\n    _button = button;\n    \n    // Update\n    [self configureButton];\n}\n\n- (LNLocalizationCollection *)selectedCollection\n{\n    NSString *selectedFileName = [self.tableButton titleOfSelectedItem];\n    NSString *selectedLanguageDesignations = [self.languageButton titleOfSelectedItem];\n    \n    for (LNLocalizationCollection *collection in self.collections) {\n        if ([collection.fileName isEqualToString:selectedFileName]\n            && [collection.languageDesignation isEqualToString:selectedLanguageDesignations]) {\n            return collection;\n        }\n    }\n    \n    return nil;\n}\n\n- (NSString *)inputtedKey\n{\n    return self.keyTextField.stringValue;\n}\n\n- (NSString *)inputtedValue\n{\n    return self.valueTextField.stringValue;\n}\n\n\n#pragma mark - Actions\n\n- (IBAction)tableDidChange:(id)sender\n{\n    // Update\n    [self updateLanguages];\n}\n\n\n#pragma mark - Updating the Views\n\n- (void)updateTables\n{\n    [self.tableButton removeAllItems];\n    \n    NSMutableSet *tableFileNames = [NSMutableSet set];\n    for (LNLocalizationCollection *collection in self.collections) {\n        [tableFileNames addObject:collection.fileName];\n    }\n    \n    [self.tableButton addItemsWithTitles:[tableFileNames allObjects]];\n}\n\n- (void)updateLanguages\n{\n    [self.languageButton removeAllItems];\n    \n    NSString *titleOfSelectedItem = [self.tableButton titleOfSelectedItem];\n    \n    NSMutableSet *languageDesignations = [NSMutableSet set];\n    for (LNLocalizationCollection *collection in self.collections) {\n        if ([titleOfSelectedItem isEqualToString:collection.fileName]) {\n            [languageDesignations addObject:collection.languageDesignation];\n        }\n    }\n    \n    [self.languageButton addItemsWithTitles:[languageDesignations allObjects]];\n}\n\n- (void)configureView\n{\n    [self updateTables];\n    [self updateLanguages];\n    \n    [self configureButton];\n}\n\n- (void)configureButton\n{\n    NSString *key = self.keyTextField.stringValue;\n    NSString *value = self.valueTextField.stringValue;\n    \n    [self.button setEnabled:(self.collections.count > 0 && key.length > 0 && value.length > 0)];\n}\n\n\n#pragma mark - NSTextFieldDelegate\n\n- (void)controlTextDidChange:(NSNotification *)obj\n{\n    [self configureButton];\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNAlertAccessoryView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"4510\" systemVersion=\"12F37\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\">\n    <dependencies>\n        <deployment defaultVersion=\"1080\" identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"4510\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSViewController\">\n            <connections>\n                <outlet property=\"view\" destination=\"1\" id=\"ApE-I1-pgP\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\"/>\n        <customView id=\"1\" customClass=\"LNAlertAccessoryView\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"276\" height=\"126\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n            <subviews>\n                <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"g8L-IS-4Xk\">\n                    <rect key=\"frame\" x=\"-3\" y=\"105\" width=\"74\" height=\"18\"/>\n                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Table:\" id=\"jNJ-it-poE\">\n                        <font key=\"font\" size=\"11\" name=\"LucidaGrande\"/>\n                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                    </textFieldCell>\n                </textField>\n                <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"c83-4U-gPj\">\n                    <rect key=\"frame\" x=\"-3\" y=\"74\" width=\"74\" height=\"18\"/>\n                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Language:\" id=\"kRy-xH-jEz\">\n                        <font key=\"font\" size=\"11\" name=\"LucidaGrande\"/>\n                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                    </textFieldCell>\n                </textField>\n                <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eXz-ob-H9h\">\n                    <rect key=\"frame\" x=\"-3\" y=\"38\" width=\"74\" height=\"18\"/>\n                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Key:\" id=\"aF0-zx-EL7\">\n                        <font key=\"font\" size=\"11\" name=\"LucidaGrande\"/>\n                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                    </textFieldCell>\n                </textField>\n                <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RCM-7S-qgd\">\n                    <rect key=\"frame\" x=\"-3\" y=\"2\" width=\"74\" height=\"18\"/>\n                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Value:\" id=\"oqq-yX-bGL\">\n                        <font key=\"font\" size=\"11\" name=\"LucidaGrande\"/>\n                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                    </textFieldCell>\n                </textField>\n                <popUpButton verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ffd-kG-7Ps\">\n                    <rect key=\"frame\" x=\"84\" y=\"101\" width=\"175\" height=\"26\"/>\n                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                    <popUpButtonCell key=\"cell\" type=\"push\" title=\"Item 1\" bezelStyle=\"rounded\" alignment=\"left\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"borderAndBezel\" imageScaling=\"proportionallyDown\" inset=\"2\" selectedItem=\"Bnc-Jb-pk1\" id=\"f33-uO-Fvh\">\n                        <behavior key=\"behavior\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                        <font key=\"font\" metaFont=\"menu\"/>\n                        <menu key=\"menu\" title=\"OtherViews\" id=\"OjL-b2-nb9\">\n                            <items>\n                                <menuItem title=\"Item 1\" state=\"on\" id=\"Bnc-Jb-pk1\"/>\n                                <menuItem title=\"Item 2\" id=\"v2K-y3-Q4d\"/>\n                                <menuItem title=\"Item 3\" id=\"j9O-iS-YPm\"/>\n                            </items>\n                        </menu>\n                    </popUpButtonCell>\n                    <connections>\n                        <action selector=\"tableDidChange:\" target=\"1\" id=\"7TQ-0w-o4K\"/>\n                    </connections>\n                </popUpButton>\n                <popUpButton verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8bv-Xr-gdv\">\n                    <rect key=\"frame\" x=\"84\" y=\"70\" width=\"175\" height=\"26\"/>\n                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                    <popUpButtonCell key=\"cell\" type=\"push\" title=\"Item 1\" bezelStyle=\"rounded\" alignment=\"left\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"borderAndBezel\" imageScaling=\"proportionallyDown\" inset=\"2\" selectedItem=\"in5-1O-5XW\" id=\"Dtc-dm-ra0\">\n                        <behavior key=\"behavior\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                        <font key=\"font\" metaFont=\"menu\"/>\n                        <menu key=\"menu\" title=\"OtherViews\" id=\"BIV-qg-Oc4\">\n                            <items>\n                                <menuItem title=\"Item 1\" state=\"on\" id=\"in5-1O-5XW\"/>\n                                <menuItem title=\"Item 2\" id=\"ICT-Lj-Z8X\"/>\n                                <menuItem title=\"Item 3\" id=\"pA4-SI-bOd\"/>\n                            </items>\n                        </menu>\n                    </popUpButtonCell>\n                </popUpButton>\n                <textField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Qol-ST-d7x\">\n                    <rect key=\"frame\" x=\"86\" y=\"36\" width=\"170\" height=\"22\"/>\n                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"eux-4V-Yap\">\n                        <font key=\"font\" metaFont=\"system\"/>\n                        <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                    </textFieldCell>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"1\" id=\"sAt-3w-AaA\"/>\n                    </connections>\n                </textField>\n                <textField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2iU-j0-HKh\">\n                    <rect key=\"frame\" x=\"86\" y=\"0.0\" width=\"170\" height=\"22\"/>\n                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"6k4-Zy-TKZ\">\n                        <font key=\"font\" metaFont=\"system\"/>\n                        <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                    </textFieldCell>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"1\" id=\"bbF-ov-OoT\"/>\n                    </connections>\n                </textField>\n            </subviews>\n            <connections>\n                <outlet property=\"keyTextField\" destination=\"Qol-ST-d7x\" id=\"TpR-9R-1mv\"/>\n                <outlet property=\"languageButton\" destination=\"8bv-Xr-gdv\" id=\"fP1-93-XWJ\"/>\n                <outlet property=\"tableButton\" destination=\"Ffd-kG-7Ps\" id=\"742-rf-D76\"/>\n                <outlet property=\"valueTextField\" destination=\"2iU-j0-HKh\" id=\"Bap-fJ-DcY\"/>\n            </connections>\n        </customView>\n    </objects>\n</document>"
  },
  {
    "path": "Lin/LNButtonCell.h",
    "content": "//\n//  LNButtonCell.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface LNButtonCell : NSButtonCell\n\n@end\n"
  },
  {
    "path": "Lin/LNButtonCell.m",
    "content": "//\n//  LNButtonCell.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNButtonCell.h\"\n\n@implementation LNButtonCell\n\n- (void)drawImage:(NSImage *)image withFrame:(NSRect)frame inView:(NSView *)controlView\n{\n    // Adjustment\n    frame.origin.y += 3;\n    \n    [super drawImage:image withFrame:frame inView:controlView];\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNDetector.h",
    "content": "//\n//  LNDetector.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface LNDetector : NSObject\n\n@property (nonatomic, copy, readonly) NSArray *regularExpressionPatterns;\n\n+ (instancetype)detector;\n\n- (NSArray *)entitiesInString:(NSString *)string;\n\n@end\n"
  },
  {
    "path": "Lin/LNDetector.m",
    "content": "//\n//  LNDetector.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNDetector.h\"\n\n// Models\n#import \"LNEntity.h\"\n#import \"LNRegularExpressionPattern.h\"\n#import \"LNRegularExpressionPattern+type.h\"\n\n@interface LNDetector ()\n\n@property (nonatomic, copy, readwrite) NSArray *regularExpressionPatterns;\n\n@end\n\n@implementation LNDetector\n\n+ (instancetype)detector\n{\n    return [[self alloc] init];\n}\n\n- (instancetype)init\n{\n    self = [super init];\n    \n    if (self) {\n        self.regularExpressionPatterns = @[\n                                           [LNRegularExpressionPattern patternWithType:LNEntityTypeLocalizedString],\n                                           [LNRegularExpressionPattern patternWithType:LNEntityTypeLocalizedStringForKey],\n                                           [LNRegularExpressionPattern patternWithType:LNEntityTypeLocalizedStringFromTable],\n                                           [LNRegularExpressionPattern patternWithType:LNEntityTypeLocalizedStringFromTableInBundle],\n                                           [LNRegularExpressionPattern patternWithType:LNEntityTypeLocalizedStringWithDefaultValue]\n                                           ];\n    }\n    \n    return self;\n}\n\n\n#pragma mark - Finding Entities\n\n- (NSArray *)entitiesInString:(NSString *)string\n{\n    NSMutableArray *entities = [NSMutableArray array];\n    \n    for (LNRegularExpressionPattern *regularExpressionPattern in self.regularExpressionPatterns) {\n        NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regularExpressionPattern.pattern options:0 error:NULL];\n        \n        __block NSRange entityRange;\n        __block NSRange keyRange;\n        \n        [regularExpression enumerateMatchesInString:string\n                                            options:0\n                                              range:NSMakeRange(0, string.length)\n                                         usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {\n                                             if (result.numberOfRanges == regularExpressionPattern.numberOfRanges) {\n                                                 entityRange = [result rangeAtIndex:regularExpressionPattern.entityRangeIndex];\n                                                 keyRange = [result rangeAtIndex:regularExpressionPattern.keyRangeIndex];\n                                                 \n                                                 LNEntity *entity = [LNEntity entityWithType:regularExpressionPattern.type\n                                                                                 entityRange:entityRange\n                                                                                    keyRange:keyRange];\n                                                 \n                                                 [entities addObject:entity];\n                                             }\n                                         }];\n    }\n    \n    return [entities copy];\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNEntity.h",
    "content": "//\n//  LNEntity.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\ntypedef NS_ENUM(NSUInteger, LNEntityType) {\n    LNEntityTypeLocalizedString = 0,\n    LNEntityTypeLocalizedStringForKey,\n    LNEntityTypeLocalizedStringFromTable,\n    LNEntityTypeLocalizedStringFromTableInBundle,\n    LNEntityTypeLocalizedStringWithDefaultValue\n};\n\nNS_INLINE NSString * NSStringFromEntityType(LNEntityType type) {\n    NSString *string = nil;\n    \n    switch (type) {\n        case LNEntityTypeLocalizedString:\n            string = @\"LNEntityTypeLocalizedString\";\n            break;\n        case LNEntityTypeLocalizedStringForKey:\n            string = @\"LNEntityTypeLocalizedStringForKey\";\n            break;\n        case LNEntityTypeLocalizedStringFromTable:\n            string = @\"LNEntityTypeLocalizedStringFromTable\";\n            break;\n        case LNEntityTypeLocalizedStringFromTableInBundle:\n            string = @\"LNEntityTypeLocalizedStringFromTableInBundle\";\n            break;\n        case LNEntityTypeLocalizedStringWithDefaultValue:\n            string = @\"LNEntityTypeLocalizedStringWithDefaultValue\";\n            break;\n    }\n    \n    return string;\n}\n\n@interface LNEntity : NSObject\n\n@property (nonatomic, assign, readonly) LNEntityType type;\n@property (nonatomic, assign, readonly) NSRange entityRange;\n@property (nonatomic, assign, readonly) NSRange keyRange;\n\n+ (instancetype)entityWithType:(LNEntityType)type entityRange:(NSRange)entityRange keyRange:(NSRange)keyRange;\n\n- (instancetype)initWithType:(LNEntityType)type entityRange:(NSRange)entityRange keyRange:(NSRange)keyRange;\n\n@end\n"
  },
  {
    "path": "Lin/LNEntity.m",
    "content": "//\n//  LNEntity.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNEntity.h\"\n\n@interface LNEntity ()\n\n@property (nonatomic, assign, readwrite) LNEntityType type;\n@property (nonatomic, assign, readwrite) NSRange entityRange;\n@property (nonatomic, assign, readwrite) NSRange keyRange;\n\n@end\n\n@implementation LNEntity\n\n+ (instancetype)entityWithType:(LNEntityType)type entityRange:(NSRange)entityRange keyRange:(NSRange)keyRange\n{\n    return [[self alloc] initWithType:type entityRange:entityRange keyRange:keyRange];\n}\n\n- (instancetype)initWithType:(LNEntityType)type entityRange:(NSRange)entityRange keyRange:(NSRange)keyRange\n{\n    self = [super init];\n    \n    if (self) {\n        self.type = type;\n        self.entityRange = entityRange;\n        self.keyRange = keyRange;\n    }\n    \n    return self;\n}\n\n- (BOOL)isEqual:(id)object\n{\n    if (object == self)\n        return YES;\n    if (!object || ![[object class] isEqual:[self class]])\n        return NO;\n    if (!NSEqualRanges([self entityRange], [object entityRange]))\n        return NO;\n    \n    return YES;\n}\n\n- (NSString *)description\n{\n    return [NSString stringWithFormat:\n            @\"<%@: %p; type = %@; range = %@; key = %@>\",\n            NSStringFromClass([self class]),\n            self,\n            NSStringFromEntityType(self.type),\n            NSStringFromRange(self.entityRange),\n            NSStringFromRange(self.keyRange)\n            ];\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNHorizontalLine.h",
    "content": "//\n//  LNHorizontalLine.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface LNHorizontalLine : NSBox\n\n@end\n"
  },
  {
    "path": "Lin/LNHorizontalLine.m",
    "content": "//\n//  LNHorizontalLine.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNHorizontalLine.h\"\n\n@implementation LNHorizontalLine\n\n- (void)drawRect:(NSRect)dirtyRect\n{\n    [[NSColor colorWithDeviceWhite:204.0/255.0 alpha:1.0] set];\n    [NSBezierPath strokeLineFromPoint:NSMakePoint(dirtyRect.origin.x, 2.5)\n                              toPoint:NSMakePoint(dirtyRect.origin.x + dirtyRect.size.width, 2.5)];\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNImageButtonCell.h",
    "content": "//\n//  LNImageButtonCell.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2014/03/04.\n//  Copyright (c) 2014年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface LNImageButtonCell : NSButtonCell\n\n@end\n"
  },
  {
    "path": "Lin/LNImageButtonCell.m",
    "content": "//\n//  LNImageButtonCell.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2014/03/04.\n//  Copyright (c) 2014年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNImageButtonCell.h\"\n\n@implementation LNImageButtonCell\n\n- (void)drawImage:(NSImage *)image withFrame:(NSRect)frame inView:(NSView *)controlView\n{\n    // Adjustment\n    frame.origin.y += 2;\n    \n    [super drawImage:image withFrame:frame inView:controlView];\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNLocalization.h",
    "content": "//\n//  LNLocalization.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/23.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class LNLocalizationCollection;\n\n@interface LNLocalization : NSObject\n\n@property (nonatomic, copy, readonly) NSString *key;\n@property (nonatomic, copy, readonly) NSString *value;\n\n@property (nonatomic, assign, readonly) NSRange entityRange;\n@property (nonatomic, assign, readonly) NSRange keyRange;\n@property (nonatomic, assign, readonly) NSRange valueRange;\n\n@property (nonatomic, weak, readonly) LNLocalizationCollection *collection;\n\n+ (instancetype)localizationWithKey:(NSString *)key value:(NSString *)value entityRange:(NSRange)entityRange keyRange:(NSRange)keyRange valueRange:(NSRange)valueRange collection:(LNLocalizationCollection *)collection;\n\n- (instancetype)initWithKey:(NSString *)key value:(NSString *)value entityRange:(NSRange)entityRange keyRange:(NSRange)keyRange valueRange:(NSRange)valueRange collection:(LNLocalizationCollection *)collection;\n\n@end\n"
  },
  {
    "path": "Lin/LNLocalization.m",
    "content": "//\n//  LNLocalization.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/23.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNLocalization.h\"\n\n@interface LNLocalization ()\n\n@property (nonatomic, copy, readwrite) NSString *key;\n@property (nonatomic, copy, readwrite) NSString *value;\n\n@property (nonatomic, assign, readwrite) NSRange entityRange;\n@property (nonatomic, assign, readwrite) NSRange keyRange;\n@property (nonatomic, assign, readwrite) NSRange valueRange;\n\n@property (nonatomic, weak, readwrite) LNLocalizationCollection *collection;\n\n@end\n\n@implementation LNLocalization\n\n+ (instancetype)localizationWithKey:(NSString *)key value:(NSString *)value entityRange:(NSRange)entityRange keyRange:(NSRange)keyRange valueRange:(NSRange)valueRange collection:(LNLocalizationCollection *)collection\n{\n    return [[self alloc] initWithKey:key value:value entityRange:(NSRange)entityRange keyRange:keyRange valueRange:valueRange collection:collection];\n}\n\n- (instancetype)initWithKey:(NSString *)key value:(NSString *)value entityRange:(NSRange)entityRange keyRange:(NSRange)keyRange valueRange:(NSRange)valueRange collection:(LNLocalizationCollection *)collection\n{\n    self = [super init];\n    \n    if (self) {\n        self.key = key;\n        self.value = value;\n        \n        self.entityRange = entityRange;\n        self.keyRange = keyRange;\n        self.valueRange = valueRange;\n        \n        self.collection = collection;\n    }\n    \n    return self;\n}\n\n- (BOOL)isEqual:(id)object\n{\n    if (object == self)\n        return YES;\n    if (!object || ![[object class] isEqual:[self class]])\n        return NO;\n    if (![[self key] isEqualToString:[object key]])\n        return NO;\n    \n    return YES;\n}\n\n- (NSUInteger)hash\n{\n    return [self.key hash];\n}\n\n- (NSString *)description\n{\n    return [NSString stringWithFormat:\n            @\"<%@: %p; key = %@; value = %@; entityRange = %@; keyRange = %@; valueRange = %@; collection = %p>\",\n            NSStringFromClass([self class]),\n            self,\n            self.key,\n            self.value,\n            NSStringFromRange(self.entityRange),\n            NSStringFromRange(self.keyRange),\n            NSStringFromRange(self.valueRange),\n            self.collection\n            ];\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNLocalizationCollection.h",
    "content": "//\n//  LNLocalizationCollection.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/23.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class LNLocalization;\n\n@interface LNLocalizationCollection : NSObject\n\n@property (nonatomic, copy, readonly) NSString *filePath;\n@property (nonatomic, copy, readonly) NSString *languageDesignation;\n\n@property (nonatomic, strong, readonly) NSMutableSet *localizations;\n\n+ (instancetype)localizationCollectionWithContentsOfFile:(NSString *)filePath;\n\n- (instancetype)initWithContentsOfFile:(NSString *)filePath;\n\n- (NSString *)fileName;\n\n- (void)reloadLocalizations;\n- (void)addLocalization:(LNLocalization *)localization;\n- (void)deleteLocalization:(LNLocalization *)localization;\n- (void)replaceLocalization:(LNLocalization *)localization withLocalization:(LNLocalization *)newLocalization;\n\n@end\n"
  },
  {
    "path": "Lin/LNLocalizationCollection.m",
    "content": "//\n//  LNLocalizationCollection.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/23.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNLocalizationCollection.h\"\n\n// Models\n#import \"LNLocalization.h\"\n\n@interface LNLocalizationCollection ()\n\n@property (nonatomic, copy, readwrite) NSString *filePath;\n@property (nonatomic, copy, readwrite) NSString *languageDesignation;\n\n@property (nonatomic, strong, readwrite) NSMutableSet *localizations;\n\n@end\n\n@implementation LNLocalizationCollection\n\n+ (instancetype)localizationCollectionWithContentsOfFile:(NSString *)filePath\n{\n    return [[self alloc] initWithContentsOfFile:filePath];\n}\n\n- (instancetype)initWithContentsOfFile:(NSString *)filePath\n{\n    self = [super init];\n    \n    if (self) {\n        self.filePath = filePath;\n        \n        // Extract language designation\n        NSArray *pathComponents = [filePath pathComponents];\n        self.languageDesignation = [[pathComponents objectAtIndex:pathComponents.count - 2] stringByDeletingPathExtension];\n        \n        // Update\n        [self reloadLocalizations];\n    }\n    \n    return self;\n}\n\n- (NSString *)description\n{\n    return [NSString stringWithFormat:\n            @\"<%@: %p; filePath = %@; languageDesignation = %@; localizations = %@>\",\n            NSStringFromClass([self class]),\n            self,\n            self.filePath,\n            self.languageDesignation,\n            self.localizations\n            ];\n}\n\n\n#pragma mark - Accessors\n\n- (NSString *)fileName\n{\n    return [self.filePath lastPathComponent];\n}\n\n\n#pragma mark - Managing Localizations\n\n- (NSString *)loadContentsOfFile:(NSString *)filePath\n{\n\tNSError *error = nil;\n    NSStringEncoding encoding = NSUTF8StringEncoding;\n    NSString *contents = [NSString stringWithContentsOfURL:[NSURL fileURLWithPath:self.filePath]\n                                              usedEncoding:&encoding\n                                                     error:&error];\n    \n    if (error) {\n        NSLog(@\"Error: %@\", [error localizedDescription]);\n        \n        return nil;\n    }\n    \n    return contents;\n}\n\n- (void)reloadLocalizations\n{\n    // Load contents\n    NSString *contents = [self loadContentsOfFile:self.filePath];\n    \n    if (contents) {\n        NSMutableSet *localizations = [NSMutableSet set];\n        \n        // Parse\n        __block NSInteger lineOffset = 0;\n        __block NSString *key;\n        __block NSString *value;\n        __block NSRange entityRange;\n        __block NSRange keyRange;\n        __block NSRange valueRange;\n        \n        NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:@\"(\\\"(\\\\S+.*\\\\S+)\\\"|(\\\\S+.*\\\\S+))\\\\s*=\\\\s*\\\"(.*)\\\";$\"\n                                                                                           options:0\n                                                                                             error:NULL];\n        \n        [contents enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) {\n            key = nil;\n            value = nil;\n            keyRange = NSMakeRange(NSNotFound, 0);\n            valueRange = NSMakeRange(NSNotFound, 0);\n            \n            NSTextCheckingResult *result = [regularExpression firstMatchInString:line\n                                                                         options:0\n                                                                           range:NSMakeRange(0, line.length)];\n            \n            if (result.range.location != NSNotFound && result.numberOfRanges == 5) {\n                entityRange = [result rangeAtIndex:0];\n                entityRange.location += lineOffset;\n                \n                keyRange = [result rangeAtIndex:2];\n                if (keyRange.location == NSNotFound) keyRange = [result rangeAtIndex:3];\n                \n                valueRange = [result rangeAtIndex:4];\n                \n                key = [line substringWithRange:keyRange];\n                value = [line substringWithRange:valueRange];\n                \n                keyRange.location += lineOffset;\n                valueRange.location += lineOffset;\n            }\n            \n            // Create localization\n            if (key != nil && value != nil) {\n                LNLocalization *localization = [LNLocalization localizationWithKey:key\n                                                                             value:value\n                                                                       entityRange:entityRange\n                                                                          keyRange:keyRange\n                                                                        valueRange:valueRange\n                                                                        collection:self];\n                \n                [localizations addObject:localization];\n            }\n            \n            // Move offset\n            NSRange lineRange = [contents lineRangeForRange:NSMakeRange(lineOffset, 0)];\n            lineOffset += lineRange.length;\n        }];\n        \n        self.localizations = localizations;\n    } else {\n        self.localizations = nil;\n    }\n}\n\n- (void)addLocalization:(LNLocalization *)localization\n{\n    // Load contents\n    NSString *contents = [self loadContentsOfFile:self.filePath];\n    \n    // Add\n    if (![contents hasSuffix:@\"\\n\"]) {\n        contents = [contents stringByAppendingString:@\"\\n\"];\n    }\n    \n    contents = [contents stringByAppendingFormat:@\"\\\"%@\\\" = \\\"%@\\\";\\n\", localization.key, localization.value];\n    \n    // Override\n    NSError *error = nil;\n    [contents writeToFile:self.filePath atomically:NO encoding:NSUTF8StringEncoding error:&error];\n    \n    if (error) {\n        NSLog(@\"Error: %@\", [error localizedDescription]);\n    }\n    \n    // Reload\n    [self reloadLocalizations];\n}\n\n- (void)deleteLocalization:(LNLocalization *)localization\n{\n    // Load contents\n    NSString *contents = [self loadContentsOfFile:self.filePath];\n    \n    // Delete line\n    NSRange lineRange = [contents lineRangeForRange:localization.entityRange];\n    contents = [contents stringByReplacingCharactersInRange:lineRange withString:@\"\"];\n    \n    // Override\n    NSError *error = nil;\n    [contents writeToFile:self.filePath atomically:NO encoding:NSUTF8StringEncoding error:&error];\n    \n    if (error) {\n        NSLog(@\"Error: %@\", [error localizedDescription]);\n    }\n    \n    // Reload\n    [self reloadLocalizations];\n}\n\n- (void)replaceLocalization:(LNLocalization *)localization withLocalization:(LNLocalization *)newLocalization\n{\n    // Load contents\n    NSString *contents = [self loadContentsOfFile:self.filePath];\n    \n    // Replace\n    NSString *newEntity = [NSString stringWithFormat:@\"\\\"%@\\\" = \\\"%@\\\";\", newLocalization.key, newLocalization.value];\n    contents = [contents stringByReplacingCharactersInRange:localization.entityRange withString:newEntity];\n    \n    // Override\n    NSError *error = nil;\n    [contents writeToFile:self.filePath atomically:NO encoding:NSUTF8StringEncoding error:&error];\n    \n    if (error) {\n        NSLog(@\"Error: %@\", [error localizedDescription]);\n    }\n    \n    // Reload\n    [self reloadLocalizations];\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNLocalizedStringCollectionOperation.h",
    "content": "//\n//  LNLocalizedStringCollectionOperation.h\n//  Lin\n//\n//  Created by Wenbin Zhang on 3/7/14.\n//  Copyright (c) 2014 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class IDEIndex;\n\ntypedef void(^LNLocalizedStringCollectionCompletionBlock)(NSString *workspacePath, NSArray *collections);\n\n@interface LNLocalizedStringCollectionOperation : NSOperation\n\n@property (nonatomic, strong) IDEIndex *index;\n@property (nonatomic, copy) LNLocalizedStringCollectionCompletionBlock collectionCompletedBlock;\n\n- (instancetype)initWithIndex:(IDEIndex *)index;\n@end\n"
  },
  {
    "path": "Lin/LNLocalizedStringCollectionOperation.m",
    "content": "//\n//  LNLocalizedStringCollectionOperation.m\n//  Lin\n//\n//  Created by Wenbin Zhang on 3/7/14.\n//  Copyright (c) 2014 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNLocalizedStringCollectionOperation.h\"\n#import \"IDEIndex.h\"\n#import \"IDEWorkspace.h\"\n#import \"IDEIndexCollection.h\"\n#import \"DVTFilePath.h\"\n#import \"LNLocalizationCollection.h\"\n\n@interface LNLocalizedStringCollectionOperation ()\n\n@property (nonatomic, strong) NSArray *collections;\n@property (nonatomic, strong) NSString *workspaceFilePath;\n@end\n\n@implementation LNLocalizedStringCollectionOperation\n\n- (instancetype)initWithIndex:(IDEIndex *)index\n{\n    self = [super init];\n    if (self) {\n        self.index = index;\n    }\n    return self;\n}\n\n- (void)main\n{\n    @autoreleasepool {\n        if (self.isCancelled) {\n            return;\n        }\n        \n        if (!self.index) {\n            return;\n        }\n        [self processLocalizedString];\n        \n        if (self.isCancelled) {\n            return;\n        }\n        \n        if (self.collectionCompletedBlock) {\n            dispatch_async(dispatch_get_main_queue(), ^{\n                self.collectionCompletedBlock(self.workspaceFilePath, self.collections);\n            });\n        }\n        \n        [self cleanup];\n    }\n}\n\n- (void)processLocalizedString\n{\n    IDEWorkspace *workspace = [self.index valueForKey:@\"_workspace\"];\n    DVTFilePath *representingFilePath = workspace.representingFilePath;\n    self.workspaceFilePath = representingFilePath.pathString;\n    NSMutableArray *mutableCollections = [[NSMutableArray alloc] init];\n    \n    if (self.workspaceFilePath) {\n        NSString *projectRootPath = [[self.workspaceFilePath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent];\n        \n        // Find .strings files\n        IDEIndexCollection *indexCollection = [self.index filesContaining:@\".strings\" anchorStart:NO anchorEnd:NO subsequence:NO ignoreCase:YES cancelWhen:nil];\n        \n        for (DVTFilePath *filePath in indexCollection) {\n            if (self.isCancelled) {\n                return;\n            }\n            NSString *pathString = filePath.pathString;\n            \n            BOOL parseStringsFilesOutsideWorkspaceProject = YES;\n            if (parseStringsFilesOutsideWorkspaceProject ||\n                (!parseStringsFilesOutsideWorkspaceProject && [pathString rangeOfString:projectRootPath].location != NSNotFound)) {\n                // Create localization collection\n                LNLocalizationCollection *collection = [LNLocalizationCollection localizationCollectionWithContentsOfFile:pathString];\n                [mutableCollections addObject:collection];\n            }\n        }\n        self.collections = [mutableCollections copy];\n    }\n}\n\n- (void)cleanup\n{\n    self.index = nil;\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNPopoverContentView.h",
    "content": "//\n//  LNPopoverContentView.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/06.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\nextern NSString * const LNPopoverContentViewLocalizationKey;\n\nextern NSString * const LNPopoverContentViewLocalizationDidSelectNotification;\nextern NSString * const LNPopoverContentViewAlertDidDismissNotification;\nextern NSString * const LNPopoverContentViewDetachButtonDidClickNotification;\n\n@interface LNPopoverContentView : NSView <NSTableViewDataSource, NSTableViewDelegate>\n\n@property (nonatomic, weak, readonly) NSTableView *tableView;\n@property (nonatomic, weak, readonly) NSButton *detachButton;\n@property (nonatomic, copy) NSArray *collections;\n@property (nonatomic, copy) NSString *searchString;\n\n@end\n"
  },
  {
    "path": "Lin/LNPopoverContentView.m",
    "content": "//\n//  LNPopoverContentView.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/06.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNPopoverContentView.h\"\n\n// Categories\n#import \"NSTableView+editedColumnIdentifier.h\"\n\n// Models\n#import \"LNLocalizationCollection.h\"\n#import \"LNLocalization.h\"\n\n// Views\n#import \"LNTableHeaderCell.h\"\n#import \"LNAlertAccessoryView.h\"\n\nNSString * const LNPopoverContentViewLocalizationKey = @\"LNPopoverContentViewLocalizationKey\";\n\nNSString * const LNPopoverContentViewLocalizationDidSelectNotification = @\"LNPopoverContentViewRowDidDoubleClickNotification\";\nNSString * const LNPopoverContentViewAlertDidDismissNotification = @\"LNPopoverContentViewAlertDidDismissNotification\";\nNSString * const LNPopoverContentViewDetachButtonDidClickNotification = @\"LNPopoverContentViewDetachButtonDidClickNotification\";\n\n@interface LNPopoverContentView ()\n\n@property (nonatomic, weak, readwrite) IBOutlet NSTableView *tableView;\n@property (nonatomic, weak, readwrite) IBOutlet NSButton *detachButton;\n\n@property (nonatomic, strong) NSMutableArray *localizations;\n@property (nonatomic, strong) NSMutableArray *sortedLocalizations;\n\n- (IBAction)addLocalization:(id)sender;\n- (IBAction)deleteLocalization:(id)sender;\n- (IBAction)detachPopover:(id)sender;\n\n@end\n\n@implementation LNPopoverContentView\n\n- (void)awakeFromNib\n{\n    [super awakeFromNib];\n    \n    // Set default sort order\n    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@\"key\"\n                                                                     ascending:YES\n                                                                      selector:@selector(compare:)];\n    [self.tableView setSortDescriptors:@[sortDescriptor]];\n    \n    // Register to notification center\n    [[NSNotificationCenter defaultCenter] addObserver:self\n                                             selector:@selector(textDidEndEditing:)\n                                                 name:NSControlTextDidEndEditingNotification\n                                               object:nil];\n}\n\n- (void)dealloc\n{\n    // Remove from notification center\n    [[NSNotificationCenter defaultCenter] removeObserver:self\n                                                    name:NSControlTextDidEndEditingNotification\n                                                  object:nil];\n}\n\n\n#pragma mark - Accessors\n\n- (void)setTableView:(NSTableView *)tableView\n{\n    _tableView = tableView;\n    \n    // Set double click action\n    [_tableView setTarget:self];\n    [_tableView setDoubleAction:@selector(tableViewDidDoubleClick:)];\n}\n\n- (void)setCollections:(NSArray *)collections\n{\n    _collections = collections;\n    \n    // Update\n    [self configureView];\n}\n\n- (void)setSearchString:(NSString *)searchString\n{\n    _searchString = searchString;\n    \n    // Update\n    [self configureView];\n}\n\n\n#pragma mark - Notifications\n\n- (void)textDidEndEditing:(NSNotification *)notification\n{\n    NSInteger editedRow = [self.tableView editedRow];\n    NSInteger editedColumn = [self.tableView editedColumn];\n    \n    if (editedRow >= 0 && editedColumn >= 0) {\n        NSTextView *textView = (NSTextView *)[notification.userInfo objectForKey:@\"NSFieldEditor\"];\n        \n        // Create a new localization\n        LNLocalization *localization = [self.sortedLocalizations objectAtIndex:editedRow];\n        \n        NSString *key = localization.key;\n        NSString *value = localization.value;\n        \n        NSString *columnIdentifier = [self.tableView editedColumnIdentifier];\n        \n        if ([columnIdentifier isEqualToString:@\"key\"]) {\n            key = textView.textStorage.string;\n        } else if ([columnIdentifier isEqualToString:@\"value\"]) {\n            value = textView.textStorage.string;\n        }\n        \n        LNLocalization *newLocalization = [LNLocalization localizationWithKey:key\n                                                                        value:value\n                                                                  entityRange:localization.entityRange\n                                                                     keyRange:localization.keyRange\n                                                                   valueRange:localization.valueRange\n                                                                   collection:localization.collection];\n        \n        // Replace in file\n        [localization.collection replaceLocalization:localization withLocalization:newLocalization];\n        \n        // Update\n        [self configureView];\n    }\n}\n\n\n#pragma mark - Actions\n\n- (void)tableViewDidDoubleClick:(id)sender\n{\n    NSInteger clickedRow = [self.tableView clickedRow];\n    \n    if (clickedRow >= 0) {\n        LNLocalization *localization = [self.sortedLocalizations objectAtIndex:clickedRow];\n        \n        // Post notification\n        [[NSNotificationCenter defaultCenter] postNotificationName:LNPopoverContentViewLocalizationDidSelectNotification\n                                                            object:self\n                                                          userInfo:@{LNPopoverContentViewLocalizationKey: localization}];\n    }\n}\n\n- (IBAction)addLocalization:(id)sender\n{\n    // Create alert\n    NSBundle *bundle = [NSBundle bundleForClass:[self class]];\n    NSViewController *viewController = [[NSViewController alloc] initWithNibName:@\"LNAlertAccessoryView\" bundle:bundle];\n    LNAlertAccessoryView *accessoryView = (LNAlertAccessoryView *)viewController.view;\n    accessoryView.collections = self.collections;\n    \n    NSAlert *alert = [NSAlert alertWithMessageText:@\"Lin\"\n                                     defaultButton:@\"OK\"\n                                   alternateButton:@\"Cancel\"\n                                       otherButton:nil\n                         informativeTextWithFormat:@\"Input a key/value for a new localization.\"];\n    alert.accessoryView = accessoryView;\n    \n    NSButton *button = [[alert buttons] objectAtIndex:0];\n    accessoryView.button = button;\n    \n    // Set icon\n    NSString *filePath = [bundle pathForResource:@\"icon120\" ofType:@\"tiff\"];\n    NSImage *icon = [[NSImage alloc] initWithContentsOfFile:filePath];\n    [alert setIcon:icon];\n    \n    // Show alert\n    switch ([alert runModal]) {\n        case NSAlertDefaultReturn:\n        {\n            // Create a new localization\n            LNAlertAccessoryView *accessoryView = (LNAlertAccessoryView *)alert.accessoryView;\n            \n            LNLocalizationCollection *collection = accessoryView.selectedCollection;\n            NSString *key = accessoryView.inputtedKey;\n            NSString *value = accessoryView.inputtedValue;\n            \n            LNLocalization *localization = [LNLocalization localizationWithKey:key\n                                                                         value:value\n                                                                   entityRange:NSMakeRange(NSNotFound, 0)\n                                                                      keyRange:NSMakeRange(NSNotFound, 0)\n                                                                    valueRange:NSMakeRange(NSNotFound, 0)\n                                                                    collection:collection];\n            \n            // Add localization to file\n            [collection addLocalization:localization];\n            \n            // Update\n            [self configureView];\n        }\n            \n        default:\n        {\n            // Post notification\n            [[NSNotificationCenter defaultCenter] postNotificationName:LNPopoverContentViewAlertDidDismissNotification\n                                                                object:self\n                                                              userInfo:nil];\n        }\n            break;\n    }\n}\n\n- (IBAction)deleteLocalization:(id)sender\n{\n    NSInteger selectedRow = [self.tableView selectedRow];\n    \n    if (selectedRow >= 0) {\n        [self.tableView beginUpdates];\n        \n        // Delete localization from array\n        LNLocalization *localization = [self.sortedLocalizations objectAtIndex:selectedRow];\n        NSInteger index = [self.localizations indexOfObject:localization];\n        [self.localizations removeObjectAtIndex:index];\n        \n        // Filter localizations\n        [self filterLocalizations];\n        \n        // Delete localization from file\n        LNLocalizationCollection *collection = localization.collection;\n        [collection deleteLocalization:localization];\n        \n        // Delete localization from table view\n        [self.tableView removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:selectedRow]\n                              withAnimation:NSTableViewAnimationEffectFade];\n        \n        [self.tableView endUpdates];\n    }\n}\n\n- (IBAction)detachPopover:(id)sender\n{\n    // Post notification\n    [[NSNotificationCenter defaultCenter] postNotificationName:LNPopoverContentViewDetachButtonDidClickNotification\n                                                        object:self\n                                                      userInfo:nil];\n}\n\n\n#pragma mark - Updating and Drawing the View\n\n- (void)reloadLocalizations\n{\n    NSMutableArray *localizations = [NSMutableArray array];\n    \n    for (LNLocalizationCollection *collection in self.collections) {\n        [localizations addObjectsFromArray:[collection.localizations allObjects]];\n    }\n    \n    self.localizations = localizations;\n}\n\n- (void)filterLocalizations\n{\n    // Filter localizations\n    NSArray *filteredLocalizations = self.localizations;\n    \n    if (self.searchString.length > 0) {\n        filteredLocalizations = [filteredLocalizations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@\"key contains[c] %@\", self.searchString]];\n    }\n    \n    // Sort localizations\n    self.sortedLocalizations = [[filteredLocalizations sortedArrayUsingDescriptors:self.tableView.sortDescriptors] mutableCopy];\n}\n\n- (void)configureView\n{\n    // Reload localizations\n    [self reloadLocalizations];\n    \n    // Filter localizations\n    [self filterLocalizations];\n    \n    // Update table view\n    [self.tableView reloadData];\n}\n\n\n#pragma mark - NSTableViewDataSource\n\n- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView\n{\n    return self.sortedLocalizations.count;\n}\n\n- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row\n{\n    LNLocalization *localization = [self.sortedLocalizations objectAtIndex:row];\n    NSString *identifier = tableColumn.identifier;\n    \n    if([identifier isEqualToString:@\"table\"]) {\n        return [localization.collection.filePath lastPathComponent];\n    }\n    else if ([identifier isEqualToString:@\"language\"]) {\n        return localization.collection.languageDesignation;\n    }\n    else if ([identifier isEqualToString:@\"key\"]) {\n        return localization.key;\n    }\n    else if ([identifier isEqualToString:@\"value\"]) {\n        return localization.value;\n    }\n    \n    return nil;\n}\n\n- (void)tableView:(NSTableView *)tableView sortDescriptorsDidChange:(NSArray *)oldDescriptors\n{\n    // Update\n    [self configureView];\n}\n\n\n#pragma mark - NSTableViewDelegate\n\n- (void)tableView:(NSTableView *)tableView didClickTableColumn:(NSTableColumn *)clickedTableColumn\n{\n    for (NSTableColumn *tableColumn in [tableView tableColumns]) {\n        LNTableHeaderCell *headerCell = (LNTableHeaderCell*)[tableColumn headerCell];\n        \n        if (tableColumn == clickedTableColumn) {\n            [headerCell setSortAscending:[[[tableView sortDescriptors] objectAtIndex:0] ascending]\n                                priority:0];\n        } else {\n            [headerCell setSortAscending:NO\n                                priority:1];\n        }\n    }\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNPopoverContentView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"4514\" systemVersion=\"13C64\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\">\n    <dependencies>\n        <deployment defaultVersion=\"1070\" identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"4514\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSViewController\">\n            <connections>\n                <outlet property=\"view\" destination=\"JhI-Tt-sI6\" id=\"ShO-KJ-h53\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\"/>\n        <customView id=\"JhI-Tt-sI6\" customClass=\"LNPopoverContentView\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"500\" height=\"200\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n            <subviews>\n                <scrollView borderType=\"none\" autohidesScrollers=\"YES\" horizontalLineScroll=\"22\" horizontalPageScroll=\"10\" verticalLineScroll=\"22\" verticalPageScroll=\"10\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3v3-Ru-fHe\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"26\" width=\"500\" height=\"165\"/>\n                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                    <clipView key=\"contentView\" id=\"4Zc-RR-q53\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"17\" width=\"500\" height=\"148\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <tableView verticalHuggingPriority=\"750\" allowsExpansionToolTips=\"YES\" columnAutoresizingStyle=\"lastColumnOnly\" multipleSelection=\"NO\" autosaveColumns=\"NO\" rowHeight=\"20\" headerView=\"PhJ-5j-No2\" id=\"Bwg-zH-Dly\" customClass=\"LNTableView\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"500\" height=\"148\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <size key=\"intercellSpacing\" width=\"3\" height=\"2\"/>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <tableViewGridLines key=\"gridStyleMask\" horizontal=\"YES\"/>\n                                <color key=\"gridColor\" red=\"0.92156862745098034\" green=\"0.92156862745098034\" blue=\"0.92156862745098034\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                <tableColumns>\n                                    <tableColumn identifier=\"table\" editable=\"NO\" width=\"120\" minWidth=\"40\" maxWidth=\"1000\" id=\"YXl-vg-Qqt\">\n                                        <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\" alignment=\"left\" title=\"Table\">\n                                            <font key=\"font\" metaFont=\"smallSystem\"/>\n                                            <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" white=\"0.33333298560000002\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        </tableHeaderCell>\n                                        <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" alignment=\"left\" title=\"Text Cell\" id=\"zoX-Td-qdB\">\n                                            <font key=\"font\" metaFont=\"cellTitle\"/>\n                                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                        <sortDescriptor key=\"sortDescriptorPrototype\" selector=\"compare:\" sortKey=\"collection.fileName\"/>\n                                        <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                    </tableColumn>\n                                    <tableColumn identifier=\"language\" editable=\"NO\" width=\"80\" minWidth=\"40\" maxWidth=\"1000\" id=\"5SM-c2-cfJ\">\n                                        <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\" alignment=\"left\" title=\"Language\">\n                                            <font key=\"font\" metaFont=\"smallSystem\"/>\n                                            <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" white=\"0.33333298560000002\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        </tableHeaderCell>\n                                        <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" alignment=\"left\" title=\"Text Cell\" id=\"Ira-n7-x81\">\n                                            <font key=\"font\" metaFont=\"cellTitle\"/>\n                                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                        <sortDescriptor key=\"sortDescriptorPrototype\" selector=\"compare:\" sortKey=\"collection.languageDesignation\"/>\n                                        <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                    </tableColumn>\n                                    <tableColumn identifier=\"key\" width=\"100\" minWidth=\"40\" maxWidth=\"1000\" id=\"UTY-KW-1GJ\">\n                                        <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\" alignment=\"left\" title=\"Key\">\n                                            <font key=\"font\" metaFont=\"smallSystem\"/>\n                                            <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" white=\"0.33333298560000002\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        </tableHeaderCell>\n                                        <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" alignment=\"left\" title=\"Text Cell\" id=\"VEM-Lk-Orp\">\n                                            <font key=\"font\" metaFont=\"cellTitle\"/>\n                                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                        <sortDescriptor key=\"sortDescriptorPrototype\" selector=\"compare:\" sortKey=\"key\"/>\n                                        <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                    </tableColumn>\n                                    <tableColumn identifier=\"value\" width=\"188\" minWidth=\"40\" maxWidth=\"1000\" id=\"puj-ZH-fjz\">\n                                        <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\" alignment=\"left\" title=\"Value\">\n                                            <font key=\"font\" metaFont=\"smallSystem\"/>\n                                            <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" white=\"0.33333298560000002\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        </tableHeaderCell>\n                                        <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" alignment=\"left\" title=\"Text Cell\" id=\"KsI-QU-sXD\">\n                                            <font key=\"font\" metaFont=\"cellTitle\"/>\n                                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                        <sortDescriptor key=\"sortDescriptorPrototype\" selector=\"compare:\" sortKey=\"value\"/>\n                                        <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                    </tableColumn>\n                                </tableColumns>\n                                <connections>\n                                    <outlet property=\"dataSource\" destination=\"JhI-Tt-sI6\" id=\"rzs-bS-zvN\"/>\n                                    <outlet property=\"delegate\" destination=\"JhI-Tt-sI6\" id=\"qbi-dH-oJW\"/>\n                                </connections>\n                            </tableView>\n                        </subviews>\n                        <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                    </clipView>\n                    <scroller key=\"horizontalScroller\" hidden=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"YES\" id=\"kwl-10-84v\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"149\" width=\"485\" height=\"16\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </scroller>\n                    <scroller key=\"verticalScroller\" hidden=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"NO\" id=\"9DO-ip-b6D\">\n                        <rect key=\"frame\" x=\"485\" y=\"17\" width=\"15\" height=\"132\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </scroller>\n                    <tableHeaderView key=\"headerView\" id=\"PhJ-5j-No2\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"500\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </tableHeaderView>\n                </scrollView>\n                <box autoresizesSubviews=\"NO\" verticalHuggingPriority=\"750\" title=\"Box\" boxType=\"separator\" titlePosition=\"noTitle\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"M5Y-vQ-slM\" customClass=\"LNHorizontalLine\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"23\" width=\"500\" height=\"5\"/>\n                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMaxY=\"YES\"/>\n                    <color key=\"borderColor\" white=\"0.0\" alpha=\"0.41999999999999998\" colorSpace=\"calibratedWhite\"/>\n                    <color key=\"fillColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                    <font key=\"titleFont\" metaFont=\"system\"/>\n                </box>\n                <box autoresizesSubviews=\"NO\" boxType=\"custom\" borderType=\"none\" titlePosition=\"noTitle\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cAa-PZ-3Fm\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"500\" height=\"25\"/>\n                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                    <view key=\"contentView\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"500\" height=\"25\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WtB-AR-lfY\">\n                                <rect key=\"frame\" x=\"4\" y=\"1\" width=\"23\" height=\"23\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"23\" id=\"VSY-Ea-som\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"23\" id=\"vGo-Tv-NV0\"/>\n                                </constraints>\n                                <buttonCell key=\"cell\" type=\"bevel\" bezelStyle=\"rounded\" image=\"icon_plus\" imagePosition=\"overlaps\" alignment=\"center\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Vfs-qd-LwL\" customClass=\"LNImageButtonCell\">\n                                    <behavior key=\"behavior\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"addLocalization:\" target=\"JhI-Tt-sI6\" id=\"dgA-Bo-Yol\"/>\n                                </connections>\n                            </button>\n                            <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Xwg-el-W0l\">\n                                <rect key=\"frame\" x=\"27\" y=\"1\" width=\"23\" height=\"23\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"23\" id=\"0kD-WZ-161\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"23\" id=\"D5h-qU-aRQ\"/>\n                                </constraints>\n                                <buttonCell key=\"cell\" type=\"bevel\" bezelStyle=\"rounded\" image=\"icon_minus\" imagePosition=\"overlaps\" alignment=\"center\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"jgd-uF-zMf\" customClass=\"LNImageButtonCell\">\n                                    <behavior key=\"behavior\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"deleteLocalization:\" target=\"JhI-Tt-sI6\" id=\"tFN-bB-EZ9\"/>\n                                </connections>\n                            </button>\n                            <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"X12-7a-tbY\">\n                                <rect key=\"frame\" x=\"473\" y=\"1\" width=\"23\" height=\"23\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"23\" id=\"Fjw-Dz-IYH\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"23\" id=\"PsO-Ia-HA2\"/>\n                                </constraints>\n                                <buttonCell key=\"cell\" type=\"bevel\" bezelStyle=\"rounded\" image=\"icon_detach\" imagePosition=\"overlaps\" alignment=\"center\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"VUs-dt-MMw\" customClass=\"LNImageButtonCell\">\n                                    <behavior key=\"behavior\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"detachPopover:\" target=\"JhI-Tt-sI6\" id=\"uOQ-V9-dBd\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                    </view>\n                    <constraints>\n                        <constraint firstItem=\"Xwg-el-W0l\" firstAttribute=\"leading\" secondItem=\"WtB-AR-lfY\" secondAttribute=\"trailing\" id=\"5pw-fJ-d8R\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"X12-7a-tbY\" secondAttribute=\"trailing\" constant=\"4\" id=\"6xU-Pd-Agd\"/>\n                        <constraint firstItem=\"WtB-AR-lfY\" firstAttribute=\"leading\" secondItem=\"cAa-PZ-3Fm\" secondAttribute=\"leading\" constant=\"4\" id=\"Kry-Fq-New\"/>\n                        <constraint firstAttribute=\"centerY\" secondItem=\"X12-7a-tbY\" secondAttribute=\"centerY\" id=\"oUR-CY-xSP\"/>\n                        <constraint firstAttribute=\"centerY\" secondItem=\"Xwg-el-W0l\" secondAttribute=\"centerY\" id=\"omo-Dh-2fO\"/>\n                        <constraint firstAttribute=\"height\" constant=\"25\" id=\"qFh-OU-mVW\"/>\n                        <constraint firstAttribute=\"centerY\" secondItem=\"WtB-AR-lfY\" secondAttribute=\"centerY\" id=\"ucy-2R-CBm\"/>\n                    </constraints>\n                    <color key=\"borderColor\" white=\"0.0\" alpha=\"0.41999999999999998\" colorSpace=\"calibratedWhite\"/>\n                    <color key=\"fillColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedRGB\"/>\n                </box>\n            </subviews>\n            <constraints>\n                <constraint firstAttribute=\"trailing\" secondItem=\"3v3-Ru-fHe\" secondAttribute=\"trailing\" id=\"0L7-81-bdN\"/>\n                <constraint firstItem=\"M5Y-vQ-slM\" firstAttribute=\"top\" secondItem=\"3v3-Ru-fHe\" secondAttribute=\"bottom\" id=\"1WQ-Ef-TZV\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"M5Y-vQ-slM\" secondAttribute=\"trailing\" id=\"5Yh-4m-jQy\"/>\n                <constraint firstItem=\"cAa-PZ-3Fm\" firstAttribute=\"top\" secondItem=\"M5Y-vQ-slM\" secondAttribute=\"bottom\" id=\"Fna-Xj-XEe\"/>\n                <constraint firstItem=\"cAa-PZ-3Fm\" firstAttribute=\"leading\" secondItem=\"JhI-Tt-sI6\" secondAttribute=\"leading\" id=\"Kgt-Ih-fU7\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"cAa-PZ-3Fm\" secondAttribute=\"trailing\" id=\"NNz-sZ-Vbd\"/>\n                <constraint firstItem=\"3v3-Ru-fHe\" firstAttribute=\"top\" secondItem=\"JhI-Tt-sI6\" secondAttribute=\"top\" constant=\"9\" id=\"cCW-AF-6OE\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"cAa-PZ-3Fm\" secondAttribute=\"bottom\" id=\"feW-oG-u69\"/>\n                <constraint firstItem=\"3v3-Ru-fHe\" firstAttribute=\"leading\" secondItem=\"JhI-Tt-sI6\" secondAttribute=\"leading\" id=\"frT-O8-fDd\"/>\n                <constraint firstItem=\"M5Y-vQ-slM\" firstAttribute=\"leading\" secondItem=\"JhI-Tt-sI6\" secondAttribute=\"leading\" id=\"gtc-0Y-ztA\"/>\n                <constraint firstItem=\"M5Y-vQ-slM\" firstAttribute=\"top\" secondItem=\"3v3-Ru-fHe\" secondAttribute=\"bottom\" id=\"ibB-DG-WcF\"/>\n                <constraint firstItem=\"cAa-PZ-3Fm\" firstAttribute=\"top\" secondItem=\"M5Y-vQ-slM\" secondAttribute=\"bottom\" id=\"ruW-IO-Hhr\"/>\n            </constraints>\n            <connections>\n                <outlet property=\"detachButton\" destination=\"X12-7a-tbY\" id=\"BqK-21-FHB\"/>\n                <outlet property=\"tableView\" destination=\"Bwg-zH-Dly\" id=\"KYr-er-9ip\"/>\n            </connections>\n        </customView>\n    </objects>\n    <resources>\n        <image name=\"icon_detach\" width=\"12\" height=\"12\"/>\n        <image name=\"icon_minus\" width=\"8\" height=\"8\"/>\n        <image name=\"icon_plus\" width=\"8\" height=\"8\"/>\n    </resources>\n</document>"
  },
  {
    "path": "Lin/LNPopoverWindow.h",
    "content": "//\n//  LNPopoverWindow.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface LNPopoverWindow : NSWindow <NSToolbarDelegate, NSTextFieldDelegate>\n\n+ (instancetype)popoverWindow;\n\n@end\n"
  },
  {
    "path": "Lin/LNPopoverWindow.m",
    "content": "//\n//  LNPopoverWindow.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNPopoverWindow.h\"\n\n// Views\n#import \"LNPopoverContentView.h\"\n\n// Controllers\n#import \"LNPopoverWindowController.h\"\n\nstatic NSString * const kLNPopoverWindowToolbarSearchFieldIdentifier = @\"Search\";\n\n@interface LNPopoverWindow ()\n\n@property (nonatomic, strong) NSSearchField *searchField;\n\n@end\n\n@implementation LNPopoverWindow\n\n+ (instancetype)popoverWindow\n{\n    LNPopoverWindow *popoverWindow = [[LNPopoverWindow alloc] initWithContentRect:NSZeroRect\n                                                                        styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask)\n                                                                          backing:NSBackingStoreBuffered\n                                                                            defer:NO];\n    popoverWindow.title = @\"Lin\";\n    popoverWindow.level = NSFloatingWindowLevel;\n    popoverWindow.backgroundColor = [NSColor whiteColor];\n    [popoverWindow.contentView setAutoresizesSubviews:YES];\n    \n    return popoverWindow;\n}\n\n- (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag\n{\n    self = [super initWithContentRect:contentRect styleMask:aStyle backing:bufferingType defer:flag];\n    \n    if (self) {\n        // Create toolbar\n        NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@\"Toolbar\"];\n        toolbar.delegate = self;\n        toolbar.displayMode = NSToolbarDisplayModeIconOnly;\n        \n        [self setToolbar:toolbar];\n    }\n    \n    return self;\n}\n\n\n#pragma mark - Actions\n\n- (void)textFieldDidReturn:(id)sender\n{\n    [self controlTextDidChange:nil];\n}\n\n\n#pragma mark - NSToolbarDelegate\n\n- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar\n{\n    return @[NSToolbarFlexibleSpaceItemIdentifier, kLNPopoverWindowToolbarSearchFieldIdentifier];\n}\n\n- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar\n{\n    return @[NSToolbarFlexibleSpaceItemIdentifier, kLNPopoverWindowToolbarSearchFieldIdentifier];\n}\n\n- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag\n{\n    NSToolbarItem *toolbarItem = nil;\n    \n    if ([itemIdentifier isEqualToString:kLNPopoverWindowToolbarSearchFieldIdentifier]) {\n        toolbarItem = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier];\n        \n        NSSearchField *searchField = [[NSSearchField alloc] init];\n        [searchField setDelegate:self];\n        [searchField setTarget:self];\n        [searchField setAction:@selector(textFieldDidReturn:)];\n        \n        [toolbarItem setView:searchField];\n        self.searchField = searchField;\n    }\n    \n    return toolbarItem;\n}\n\n\n#pragma mark - NSTextFieldDelegate\n\n- (void)controlTextDidChange:(NSNotification *)obj\n{\n    LNPopoverWindowController *popoverWindowController = (LNPopoverWindowController *)self.windowController;\n    LNPopoverContentView *contentView = (LNPopoverContentView *)popoverWindowController.popoverContentViewController.view;\n    \n    contentView.searchString = self.searchField.stringValue;\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNPopoverWindowController.h",
    "content": "//\n//  LNPopoverWindowController.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/20.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@class LNPopoverContentViewController;\n\nextern NSString * const LNPopoverWindowControllerWindowWillCloseNotification;\n\n@interface LNPopoverWindowController : NSWindowController <NSWindowDelegate, NSToolbarDelegate, NSTextFieldDelegate>\n\n@property (nonatomic, strong) NSViewController *popoverContentViewController;\n\n- (instancetype)initWithPopoverContentViewController:(NSViewController *)popoverContentViewController;\n\n@end\n"
  },
  {
    "path": "Lin/LNPopoverWindowController.m",
    "content": "//\n//  LNPopoverWindowController.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/20.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNPopoverWindowController.h\"\n\n// Views\n#import \"LNPopoverWindow.h\"\n\nNSString * const LNPopoverWindowControllerWindowWillCloseNotification = @\"LNPopoverWindowControllerWindowWillCloseNotification\";\n\n@implementation LNPopoverWindowController\n\n- (instancetype)initWithPopoverContentViewController:(NSViewController *)popoverContentViewController\n{\n    LNPopoverWindow *popoverWindow = [LNPopoverWindow popoverWindow];\n    popoverWindow.delegate = self;\n    \n    self = [super initWithWindow:popoverWindow];\n    \n    if (self) {\n        self.popoverContentViewController = popoverContentViewController;\n    }\n    \n    return self;\n}\n\n\n#pragma mark - Accessors\n\n- (void)setPopoverContentViewController:(NSViewController *)popoverContentViewController\n{\n    // Remove previous content view\n    if (self.popoverContentViewController) {\n        [self.popoverContentViewController.view removeFromSuperview];\n    }\n    \n    _popoverContentViewController = popoverContentViewController;\n    \n    // Set content view of the window\n    self.popoverContentViewController.view.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;\n    [self.window.contentView setFrame:self.popoverContentViewController.view.bounds];\n    [self.window.contentView addSubview:self.popoverContentViewController.view];\n}\n\n\n#pragma mark - NSWindowDelegate\n\n- (void)windowWillClose:(NSNotification *)notification\n{\n    // Post notification\n    [[NSNotificationCenter defaultCenter] postNotificationName:LNPopoverWindowControllerWindowWillCloseNotification\n                                                        object:self\n                                                      userInfo:nil];\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNRegularExpressionPattern+type.h",
    "content": "//\n//  LNRegularExpressionPattern+type.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNRegularExpressionPattern.h\"\n\n// Models\n#import \"LNEntity.h\"\n\n@interface LNRegularExpressionPattern (type)\n\n@property (nonatomic, assign, readonly) LNEntityType type;\n\n+ (instancetype)patternWithType:(LNEntityType)type;\n\n@end\n"
  },
  {
    "path": "Lin/LNRegularExpressionPattern+type.m",
    "content": "//\n//  LNRegularExpressionPattern+type.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNRegularExpressionPattern+type.h\"\n#import <objc/runtime.h>\n\nstatic NSString * const LNRegularExpressionPatternTypePropertyKey = @\"type\";\n\n@implementation LNRegularExpressionPattern (type)\n\n- (LNEntityType)type\n{\n    return [objc_getAssociatedObject(self, (__bridge const void *)(LNRegularExpressionPatternTypePropertyKey)) unsignedIntegerValue];\n}\n\n- (void)setType:(LNEntityType)type\n{\n    objc_setAssociatedObject(self, (__bridge const void *)(LNRegularExpressionPatternTypePropertyKey), @(type), OBJC_ASSOCIATION_ASSIGN);\n}\n\n+ (instancetype)patternWithType:(LNEntityType)type\n{\n    LNRegularExpressionPattern *regularExpression = nil;\n    \n    NSString *pettern = nil;\n    NSUInteger numberOfRanges = 0;\n    NSUInteger entityRangeIndex = 0;\n    NSUInteger keyRangeIndex = 1;\n    \n    switch (type) {\n        case LNEntityTypeLocalizedString:\n        {\n            pettern = @\"NSLocalizedString\\\\s*\\\\(\\\\s*@\\\"(.*?)\\\"\\\\s*,\\\\s*(.*?)\\\\s*\\\\)\";\n            numberOfRanges = 3;\n        }\n            break;\n        case LNEntityTypeLocalizedStringForKey:\n        {\n            pettern = @\"localizedStringForKey:\\\\s*@\\\"(.*?)\\\"\\\\s*value:\\\\s*(.*?)\\\\s*table:\\\\s*(.*?)\";\n            numberOfRanges = 4;\n        }\n            break;\n        case LNEntityTypeLocalizedStringFromTable:\n        {\n            pettern = @\"NSLocalizedStringFromTable\\\\s*\\\\(\\\\s*@\\\"(.*?)\\\"\\\\s*,\\\\s*(.*?)\\\\s*,\\\\s*(.*?)\\\\s*\\\\)\";\n            numberOfRanges = 4;\n        }\n            break;\n        case LNEntityTypeLocalizedStringFromTableInBundle:\n        {\n            pettern = @\"NSLocalizedStringFromTableInBundle\\\\s*\\\\(\\\\s*@\\\"(.*?)\\\"\\\\s*,\\\\s*(.*?)\\\\s*,\\\\s*(.*?)\\\\s*,\\\\s*(.*?)\\\\s*\\\\)\";\n            numberOfRanges = 5;\n        }\n            break;\n        case LNEntityTypeLocalizedStringWithDefaultValue:\n        {\n            pettern = @\"NSLocalizedStringWithDefaultValue\\\\s*\\\\(\\\\s*@\\\"(.*?)\\\"\\\\s*,\\\\s*(.*?)\\\\s*,\\\\s*(.*?)\\\\s*,\\\\s*(.*?)\\\\s*,\\\\s*(.*?)\\\\s*\\\\)\";\n            numberOfRanges = 6;\n        }\n            break;\n    }\n    \n    if (pettern) {\n        regularExpression = [LNRegularExpressionPattern patternWithString:pettern\n                                                           numberOfRanges:numberOfRanges\n                                                         entityRangeIndex:entityRangeIndex\n                                                            keyRangeIndex:keyRangeIndex];\n        regularExpression.type = type;\n    }\n    \n    return regularExpression;\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNRegularExpressionPattern.h",
    "content": "//\n//  LNRegularExpressionPattern.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface LNRegularExpressionPattern : NSObject\n\n@property (nonatomic, copy, readonly) NSString *pattern;\n@property (nonatomic, assign, readonly) NSUInteger numberOfRanges;\n@property (nonatomic, assign, readonly) NSUInteger entityRangeIndex;\n@property (nonatomic, assign, readonly) NSUInteger keyRangeIndex;\n\n+ (instancetype)patternWithString:(NSString *)string numberOfRanges:(NSUInteger)numberOfRanges entityRangeIndex:(NSUInteger)entityRangeIndex keyRangeIndex:(NSUInteger)keyRangeIndex;\n\n- (instancetype)initWithString:(NSString *)string numberOfRanges:(NSUInteger)numberOfRanges entityRangeIndex:(NSUInteger)entityRangeIndex keyRangeIndex:(NSUInteger)keyRangeIndex;\n\n@end\n"
  },
  {
    "path": "Lin/LNRegularExpressionPattern.m",
    "content": "//\n//  LNRegularExpressionPattern.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNRegularExpressionPattern.h\"\n\n@interface LNRegularExpressionPattern ()\n\n@property (nonatomic, copy, readwrite) NSString *pattern;\n@property (nonatomic, assign, readwrite) NSUInteger numberOfRanges;\n@property (nonatomic, assign, readwrite) NSUInteger entityRangeIndex;\n@property (nonatomic, assign, readwrite) NSUInteger keyRangeIndex;\n\n@end\n\n@implementation LNRegularExpressionPattern\n\n+ (instancetype)patternWithString:(NSString *)string numberOfRanges:(NSUInteger)numberOfRanges entityRangeIndex:(NSUInteger)entityRangeIndex keyRangeIndex:(NSUInteger)keyRangeIndex\n{\n    return [[self alloc] initWithString:string\n                         numberOfRanges:numberOfRanges\n                       entityRangeIndex:entityRangeIndex\n                          keyRangeIndex:keyRangeIndex];\n}\n\n- (instancetype)initWithString:(NSString *)string numberOfRanges:(NSUInteger)numberOfRanges entityRangeIndex:(NSUInteger)entityRangeIndex keyRangeIndex:(NSUInteger)keyRangeIndex\n{\n    self = [super init];\n    \n    if (self) {\n        self.pattern = string;\n        self.numberOfRanges = numberOfRanges;\n        self.entityRangeIndex = entityRangeIndex;\n        self.keyRangeIndex = keyRangeIndex;\n    }\n    \n    return self;\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNTableCornerView.h",
    "content": "//\n//  LNTableCornerView.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface LNTableCornerView : NSView\n\n@end\n"
  },
  {
    "path": "Lin/LNTableCornerView.m",
    "content": "//\n//  LNTableCornerView.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNTableCornerView.h\"\n\n@implementation LNTableCornerView\n\n- (void)drawRect:(NSRect)dirtyRect\n{\n\t[super drawRect:dirtyRect];\n\t\n    // Background\n    [[NSColor whiteColor] setFill];\n    NSRectFill(dirtyRect);\n    \n    // Draw separator\n    [[NSColor colorWithDeviceWhite:204.0/255.0 alpha:1.0] setStroke];\n    [NSBezierPath strokeLineFromPoint:NSMakePoint(dirtyRect.origin.x, 0.5)\n                              toPoint:NSMakePoint(dirtyRect.origin.x + dirtyRect.size.width, 0.5)];\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNTableHeaderCell.h",
    "content": "//\n//  LNTableHeaderCell.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface LNTableHeaderCell : NSTableHeaderCell\n\n@property (nonatomic, weak) NSTableView *tableView;\n\n- (void)setSortAscending:(BOOL)ascending priority:(NSInteger)priority;\n\n@end\n"
  },
  {
    "path": "Lin/LNTableHeaderCell.m",
    "content": "//\n//  LNTableHeaderCell.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNTableHeaderCell.h\"\n\nstatic const NSInteger kLNTableHeaderCellSortIndicatorWidth = 8;\nstatic const NSInteger kLNTableHeaderCellSortIndicatorHeight = 7;\nstatic const NSInteger kLNTableHeaderCellSortIndicatorMarginX = 4;\nstatic const NSInteger kLNTableHeaderCellSortIndicatorMarginY = 6;\n\n@interface LNTableHeaderCell ()\n\n@property (nonatomic, assign) BOOL ascending;\n@property (nonatomic, assign) NSInteger priority;\n\n- (void)drawContentInRect:(NSRect)rect highlighted:(BOOL)highlighted;\n\n@end\n\n@implementation LNTableHeaderCell\n\n- (instancetype)init\n{\n    self = [super init];\n    \n    if (self) {\n        self.priority = 1;\n    }\n    \n    return self;\n}\n\n\n#pragma mark - Accessors\n\n- (void)setSortAscending:(BOOL)ascending priority:(NSInteger)priority\n{\n    self.ascending = ascending;\n    self.priority = priority;\n}\n\n\n#pragma mark - Drawing the View\n\n- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView\n{\n    [self drawContentInRect:cellFrame highlighted:NO];\n    [self drawSortIndicatorWithFrame:cellFrame inView:controlView ascending:self.ascending priority:self.priority];\n}\n\n- (void)highlight:(BOOL)flag withFrame:(NSRect)cellFrame inView:(NSView *)controlView\n{\n    [self drawContentInRect:cellFrame highlighted:YES];\n    [self drawSortIndicatorWithFrame:cellFrame inView:controlView ascending:self.ascending priority:self.priority];\n}\n\n- (void)drawContentInRect:(NSRect)rect highlighted:(BOOL)highlighted\n{\n    // Draw background\n    NSRect backgroundRect = rect;\n    backgroundRect.size.width -= 1;\n    \n    if (highlighted) {\n        [[NSColor colorWithDeviceWhite:153.0/255.0 alpha:1.0] set];\n    } else {\n        [[NSColor whiteColor] set];\n    }\n    \n    NSRectFill(backgroundRect);\n    \n    // Draw separator\n    [[NSColor colorWithDeviceWhite:204.0/255.0 alpha:1.0] setStroke];\n    [NSBezierPath strokeLineFromPoint:NSMakePoint(rect.origin.x, rect.size.height - 0.5)\n                              toPoint:NSMakePoint(rect.origin.x + rect.size.width, rect.size.height - 0.5)];\n    \n    // Draw title\n    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:[self attributedStringValue]];\n    \n    NSDictionary *attributes;\n    if (highlighted) {\n        attributes = @{\n                       NSForegroundColorAttributeName: [NSColor whiteColor],\n                       NSFontAttributeName: [NSFont systemFontOfSize:12.0]\n                       };\n    } else {\n        attributes = @{\n                       NSForegroundColorAttributeName: [NSColor colorWithDeviceWhite:153.0/255.0 alpha:1.0],\n                       NSFontAttributeName: [NSFont systemFontOfSize:12.0]\n                       };\n    }\n    \n    [attributedString addAttributes:attributes range:NSMakeRange(0, [attributedString length])];\n    \n    NSRect titleRect = rect;\n    titleRect.origin.x += 3;\n    titleRect.origin.y += 0;\n    \n    [attributedString drawInRect:titleRect];\n}\n\n- (void)drawSortIndicatorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView ascending:(BOOL)ascending priority:(NSInteger)priority\n{\n    NSBezierPath *path = [NSBezierPath bezierPath];\n    \n    if (ascending) {\n        NSPoint p = NSMakePoint(cellFrame.origin.x + cellFrame.size.width - kLNTableHeaderCellSortIndicatorWidth - kLNTableHeaderCellSortIndicatorMarginX,\n                                cellFrame.origin.y + cellFrame.size.height - kLNTableHeaderCellSortIndicatorMarginY);\n        [path moveToPoint:p];\n        \n        p.x += kLNTableHeaderCellSortIndicatorWidth / 2.0;\n        p.y -= kLNTableHeaderCellSortIndicatorHeight;\n        [path lineToPoint:p];\n        \n        p.x += kLNTableHeaderCellSortIndicatorWidth / 2.0;\n        p.y += kLNTableHeaderCellSortIndicatorHeight;\n        [path lineToPoint:p];\n    } else {\n        NSPoint p = NSMakePoint(cellFrame.origin.x + cellFrame.size.width - kLNTableHeaderCellSortIndicatorWidth - kLNTableHeaderCellSortIndicatorMarginX,\n                                cellFrame.origin.y + cellFrame.size.height - kLNTableHeaderCellSortIndicatorHeight - kLNTableHeaderCellSortIndicatorMarginY);\n        [path moveToPoint:p];\n        \n        p.x += kLNTableHeaderCellSortIndicatorWidth / 2.0;\n        p.y += kLNTableHeaderCellSortIndicatorHeight;\n        [path lineToPoint:p];\n        \n        p.x += kLNTableHeaderCellSortIndicatorWidth / 2.0;\n        p.y -= kLNTableHeaderCellSortIndicatorHeight;\n        [path lineToPoint:p];\n    }\n    \n    [path closePath];\n    \n    if (priority == 0) {\n        [[NSColor colorWithDeviceWhite:153.0/255.0 alpha:1.0] set];\n    } else {\n        [[NSColor clearColor] set];\n    }\n    \n    [path fill];\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNTableView.h",
    "content": "//\n//  LNTableView.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface LNTableView : NSTableView\n\n@end\n"
  },
  {
    "path": "Lin/LNTableView.m",
    "content": "//\n//  LNTableView.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNTableView.h\"\n\n// Views\n#import \"LNTableCornerView.h\"\n#import \"LNTableHeaderCell.h\"\n\n@implementation LNTableView\n\n- (void)awakeFromNib\n{\n    [super awakeFromNib];\n    \n    // Set corner view\n    NSView *cornerView = [self cornerView];\n    LNTableCornerView *newCornerView = [[LNTableCornerView alloc] initWithFrame:cornerView.frame];\n    [self setCornerView:newCornerView];\n    \n    // Change header cell\n    for (NSTableColumn *tableColumn in [self tableColumns]) {\n        NSTableHeaderCell *headerCell = [tableColumn headerCell];\n        \n        LNTableHeaderCell *newHeaderCell = [[LNTableHeaderCell alloc] init];\n        newHeaderCell.tableView = self;\n        [newHeaderCell setAttributedStringValue:[headerCell attributedStringValue]];\n        \n        [tableColumn setHeaderCell:newHeaderCell];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Lin/LNUserDefaultsManager.h",
    "content": "//\n//  LNUserDefaultsManager.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/22.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface LNUserDefaultsManager : NSObject\n\n@property (nonatomic, assign, getter = isEnabled) BOOL enabled;\n\n+ (instancetype)sharedManager;\n\n@end\n"
  },
  {
    "path": "Lin/LNUserDefaultsManager.m",
    "content": "//\n//  LNUserDefaultsManager.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/22.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNUserDefaultsManager.h\"\n\nstatic NSString * const LNUserDefaultManagerEnabledKey = @\"jp.questbeat.Lin.enabled\";\n\n@implementation LNUserDefaultsManager\n\n+ (instancetype)sharedManager\n{\n    static id _sharedManager;\n\tstatic dispatch_once_t _onceToken;\n    \n\tdispatch_once(&_onceToken, ^{\n\t\t_sharedManager = [[self alloc] init];\n\t});\n    \n    return _sharedManager;\n}\n\n- (instancetype)init\n{\n    self = [super init];\n    \n    if (self) {\n        // Register defaults\n        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];\n        [userDefaults registerDefaults:@{LNUserDefaultManagerEnabledKey: @(YES)}];\n        [userDefaults synchronize];\n    }\n    \n    return self;\n}\n\n\n#pragma mark - Accessors\n\n- (void)setEnabled:(BOOL)enabled\n{\n    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];\n    [userDefaults setBool:enabled forKey:LNUserDefaultManagerEnabledKey];\n    [userDefaults synchronize];\n}\n\n- (BOOL)isEnabled\n{\n    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];\n    return [userDefaults boolForKey:LNUserDefaultManagerEnabledKey];\n}\n\n@end\n"
  },
  {
    "path": "Lin/Lin-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>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>jp.questbeat.${PRODUCT_NAME:rfc1034identifier}</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>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>DVTPlugInCompatibilityUUIDs</key>\n\t<array>\n\t\t<string>37B30044-3B14-46BA-ABAA-F01000C27B63</string>\n\t\t<string>640F884E-CE55-4B40-87C0-8869546CAB7A</string>\n\t\t<string>A2E4D43F-41F4-4FB9-BB94-7177011C9AED</string>\n\t</array>\n\t<key>LSApplicationCategoryType</key>\n\t<string></string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2013年 Tanaka Katsuma. All rights reserved.</string>\n\t<key>NSPrincipalClass</key>\n\t<string>Lin</string>\n\t<key>XC4Compatible</key>\n\t<true/>\n\t<key>XC5Compatible</key>\n\t<true/>\n\t<key>XCGCReady</key>\n\t<true/>\n\t<key>XCPluginHasUI</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Lin/Lin-Prefix.pch",
    "content": "//\n//  Prefix header\n//\n//  The contents of this file are implicitly included at the beginning of every source file.\n//\n\n#ifdef __OBJC__\n    #import <Cocoa/Cocoa.h>\n#endif\n"
  },
  {
    "path": "Lin/Lin.h",
    "content": "//\n//  Lin.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class IDEIndex;\n\n@interface Lin : NSObject <NSPopoverDelegate>\n\n+ (void)pluginDidLoad:(NSBundle *)bundle;\n+ (instancetype)sharedPlugIn;\n\n- (void)indexNeedsUpdate:(IDEIndex *)index;\n- (void)removeLocalizationsForIndex:(IDEIndex *)index;\n\n@end\n"
  },
  {
    "path": "Lin/Lin.m",
    "content": "//\n//  Lin.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"Lin.h\"\n\n// Xcode\n#import \"IDEWorkspace.h\"\n#import \"DVTFilePath.h\"\n#import \"IDEIndex.h\"\n#import \"IDEIndexCollection.h\"\n#import \"IDEEditorDocument.h\"\n#import \"IDEWorkspaceWindow.h\"\n#import \"DVTSourceTextView.h\"\n\n// Categories\n#import \"NSBundle+versions.h\"\n\n// Shared\n#import \"LNUserDefaultsManager.h\"\n\n// Models\n#import \"LNDetector.h\"\n#import \"LNEntity.h\"\n#import \"LNLocalizationCollection.h\"\n#import \"LNLocalization.h\"\n\n// Views\n#import \"LNPopoverContentView.h\"\n\n// Controllers\n#import \"LNPopoverWindowController.h\"\n#import \"LNLocalizedStringCollectionOperation.h\"\n\nstatic Lin *_sharedPlugin = nil;\n\n@interface NSPopover ()\n\n- (id)_popoverWindow;\n\n@end\n\n@interface Lin ()\n\n@property (nonatomic, strong) NSPopover *popover;\n@property (nonatomic, strong) LNPopoverWindowController *popoverWindowController;\n\n@property (nonatomic, strong) NSTextView *textView;\n\n@property (nonatomic, strong) LNDetector *detector;\n@property (nonatomic, strong) NSMutableDictionary *workspaceLocalizations;\n@property (nonatomic, copy) NSString *currentWorkspaceFilePath;\n@property (nonatomic, unsafe_unretained) NSResponder *previousFirstResponder;\n@property (nonatomic, assign, getter = isActivated) BOOL activated;\n\n@property (nonatomic, strong) NSMenuItem *enableMenuItem;\n@property (nonatomic, strong) NSMenuItem *showWindowMenuItem;\n@property (nonatomic, strong) NSOperationQueue *collectionProcessQueue;\n\n@end\n\n@implementation Lin\n\n+ (void)pluginDidLoad:(NSBundle *)bundle\n{\n    static dispatch_once_t _onceToken;\n    dispatch_once(&_onceToken, ^{\n        _sharedPlugin = [[self alloc] init];\n    });\n}\n\n+ (instancetype)sharedPlugIn\n{\n    return _sharedPlugin;\n}\n\n- (instancetype)init\n{\n    self = [super init];\n    \n    if (self) {\n        // Initialization\n        self.detector = [LNDetector detector];\n        self.workspaceLocalizations = [NSMutableDictionary dictionary];\n        \n        // Create menu\n        [self createMenuItem];\n        \n        // Load views\n        [self instantiatePopover];\n        [self instantiatePopoverWindowController];\n        \n        // Register to notification center\n        [[NSNotificationCenter defaultCenter] addObserver:self\n                                                 selector:@selector(workspaceWindowDidBecomeMain:)\n                                                     name:NSWindowDidBecomeMainNotification\n                                                   object:nil];\n        [[NSNotificationCenter defaultCenter] addObserver:self\n                                                 selector:@selector(indexDidIndexWorkspace:)\n                                                     name:@\"IDEIndexDidIndexWorkspaceNotification\"\n                                                   object:nil];\n        [[NSNotificationCenter defaultCenter] addObserver:self\n                                                 selector:@selector(editorDocumentDidSave:)\n                                                     name:@\"IDEEditorDocumentDidSaveNotification\"\n                                                   object:nil];\n        \n        [[NSNotificationCenter defaultCenter] addObserver:self\n                                                 selector:@selector(popoverWindowControllerWindowWillClose:)\n                                                     name:LNPopoverWindowControllerWindowWillCloseNotification\n                                                   object:nil];\n        \n        [[NSNotificationCenter defaultCenter] addObserver:self\n                                                 selector:@selector(popoverContentViewLocalizationDidSelect:)\n                                                     name:LNPopoverContentViewLocalizationDidSelectNotification\n                                                   object:nil];\n        [[NSNotificationCenter defaultCenter] addObserver:self\n                                                 selector:@selector(popoverContentViewAlertDidDismiss:)\n                                                     name:LNPopoverContentViewAlertDidDismissNotification\n                                                   object:nil];\n        [[NSNotificationCenter defaultCenter] addObserver:self\n                                                 selector:@selector(popoverContentViewDetachButtonDidClick:)\n                                                     name:LNPopoverContentViewDetachButtonDidClickNotification\n                                                   object:nil];\n        \n        [[NSNotificationCenter defaultCenter] addObserver:self\n                                                 selector:@selector(menuDidChange:)\n                                                     name:NSMenuDidChangeItemNotification\n                                                   object:nil];\n        \n        // Activate if enabled\n        if ([[LNUserDefaultsManager sharedManager] isEnabled]) {\n            [self activate];\n        }\n        \n        self.collectionProcessQueue = [[NSOperationQueue alloc] init];\n        self.collectionProcessQueue.maxConcurrentOperationCount = 1;\n    }\n    \n    return self;\n}\n\n- (void)instantiatePopover\n{\n    NSBundle *bundle = [NSBundle bundleForClass:[self class]];\n    NSViewController *contentViewController = [[NSViewController alloc] initWithNibName:@\"LNPopoverContentView\" bundle:bundle];\n    \n    NSPopover *popover = [[NSPopover alloc] init];\n    popover.delegate = self;\n    popover.behavior = NSPopoverBehaviorTransient;\n    popover.appearance = NSPopoverAppearanceMinimal;\n    popover.animates = NO;\n    popover.contentViewController = contentViewController;\n    \n    self.popover = popover;\n}\n\n- (void)instantiatePopoverWindowController\n{\n    NSBundle *bundle = [NSBundle bundleForClass:[self class]];\n    NSViewController *contentViewController = [[NSViewController alloc] initWithNibName:@\"LNPopoverContentView\" bundle:bundle];\n    LNPopoverContentView *contentView = (LNPopoverContentView *)contentViewController.view;\n    [contentView.detachButton setHidden:YES];\n    \n    LNPopoverWindowController *popoverWindowController = [[LNPopoverWindowController alloc] initWithPopoverContentViewController:contentViewController];\n    \n    self.popoverWindowController = popoverWindowController;\n}\n\n- (void)dealloc\n{\n    // Deactivate\n    [self deactivate];\n    \n    // Remove from notification center\n    [[NSNotificationCenter defaultCenter] removeObserver:self\n                                                    name:NSWindowDidBecomeMainNotification\n                                                  object:nil];\n    [[NSNotificationCenter defaultCenter] removeObserver:self\n                                                    name:@\"IDEIndexDidIndexWorkspaceNotification\"\n                                                  object:nil];\n    [[NSNotificationCenter defaultCenter] removeObserver:self\n                                                    name:@\"IDEEditorDocumentDidSaveNotification\"\n                                                  object:nil];\n    \n    [[NSNotificationCenter defaultCenter] removeObserver:self\n                                                    name:LNPopoverWindowControllerWindowWillCloseNotification\n                                                  object:nil];\n    \n    [[NSNotificationCenter defaultCenter] removeObserver:self\n                                                    name:LNPopoverContentViewLocalizationDidSelectNotification\n                                                  object:nil];\n    [[NSNotificationCenter defaultCenter] removeObserver:self\n                                                    name:LNPopoverContentViewAlertDidDismissNotification\n                                                  object:nil];\n    [[NSNotificationCenter defaultCenter] removeObserver:self\n                                                    name:LNPopoverContentViewDetachButtonDidClickNotification\n                                                  object:nil];\n    \n    [[NSNotificationCenter defaultCenter] removeObserver:self\n                                                    name:NSMenuDidChangeItemNotification\n                                                  object:nil];\n}\n\n\n#pragma mark - Managing Application State\n\n- (void)activate\n{\n    if (!self.activated) {\n        self.activated = YES;\n        \n        [[NSNotificationCenter defaultCenter] addObserver:self\n                                                 selector:@selector(textDidChange:)\n                                                     name:NSTextDidChangeNotification\n                                                   object:nil];\n        [[NSNotificationCenter defaultCenter] addObserver:self\n                                                 selector:@selector(textViewDidChangeSelection:)\n                                                     name:NSTextViewDidChangeSelectionNotification\n                                                   object:nil];\n    }\n}\n\n- (void)deactivate\n{\n    if (self.activated) {\n        self.activated = NO;\n        \n        [[NSNotificationCenter defaultCenter] removeObserver:self\n                                                        name:NSTextDidChangeNotification\n                                                      object:nil];\n        [[NSNotificationCenter defaultCenter] removeObserver:self\n                                                        name:NSTextViewDidChangeSelectionNotification\n                                                      object:nil];\n    }\n}\n\n\n#pragma mark - Notifications\n\n- (void)textDidChange:(NSNotification *)notification\n{\n\tif ([[notification object] isKindOfClass:[DVTSourceTextView class]]) {\n        NSTextView *textView = (NSTextView *)[notification object];\n        self.textView = textView;\n        \n        // Find entity\n        LNEntity *entity = [self selectedEntityInTextView:textView];\n        \n        if (entity) {\n            [self presentPopoverInTextView:textView entity:entity];\n        } else {\n            [self dismissPopover];\n        }\n\t}\n}\n\n- (void)textViewDidChangeSelection:(NSNotification *)notification\n{\n\tif ([[notification object] isKindOfClass:[DVTSourceTextView class]]) {\n        NSTextView *textView = (NSTextView *)[notification object];\n        self.textView = textView;\n        \n        // Find entity\n        LNEntity *entity = [self selectedEntityInTextView:textView];\n        \n        if (entity) {\n            [self presentPopoverInTextView:textView entity:entity];\n        } else {\n            [self dismissPopover];\n        }\n\t}\n}\n\n- (void)workspaceWindowDidBecomeMain:(NSNotification *)notification\n{\n    if ([[notification object] isKindOfClass:[IDEWorkspaceWindow class]]) {\n        NSWindow *workspaceWindow = (NSWindow *)[notification object];\n        NSWindowController *workspaceWindowController = (NSWindowController *)workspaceWindow.windowController;\n        \n        IDEWorkspace *workspace = (IDEWorkspace *)[workspaceWindowController valueForKey:@\"_workspace\"];\n        DVTFilePath *representingFilePath = workspace.representingFilePath;\n        NSString *pathString = representingFilePath.pathString;\n        \n        self.currentWorkspaceFilePath = pathString;\n    }\n}\n\n- (void)indexDidIndexWorkspace:(NSNotification *)notification\n{\n    IDEIndex *index = (IDEIndex *)[notification object];\n    [self indexNeedsUpdate:index];\n}\n\n- (void)editorDocumentDidSave:(NSNotification *)notification\n{\n    IDEEditorDocument *editorDocument = (IDEEditorDocument *)[notification object];\n    DVTFilePath *filePath = editorDocument.filePath;\n    NSString *pathString = filePath.pathString;\n    \n    // Check whether there are any changes to .strings\n    NSArray *collections = [self.workspaceLocalizations objectForKey:self.currentWorkspaceFilePath];\n    \n    for (LNLocalizationCollection *collection in collections) {\n        if ([collection.filePath isEqualToString:pathString]) {\n            [collection reloadLocalizations];\n            \n            break;\n        }\n    }\n}\n\n- (void)popoverWindowControllerWindowWillClose:(NSNotification *)notification\n{\n    // Instantiate popover\n    [self instantiatePopover];\n}\n\n- (void)popoverContentViewLocalizationDidSelect:(NSNotification *)notification\n{\n    NSTextView *textView = self.textView;\n    LNEntity *entity = [self selectedEntityInTextView:textView];\n    \n    if (entity) {\n        NSArray *selectedRanges = textView.selectedRanges;\n        \n        if (selectedRanges.count > 0) {\n            NSRange selectedRange = [[selectedRanges objectAtIndex:0] rangeValue];\n            \n            // Locate the key\n            NSRange lineRange = [textView.textStorage.string lineRangeForRange:selectedRange];\n            NSRange keyRange = NSMakeRange(lineRange.location + entity.keyRange.location, entity.keyRange.length);\n            \n            // Replace\n            LNLocalization *localization = [[notification userInfo] objectForKey:LNPopoverContentViewLocalizationKey];\n            [textView insertText:localization.key replacementRange:keyRange];\n        }\n    }\n}\n\n- (void)popoverContentViewAlertDidDismiss:(NSNotification *)notification\n{\n    // Show popover again\n    [self presentPopoverInTextView:self.textView entity:[self selectedEntityInTextView:self.textView]];\n}\n\n- (void)popoverContentViewDetachButtonDidClick:(NSNotification *)notification\n{\n    [self preparePopoverWindow];\n    [self detachPopover];\n}\n\n- (void)menuDidChange:(NSNotification *)notification\n{\n    // Create menu item\n    [self createMenuItem];\n}\n\n\n#pragma mark - Detachig Popover\n\n- (void)preparePopoverWindow\n{\n    // Resize popover window\n    NSWindow *popoverWindow = [self.popover _popoverWindow];\n    \n    [self.popoverWindowController.window setFrame:NSMakeRect(popoverWindow.frame.origin.x,\n                                                             popoverWindow.frame.origin.y - (80.0 / 2.0),\n                                                             self.popover.contentSize.width,\n                                                             self.popover.contentSize.height + 80.0)\n                                          display:NO];\n    \n    // Copy popover content\n    LNPopoverContentView *popoverContentView = (LNPopoverContentView *)self.popover.contentViewController.view;\n    LNPopoverContentView *popoverWindowContentView = (LNPopoverContentView *)self.popoverWindowController.popoverContentViewController.view;\n    popoverWindowContentView.tableView.sortDescriptors = popoverContentView.tableView.sortDescriptors;\n    popoverWindowContentView.collections = popoverContentView.collections;\n    popoverWindowContentView.searchString = popoverContentView.searchString;\n}\n\n- (void)detachPopover\n{\n    [self dismissPopover];\n    [self.popoverWindowController showWindow:nil];\n}\n\n\n#pragma mark - Entity\n\n- (LNEntity *)selectedEntityInTextView:(NSTextView *)textView\n{\n    NSArray *selectedRanges = textView.selectedRanges;\n    \n    if (selectedRanges.count > 0) {\n        NSRange selectedRange = [[selectedRanges objectAtIndex:0] rangeValue];\n        \n        // Locate the line containing the caret\n        NSString *string = textView.textStorage.string;\n        NSRange lineRange = [string lineRangeForRange:selectedRange];\n        NSString *lineString = [string substringWithRange:lineRange];\n        NSRange selectedRangeInLine = NSMakeRange(selectedRange.location - lineRange.location, selectedRange.length);\n        \n        // Search for the entities\n        NSArray *entities = [self.detector entitiesInString:lineString];\n        \n        for (LNEntity *entity in entities) {\n            if (NSLocationInRange(selectedRangeInLine.location, entity.entityRange)) {\n                return entity;\n            }\n        }\n    }\n    \n    return nil;\n}\n\n\n#pragma mark - Menu\n\n- (void)createMenuItem\n{\n    NSMenuItem *editorMenuItem = [[NSApp mainMenu] itemWithTitle:@\"Editor\"];\n    \n    if (editorMenuItem && [[editorMenuItem submenu] itemWithTitle:@\"Lin\"] == nil) {\n        // Load defaults\n        BOOL enabled = [[LNUserDefaultsManager sharedManager] isEnabled];\n        \n        NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:@\"Lin\" action:NULL keyEquivalent:@\"\"];\n        \n        NSMenu *submenu = [[NSMenu alloc] initWithTitle:@\"Lin\"];\n        menuItem.submenu = submenu;\n        \n        // Enable Lin\n        NSMenuItem *enableMenuItem = [[NSMenuItem alloc] initWithTitle:@\"Enable Lin\" action:@selector(toggleEnabled:) keyEquivalent:@\"\"];\n        [enableMenuItem setTarget:self];\n        enableMenuItem.state = enabled ? NSOnState : NSOffState;\n        \n        [submenu addItem:enableMenuItem];\n        self.enableMenuItem = enableMenuItem;\n        \n        // Show Window\n        NSMenuItem *showWindowMenuItem = [[NSMenuItem alloc] initWithTitle:@\"Show Window\" action:@selector(showWindow:) keyEquivalent:@\"\"];\n        [showWindowMenuItem setTarget:self];\n        \n        [submenu addItem:showWindowMenuItem];\n        self.showWindowMenuItem = showWindowMenuItem;\n        \n        // Separator\n        [submenu addItem:[NSMenuItem separatorItem]];\n        \n        // Version Info\n        NSMenuItem *versionInfoMenuItem = [[NSMenuItem alloc] initWithTitle:@\"Version Info\" action:@selector(showVersionInfo:) keyEquivalent:@\"\"];\n        [versionInfoMenuItem setTarget:self];\n        [submenu addItem:versionInfoMenuItem];\n        \n        [[editorMenuItem submenu] addItem:[NSMenuItem separatorItem]];\n        [[editorMenuItem submenu] addItem:menuItem];\n    }\n}\n\n- (BOOL)validateMenuItem:(NSMenuItem *)menuItem\n{\n    if (menuItem == self.showWindowMenuItem) {\n        return [[LNUserDefaultsManager sharedManager] isEnabled];\n    }\n    \n    return YES;\n}\n\n- (void)toggleEnabled:(id)sender\n{\n    // Save defaults\n    LNUserDefaultsManager *userDefaultManager = [LNUserDefaultsManager sharedManager];\n    BOOL enabled = ![userDefaultManager isEnabled];\n    userDefaultManager.enabled = enabled;\n    \n    // Update menu item\n    self.enableMenuItem.state = enabled ? NSOnState : NSOffState;\n    \n    // Activate/Deactivate\n    if (enabled) {\n        [self activate];\n    } else {\n        [self deactivate];\n    }\n}\n\n- (void)showWindow:(id)sender\n{\n    // Prepare window\n    NSArray *collections = [self.workspaceLocalizations objectForKey:self.currentWorkspaceFilePath];\n    \n    LNPopoverContentView *popoverWindowContentView = (LNPopoverContentView *)self.popoverWindowController.popoverContentViewController.view;\n    popoverWindowContentView.collections = collections;\n    popoverWindowContentView.searchString = @\"\";\n    \n    // Show window\n    [self.popoverWindowController.window setFrame:NSMakeRect(0, 0, 500, 280) display:NO];\n    [self.popoverWindowController.window center];\n    [self.popoverWindowController showWindow:nil];\n}\n\n- (void)showVersionInfo:(id)sender\n{\n    // Create alert\n    NSBundle *bundle = [NSBundle bundleForClass:[self class]];\n    NSAlert *alert = [NSAlert alertWithMessageText:@\"Lin\"\n                                     defaultButton:@\"OK\"\n                                   alternateButton:nil\n                                       otherButton:@\"Open Website\"\n                         informativeTextWithFormat:@\"Version %@\\n\\nCopyright (c) 2013 Katsuma Tanaka\\n\\nEmail: questbeat@gmail.com\\nTwitter: @questbeat\", [bundle shortVersionString]];\n    \n    // Set icon\n    NSString *filePath = [bundle pathForResource:@\"icon120\" ofType:@\"tiff\"];\n    NSImage *icon = [[NSImage alloc] initWithContentsOfFile:filePath];\n    [alert setIcon:icon];\n    \n    // Show alert\n    if ([alert runModal] == NSAlertOtherReturn) {\n        [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@\"http://questbe.at/lin\"]];\n    }\n}\n\n\n#pragma mark - Index\n\n- (void)indexNeedsUpdate:(IDEIndex *)index\n{\n    DVTFilePath *workspaceFile = index.workspaceFile;\n    NSString *workspaceFilePath = workspaceFile.pathString;\n    \n    if (workspaceFilePath) {\n        [self.collectionProcessQueue cancelAllOperations];\n        [self updateLocalizationsForIndex:index];\n    }\n}\n\n- (void)updateLocalizationsForIndex:(IDEIndex *)index\n{\n    LNLocalizedStringCollectionOperation *processOperation = [[LNLocalizedStringCollectionOperation alloc] initWithIndex:index];\n    processOperation.collectionCompletedBlock = ^(NSString *workspaceFilePath, NSArray *collections) {\n        [self.workspaceLocalizations setObject:collections forKey:workspaceFilePath];\n        if ([workspaceFilePath isEqualToString:self.currentWorkspaceFilePath]) {\n            if ([self.popover isShown]) {\n                LNPopoverContentView *contentView = (LNPopoverContentView *)self.popover.contentViewController.view;\n                contentView.collections = collections;\n            } else if ([self.popoverWindowController.window isVisible]) {\n                LNPopoverContentView *contentView = (LNPopoverContentView *)self.popoverWindowController.popoverContentViewController.view;\n                contentView.collections = collections;\n            }\n        }\n    };\n    \n    [self.collectionProcessQueue addOperation:processOperation];\n}\n\n- (void)removeLocalizationsForIndex:(IDEIndex *)index\n{\n    DVTFilePath *workspaceFile = index.workspaceFile;\n    NSString *workspaceFilePath = workspaceFile.pathString;\n    \n    if (workspaceFilePath) {\n        [self.workspaceLocalizations removeObjectForKey:workspaceFilePath];\n    }\n}\n\n\n#pragma mark - Popover\n\n- (void)presentPopoverInTextView:(NSTextView *)textView entity:(LNEntity *)entity\n{\n    if (![[LNUserDefaultsManager sharedManager] isEnabled]) {\n        return;\n    }\n    \n    NSArray *selectedRanges = textView.selectedRanges;\n    \n    if (selectedRanges.count > 0) {\n        NSRange selectedRange = [[selectedRanges objectAtIndex:0] rangeValue];\n        \n        // Locate the line containing the caret\n        NSRange lineRange = [textView.textStorage.string lineRangeForRange:selectedRange];\n        \n        // Stick popover at the beginning of the key\n        NSRange keyRange = NSMakeRange(lineRange.location + entity.keyRange.location, 1);\n        NSRect keyRectOnScreen = [textView firstRectForCharacterRange:keyRange actualRange:NULL];\n        NSRect keyRectOnWindow = [textView.window convertRectFromScreen:keyRectOnScreen];\n        NSRect keyRectOnTextView = [textView convertRect:keyRectOnWindow fromView:nil];\n        \n        // Update or show popover\n        NSArray *collections = [self.workspaceLocalizations objectForKey:self.currentWorkspaceFilePath];\n        NSString *key = [textView.textStorage.string substringWithRange:NSMakeRange(lineRange.location + entity.keyRange.location, entity.keyRange.length)];\n        \n        if ([self.popoverWindowController.window isVisible]) {\n            // Update popover content\n            LNPopoverContentView *contentView = (LNPopoverContentView *)self.popoverWindowController.popoverContentViewController.view;\n            contentView.collections = collections;\n            contentView.searchString = key;\n        } else {\n            if ([self.popover isShown]) {\n                // Update the position for popover when the cursor moved\n                self.popover.positioningRect = keyRectOnTextView;\n                \n                // Update popover content\n                LNPopoverContentView *contentView = (LNPopoverContentView *)self.popover.contentViewController.view;\n                contentView.searchString = key;\n            } else {\n                // Show popover\n                [self.popover showRelativeToRect:keyRectOnTextView\n                                          ofView:textView\n                                   preferredEdge:NSMinYEdge];\n                \n                // Update popover content\n                LNPopoverContentView *contentView = (LNPopoverContentView *)self.popover.contentViewController.view;\n                contentView.collections = collections;\n                contentView.searchString = key;\n            }\n        }\n    }\n}\n\n- (void)dismissPopover\n{\n    if ([self.popoverWindowController.window isVisible]) {\n        // Update popover content\n        NSArray *collections = [self.workspaceLocalizations objectForKey:self.currentWorkspaceFilePath];\n        \n        LNPopoverContentView *contentView = (LNPopoverContentView *)self.popoverWindowController.popoverContentViewController.view;\n        contentView.collections = collections;\n        contentView.searchString = nil;\n    } else {\n        // Hide popover\n        if (self.popover.shown) {\n            [self.popover performClose:self];\n        }\n    }\n}\n\n\n#pragma mark - NSPopoverDelegate\n\n- (void)popoverWillShow:(NSNotification *)notification\n{\n    // Save first responder\n    self.previousFirstResponder = [self.textView.window firstResponder];\n}\n\n- (void)popoverDidShow:(NSNotification *)notification\n{\n    // Reclaim key window and first responder\n    [self.textView.window becomeKeyWindow];\n    [self.textView.window makeFirstResponder:self.previousFirstResponder];\n}\n\n- (NSWindow *)detachableWindowForPopover:(NSPopover *)popover\n{\n    // Prepare for detaching\n    [self preparePopoverWindow];\n    \n    return self.popoverWindowController.window;\n}\n\n@end\n"
  },
  {
    "path": "Lin/MethodSwizzle.h",
    "content": "//\n//  MethodSwizzle.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/24.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nvoid MethodSwizzle(Class cls, SEL org_sel, SEL alt_sel);\n"
  },
  {
    "path": "Lin/MethodSwizzle.m",
    "content": "//\n//  MethodSwizzle.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/24.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"MethodSwizzle.h\"\n#import <objc/objc-class.h>\n\nvoid MethodSwizzle(Class cls, SEL org_sel, SEL alt_sel)\n{\n    Method org_method = nil, alt_method = nil;\n\t\n    org_method = class_getInstanceMethod(cls, org_sel);\n    alt_method = class_getInstanceMethod(cls, alt_sel);\n\t\n    if (org_method != nil && alt_method != nil) {\n        method_exchangeImplementations(org_method, alt_method);\n\t}\n}\n\n"
  },
  {
    "path": "Lin/NSBundle+versions.h",
    "content": "//\n//  NSBundle+versions.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSBundle (versions)\n\n- (NSString *)shortVersionString;\n- (NSNumber *)buildNumber;\n\n@end\n"
  },
  {
    "path": "Lin/NSBundle+versions.m",
    "content": "//\n//  NSBundle+versions.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"NSBundle+versions.h\"\n\n@implementation NSBundle (versions)\n\n- (NSString *)shortVersionString\n{\n    return [self objectForInfoDictionaryKey:@\"CFBundleShortVersionString\"];\n}\n\n- (NSNumber *)buildNumber\n{\n    return [self objectForInfoDictionaryKey:@\"CFBundleVersion\"];\n}\n\n@end\n"
  },
  {
    "path": "Lin/NSPopoverFrame+Lin.h",
    "content": "//\n//  NSPopoverFrame+Lin.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"NSPopoverFrame.h\"\n\n@interface NSPopoverFrame (Lin)\n\n@end\n"
  },
  {
    "path": "Lin/NSPopoverFrame+Lin.m",
    "content": "//\n//  NSPopoverFrame+Lin.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"NSPopoverFrame+Lin.h\"\n#import <CoreServices/CoreServices.h>\n\n#import \"MethodSwizzle.h\"\n\n@implementation NSPopoverFrame (Lin)\n\n+ (void)load\n{\n    MethodSwizzle(self, @selector(_drawMinimalPopoverAppearanceInRect:anchorEdge:anchorPoint:), @selector(jp_questbeat_lin_drawMinimalPopoverAppearanceInRect:anchorEdge:anchorPoint:));\n}\n\n- (void)jp_questbeat_lin_drawMinimalPopoverAppearanceInRect:(struct CGRect)arg1 anchorEdge:(unsigned long long)arg2 anchorPoint:(struct CGPoint)arg3\n{\n    [self jp_questbeat_lin_drawMinimalPopoverAppearanceInRect:arg1 anchorEdge:arg2 anchorPoint:arg3];\n    \n    // Check OS version\n    SInt32 major = 0;\n    SInt32 minor = 0;\n    Gestalt(gestaltSystemVersionMajor, &major);\n    Gestalt(gestaltSystemVersionMinor, &minor);\n    \n    if ((major == 10 && minor <= 8) || major <= 9) {\n        // Mac OS X Mountain Lion or older\n        // This code will cause a problem on Max OS X 10.9 Mavericks (or maybe later)\n        [[NSColor whiteColor] setFill];\n        NSRectFill(arg1);\n    } else {\n        // Mac OS X Mavericks or later\n        CGPathRef path = [self _newMinimalAppearancePathInBounds:arg1\n                                                      anchorEdge:arg2\n                                                     anchorPoint:arg3\n                                                      topCapOnly:NO\n                                                     arrowOffset:0];\n        CGImageRef maskImage = [self _imageMaskForPath:(struct CGPath *)path\n                                            anchorEdge:arg2\n                                           anchorPoint:arg3];\n        \n        NSBitmapImageRep *backgroundImageRep = [self backgroundImageRepWithSize:self.bounds.size maskImage:maskImage];\n        \n        CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];\n        CGImageRef backgroundImageRef = [backgroundImageRep CGImage];\n        CGContextDrawImage(context, self.bounds, backgroundImageRef);\n    }\n}\n\n- (NSBitmapImageRep *)backgroundImageRepWithSize:(NSSize)size maskImage:(CGImageRef)maskImage\n{\n    CGContextRef currentContext = [[NSGraphicsContext currentContext] graphicsPort];\n    CGContextSaveGState(currentContext);\n    \n    CGFloat scale = [self convertSizeToBacking:CGSizeMake(1, 1)].width;\n    size.width *= scale;\n    size.height *= scale;\n    \n    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();\n    CGContextRef context = CGBitmapContextCreate(NULL,\n                                                 size.width,\n                                                 size.height,\n                                                 8,\n                                                 4 * size.width,\n                                                 colorSpace,\n                                                 (CGBitmapInfo)kCGImageAlphaPremultipliedLast);\n    \n    CGContextClipToMask(context, CGRectMake(0, 0, size.width, size.height), maskImage);\n    \n    CGContextSetFillColorWithColor(context, [[NSColor whiteColor] CGColor]);\n    CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height));\n    \n    CGImageRef backgroundImageRef = CGBitmapContextCreateImage(context);\n    NSBitmapImageRep *backgroundImageRep = [[NSBitmapImageRep alloc] initWithCGImage:backgroundImageRef];\n    CGImageRelease(backgroundImageRef);\n    \n    CGContextRelease(context);\n    CGColorSpaceRelease(colorSpace);\n    \n    CGContextRestoreGState(currentContext);\n    \n    return backgroundImageRep;\n}\n\n@end\n"
  },
  {
    "path": "Lin/NSPopoverFrame.h",
    "content": "/*\n *     Generated by class-dump 3.4 (64 bit).\n *\n *     class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2012 by Steve Nygard.\n */\n\n#import <AppKit/NSView.h>\n\n@class NSImage;\n\n@interface NSPopoverFrame : NSView\n\n- (void)_drawMinimalPopoverAppearanceInRect:(struct CGRect)arg1 anchorEdge:(unsigned long long)arg2 anchorPoint:(struct CGPoint)arg3;\n\n- (struct CGImage *)_imageMaskForPath:(struct CGPath *)arg1 anchorEdge:(unsigned long long)arg2 anchorPoint:(struct CGPoint)arg3;\n- (struct CGPath *)_newMinimalAppearancePathInBounds:(struct CGRect)arg1 anchorEdge:(unsigned long long)arg2 anchorPoint:(struct CGPoint)arg3 topCapOnly:(BOOL)arg4 arrowOffset:(double)arg5;\n- (struct CGPath *)_newMinimalAppearancePathInBounds:(struct CGRect)arg1 anchorEdge:(unsigned long long)arg2 arrowPosition:(double)arg3 topCapOnly:(BOOL)arg4 arrowOffset:(double)arg5;\n\n@end\n\n"
  },
  {
    "path": "Lin/NSTableView+editedColumnIdentifier.h",
    "content": "//\n//  NSTableView+editedColumnIdentifier.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/22.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface NSTableView (editedColumnIdentifier)\n\n- (NSString *)editedColumnIdentifier;\n\n@end\n"
  },
  {
    "path": "Lin/NSTableView+editedColumnIdentifier.m",
    "content": "//\n//  NSTableView+editedColumnIdentifier.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/09/22.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"NSTableView+editedColumnIdentifier.h\"\n\n@implementation NSTableView (editedColumnIdentifier)\n\n- (NSString *)editedColumnIdentifier\n{\n    NSInteger editedColumnIndex = [self editedColumn];\n    \n    NSArray *tableColumns = [self tableColumns];\n    for (NSInteger i = 0; i < tableColumns.count; i++) {\n        NSTableColumn *column = [tableColumns objectAtIndex:i];\n        \n        if (i == editedColumnIndex) {\n            return column.identifier;\n        }\n    }\n    \n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Lin/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "Lin.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\tAA02CE8B17EE08240041C2BD /* LNAlertAccessoryView.xib in Resources */ = {isa = PBXBuildFile; fileRef = AA02CE8A17EE08240041C2BD /* LNAlertAccessoryView.xib */; };\n\t\tAA02CE8E17EE083A0041C2BD /* LNAlertAccessoryView.m in Sources */ = {isa = PBXBuildFile; fileRef = AA02CE8D17EE083A0041C2BD /* LNAlertAccessoryView.m */; };\n\t\tAA1B7DA717C3C1EC00A3A6D7 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA1B7DA617C3C1EC00A3A6D7 /* Cocoa.framework */; };\n\t\tAA1B7DB117C3C1EC00A3A6D7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AA1B7DAF17C3C1EC00A3A6D7 /* InfoPlist.strings */; };\n\t\tAA1B7DBA17C3C20F00A3A6D7 /* Lin.m in Sources */ = {isa = PBXBuildFile; fileRef = AA1B7DB917C3C20F00A3A6D7 /* Lin.m */; };\n\t\tAA20D87F17ECB12A006B7CA2 /* NSPopoverFrame+Lin.m in Sources */ = {isa = PBXBuildFile; fileRef = AA20D87E17ECB12A006B7CA2 /* NSPopoverFrame+Lin.m */; };\n\t\tAA2980B417EE2C5300CF46E3 /* LNUserDefaultsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = AA2980B317EE2C5300CF46E3 /* LNUserDefaultsManager.m */; };\n\t\tAA36376617D9EF9E003C5E55 /* LNPopoverContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = AA36376517D9EF9E003C5E55 /* LNPopoverContentView.m */; };\n\t\tAA3EC36F17EB2A290003A180 /* DVTFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA3EC36D17EB2A290003A180 /* DVTFoundation.framework */; };\n\t\tAA3EC37017EB2A290003A180 /* DVTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA3EC36E17EB2A290003A180 /* DVTKit.framework */; };\n\t\tAA3EC37317EB2A380003A180 /* IDEFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA3EC37117EB2A380003A180 /* IDEFoundation.framework */; };\n\t\tAA3EC37417EB2A380003A180 /* IDEKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA3EC37217EB2A380003A180 /* IDEKit.framework */; };\n\t\tAA470D5B17C3CFEC005CBB7F /* LNDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = AA470D5A17C3CFEC005CBB7F /* LNDetector.m */; };\n\t\tAA470D5E17C3D05D005CBB7F /* LNEntity.m in Sources */ = {isa = PBXBuildFile; fileRef = AA470D5D17C3D05D005CBB7F /* LNEntity.m */; };\n\t\tAA470D6517C3D380005CBB7F /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA470D6417C3D380005CBB7F /* XCTest.framework */; };\n\t\tAA470D6B17C3D380005CBB7F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AA470D6917C3D380005CBB7F /* InfoPlist.strings */; };\n\t\tAA470D7D17C3DE31005CBB7F /* LNDetectorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AA470D7C17C3DE31005CBB7F /* LNDetectorTests.m */; };\n\t\tAA6377CE18C5CCFC005EADC7 /* LNImageButtonCell.m in Sources */ = {isa = PBXBuildFile; fileRef = AA6377CD18C5CCFC005EADC7 /* LNImageButtonCell.m */; };\n\t\tAA63897918C6019A0061C2C4 /* icon_plus@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA63897118C6019A0061C2C4 /* icon_plus@2x.png */; };\n\t\tAA63897A18C6019A0061C2C4 /* icon_minus.png in Resources */ = {isa = PBXBuildFile; fileRef = AA63897218C6019A0061C2C4 /* icon_minus.png */; };\n\t\tAA63897B18C6019A0061C2C4 /* icon_minus@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA63897318C6019A0061C2C4 /* icon_minus@2x.png */; };\n\t\tAA63897C18C6019A0061C2C4 /* icon120.png in Resources */ = {isa = PBXBuildFile; fileRef = AA63897418C6019A0061C2C4 /* icon120.png */; };\n\t\tAA63897D18C6019A0061C2C4 /* icon_plus.png in Resources */ = {isa = PBXBuildFile; fileRef = AA63897518C6019A0061C2C4 /* icon_plus.png */; };\n\t\tAA63897E18C6019A0061C2C4 /* icon_detach@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA63897618C6019A0061C2C4 /* icon_detach@2x.png */; };\n\t\tAA63897F18C6019A0061C2C4 /* icon120@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA63897718C6019A0061C2C4 /* icon120@2x.png */; };\n\t\tAA63898018C6019A0061C2C4 /* icon_detach.png in Resources */ = {isa = PBXBuildFile; fileRef = AA63897818C6019A0061C2C4 /* icon_detach.png */; };\n\t\tAA7D4DB117C74CFE0092DF8A /* LNLocalizationCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = AA7D4DB017C74CFE0092DF8A /* LNLocalizationCollection.m */; };\n\t\tAA7D4DB417C74D0A0092DF8A /* LNLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = AA7D4DB317C74D0A0092DF8A /* LNLocalization.m */; };\n\t\tAA8F8EF017EDFC68004964FB /* NSTableView+editedColumnIdentifier.m in Sources */ = {isa = PBXBuildFile; fileRef = AA8F8EEF17EDFC68004964FB /* NSTableView+editedColumnIdentifier.m */; };\n\t\tAA95FDEC17EB48A9007D33D4 /* LNPopoverContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = AA95FDEB17EB48A9007D33D4 /* LNPopoverContentView.xib */; };\n\t\tAA95FDEF17EB4E77007D33D4 /* LNPopoverWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = AA95FDEE17EB4E77007D33D4 /* LNPopoverWindowController.m */; };\n\t\tAAAC873317ED9D4F00BF251D /* LNHorizontalLine.m in Sources */ = {isa = PBXBuildFile; fileRef = AAAC873217ED9D4F00BF251D /* LNHorizontalLine.m */; };\n\t\tAAAC873B17EDA9CF00BF251D /* LNPopoverWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = AAAC873A17EDA9CF00BF251D /* LNPopoverWindow.m */; };\n\t\tAAB0CD3117C4382D0085E913 /* LNRegularExpressionPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0CD3017C4382D0085E913 /* LNRegularExpressionPattern.m */; };\n\t\tAAB0CD3417C448200085E913 /* LNRegularExpressionPattern+type.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0CD3317C448200085E913 /* LNRegularExpressionPattern+type.m */; };\n\t\tAAB0CD3617C46A730085E913 /* LNDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = AA470D5A17C3CFEC005CBB7F /* LNDetector.m */; };\n\t\tAAB0CD3717C46B070085E913 /* LNEntity.m in Sources */ = {isa = PBXBuildFile; fileRef = AA470D5D17C3D05D005CBB7F /* LNEntity.m */; };\n\t\tAAB0CD3817C46B070085E913 /* LNRegularExpressionPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0CD3017C4382D0085E913 /* LNRegularExpressionPattern.m */; };\n\t\tAAB0CD3917C46B070085E913 /* LNRegularExpressionPattern+type.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0CD3317C448200085E913 /* LNRegularExpressionPattern+type.m */; };\n\t\tAAB0CD3C17C477030085E913 /* LNDetectorTestSet.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0CD3B17C477030085E913 /* LNDetectorTestSet.m */; };\n\t\tAADDDA9417C49D4800BBA67C /* NSBundle+versions.m in Sources */ = {isa = PBXBuildFile; fileRef = AADDDA9317C49D4800BBA67C /* NSBundle+versions.m */; };\n\t\tAADEADB317C7B6D3001E0C65 /* LNLocalizationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AADEADB217C7B6D3001E0C65 /* LNLocalizationTests.m */; };\n\t\tAADEADB417C7B838001E0C65 /* LNLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = AA7D4DB317C74D0A0092DF8A /* LNLocalization.m */; };\n\t\tAADEADB717C87298001E0C65 /* IDEIndex+Lin.m in Sources */ = {isa = PBXBuildFile; fileRef = AADEADB617C87298001E0C65 /* IDEIndex+Lin.m */; };\n\t\tAADEADC017C87392001E0C65 /* MethodSwizzle.m in Sources */ = {isa = PBXBuildFile; fileRef = AADEADBF17C87392001E0C65 /* MethodSwizzle.m */; };\n\t\tAAF0D6AB17ECB87100B4318B /* LNTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = AAF0D6AA17ECB87100B4318B /* LNTableView.m */; };\n\t\tAAF0D6AE17ECB89800B4318B /* LNTableHeaderCell.m in Sources */ = {isa = PBXBuildFile; fileRef = AAF0D6AD17ECB89800B4318B /* LNTableHeaderCell.m */; };\n\t\tAAF0D6B117ECC4AF00B4318B /* LNTableCornerView.m in Sources */ = {isa = PBXBuildFile; fileRef = AAF0D6B017ECC4AF00B4318B /* LNTableCornerView.m */; };\n\t\tAAF0D6B417ECD8EC00B4318B /* LNButtonCell.m in Sources */ = {isa = PBXBuildFile; fileRef = AAF0D6B317ECD8EC00B4318B /* LNButtonCell.m */; };\n\t\tAAFE3C3F17EECF4A0018E478 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AAFE3C3E17EECF4A0018E478 /* Localizable.strings */; };\n\t\tAAFE3C4117EED36C0018E478 /* LNLocalizationCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = AA7D4DB017C74CFE0092DF8A /* LNLocalizationCollection.m */; };\n\t\tF5859DBD18CABC2A009AF108 /* LNLocalizedStringCollectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = F5859DBC18CABC2A009AF108 /* LNLocalizedStringCollectionOperation.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tAA470D6F17C3D380005CBB7F /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = AA1B7D9B17C3C1EC00A3A6D7 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = AA1B7DA217C3C1EC00A3A6D7;\n\t\t\tremoteInfo = Lin;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\tAA02CE8A17EE08240041C2BD /* LNAlertAccessoryView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LNAlertAccessoryView.xib; sourceTree = \"<group>\"; };\n\t\tAA02CE8C17EE083A0041C2BD /* LNAlertAccessoryView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNAlertAccessoryView.h; sourceTree = \"<group>\"; };\n\t\tAA02CE8D17EE083A0041C2BD /* LNAlertAccessoryView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNAlertAccessoryView.m; sourceTree = \"<group>\"; };\n\t\tAA11AC4017C66F0200889DFB /* DVTFilePath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVTFilePath.h; sourceTree = \"<group>\"; };\n\t\tAA11AC4317C6746800889DFB /* IDEIndex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDEIndex.h; sourceTree = \"<group>\"; };\n\t\tAA11AC4617C6755400889DFB /* IDEIndexCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDEIndexCollection.h; sourceTree = \"<group>\"; };\n\t\tAA1B7DA317C3C1EC00A3A6D7 /* Lin.xcplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Lin.xcplugin; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tAA1B7DA617C3C1EC00A3A6D7 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };\n\t\tAA1B7DA917C3C1EC00A3A6D7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\tAA1B7DAA17C3C1EC00A3A6D7 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };\n\t\tAA1B7DAB17C3C1EC00A3A6D7 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };\n\t\tAA1B7DAE17C3C1EC00A3A6D7 /* Lin-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"Lin-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tAA1B7DB017C3C1EC00A3A6D7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tAA1B7DB217C3C1EC00A3A6D7 /* Lin-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Lin-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tAA1B7DB817C3C20F00A3A6D7 /* Lin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Lin.h; sourceTree = \"<group>\"; };\n\t\tAA1B7DB917C3C20F00A3A6D7 /* Lin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Lin.m; sourceTree = \"<group>\"; };\n\t\tAA20D87D17ECB12A006B7CA2 /* NSPopoverFrame+Lin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSPopoverFrame+Lin.h\"; sourceTree = \"<group>\"; };\n\t\tAA20D87E17ECB12A006B7CA2 /* NSPopoverFrame+Lin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSPopoverFrame+Lin.m\"; sourceTree = \"<group>\"; };\n\t\tAA20D88017ECB1AD006B7CA2 /* NSPopoverFrame.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSPopoverFrame.h; sourceTree = \"<group>\"; };\n\t\tAA2980B217EE2C5300CF46E3 /* LNUserDefaultsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNUserDefaultsManager.h; sourceTree = \"<group>\"; };\n\t\tAA2980B317EE2C5300CF46E3 /* LNUserDefaultsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNUserDefaultsManager.m; sourceTree = \"<group>\"; };\n\t\tAA36376417D9EF9E003C5E55 /* LNPopoverContentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNPopoverContentView.h; sourceTree = \"<group>\"; };\n\t\tAA36376517D9EF9E003C5E55 /* LNPopoverContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNPopoverContentView.m; sourceTree = \"<group>\"; };\n\t\tAA3EC36D17EB2A290003A180 /* DVTFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DVTFoundation.framework; path = ../../../../Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework; sourceTree = \"<group>\"; };\n\t\tAA3EC36E17EB2A290003A180 /* DVTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DVTKit.framework; path = ../../../../Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework; sourceTree = \"<group>\"; };\n\t\tAA3EC37117EB2A380003A180 /* IDEFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IDEFoundation.framework; path = ../../../../Applications/Xcode.app/Contents/Frameworks/IDEFoundation.framework; sourceTree = \"<group>\"; };\n\t\tAA3EC37217EB2A380003A180 /* IDEKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IDEKit.framework; path = ../../../../Applications/Xcode.app/Contents/Frameworks/IDEKit.framework; sourceTree = \"<group>\"; };\n\t\tAA470D5917C3CFEC005CBB7F /* LNDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNDetector.h; sourceTree = \"<group>\"; };\n\t\tAA470D5A17C3CFEC005CBB7F /* LNDetector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNDetector.m; sourceTree = \"<group>\"; };\n\t\tAA470D5C17C3D05D005CBB7F /* LNEntity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNEntity.h; sourceTree = \"<group>\"; };\n\t\tAA470D5D17C3D05D005CBB7F /* LNEntity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNEntity.m; sourceTree = \"<group>\"; };\n\t\tAA470D6317C3D380005CBB7F /* LinTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LinTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tAA470D6417C3D380005CBB7F /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };\n\t\tAA470D6817C3D380005CBB7F /* LinTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"LinTests-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tAA470D6A17C3D380005CBB7F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tAA470D6E17C3D380005CBB7F /* LinTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"LinTests-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tAA470D7C17C3DE31005CBB7F /* LNDetectorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNDetectorTests.m; sourceTree = \"<group>\"; };\n\t\tAA6377CC18C5CCFC005EADC7 /* LNImageButtonCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNImageButtonCell.h; sourceTree = \"<group>\"; };\n\t\tAA6377CD18C5CCFC005EADC7 /* LNImageButtonCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNImageButtonCell.m; sourceTree = \"<group>\"; };\n\t\tAA63897118C6019A0061C2C4 /* icon_plus@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"icon_plus@2x.png\"; sourceTree = \"<group>\"; };\n\t\tAA63897218C6019A0061C2C4 /* icon_minus.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_minus.png; sourceTree = \"<group>\"; };\n\t\tAA63897318C6019A0061C2C4 /* icon_minus@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"icon_minus@2x.png\"; sourceTree = \"<group>\"; };\n\t\tAA63897418C6019A0061C2C4 /* icon120.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon120.png; sourceTree = \"<group>\"; };\n\t\tAA63897518C6019A0061C2C4 /* icon_plus.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_plus.png; sourceTree = \"<group>\"; };\n\t\tAA63897618C6019A0061C2C4 /* icon_detach@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"icon_detach@2x.png\"; sourceTree = \"<group>\"; };\n\t\tAA63897718C6019A0061C2C4 /* icon120@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"icon120@2x.png\"; sourceTree = \"<group>\"; };\n\t\tAA63897818C6019A0061C2C4 /* icon_detach.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_detach.png; sourceTree = \"<group>\"; };\n\t\tAA7B0CAD17F4228E0004FE3B /* DVTDualProxyWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVTDualProxyWindow.h; sourceTree = \"<group>\"; };\n\t\tAA7B0CB017F4229D0004FE3B /* IDEWorkspaceWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDEWorkspaceWindow.h; sourceTree = \"<group>\"; };\n\t\tAA7B0CB317F422BB0004FE3B /* DVTSourceTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVTSourceTextView.h; sourceTree = \"<group>\"; };\n\t\tAA7D4DAF17C74CFE0092DF8A /* LNLocalizationCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNLocalizationCollection.h; sourceTree = \"<group>\"; };\n\t\tAA7D4DB017C74CFE0092DF8A /* LNLocalizationCollection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNLocalizationCollection.m; sourceTree = \"<group>\"; };\n\t\tAA7D4DB217C74D0A0092DF8A /* LNLocalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNLocalization.h; sourceTree = \"<group>\"; };\n\t\tAA7D4DB317C74D0A0092DF8A /* LNLocalization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNLocalization.m; sourceTree = \"<group>\"; };\n\t\tAA8F8EEE17EDFC68004964FB /* NSTableView+editedColumnIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSTableView+editedColumnIdentifier.h\"; sourceTree = \"<group>\"; };\n\t\tAA8F8EEF17EDFC68004964FB /* NSTableView+editedColumnIdentifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSTableView+editedColumnIdentifier.m\"; sourceTree = \"<group>\"; };\n\t\tAA93691517C4E4C000E94318 /* IDEWorkspace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDEWorkspace.h; sourceTree = \"<group>\"; };\n\t\tAA95FDEB17EB48A9007D33D4 /* LNPopoverContentView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LNPopoverContentView.xib; sourceTree = \"<group>\"; };\n\t\tAA95FDED17EB4E77007D33D4 /* LNPopoverWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNPopoverWindowController.h; sourceTree = \"<group>\"; };\n\t\tAA95FDEE17EB4E77007D33D4 /* LNPopoverWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNPopoverWindowController.m; sourceTree = \"<group>\"; };\n\t\tAAAC873117ED9D4F00BF251D /* LNHorizontalLine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNHorizontalLine.h; sourceTree = \"<group>\"; };\n\t\tAAAC873217ED9D4F00BF251D /* LNHorizontalLine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNHorizontalLine.m; sourceTree = \"<group>\"; };\n\t\tAAAC873917EDA9CF00BF251D /* LNPopoverWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNPopoverWindow.h; sourceTree = \"<group>\"; };\n\t\tAAAC873A17EDA9CF00BF251D /* LNPopoverWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNPopoverWindow.m; sourceTree = \"<group>\"; };\n\t\tAAB0CD2F17C4382D0085E913 /* LNRegularExpressionPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNRegularExpressionPattern.h; sourceTree = \"<group>\"; };\n\t\tAAB0CD3017C4382D0085E913 /* LNRegularExpressionPattern.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNRegularExpressionPattern.m; sourceTree = \"<group>\"; };\n\t\tAAB0CD3217C448200085E913 /* LNRegularExpressionPattern+type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"LNRegularExpressionPattern+type.h\"; sourceTree = \"<group>\"; };\n\t\tAAB0CD3317C448200085E913 /* LNRegularExpressionPattern+type.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"LNRegularExpressionPattern+type.m\"; sourceTree = \"<group>\"; };\n\t\tAAB0CD3A17C477030085E913 /* LNDetectorTestSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNDetectorTestSet.h; sourceTree = \"<group>\"; };\n\t\tAAB0CD3B17C477030085E913 /* LNDetectorTestSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNDetectorTestSet.m; sourceTree = \"<group>\"; };\n\t\tAADDDA9217C49D4800BBA67C /* NSBundle+versions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSBundle+versions.h\"; sourceTree = \"<group>\"; };\n\t\tAADDDA9317C49D4800BBA67C /* NSBundle+versions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSBundle+versions.m\"; sourceTree = \"<group>\"; };\n\t\tAADEADB217C7B6D3001E0C65 /* LNLocalizationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNLocalizationTests.m; sourceTree = \"<group>\"; };\n\t\tAADEADB517C87298001E0C65 /* IDEIndex+Lin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"IDEIndex+Lin.h\"; sourceTree = \"<group>\"; };\n\t\tAADEADB617C87298001E0C65 /* IDEIndex+Lin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"IDEIndex+Lin.m\"; sourceTree = \"<group>\"; };\n\t\tAADEADBB17C872EB001E0C65 /* IDEEditorDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDEEditorDocument.h; sourceTree = \"<group>\"; };\n\t\tAADEADBE17C87392001E0C65 /* MethodSwizzle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MethodSwizzle.h; sourceTree = \"<group>\"; };\n\t\tAADEADBF17C87392001E0C65 /* MethodSwizzle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MethodSwizzle.m; sourceTree = \"<group>\"; };\n\t\tAAF0D6A917ECB87100B4318B /* LNTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNTableView.h; sourceTree = \"<group>\"; };\n\t\tAAF0D6AA17ECB87100B4318B /* LNTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNTableView.m; sourceTree = \"<group>\"; };\n\t\tAAF0D6AC17ECB89800B4318B /* LNTableHeaderCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNTableHeaderCell.h; sourceTree = \"<group>\"; };\n\t\tAAF0D6AD17ECB89800B4318B /* LNTableHeaderCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNTableHeaderCell.m; sourceTree = \"<group>\"; };\n\t\tAAF0D6AF17ECC4AF00B4318B /* LNTableCornerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNTableCornerView.h; sourceTree = \"<group>\"; };\n\t\tAAF0D6B017ECC4AF00B4318B /* LNTableCornerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNTableCornerView.m; sourceTree = \"<group>\"; };\n\t\tAAF0D6B217ECD8EC00B4318B /* LNButtonCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNButtonCell.h; sourceTree = \"<group>\"; };\n\t\tAAF0D6B317ECD8EC00B4318B /* LNButtonCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNButtonCell.m; sourceTree = \"<group>\"; };\n\t\tAAFE3C3E17EECF4A0018E478 /* Localizable.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = \"<group>\"; };\n\t\tF5859DBB18CABC2A009AF108 /* LNLocalizedStringCollectionOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LNLocalizedStringCollectionOperation.h; sourceTree = \"<group>\"; };\n\t\tF5859DBC18CABC2A009AF108 /* LNLocalizedStringCollectionOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LNLocalizedStringCollectionOperation.m; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tAA1B7DA017C3C1EC00A3A6D7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tAA3EC37317EB2A380003A180 /* IDEFoundation.framework in Frameworks */,\n\t\t\t\tAA3EC37417EB2A380003A180 /* IDEKit.framework in Frameworks */,\n\t\t\t\tAA3EC36F17EB2A290003A180 /* DVTFoundation.framework in Frameworks */,\n\t\t\t\tAA3EC37017EB2A290003A180 /* DVTKit.framework in Frameworks */,\n\t\t\t\tAA1B7DA717C3C1EC00A3A6D7 /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAA470D6017C3D380005CBB7F /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tAA470D6517C3D380005CBB7F /* XCTest.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tAA1B7D9A17C3C1EC00A3A6D7 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA1B7DAC17C3C1EC00A3A6D7 /* Lin */,\n\t\t\t\tAA470D6617C3D380005CBB7F /* LinTests */,\n\t\t\t\tAA1B7DA517C3C1EC00A3A6D7 /* Frameworks */,\n\t\t\t\tAA1B7DA417C3C1EC00A3A6D7 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA1B7DA417C3C1EC00A3A6D7 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA1B7DA317C3C1EC00A3A6D7 /* Lin.xcplugin */,\n\t\t\t\tAA470D6317C3D380005CBB7F /* LinTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA1B7DA517C3C1EC00A3A6D7 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA3EC37117EB2A380003A180 /* IDEFoundation.framework */,\n\t\t\t\tAA3EC37217EB2A380003A180 /* IDEKit.framework */,\n\t\t\t\tAA3EC36D17EB2A290003A180 /* DVTFoundation.framework */,\n\t\t\t\tAA3EC36E17EB2A290003A180 /* DVTKit.framework */,\n\t\t\t\tAA1B7DA617C3C1EC00A3A6D7 /* Cocoa.framework */,\n\t\t\t\tAA470D6417C3D380005CBB7F /* XCTest.framework */,\n\t\t\t\tAA1B7DA817C3C1EC00A3A6D7 /* Other Frameworks */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA1B7DA817C3C1EC00A3A6D7 /* Other Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA1B7DA917C3C1EC00A3A6D7 /* Foundation.framework */,\n\t\t\t\tAA1B7DAA17C3C1EC00A3A6D7 /* CoreData.framework */,\n\t\t\t\tAA1B7DAB17C3C1EC00A3A6D7 /* AppKit.framework */,\n\t\t\t);\n\t\t\tname = \"Other Frameworks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA1B7DAC17C3C1EC00A3A6D7 /* Lin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA93691817C4E4C700E94318 /* Xcode-Private-Classes */,\n\t\t\t\tAA20D88117ECB467006B7CA2 /* AppKit-Private-Classes */,\n\t\t\t\tAADDDA9517C49D4D00BBA67C /* Categories */,\n\t\t\t\tAA2980B517EE2CF600CF46E3 /* Shared */,\n\t\t\t\tAA470D7817C3DD42005CBB7F /* Models */,\n\t\t\t\tAADDDAA017C4A3BA00BBA67C /* Views */,\n\t\t\t\tAADDDA9C17C4A0E200BBA67C /* Controllers */,\n\t\t\t\tAA1B7DB817C3C20F00A3A6D7 /* Lin.h */,\n\t\t\t\tAA1B7DB917C3C20F00A3A6D7 /* Lin.m */,\n\t\t\t\tAADDDA9B17C4A0DA00BBA67C /* Resources */,\n\t\t\t\tAA1B7DAD17C3C1EC00A3A6D7 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = Lin;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA1B7DAD17C3C1EC00A3A6D7 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA1B7DAE17C3C1EC00A3A6D7 /* Lin-Info.plist */,\n\t\t\t\tAA1B7DAF17C3C1EC00A3A6D7 /* InfoPlist.strings */,\n\t\t\t\tAA1B7DB217C3C1EC00A3A6D7 /* Lin-Prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA20D88117ECB467006B7CA2 /* AppKit-Private-Classes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA20D88017ECB1AD006B7CA2 /* NSPopoverFrame.h */,\n\t\t\t);\n\t\t\tname = \"AppKit-Private-Classes\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA2980B517EE2CF600CF46E3 /* Shared */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA2980B217EE2C5300CF46E3 /* LNUserDefaultsManager.h */,\n\t\t\t\tAA2980B317EE2C5300CF46E3 /* LNUserDefaultsManager.m */,\n\t\t\t\tF5859DBB18CABC2A009AF108 /* LNLocalizedStringCollectionOperation.h */,\n\t\t\t\tF5859DBC18CABC2A009AF108 /* LNLocalizedStringCollectionOperation.m */,\n\t\t\t);\n\t\t\tname = Shared;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA470D6617C3D380005CBB7F /* LinTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAAB0CD3D17C478EF0085E913 /* Models */,\n\t\t\t\tAA470D7C17C3DE31005CBB7F /* LNDetectorTests.m */,\n\t\t\t\tAADEADB217C7B6D3001E0C65 /* LNLocalizationTests.m */,\n\t\t\t\tAAFE3C4017EED0950018E478 /* Resources */,\n\t\t\t\tAA470D6717C3D380005CBB7F /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = LinTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA470D6717C3D380005CBB7F /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA470D6817C3D380005CBB7F /* LinTests-Info.plist */,\n\t\t\t\tAA470D6917C3D380005CBB7F /* InfoPlist.strings */,\n\t\t\t\tAA470D6E17C3D380005CBB7F /* LinTests-Prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA470D7817C3DD42005CBB7F /* Models */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA470D5917C3CFEC005CBB7F /* LNDetector.h */,\n\t\t\t\tAA470D5A17C3CFEC005CBB7F /* LNDetector.m */,\n\t\t\t\tAA470D5C17C3D05D005CBB7F /* LNEntity.h */,\n\t\t\t\tAA470D5D17C3D05D005CBB7F /* LNEntity.m */,\n\t\t\t\tAAB0CD2F17C4382D0085E913 /* LNRegularExpressionPattern.h */,\n\t\t\t\tAAB0CD3017C4382D0085E913 /* LNRegularExpressionPattern.m */,\n\t\t\t\tAAB0CD3217C448200085E913 /* LNRegularExpressionPattern+type.h */,\n\t\t\t\tAAB0CD3317C448200085E913 /* LNRegularExpressionPattern+type.m */,\n\t\t\t\tAA7D4DAF17C74CFE0092DF8A /* LNLocalizationCollection.h */,\n\t\t\t\tAA7D4DB017C74CFE0092DF8A /* LNLocalizationCollection.m */,\n\t\t\t\tAA7D4DB217C74D0A0092DF8A /* LNLocalization.h */,\n\t\t\t\tAA7D4DB317C74D0A0092DF8A /* LNLocalization.m */,\n\t\t\t);\n\t\t\tname = Models;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA63898118C6019F0061C2C4 /* Images */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA63897118C6019A0061C2C4 /* icon_plus@2x.png */,\n\t\t\t\tAA63897518C6019A0061C2C4 /* icon_plus.png */,\n\t\t\t\tAA63897218C6019A0061C2C4 /* icon_minus.png */,\n\t\t\t\tAA63897318C6019A0061C2C4 /* icon_minus@2x.png */,\n\t\t\t\tAA63897618C6019A0061C2C4 /* icon_detach@2x.png */,\n\t\t\t\tAA63897818C6019A0061C2C4 /* icon_detach.png */,\n\t\t\t\tAA63897718C6019A0061C2C4 /* icon120@2x.png */,\n\t\t\t\tAA63897418C6019A0061C2C4 /* icon120.png */,\n\t\t\t);\n\t\t\tname = Images;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA93691817C4E4C700E94318 /* Xcode-Private-Classes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA93691517C4E4C000E94318 /* IDEWorkspace.h */,\n\t\t\t\tAA11AC4017C66F0200889DFB /* DVTFilePath.h */,\n\t\t\t\tAA11AC4317C6746800889DFB /* IDEIndex.h */,\n\t\t\t\tAA11AC4617C6755400889DFB /* IDEIndexCollection.h */,\n\t\t\t\tAADEADBB17C872EB001E0C65 /* IDEEditorDocument.h */,\n\t\t\t\tAA7B0CAD17F4228E0004FE3B /* DVTDualProxyWindow.h */,\n\t\t\t\tAA7B0CB017F4229D0004FE3B /* IDEWorkspaceWindow.h */,\n\t\t\t\tAA7B0CB317F422BB0004FE3B /* DVTSourceTextView.h */,\n\t\t\t);\n\t\t\tname = \"Xcode-Private-Classes\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAAB0CD3D17C478EF0085E913 /* Models */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAAB0CD3A17C477030085E913 /* LNDetectorTestSet.h */,\n\t\t\t\tAAB0CD3B17C477030085E913 /* LNDetectorTestSet.m */,\n\t\t\t);\n\t\t\tname = Models;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAADDDA9517C49D4D00BBA67C /* Categories */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAADEADBE17C87392001E0C65 /* MethodSwizzle.h */,\n\t\t\t\tAADEADBF17C87392001E0C65 /* MethodSwizzle.m */,\n\t\t\t\tAADDDA9217C49D4800BBA67C /* NSBundle+versions.h */,\n\t\t\t\tAADDDA9317C49D4800BBA67C /* NSBundle+versions.m */,\n\t\t\t\tAADEADB517C87298001E0C65 /* IDEIndex+Lin.h */,\n\t\t\t\tAADEADB617C87298001E0C65 /* IDEIndex+Lin.m */,\n\t\t\t\tAA20D87D17ECB12A006B7CA2 /* NSPopoverFrame+Lin.h */,\n\t\t\t\tAA20D87E17ECB12A006B7CA2 /* NSPopoverFrame+Lin.m */,\n\t\t\t\tAA8F8EEE17EDFC68004964FB /* NSTableView+editedColumnIdentifier.h */,\n\t\t\t\tAA8F8EEF17EDFC68004964FB /* NSTableView+editedColumnIdentifier.m */,\n\t\t\t);\n\t\t\tname = Categories;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAADDDA9B17C4A0DA00BBA67C /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA95FDEB17EB48A9007D33D4 /* LNPopoverContentView.xib */,\n\t\t\t\tAA02CE8A17EE08240041C2BD /* LNAlertAccessoryView.xib */,\n\t\t\t\tAA63898118C6019F0061C2C4 /* Images */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAADDDA9C17C4A0E200BBA67C /* Controllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA95FDED17EB4E77007D33D4 /* LNPopoverWindowController.h */,\n\t\t\t\tAA95FDEE17EB4E77007D33D4 /* LNPopoverWindowController.m */,\n\t\t\t);\n\t\t\tname = Controllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAADDDAA017C4A3BA00BBA67C /* Views */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAAAC873917EDA9CF00BF251D /* LNPopoverWindow.h */,\n\t\t\t\tAAAC873A17EDA9CF00BF251D /* LNPopoverWindow.m */,\n\t\t\t\tAA36376417D9EF9E003C5E55 /* LNPopoverContentView.h */,\n\t\t\t\tAA36376517D9EF9E003C5E55 /* LNPopoverContentView.m */,\n\t\t\t\tAAF0D6A917ECB87100B4318B /* LNTableView.h */,\n\t\t\t\tAAF0D6AA17ECB87100B4318B /* LNTableView.m */,\n\t\t\t\tAAF0D6AF17ECC4AF00B4318B /* LNTableCornerView.h */,\n\t\t\t\tAAF0D6B017ECC4AF00B4318B /* LNTableCornerView.m */,\n\t\t\t\tAAF0D6AC17ECB89800B4318B /* LNTableHeaderCell.h */,\n\t\t\t\tAAF0D6AD17ECB89800B4318B /* LNTableHeaderCell.m */,\n\t\t\t\tAAF0D6B217ECD8EC00B4318B /* LNButtonCell.h */,\n\t\t\t\tAAF0D6B317ECD8EC00B4318B /* LNButtonCell.m */,\n\t\t\t\tAAAC873117ED9D4F00BF251D /* LNHorizontalLine.h */,\n\t\t\t\tAAAC873217ED9D4F00BF251D /* LNHorizontalLine.m */,\n\t\t\t\tAA02CE8C17EE083A0041C2BD /* LNAlertAccessoryView.h */,\n\t\t\t\tAA02CE8D17EE083A0041C2BD /* LNAlertAccessoryView.m */,\n\t\t\t\tAA6377CC18C5CCFC005EADC7 /* LNImageButtonCell.h */,\n\t\t\t\tAA6377CD18C5CCFC005EADC7 /* LNImageButtonCell.m */,\n\t\t\t);\n\t\t\tname = Views;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAAFE3C4017EED0950018E478 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAAFE3C3E17EECF4A0018E478 /* Localizable.strings */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tAA1B7DA217C3C1EC00A3A6D7 /* Lin */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = AA1B7DB517C3C1EC00A3A6D7 /* Build configuration list for PBXNativeTarget \"Lin\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tAA1B7D9F17C3C1EC00A3A6D7 /* Sources */,\n\t\t\t\tAA1B7DA017C3C1EC00A3A6D7 /* Frameworks */,\n\t\t\t\tAA1B7DA117C3C1EC00A3A6D7 /* 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 = Lin;\n\t\t\tproductName = Lin;\n\t\t\tproductReference = AA1B7DA317C3C1EC00A3A6D7 /* Lin.xcplugin */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n\t\tAA470D6217C3D380005CBB7F /* LinTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = AA470D7117C3D380005CBB7F /* Build configuration list for PBXNativeTarget \"LinTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tAA470D5F17C3D380005CBB7F /* Sources */,\n\t\t\t\tAA470D6017C3D380005CBB7F /* Frameworks */,\n\t\t\t\tAA470D6117C3D380005CBB7F /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tAA470D7017C3D380005CBB7F /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = LinTests;\n\t\t\tproductName = LinTests;\n\t\t\tproductReference = AA470D6317C3D380005CBB7F /* LinTests.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\tAA1B7D9B17C3C1EC00A3A6D7 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0610;\n\t\t\t\tORGANIZATIONNAME = \"Tanaka Katsuma\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tAA470D6217C3D380005CBB7F = {\n\t\t\t\t\t\tTestTargetID = AA1B7DA217C3C1EC00A3A6D7;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = AA1B7D9E17C3C1EC00A3A6D7 /* Build configuration list for PBXProject \"Lin\" */;\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 = AA1B7D9A17C3C1EC00A3A6D7;\n\t\t\tproductRefGroup = AA1B7DA417C3C1EC00A3A6D7 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tAA1B7DA217C3C1EC00A3A6D7 /* Lin */,\n\t\t\t\tAA470D6217C3D380005CBB7F /* LinTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tAA1B7DA117C3C1EC00A3A6D7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tAA63897B18C6019A0061C2C4 /* icon_minus@2x.png in Resources */,\n\t\t\t\tAA63897F18C6019A0061C2C4 /* icon120@2x.png in Resources */,\n\t\t\t\tAA63898018C6019A0061C2C4 /* icon_detach.png in Resources */,\n\t\t\t\tAA63897A18C6019A0061C2C4 /* icon_minus.png in Resources */,\n\t\t\t\tAA95FDEC17EB48A9007D33D4 /* LNPopoverContentView.xib in Resources */,\n\t\t\t\tAA63897C18C6019A0061C2C4 /* icon120.png in Resources */,\n\t\t\t\tAA63897D18C6019A0061C2C4 /* icon_plus.png in Resources */,\n\t\t\t\tAA63897E18C6019A0061C2C4 /* icon_detach@2x.png in Resources */,\n\t\t\t\tAA63897918C6019A0061C2C4 /* icon_plus@2x.png in Resources */,\n\t\t\t\tAA02CE8B17EE08240041C2BD /* LNAlertAccessoryView.xib in Resources */,\n\t\t\t\tAA1B7DB117C3C1EC00A3A6D7 /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAA470D6117C3D380005CBB7F /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tAA470D6B17C3D380005CBB7F /* InfoPlist.strings in Resources */,\n\t\t\t\tAAFE3C3F17EECF4A0018E478 /* Localizable.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tAA1B7D9F17C3C1EC00A3A6D7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tAA7D4DB117C74CFE0092DF8A /* LNLocalizationCollection.m in Sources */,\n\t\t\t\tAAF0D6B417ECD8EC00B4318B /* LNButtonCell.m in Sources */,\n\t\t\t\tAAF0D6B117ECC4AF00B4318B /* LNTableCornerView.m in Sources */,\n\t\t\t\tAAB0CD3417C448200085E913 /* LNRegularExpressionPattern+type.m in Sources */,\n\t\t\t\tAADDDA9417C49D4800BBA67C /* NSBundle+versions.m in Sources */,\n\t\t\t\tAAAC873B17EDA9CF00BF251D /* LNPopoverWindow.m in Sources */,\n\t\t\t\tAA8F8EF017EDFC68004964FB /* NSTableView+editedColumnIdentifier.m in Sources */,\n\t\t\t\tAA6377CE18C5CCFC005EADC7 /* LNImageButtonCell.m in Sources */,\n\t\t\t\tAA20D87F17ECB12A006B7CA2 /* NSPopoverFrame+Lin.m in Sources */,\n\t\t\t\tAA02CE8E17EE083A0041C2BD /* LNAlertAccessoryView.m in Sources */,\n\t\t\t\tAA36376617D9EF9E003C5E55 /* LNPopoverContentView.m in Sources */,\n\t\t\t\tAA470D5E17C3D05D005CBB7F /* LNEntity.m in Sources */,\n\t\t\t\tAA7D4DB417C74D0A0092DF8A /* LNLocalization.m in Sources */,\n\t\t\t\tAAB0CD3117C4382D0085E913 /* LNRegularExpressionPattern.m in Sources */,\n\t\t\t\tAA1B7DBA17C3C20F00A3A6D7 /* Lin.m in Sources */,\n\t\t\t\tAAF0D6AE17ECB89800B4318B /* LNTableHeaderCell.m in Sources */,\n\t\t\t\tAAAC873317ED9D4F00BF251D /* LNHorizontalLine.m in Sources */,\n\t\t\t\tAADEADB717C87298001E0C65 /* IDEIndex+Lin.m in Sources */,\n\t\t\t\tAAF0D6AB17ECB87100B4318B /* LNTableView.m in Sources */,\n\t\t\t\tAA2980B417EE2C5300CF46E3 /* LNUserDefaultsManager.m in Sources */,\n\t\t\t\tAA95FDEF17EB4E77007D33D4 /* LNPopoverWindowController.m in Sources */,\n\t\t\t\tAADEADC017C87392001E0C65 /* MethodSwizzle.m in Sources */,\n\t\t\t\tF5859DBD18CABC2A009AF108 /* LNLocalizedStringCollectionOperation.m in Sources */,\n\t\t\t\tAA470D5B17C3CFEC005CBB7F /* LNDetector.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAA470D5F17C3D380005CBB7F /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tAAFE3C4117EED36C0018E478 /* LNLocalizationCollection.m in Sources */,\n\t\t\t\tAADEADB417C7B838001E0C65 /* LNLocalization.m in Sources */,\n\t\t\t\tAAB0CD3C17C477030085E913 /* LNDetectorTestSet.m in Sources */,\n\t\t\t\tAAB0CD3717C46B070085E913 /* LNEntity.m in Sources */,\n\t\t\t\tAAB0CD3817C46B070085E913 /* LNRegularExpressionPattern.m in Sources */,\n\t\t\t\tAAB0CD3917C46B070085E913 /* LNRegularExpressionPattern+type.m in Sources */,\n\t\t\t\tAAB0CD3617C46A730085E913 /* LNDetector.m in Sources */,\n\t\t\t\tAA470D7D17C3DE31005CBB7F /* LNDetectorTests.m in Sources */,\n\t\t\t\tAADEADB317C7B6D3001E0C65 /* LNLocalizationTests.m 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\tAA470D7017C3D380005CBB7F /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = AA1B7DA217C3C1EC00A3A6D7 /* Lin */;\n\t\t\ttargetProxy = AA470D6F17C3D380005CBB7F /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\tAA1B7DAF17C3C1EC00A3A6D7 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tAA1B7DB017C3C1EC00A3A6D7 /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAA470D6917C3D380005CBB7F /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tAA470D6A17C3D380005CBB7F /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\tAA1B7DB317C3C1EC00A3A6D7 /* 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__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = 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;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.7;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tAA1B7DB417C3C1EC00A3A6D7 /* 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__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = 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;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.7;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tAA1B7DB617C3C1EC00A3A6D7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEPLOYMENT_LOCATION = YES;\n\t\t\t\tDSTROOT = \"$(HOME)\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/SharedFrameworks\",\n\t\t\t\t\t\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Frameworks\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Lin/Lin-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Lin/Lin-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"/Library/Application Support/Developer/Shared/Xcode/Plug-ins\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = xcplugin;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tAA1B7DB717C3C1EC00A3A6D7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEPLOYMENT_LOCATION = YES;\n\t\t\t\tDSTROOT = \"$(HOME)\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/SharedFrameworks\",\n\t\t\t\t\t\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Frameworks\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Lin/Lin-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Lin/Lin-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"/Library/Application Support/Developer/Shared/Xcode/Plug-ins\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = xcplugin;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tAA470D7217C3D380005CBB7F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"LinTests/LinTests-Prefix.pch\";\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 = \"LinTests/LinTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tAA470D7317C3D380005CBB7F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"LinTests/LinTests-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"LinTests/LinTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tAA1B7D9E17C3C1EC00A3A6D7 /* Build configuration list for PBXProject \"Lin\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tAA1B7DB317C3C1EC00A3A6D7 /* Debug */,\n\t\t\t\tAA1B7DB417C3C1EC00A3A6D7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tAA1B7DB517C3C1EC00A3A6D7 /* Build configuration list for PBXNativeTarget \"Lin\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tAA1B7DB617C3C1EC00A3A6D7 /* Debug */,\n\t\t\t\tAA1B7DB717C3C1EC00A3A6D7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tAA470D7117C3D380005CBB7F /* Build configuration list for PBXNativeTarget \"LinTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tAA470D7217C3D380005CBB7F /* Debug */,\n\t\t\t\tAA470D7317C3D380005CBB7F /* 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 = AA1B7D9B17C3C1EC00A3A6D7 /* Project object */;\n}\n"
  },
  {
    "path": "Lin.xcodeproj/xcshareddata/xcschemes/Lin.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0610\"\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 = \"AA1B7DA217C3C1EC00A3A6D7\"\n               BuildableName = \"Lin.xcplugin\"\n               BlueprintName = \"Lin\"\n               ReferencedContainer = \"container:Lin.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 = \"AA470D6217C3D380005CBB7F\"\n               BuildableName = \"LinTests.xctest\"\n               BlueprintName = \"LinTests\"\n               ReferencedContainer = \"container:Lin.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\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      <PathRunnable\n         FilePath = \"/Applications/Xcode.app\">\n      </PathRunnable>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"AA1B7DA217C3C1EC00A3A6D7\"\n            BuildableName = \"Lin.xcplugin\"\n            BlueprintName = \"Lin\"\n            ReferencedContainer = \"container:Lin.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n         <AdditionalOption\n            key = \"NSZombieEnabled\"\n            value = \"YES\"\n            isEnabled = \"YES\">\n         </AdditionalOption>\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"
  },
  {
    "path": "Lin.xcodeproj/xcshareddata/xcschemes/LinTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0610\"\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 = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"AA470D6217C3D380005CBB7F\"\n               BuildableName = \"LinTests.xctest\"\n               BlueprintName = \"LinTests\"\n               ReferencedContainer = \"container:Lin.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 = \"AA470D6217C3D380005CBB7F\"\n               BuildableName = \"LinTests.xctest\"\n               BlueprintName = \"LinTests\"\n               ReferencedContainer = \"container:Lin.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\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 = \"AA470D6217C3D380005CBB7F\"\n            BuildableName = \"LinTests.xctest\"\n            BlueprintName = \"LinTests\"\n            ReferencedContainer = \"container:Lin.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"
  },
  {
    "path": "LinTests/LNDetectorTestSet.h",
    "content": "//\n//  LNDetectorTestSet.h\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface LNDetectorTestSet : NSObject\n\n@property (nonatomic, copy, readonly) NSString *string;\n@property (nonatomic, copy, readonly) NSArray *keys;\n\n- (instancetype)initWithString:(NSString *)string keys:(NSString *)keyValue, ... NS_REQUIRES_NIL_TERMINATION;\n\n@end\n"
  },
  {
    "path": "LinTests/LNDetectorTestSet.m",
    "content": "//\n//  LNDetectorTestSet.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import \"LNDetectorTestSet.h\"\n\n@interface LNDetectorTestSet ()\n\n@property (nonatomic, copy, readwrite) NSString *string;\n@property (nonatomic, copy, readwrite) NSArray *keys;\n\n@end\n\n@implementation LNDetectorTestSet\n\n- (instancetype)initWithString:(NSString *)string keys:(NSString *)keyValue, ...\n{\n    self = [super init];\n    \n    if (self) {\n        self.string = string;\n        \n        va_list arguments;\n        va_start(arguments, keyValue);\n        \n        NSString *key = keyValue;\n        NSMutableArray *keys = [NSMutableArray array];\n        \n        while (key) {\n            [keys addObject:key];\n            \n            key = va_arg(arguments, typeof(NSString *));\n        }\n        \n        self.keys = [keys copy];\n        \n        va_end(arguments);\n    }\n    \n    return self;\n}\n\n@end\n"
  },
  {
    "path": "LinTests/LNDetectorTests.m",
    "content": "//\n//  LNDetectorTests.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/21.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <XCTest/XCTest.h>\n\n// Models\n#import \"LNDetector.h\"\n#import \"LNEntity.h\"\n#import \"LNDetectorTestSet.h\"\n\n@interface LNDetectorTests : XCTestCase\n\n@property (nonatomic, strong) LNDetector *detector;\n\n- (void)performTests:(LNDetectorTestSet *)testSetValue, ... NS_REQUIRES_NIL_TERMINATION;\n\n@end\n\n@implementation LNDetectorTests\n\n- (void)setUp\n{\n    [super setUp];\n    \n    LNDetector *detector = [LNDetector detector];\n    self.detector = detector;\n}\n\n- (void)tearDown\n{\n    [super tearDown];\n}\n\n- (void)testLocalizedString\n{\n    [self performTests:\n     [[LNDetectorTestSet alloc] initWithString:@\"NSLocalizedString(@\\\"key\\\", nil);\"\n                                          keys:@\"key\", nil],\n     \n     [[LNDetectorTestSet alloc] initWithString:@\"NSLocalizedString ( @\\\"key\\\" , nil );\"\n                                          keys:@\"key\", nil],\n     [[LNDetectorTestSet alloc] initWithString:@\"NSString *value = NSLocalizedString(@\\\"key\\\", nil);\"\n                                          keys:@\"key\", nil],\n     [[LNDetectorTestSet alloc] initWithString:@\"NSLog(@\\\"value1 = %@, value2 = %@\\\", NSLocalizedString(@\\\"key1\\\", nil), NSLocalizedString(@\\\"key2\\\", nil));\"\n                                          keys:@\"key1\", @\"key2\", nil],\n     nil];\n}\n\n- (void)testLocalizedStringForKey\n{\n    [self performTests:\n     [[LNDetectorTestSet alloc] initWithString:@\"[[NSBundle mainBundle] localizedStringForKey:@\\\"key\\\" value:@\\\"default_value\\\" table:@\\\"table_name\\\"];\"\n                                          keys:@\"key\", nil],\n     nil];\n}\n\n- (void)testLocalizedStringFromTable\n{\n    [self performTests:\n     [[LNDetectorTestSet alloc] initWithString:@\"NSLocalizedStringFromTable(@\\\"key\\\", @\\\"table_name\\\", @\\\"comment\\\");\"\n                                          keys:@\"key\", nil],\n     nil];\n}\n\n- (void)testLocalizedStringFromTableInBundle\n{\n    [self performTests:\n     [[LNDetectorTestSet alloc] initWithString:@\"NSLocalizedStringFromTableInBundle(@\\\"key\\\", @\\\"table_name\\\", [NSBundle mainBundle], @\\\"comment\\\");\"\n                                          keys:@\"key\", nil],\n     nil];\n}\n\n- (void)testLocalizedStringWithDefaultValue\n{\n    [self performTests:\n     [[LNDetectorTestSet alloc] initWithString:@\"NSLocalizedStringWithDefaultValue(@\\\"key\\\", @\\\"table_name\\\", [NSBundle mainBundle], @\\\"default_value\\\", @\\\"comment\\\");\"\n                                          keys:@\"key\", nil],\n     nil];\n}\n\n- (void)performTests:(LNDetectorTestSet *)testSetValue, ...\n{\n    // Parse arguments\n    va_list arguments;\n    va_start(arguments, testSetValue);\n    \n    LNDetectorTestSet *testSet = testSetValue;\n    NSMutableArray *testSets = [NSMutableArray array];\n    \n    while (testSet) {\n        [testSets addObject:testSet];\n        \n        testSet = va_arg(arguments, typeof(LNDetectorTestSet *));\n    }\n    \n    va_end(arguments);\n    \n    // Do tests\n    for (LNDetectorTestSet *testSet in testSets) {\n        NSArray *entities = [self.detector entitiesInString:testSet.string];\n        XCTAssertTrue(entities.count == testSet.keys.count); // Number of detected entities and expected keys are equal.\n        \n        for (LNEntity *entity in entities) {\n            NSUInteger indexOfEntity = [entities indexOfObject:entity];\n            NSString *keyString = [testSet.string substringWithRange:entity.keyRange];\n            XCTAssertEqualObjects(keyString, testSet.keys[indexOfEntity]); // Extracted key is equal to expected key.\n        }\n    }\n}\n\n@end\n"
  },
  {
    "path": "LinTests/LNLocalizationTests.m",
    "content": "//\n//  LNLocalizationTests.m\n//  Lin\n//\n//  Created by Tanaka Katsuma on 2013/08/24.\n//  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n//\n\n#import <XCTest/XCTest.h>\n\n// Models\n#import \"LNLocalizationCollection.h\"\n#import \"LNLocalization.h\"\n\n@interface LNLocalizationTests : XCTestCase\n\n@end\n\n@implementation LNLocalizationTests\n\n- (NSBundle *)testBundle\n{\n    for (NSBundle *bundle in [NSBundle allBundles]) {\n        if ([[bundle bundleIdentifier] isEqualToString:@\"jp.questbeat.LinTests\"]) {\n            return bundle;\n        }\n    }\n    \n    return nil;\n}\n\n- (void)testParsingPatterns\n{\n    NSString *filePath = [[self testBundle] pathForResource:@\"Localizable\" ofType:@\"strings\"];\n    LNLocalizationCollection *collection = [LNLocalizationCollection localizationCollectionWithContentsOfFile:filePath];\n    \n    struct LNLocalizationTestSet {\n        __unsafe_unretained NSString *key;\n        __unsafe_unretained NSString *value;\n    } testSets[] = {\n        {@\"key0\",   @\"value0\"},\n        {@\"key1\",   @\"value1\"},\n        {@\"key2\",   @\"value2\"},\n        {@\"key3\",   @\"value3\"},\n        {@\"key4\",   @\"value4\"},\n        {@\"key5\",   @\"value5\"},\n        {@\"key6\",   @\"value6\"},\n        {@\"key7\",   @\"value7\"},\n        {@\"key8\",   @\"value8\"},\n        {@\"key 9\",  @\"value9\"},\n        {@\"key 10\", @\"value10\"},\n        {@\"key 11\", @\"value11\"},\n        {@\"key 12\", @\"value12\"},\n        {@\"key 13\", @\"value13\"},\n        {@\"key 14\", @\"value14\"},\n        {@\"key 15\", @\"value15\"},\n        {@\"key 16\", @\"value16\"},\n        {@\"key.17\", @\"value17\"},\n        {@\"key.18\", @\"value18\"},\n        {@\"key.19\", @\"value19\"},\n        {@\"key.20\", @\"value20\"},\n        {@\"key.21\", @\"value21\"}\n    };\n    \n    NSInteger numberOfTestSets = sizeof(testSets) / sizeof(struct LNLocalizationTestSet);\n    \n    for (NSInteger i = 0; i < numberOfTestSets; i++) {\n        LNLocalization *localization = [LNLocalization localizationWithKey:testSets[i].key\n                                                                     value:testSets[i].value\n                                                               entityRange:NSMakeRange(0, 0)\n                                                                  keyRange:NSMakeRange(0, 0)\n                                                                valueRange:NSMakeRange(0, 0)\n                                                                collection:nil];\n        \n        XCTAssertTrue([collection.localizations containsObject:localization]);\n    }\n}\n\n@end\n"
  },
  {
    "path": "LinTests/LinTests-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>jp.questbeat.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</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": "LinTests/LinTests-Prefix.pch",
    "content": "//\n//  Prefix header\n//\n//  The contents of this file are implicitly included at the beginning of every source file.\n//\n\n#ifdef __OBJC__\n    #import <Cocoa/Cocoa.h>\n#endif\n\n// Fix Xcode 5 confusion about #defines\n#undef NULL\n#define NULL ((void*)0)\n"
  },
  {
    "path": "LinTests/Localizable.strings",
    "content": "/* \n  Localizable.strings\n  Lin\n\n  Created by Tanaka Katsuma on 2013/09/22.\n  Copyright (c) 2013年 Tanaka Katsuma. All rights reserved.\n*/\n\nkey0 = \"value0\";\n key1 = \"value1\";\nkey2= \"value2\";\nkey3=\"value3\";\n\"key4\" = \"value4\";\n\"key5\" = \"value5\";\n\"key6\"= \"value6\";\n\"key7\"=\"value7\";\nkey8\t=\t\"value8\";\n\"key 9\"=\"value9\";\n\"key 10\"\t=\"value10\";\n \"key 11\"=\"value11\";\n \"key 12\" =\"value12\";\n\"key 13\" = \"value13\";\n\"key 14\" =\t\"value14\";\n\t\"key 15\"\t=\"value15\";\n\t\"key 16\"\t=\t\"value16\";\n\"key.17\"\t=\t\"value17\";\nkey.18\t=\t\"value18\";\n key.19\t=\t\"value19\";\n key.20=\"value20\";\nkey.21=\"value21\";\n"
  },
  {
    "path": "LinTests/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "Makefile",
    "content": "clean:\n\txcodebuild \\\n\t\t-project Lin.xcodeproj \\\n\t\tclean\n\ntest:\n\txcodebuild \\\n\t\t-project Lin.xcodeproj \\\n\t\t-scheme LinTests \\\n\t\t-configuration Debug \\\n\t\ttest\n\n"
  },
  {
    "path": "README.md",
    "content": "# Lin\nLin is a open source plug-in for **Xcode 5**.  \nIt lets you search/manage localizations without opening the .strings files.\n\n[![Build Status](https://travis-ci.org/questbeat/Lin-Xcode5.svg?branch=master)](https://travis-ci.org/questbeat/Lin-Xcode5)\n\n![01.png](https://raw.github.com/questbeat/Lin-Xcode5/master/screenshots/01.png)\n\n\n## Note: Xcode 6 or later\nThis version does not support Xcode 6 or later.  \nPlease use the latest version of [questbeat/Lin](https://github.com/questbeat/Lin).\n\n\n## Features\nWhen you are focusing on NSLocalizedString or other functions to get a localized version of a string, Lin shows the list of localizations that contains the inputted key string.\n\n![02.gif](https://raw.github.com/questbeat/Lin-Xcode5/master/screenshots/02.gif)\n\nYou can add a new localization or remove a localization from the popover.  \n(Click +/- button in the bottom left of the popover.)\n\n![03.gif](https://raw.github.com/questbeat/Lin-Xcode5/master/screenshots/03.png)\n\nYou can also edit key or value of a localization by clicking the row on the table.\n\n![04.png](https://raw.github.com/questbeat/Lin-Xcode5/master/screenshots/04.png)\n\nLin has not only popover mode, but also window mode.  \nThe window will appear when you drag-and-drop the popover.  \nIn window mode, the search field can be used to find the localization with a free keyword.\n\n![05.gif](https://raw.github.com/questbeat/Lin-Xcode5/master/screenshots/05.gif)\n\n\n## Installation\nDownload the project and build it, then relaunch Xcode.  \nLin will be installed in `~/Library/Application Support/Developer/Shared/Xcode/Plug-ins` automatically.\n\nIf you want to uninstall Lin, remove Lin.xcplugin in `Plug-ins` directory.\n\n\n## Settings\nYou can enable/disable Lin or show window manually by opening the Lin menu in the Editor menu in Xcode.\n\n![06.png](https://raw.github.com/questbeat/Lin-Xcode5/master/screenshots/06.png)\n\n\n## Notes\n* `.strings` files must be UTF-8\n* Supported functions:\n  * NSLocalizedString\n  * NSLocalizedStringFromTable\n  * NSLocalizedStringFromTableInBundle\n  * NSLocalizedStringWithDefaultValue\n  * localizedStringForKey:value:table:\n* After modifying a `.string` file, don't forget to save otherwise new strings won't appear in completion popup\n\n\n## License\n*Lin* is released under the **MIT License**, see *LICENSE.txt*.\n"
  }
]