diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/.gitignore new file mode 100644 index 0000000..0205d62 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/.gitignore @@ -0,0 +1,2 @@ +*.pyc +.DS_Store diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.py new file mode 100644 index 0000000..164d7de --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.py @@ -0,0 +1,581 @@ +import os +import sublime +import sublime_plugin +import re +import logging +import errno + +SETTINGS = [ + "alias", + "default_initial", + "use_cursor_text", + "show_files", + "show_path", + "default_root", + "default_path", + "default_folder_index", + "os_specific_alias", + "ignore_case", + "alias_root", + "alias_path", + "alias_folder_index", + "debug", + "auto_refresh_sidebar" +] +VIEW_NAME = "AdvancedNewFileCreation" +WIN_ROOT_REGEX = r"[a-zA-Z]:(/|\\)" +NIX_ROOT_REGEX = r"^/" +HOME_REGEX = r"^~" + +# Set up logger +logging.basicConfig(format='[AdvancedNewFile] %(levelname)s %(message)s') +logger = logging.getLogger() + + +class AdvancedNewFileCommand(sublime_plugin.WindowCommand): + def run(self, is_python=False): + self.PLATFORM = sublime.platform().lower() + self.root = None + self.alias_root = None + self.top_level_split_char = ":" + self.is_python = is_python + self.view = self.window.active_view() + + # Settings will be based on the view + settings = get_settings(self.view) + self.aliases = self.get_aliases(settings) + self.show_path = settings.get("show_path") + self.auto_refresh_sidebar = settings.get("auto_refresh_sidebar") + self.default_folder_index = settings.get("default_folder_index") + self.alias_folder_index = settings.get("alias_folder_index") + default_root = self.get_default_root(settings.get("default_root")) + if default_root == "path": + self.root = os.path.expanduser(settings.get("default_path")) + default_root = "" + self.root, path = self.split_path(default_root) + + # Set some default values for the auto complete + PathAutocomplete.set_show_files(settings.get("show_files")) + PathAutocomplete.set_aliases(self.aliases) + PathAutocomplete.set_ignore_case(settings.get("ignore_case")) + + # Search for initial string + path = settings.get("default_initial", "") + if settings.get("use_cursor_text", False): + tmp = self.get_cursor_path() + if tmp != "": + path = tmp + + alias_root = self.get_default_root(settings.get("alias_root"), True) + if alias_root == "path": + self.alias_root = os.path.expanduser(settings.get("alias_path")) + alias_root = "" + self.alias_root, tmp = self.split_path(alias_root, True) + + debug = settings.get("debug") or False + if debug: + logger.setLevel(logging.DEBUG) + else: + logger.setLevel(logging.ERROR) + # Get user input + self.show_filename_input(path) + + def get_aliases(self, settings): + aliases = settings.get("alias") + all_os_aliases = settings.get("os_specific_alias") + for key in all_os_aliases: + if self.PLATFORM in all_os_aliases.get(key): + aliases[key] = all_os_aliases.get(key).get(self.PLATFORM) + + return aliases + + def get_default_root(self, string, is_alias=False): + root = "" + + if string == "home": + root = "~/" + elif string == "current": + root = self.top_level_split_char + elif string == "project_folder": + if is_alias: + folder_index = self.alias_folder_index + else: + folder_index = self.default_folder_index + if len(self.window.folders()) <= folder_index: + if is_alias: + self.alias_folder_index = 0 + else: + self.default_folder_index = 0 + elif string == "top_folder": + if is_alias: + self.alias_folder_index = 0 + else: + self.default_folder_index = 0 + elif string == "path": + root = "path" + else: + logger.error("Invalid specifier for \"default_root\"") + return root + + def split_path(self, path="", is_alias=False): + HOME_REGEX = r"^~[/\\]" + root = None + try: + # Parse windows root + if self.PLATFORM == "windows": + if re.match(WIN_ROOT_REGEX, path): + root = path[0:3] + path = path[3:] + + # Parse if alias + if self.top_level_split_char in path and root == None: + parts = path.rsplit(self.top_level_split_char, 1) + root, path = self.translate_alias(parts[0]) + path_list = [] + if path != "": + path_list.append(path) + if parts[1] != "": + path_list.append(parts[1]) + path = self.top_level_split_char.join(path_list) + # Parse if tilde used + elif re.match(HOME_REGEX, path) and root == None: + root = os.path.expanduser("~") + path = path[2:] + + # Default + if root == None: + if is_alias: + root = self.alias_root + folder_index = self.alias_folder_index + else: + root = self.root + folder_index = self.default_folder_index + root = root or self.window.folders()[folder_index] + except IndexError: + root = os.path.expanduser("~") + return root, path + + def translate_alias(self, path): + root = None + split_path = None + if path == "" and self.view is not None: + filename = self.view.file_name() + if filename is not None: + root = os.path.dirname(filename) + else: + split_path = path.split(self.top_level_split_char) + join_index = len(split_path) - 1 + target = path + root_found = False + while join_index >= 0 and not root_found: + # Folder aliases + for folder in self.window.folders(): + basename = os.path.basename(folder) + if basename == target: + root = folder + root_found = True + break + # Aliases from settings. + for alias in self.aliases.keys(): + if alias == target: + alias_path = self.aliases.get(alias) + if re.search(HOME_REGEX, alias_path) is None: + if self.PLATFORM == "windows": + if re.search(WIN_ROOT_REGEX, alias_path) is None: + root = os.path.join(self.alias_root, alias_path) + break + else: + if re.search(NIX_ROOT_REGEX, alias_path) is None: + root = os.path.join(self.alias_root, alias_path) + break + root = os.path.expanduser(alias_path) + root_found = True + break + remove = re.escape(split_path[join_index]) + target = re.sub(r":%s$" % remove, "", target) + join_index -= 1 + + if root is None: + return None, path + elif split_path is None: + return os.path.abspath(root), "" + else: + # Add to index so we re + join_index += 2 + return os.path.abspath(root), self.top_level_split_char.join(split_path[join_index:]) + + def show_filename_input(self, initial=''): + caption = 'Enter a path for a new file' + if self.is_python: + caption = '%s (creates __init__.py in new dirs)' % caption + view = self.window.show_input_panel( + caption, initial, + self.entered_filename, self.update_filename_input, self.clear + ) + + view.set_name(VIEW_NAME) + temp = view.settings().get("word_separators") + temp = temp.replace(".", "") + view.settings().set("word_separators", temp) + view.settings().set("auto_complete_commit_on_tab", True) + view.settings().set("tab_completion", True) + + PathAutocomplete.set_view_id(view.id()) + PathAutocomplete.set_root(self.root, True) + + def update_filename_input(self, path_in): + base, path = self.split_path(path_in) + if self.top_level_split_char in path_in or re.match(r"^~[/\\]", path_in): + PathAutocomplete.set_root(base, False) + else: + PathAutocomplete.set_root(base, True) + + creation_path = self.generate_creation_path(base, path) + if self.show_path: + if self.view != None: + self.view.set_status("AdvancedNewFile", "Creating file at %s " % \ + creation_path) + else: + sublime.status_message("Creating file at %s " % creation_path) + logger.debug("Creation path is '%s'" % creation_path) + PathAutocomplete.set_path(path) + + def generate_creation_path(self, base, path): + if self.PLATFORM == "windows": + if not re.match(WIN_ROOT_REGEX, base): + return base + self.top_level_split_char + path + else: + if not re.match(NIX_ROOT_REGEX, base): + return base + self.top_level_split_char + path + + return os.path.abspath(os.path.join(base, path)) + + def entered_filename(self, filename): + # Check if valid root specified for windows. + if self.PLATFORM == "windows": + if re.match(WIN_ROOT_REGEX, filename): + root = filename[0:3] + if not os.path.isdir(root): + sublime.error_message(root + " is not a valid root.") + self.clear() + return + + base, path = self.split_path(filename) + file_path = os.path.join(base, path) + # Check for invalid alias specified. + if self.top_level_split_char in filename and \ + not (self.PLATFORM == "windows" and re.match(WIN_ROOT_REGEX, base)) and \ + not (self.PLATFORM != "windows" and re.match(NIX_ROOT_REGEX, base)): + if base == "": + error_message = "Current file cannot be resolved." + else: + error_message = "'" + base + "' is an invalid alias." + sublime.error_message(error_message) + else: + attempt_open = True + logger.debug("Creating file at %s", file_path) + if not os.path.exists(file_path): + try: + self.create(file_path) + except OSError as e: + attempt_open = False + sublime.error_message("Cannot create '" + file_path + "'. See console for details") + logger.error("Exception: %s '%s'" % (e.strerror, e.filename)) + if attempt_open: + if os.path.isdir(file_path): + if not re.search(r"(/|\\)$", file_path): + sublime.error_message("Cannot open view for '" + file_path + "'. It is a directory. ") + else: + self.window.open_file(file_path) + self.clear() + self.refresh_sidebar() + + def refresh_sidebar(self): + if self.auto_refresh_sidebar: + try: + self.window.run_command("refresh_folder_list") + except: + pass + + + def clear(self): + if self.view != None: + self.view.erase_status("AdvancedNewFile") + PathAutocomplete.clear() + + def create(self, filename): + base, filename = os.path.split(filename) + self.create_folder(base) + if filename != "": + open(os.path.join(base, filename), "a").close() + + def create_folder(self, path): + try: + os.makedirs(path) + except OSError as ex: + if ex.errno != errno.EEXIST: + raise + if self.is_python: + open(os.path.join(base, '__init__.py'), 'a').close() + + def get_cursor_path(self): + if self.view == None: + return "" + + view = self.view + path = "" + for region in view.sel(): + syntax = view.syntax_name(region.begin()) + if region.begin() != region.end(): + path = view.substr(region) + break + if re.match(".*string.quoted.double", syntax) or re.match(".*string.quoted.single", syntax): + path = view.substr(view.extract_scope(region.begin())) + path = re.sub('^"|\'', '', re.sub('"|\'$', '', path.strip())) + break + + return path + + +class PathAutocomplete(sublime_plugin.EventListener): + aliases = {} + show_files = False + ignore_case = False + + path = "" + root = "" + default_root = True + view_id = None + + prev_suggestions = [] + prev_base = "" + prev_directory = "" + path_empty = True + prev_root = "" + prev_prefix = "" + prev_locations = [] + + def on_query_context(self, view, key, operator, operand, match_all): + if key == "advanced_new_file_completion" and PathAutocomplete.view_id != None and view.id() == PathAutocomplete.view_id: + return True + return None + + def continue_previous_autocomplete(self): + pac = PathAutocomplete + sep = os.sep + root_path = pac.root + sep + prev_base = pac.prev_base + prev_directory = pac.prev_directory + prev_root = pac.prev_root + + base = os.path.basename(pac.path) + directory = os.path.dirname(pac.path) + + # If base is empty, we may be cycling through directory options + if base == "": + return True + + # Ensures the correct directory is used if the default root is specified + # using an alias. + if base == prev_base and \ + directory == prev_directory and \ + prev_root == root_path and \ + pac.default_root: + return True + # Continue completions if file names are completed. + if os.path.isfile(os.path.join(root_path, pac.path)): + return True + return False + + def on_query_completions(self, view, prefix, locations): + self.suggestion_entries = [] + pac = PathAutocomplete + if pac.view_id == None or view.id() != pac.view_id: + return [] + + auto_complete_prefix = "" + if self.continue_previous_autocomplete() and prefix != "": + logger.debug("(Prev) Suggestions") + logger.debug(pac.prev_suggestions) + if len(pac.prev_suggestions) > 1: + return (pac.prev_suggestions, sublime.INHIBIT_WORD_COMPLETIONS | sublime.INHIBIT_EXPLICIT_COMPLETIONS) + elif len(pac.prev_suggestions) == 1: + auto_complete_prefix = pac.prev_suggestions[0][1] + + suggestions = [] + suggestions_w_spaces = [] + root_path = pac.root + os.sep + directory, base = os.path.split(pac.path) + + if directory == "" and pac.default_root: + # Project folders + sugg, sugg_w_spaces = self.generate_project_auto_complete(base) + suggestions += sugg + suggestions_w_spaces += sugg_w_spaces + # Aliases + sugg, sugg_w_spaces = self.generate_alias_auto_complete(base) + suggestions += sugg + suggestions_w_spaces += sugg_w_spaces + + # Directories + path = os.path.join(root_path, directory) + if os.path.exists(path): + sugg, sugg_w_spaces = self.generate_relative_auto_complete(path, base, auto_complete_prefix) + suggestions += sugg + suggestions_w_spaces += sugg_w_spaces + # If suggestions exist, use complete name + # else remove base prefix + if len(suggestions) > 0: + for name in suggestions_w_spaces: + suggestions.append((" " + name, name)) + else: + for name in suggestions_w_spaces: + temp = name + name = name[len(base) - 1:] + suggestions.append((" " + temp, name)) + + if len(suggestions) == 0 and locations == pac.prev_locations: + return (pac.prev_suggestions, sublime.INHIBIT_WORD_COMPLETIONS | sublime.INHIBIT_EXPLICIT_COMPLETIONS) + # Previous used to determine cycling through entries. + pac.prev_directory = directory + pac.prev_base = base + pac.prev_suggestions = suggestions + pac.prev_root = root_path + pac.prev_prefix = prefix + pac.prev_locations = locations + logger.debug("Suggestions:") + logger.debug(suggestions) + return (suggestions, sublime.INHIBIT_WORD_COMPLETIONS | sublime.INHIBIT_EXPLICIT_COMPLETIONS) + + def generate_project_auto_complete(self, base): + folders = sublime.active_window().folders() + if len(folders) > 1: + folders = map(lambda f: os.path.basename(f), folders) + return self.generate_auto_complete(base, folders) + return [], [] + + def generate_alias_auto_complete(self, base): + return self.generate_auto_complete(base, PathAutocomplete.aliases) + + def generate_auto_complete(self, base, iterable_var): + sugg = [] + sugg_w_spaces = [] + + for entry in iterable_var: + if entry in self.suggestion_entries: + continue + self.suggestion_entries.append(entry) + compare_entry = entry + compare_base = base + if PathAutocomplete.ignore_case: + compare_entry = compare_entry.lower() + compare_base = compare_base.lower() + + if compare_entry.find(compare_base) == 0: + if " " in base: + sugg_w_spaces.append(entry + ":") + else: + sugg.append((entry + ":", entry + ":")) + return sugg, sugg_w_spaces + + def generate_relative_auto_complete(self, path, base, auto_complete_prefix): + sep = os.sep + sugg = [] + sugg_w_spaces = [] + + # Attempt to prevent searching the same path when a path has been specified + # Problems occur when using tab to complete entry with single completion + # followed by ctrl + space + if ":" in auto_complete_prefix: + compare_prefix = auto_complete_prefix.split(":", 1)[1] + else: + compare_prefix = auto_complete_prefix + + if re.search(r"[/\\]$", auto_complete_prefix) and not path.endswith(compare_prefix[0:-1]): + path = os.path.join(path, compare_prefix) + + for filename in os.listdir(path): + if PathAutocomplete.show_files or os.path.isdir(os.path.join(path, filename)): + compare_base = base + compare_filename = filename + if PathAutocomplete.ignore_case: + compare_base = compare_base.lower() + compare_filename = filename.lower() + + if compare_filename.find(compare_base) == 0: + # Need to find a better way to do the auto complete. + if " " in compare_base: + if os.path.isdir(os.path.join(path, filename)): + sugg_w_spaces.append(auto_complete_prefix + filename + sep) + else: + sugg_w_spaces.append(auto_complete_prefix + filename) + else: + if os.path.isdir(os.path.join(path, filename)): + sugg.append((" " + auto_complete_prefix + filename + sep, auto_complete_prefix + filename + sep)) + else: + sugg.append((" " + auto_complete_prefix + filename, auto_complete_prefix + filename)) + + return sugg, sugg_w_spaces + + @staticmethod + def set_path(path_input): + PathAutocomplete.path = path_input + + @staticmethod + def set_root(root_input, default_root): + PathAutocomplete.root = root_input + PathAutocomplete.default_root = default_root + + @staticmethod + def clear(): + PathAutocomplete.path = "" + PathAutocomplete.root = "" + PathAutocomplete.prev_suggestions = [] + PathAutocomplete.prev_base = "" + PathAutocomplete.prev_directory = "" + PathAutocomplete.aliases = {} + PathAutocomplete.path_empty = True + PathAutocomplete.prev_root = "" + PathAutocomplete.default_root = True + PathAutocomplete.show_files = False + PathAutocomplete.prev_prefix = "" + PathAutocomplete.prev_locations = [] + PathAutocomplete.view_id = None + + @staticmethod + def set_aliases(aliases): + PathAutocomplete.aliases = aliases + + @staticmethod + def set_show_files(show_files): + PathAutocomplete.show_files = show_files + + @staticmethod + def set_ignore_case(ignore_case): + PathAutocomplete.ignore_case = ignore_case + + @staticmethod + def set_view_id(view_id): + PathAutocomplete.view_id = view_id + + +def get_settings(view): + settings = sublime.load_settings("AdvancedNewFile.sublime-settings") + project_settings = {} + local_settings = {} + if view != None: + project_settings = view.settings().get('AdvancedNewFile', {}) + + for setting in SETTINGS: + local_settings[setting] = settings.get(setting) + + for key in project_settings: + if key in SETTINGS: + if key == "alias": + local_settings[key] = dict(local_settings[key].items() + project_settings.get(key).items()) + else: + local_settings[key] = project_settings[key] + else: + logger.error("AdvancedNewFile[Warning]: Invalid key '%s' in project settings.", key) + + return local_settings diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.sublime-settings new file mode 100644 index 0000000..76cdf33 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.sublime-settings @@ -0,0 +1,80 @@ +{ + // This setting contains a dictionary of aliases. The keys represent the + // alias names, the values represent the paths. + // NOTE: These should be absolute paths. Also, these paths should + // match your systems convention. For example, Windows machines should + // have paths similar to "C:\\Users\\username\\Desktop". *nix systems should + // have paths similar to "/home/username/desktop". + "alias": {}, + + // This is a secondary field for aliases. These aliases will be platform specific. + // The key for the entry will still represent the name to be used for the alias. + // Rather than being just a string path, the value will be a nested dictionary. + // The dictionary may have one of three keys, "windows", "linux", or "osx". + // The path used for this alias will be based on the operating system being used. + "os_specific_alias": {}, + + // A default initial value to fill the create new file input path with. + "default_initial": "", + + // A boolean defining if cursor text should be used. Text bound by single or + // double quotes or within a region will be used. If multiple cursors + // are used, the earliest selection containing a region or existing + // within quotes will be used. + // NOTE: A value read from cursor will override the default + // initial string setting. + "use_cursor_text": false, + + // A boolean value specifying if regular files should be included in the auto + // complete options. + "show_files": false, + + // A boolean specifying if the file path being created should be displayed in + // the status bar. + "show_path": true, + + // This value specifies the default directory when using AdvancedNewFile. + // Note it must be one of these values: + // project_folder - Default will be the folder index specified by the "default_folder_index" setting. + // current - Default will be the directory of the current view. + // home - Default will be the home folder (~/) + // path - Default will be defined by the setting "default_path" + // If the current view or top folder cannot be resolved, the home directory + // will be used. + "default_root": "project_folder", + + // A string specifying the default root to use. For this to be utilized, + // "default_root" must be set to "path" + "default_path": "~", + + // An integer value representing a folder index to be used when "folder" is specified + // for "default_root". If an index outside of the range of existing folders is used, + // it will default to 0 (the top level folder). + "default_folder_index": 0, + + + // This value specifies the root that will be used when resolving relative paths + // defined in aliases. For more information about valid values, see "default_root". + // Note that if "default_path" or "default_folder_index" is used, + // "alias_path" and "alias_folder_index" must be used for the respective entries. + "alias_root": "current", + + // A string specifying the path to use for the alias root. For this to be + // utilized, "alias_root" must be set to "path" + "alias_path": "~", + + // An integer value representing the folder index to use when "folder" is specified + // for "alias_root". If an index outside of the range of the existing folders is used, + // it will default to 0. + "alias_folder_index": 0, + + // A boolean specifying if case should be ignored when building + // auto complete list. + "ignore_case": false, + + // A boolean specifying if folders should automatically refresh and update the sidebar. + // In some builds, the sidebar does not refresh when contents of project folder are updated. + // This setting is required to refresh the sidebar in these circumstances. + // false by default + "auto_refresh_sidebar": false +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/CHANGELOG.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/CHANGELOG.md new file mode 100644 index 0000000..55b5f3a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/CHANGELOG.md @@ -0,0 +1,51 @@ +# Changelog for AdvancedNewFile +- 2 February 2013 + - Update to be compatible with Sublime Text 3. +- 14 January 2013 + - Add `alias_root` setting, used with aliases with relative paths. + - Add setting to allow user to specify which folder from the project should be used. + - Bug fixes + - Do not require relative alias paths to begin with `./` + - Prevent duplicate entries from appearing in auto complete list. + +- 17 December 2012 + - Allow selected text to fill entry window. + - Basic work for continued autocompletion (Only applies if there is a single completion option) + - Bug fixes + - Properly display completions when using "ctrl+space" to manually display auto complete options. + - Prevent error pop up from occuring when explicitly creating a directory structure. + - Fix bug where using cursor text causes an error. + - Prevent spaces from being inserted when tab is without a possible completion. + +- 26 November 2012 + - Add setting to display path for file to be created in status bar. + - Add setting to set default base path (home, current, top_folder, path). + - Add setting to ignore case for auto completion. + - Add support for relative paths in alias. + - Add OS Specific Aliases to settings. + - Display an error when attempting to use an invalid alias. + - Display an error when attempting to open a directory in a view. + - Display an error if path creation fails. + - Bug Fixes + - Auto complete bug for files with spaces in their name + - Status bar update causing errors when no view is present. + - Specifying absolute paths for Windows produced unexpected behavior. + +- 30 October 2012 + - Initial work for tab autocompletion + - Files created when path entered + - Add setting to fill with a default value. + - Setting to prefill entry box with text in quotes. + - Add setting to display non directory files + - Add user defined aliases. + - Bug fixes. + - Prevent buffer from being opened when a directory is specified. + +- 20 April 2012 + - Add ability to specify top level folders + - Bug fixes + - Fix Windows keybindings + - Fix save issue on Windows + +- 29 October 2011 + - Initial release of AdvancedNewFile plugin diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Linux).sublime-keymap new file mode 100644 index 0000000..2ea7bc1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Linux).sublime-keymap @@ -0,0 +1,15 @@ +[ + { "keys": ["super+alt+n"], "command": "advanced_new_file"}, + { "keys": ["shift+super+alt+n"], "command": "advanced_new_file", "args": {"is_python": true}}, + { + "keys": ["tab"], + "command": "insert_best_completion", + "args": {"default": "", "exact": false}, + "context": [ + { "key": "advanced_new_file_completion"}, + { "key": "setting.tab_completion", "operator": "equal", "operand": true }, + { "key": "last_command", "operator": "not_equal", "operand": "insert_best_completion" }, + { "key": "auto_complete_visible" , "operator": "equal", "operand": false} + ] + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (OSX).sublime-keymap new file mode 100644 index 0000000..2ea7bc1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (OSX).sublime-keymap @@ -0,0 +1,15 @@ +[ + { "keys": ["super+alt+n"], "command": "advanced_new_file"}, + { "keys": ["shift+super+alt+n"], "command": "advanced_new_file", "args": {"is_python": true}}, + { + "keys": ["tab"], + "command": "insert_best_completion", + "args": {"default": "", "exact": false}, + "context": [ + { "key": "advanced_new_file_completion"}, + { "key": "setting.tab_completion", "operator": "equal", "operand": true }, + { "key": "last_command", "operator": "not_equal", "operand": "insert_best_completion" }, + { "key": "auto_complete_visible" , "operator": "equal", "operand": false} + ] + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Windows).sublime-keymap new file mode 100644 index 0000000..11a180a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Windows).sublime-keymap @@ -0,0 +1,16 @@ +[ + { "keys": ["ctrl+alt+n"], "command": "advanced_new_file"}, + { "keys": ["shift+ctrl+alt+n"], "command": "advanced_new_file", "args": {"is_python": true}}, + // Forces insert best autocomplete to run for advanced new file + { + "keys": ["tab"], + "command": "insert_best_completion", + "args": {"default": "", "exact": false}, + "context": [ + { "key": "advanced_new_file_completion"}, + { "key": "setting.tab_completion", "operator": "equal", "operand": true }, + { "key": "last_command", "operator": "not_equal", "operand": "insert_best_completion" }, + { "key": "auto_complete_visible" , "operator": "equal", "operand": false} + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/LICENSE.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/LICENSE.txt new file mode 100644 index 0000000..b086861 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/LICENSE.txt @@ -0,0 +1,18 @@ +The MIT License (MIT) + +Copyright (c) 2012 AdvancedNewFile authors + +Permission 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: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE 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, +sOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Main.sublime-menu new file mode 100644 index 0000000..1c773f6 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Main.sublime-menu @@ -0,0 +1,90 @@ +[ + { + "caption": "Preferences", + "mnemonic": "n", + "id": "preferences", + "children": + [ + { + "caption": "Package Settings", + "mnemonic": "P", + "id": "package-settings", + "children": + [ + { + "caption": "AdvancedNewFile", + "children": + [ + { + "command": "open_file", + "args": {"file": "${packages}/AdvancedNewFile/README.md"}, + "caption": "README" + }, + { "caption": "-" }, + { + "command": "open_file", + "args": {"file": "${packages}/AdvancedNewFile/AdvancedNewFile.sublime-settings"}, + "caption": "Settings – Default" + }, + { + "command": "open_file", + "args": {"file": "${packages}/User/AdvancedNewFile.sublime-settings"}, + "caption": "Settings – User" + }, + { "caption": "-" }, + { + "command": "open_file", + "args": { + "file": "${packages}/AdvancedNewFile/Default (OSX).sublime-keymap", + "platform": "OSX" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/AdvancedNewFile/Default (Linux).sublime-keymap", + "platform": "Linux" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/AdvancedNewFile/Default (Windows).sublime-keymap", + "platform": "Windows" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (OSX).sublime-keymap", + "platform": "OSX" + }, + "caption": "Key Bindings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (Linux).sublime-keymap", + "platform": "Linux" + }, + "caption": "Key Bindings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (Windows).sublime-keymap", + "platform": "Windows" + }, + "caption": "Key Bindings – User" + }, + { "caption": "-" } + ] + } + ] + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/README.md new file mode 100644 index 0000000..d128cbf --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/README.md @@ -0,0 +1,181 @@ +# AdvancedNewFile +Advanced file creation for Sublime Text 2 and Sublime Text 3. + +## Overview + +This plugin allows for faster file creation within a project. Please see the [Features](https://github.com/skuroda/Sublime-AdvancedNewFile#features) section for more detailed information about advanced features. + +## Installation +Note with either method, you may need to restart Sublime Text 2 for the plugin to load. + +### Package Control +Installation through [package control](http://wbond.net/sublime_packages/package_control) is recommended. It will handle updating your packages as they become available. To install, do the following. + +* In the Command Palette, enter `Package Control: Install Package` +* Search for `AdvancedNewFile` +* In the Command Palette, enter `Package Control :Enable Package` -> select AdvancedNewFile + +### Manual +Clone or copy this repository into the packages directory. By default, they are located at: + +* OS X: ~/Library/Application Support/Sublime Text 2/Packages/ +* Windows: %APPDATA%/Roaming/Sublime Text 2/Packages/ +* Linux: ~/.config/sublime-text-2/Packages/ + +## Usage +Simply bring up the AdvancedNewFile input through the appropriate [key binding](https://github.com/skuroda/Sublime-AdvancedNewFile). Then, enter the path, along with the file name into the input field. Upon pressing enter, the file will be created. In addition, if the directories specified do not yet exists, they will also be created. For more advanced usage of this plugin, be sure to look at [Advanced Path Usage](https://github.com/skuroda/Sublime-AdvancedNewFile#advanced-path-usage). By default, the path to the file being created will be filled shown in the status bar as you enter the path information. + +**Default directory:** +The default directory is specified by the `default_root` setting. By default, it will be the top directory of the folders listed in the window. If this cannot be resolved, the home directory will be used. See [Settings](https://github.com/skuroda/Sublime-AdvancedNewFile#settings) (`default_root`) for more information. + +## Keymaps +If you have issues with keymaps, consider running [FindKeyConflicts](https://github.com/skuroda/FindKeyConflicts), also available through the package manager. Alternatively, set command logging to true by entering `sublime.log_commands(True)` in the Sublime Text console. + +### Windows +`ctrl+alt+n`: General keymap to create new files. + +`ctrl+shift+alt+n`: In addition to creating the folders specified, new folders will also contain an `__init__.py` file. + +### OS X and Linux +The super keys for Linux and OS X are the Windows and command key respectively. + +`super+alt+n`: General keymap to create new files. + +`shift+super+alt+n`: In addition to creating the folders specified, new folders will also contain an `__init__.py` file. + +## Settings +`alias`: + +A dictionary that contains a set of aliases tied to a directory. For more information, see [Aliases](https://github.com/skuroda/Sublime-AdvancedNewFile#aliases) + +`os_specific_alias`: + +A dictionary containing a set of aliases tied to a directory. These aliases will be platform specific. For more information, see [Platform Specific Aliases](https://github.com/skuroda/Sublime-AdvancedNewFile#platform-specific-aliases) + +`default_initial`: + +A string that will be automatically inserted into the new file creation input. + +`use_cursor_text`: + +A boolean value determining if text from a buffer, bound by quotes or a selected region, will be auto inserted into the new file generation input field. If multiple cursors are used, the first entry either contained in quotes, are a selected region, will be used. + +`show_files`: + +A boolean value determining if regular files should be included in the autocompletion list. + +`show_path`: + +A boolean value used to determine if the path of the file to be created should be displayed in the status bar. + +`default_root`: + +This value is used to determine the default root when using AdvancedNewFile. It must be one of the following values: + +* `project_folder`- The default path will be the folder specified by the 'default_folder_index' setting. +* `current` - The default path will be the directory of the current active view. +* `home` - The default path will be your home directory. +* `path` - The default path will be defined by the setting `default_path` + +If the current view's directory cannot be resolved, the top level folder in the window will be used. If the top level folder in the window cannot be resolved either, the home directory will be used. + +`default_path`: + +This path is used as the default if `path` has been specified for the setting `default_root`. This path should be absolute. If a relative path is specified, it will be relative to the AdvancedNewFile package directory. + +`default_folder_index`: + +An integer value representing a folder index to be used when "folder" is specified for "default_root". If an index outside of the range of existing folders is used, it will default to 0 (the top level folder). + +`alias_root`: + +This entry defines the root that will be used when resolving aliases defined as relative paths. For more information about valid entries, see `default_root`. Note that for path, `alias_path` will be specified. + +`alias_path`: + +This path is used as the default if `path` has been specified for the setting `alias_root`. + +`alias_folder_index`: + +An integer value representing the folder index to use when "folder" is specified for "alias_root". If an index outside of the range of the existing folders is used, it will default to 0. + +`ignore_case`: + +A boolean specifying if case should be ignored when building auto complete list. + +`auto_refresh_sidebar`: + +A boolean specifying if folders should automatically refresh and update the sidebar. In some builds, the sidebar does not refresh when contents of project folder are updated. This setting is required to refresh the sidebar in these circumstances. False by default. + +### Project Specific Settings +All of the above settings can also be specified as part of the project specific settings. These values override any previous values set by higher level settings, with aliases being an exception. Alias settings will be merged with higher level configurations for alias. In addition, if the same alias exist for both default/user settings and project settings, the project setting will take precedence. + + "settings": + { + "AdvancedNewFile": + { + "default_initial": "/project/specific/path" + } + } + + +## Features +#### __init__.py creation: +This plugin may optionally create `__init__` in the created directories. Please reference [Key Maps](https://github.com/skuroda/Sublime-AdvancedNewFile#keymaps) to see the default key bindings to do this. + +#### Tab Autocompletion: +After typing in a partial path, simply press tab to autocomplete it. Continue to press tab to cycle through the options. + +### Advanced Path Usage +#### Home directory: +To begin at the home directory simply start with `~/` like you would in the shell. + +#### Aliases: +You can create an alias to quickly navigate to a directory. Simply type in the alias followed by a colon. Then specify the path as you would normally. Note, in an event a specified alias conflicts with a [predefined alias](https://github.com/skuroda/Sublime-AdvancedNewFile#predefined-aliases), the specified alias will take precedence. + +Alias paths may be relative or absolute. If a relative path is specified, the `alias_root` setting will be used as the base. When specifying absolute paths, be sure to use the system specific style (e.g. Windows `C:\\Users\\username\\Desktop`, OS X and Linix `/home/username/desktop/`). In addition, you may specify an alias from the home directory by using `~/`. + +If an invalid alias is specified, an error pop up will be displayed when trying to create the file. + +Sample aliases: + + { + "alias": { + "Desktop": "~/Desktop/" + } + } + +To use the above alias, when specifying a new file enter `Desktop:testDir/testFile`, which would then create a file at `/Desktop/testDir/testFile`. + +##### Platform Specific Aliases +You can also create aliases that are platform specific. These follow a similar set of rules as aliases. However, rather than specifying a string path to use, a dictionary is specified. This dictionary may contain the following keys: `windows`, `linux`, and `osx`. The path for this particular alias will be used based on the operating system in use. If the same alias is specified in both `alias` and `os_specific_alias`, the path in `os_specific_alias` will be used. + +Sample OS Specific Aliases: + + { + "os_specific_alias": { + "subl_packages" { + "windows": "~\\AppData\\Roaming\\Sublime Text 2\\Packages", + "linux": "~/.config/sublime-text-2/Packages", + "osx": "~/Library/Application Support/Sublime Text 2/Packages" + } + } + } + +##### Predefined Aliases +###### Top level folders in window +Top level folders can be specified by typing in the name of the folder followed by a colon. Then specify the path as you would normally. + +###### Current Working Directory +To specify the current working directory, simply type a colon, without any preceding text. + +## Notes +Thanks to Dima Kukushkin ([xobb1t](https://github.com/xobb1t)) for the original work on this plugin. Also, thank you to [facelessuser](https://github.com/facelessuser), and by extension biermeester and matthjes for the idea of platform specific settings. + +### Contributors +* [xobb1t](https://github.com/xobb1t) +* [edmundask](https://github.com/edmundask) +* [alirezadot](https://github.com/alirezadot) +* [aventurella](https://github.com/aventurella) +* [skuroda](https://github.com/skuroda) + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages.json new file mode 100644 index 0000000..5fb2ced --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages.json @@ -0,0 +1,7 @@ +{ + "install": "messages/install.txt", + "2012.11.08.20.00.00": "messages/1.txt", + "2012.11.12.11.00.00": "messages/2.txt", + "2012.11.26.11.00.00": "messages/3.txt", + "2012.12.17.11.00.00": "messages/4.txt" +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/1.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/1.txt new file mode 100644 index 0000000..ce62ab0 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/1.txt @@ -0,0 +1 @@ +The repository has now been transferred to the proper URL. If you experienced any issues while this transition was occuring, my apologies. Please take a look at the README for new enhancments if you have not done so already. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/2.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/2.txt new file mode 100644 index 0000000..65d14f3 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/2.txt @@ -0,0 +1,10 @@ +New Features/Enhancements: + +- Add setting to display path for file to be created in status bar. - Default true +- Add setting to set default base path (home, current, top_folder, path). - Default "top_folder" +- Add support for relative paths in alias. + +Please see the README for more information about the new settings. + +Bug Fixes: +- Auto complete bug for files with spaces in their name diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/3.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/3.txt new file mode 100644 index 0000000..06c1553 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/3.txt @@ -0,0 +1,12 @@ +New Features/Enhancements: + +- Add OS Specific Aliases to settings. +- Display an error when attempting to use an invalid alias. +- Display an error when attempting to open a directory in a view. +- Display an error if path creation fails. + +Please see the README for more information about the new settings. + +Bug Fixes: +- Status bar update causing errors when no view is present. +- Specifying absolute paths for Windows produced unexpected behavior. diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/4.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/4.txt new file mode 100644 index 0000000..5e24c4c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/4.txt @@ -0,0 +1,12 @@ +New Features/Enhancements: + +- Enabling "use_cursor_text" will fill with selected regions. The first cursor/region to match the conditions (region or quoted section) will be used. +- Autocompleting with tab where there is only a single completion option will continue completion on subsequent directories. + +Please see the README for more information about the new settings. + +Bug Fixes: +- Properly display completions when using "ctrl+space" to manually display auto complete options. +- Prevent error pop up from occuring when explicitly creating a directory structure. +- Fix bug where using cursor text causes an error. +- Prevent spaces from being inserted when tab is without a possible completion. diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/install.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/install.txt new file mode 100644 index 0000000..871cba0 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/install.txt @@ -0,0 +1,9 @@ +Thank you for installing the AdvancedNewFile plugin. + +For more information please visit https://github.com/skuroda/Sublime-AdvancedNewFile. + +Note you may need to restart Sublime Text 2 after installing this plugin. + +If you have any questions, comments, or run into issues, please let me know! Hope you enjoy the plugin. + +Thank you! \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/package-metadata.json new file mode 100644 index 0000000..c8ced63 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/skuroda/Sublime-AdvancedNewFile", "version": "2013.04.02.21.22.36", "description": "File creation plugin for Sublime Text 2 and Sublime Text 3."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/.gitignore new file mode 100644 index 0000000..298d177 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/.gitignore @@ -0,0 +1,7 @@ +# Environment-specific files such as configuration, logs, and setup +*.pyc + +# Misc and OS files +Desktop.ini # Directory atttributes in Windows. +Thumbs.db # Picture thumbnail cache in Windows 98. +.DS_Store # Directory attributes in Mac OS X. diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/LICENSE b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/LICENSE new file mode 100644 index 0000000..6dd5395 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 Joe Esposito + +Permission 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: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE 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. diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/README.md new file mode 100644 index 0000000..2632673 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/README.md @@ -0,0 +1,74 @@ +Console Exec +============ + +Plugin for [Sublime Text 2][sublime] to execute a command in a console +window. After the process exits, the console remains open and displays +**"Press any key to exit"** before closing. + +This plugin is based on the exec command shipped with Sublime Text, and +uses the launcher that ships with [Crimson Editor][crimson] +to wait for a keypress before closing the window. + +![Running a Flask application screenshot][example] + +Source [available on Github][repo]. + +[sublime]: http://www.sublimetext.com +[crimson]: http://crimsoneditor.com +[example]: https://raw.github.com/joeyespo/sublimetext-console-exec/master/examples/flask_application_screenshot.png +[repo]: http://github.com/joeyespo/sublimetext-console-exec + + +Why? +---- + +Aside from personal preference of having an external console in web projects, + +- Sublime leaves your background process running when you quit +- Rebuilding a project overwrites your running process, leaking processes if you're not careful +- Certain environments such as [Pyglet][] will not run within the integrated console window + +This plugin ties these loose ends in a familiar way. + +[Pyglet]: http://www.pyglet.org + + +Usage +----- + +In any **.sublime-build** file add the following line to run it in a console: + + "target": "console_exec" + +For example, here's a modified **Python.sublime-build** file: + + { + "cmd": ["python", "-u", "$file"], + "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", + "selector": "source.python", + "target": "console_exec" + } + +Note: you can find the appropriate build file from **"Browse Packages..."** + + +Installation +------------ + +With [Sublime Package Control][package_control], simply + +1. Select **Package Control: Install Package** from the command palette +2. Locate **ConsoleExec** and press enter to install it + +[package_control]: http://wbond.net/sublime_packages/package_control + +#### Manual installation (advanced) + +Clone this repository into the Packages directory. +To see where it's located enter `print sublime.packages_path()` in the console. + + +Notes +----- + +This plugin is Windows-only for the moment. diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/console_exec.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/console_exec.py new file mode 100644 index 0000000..40b0a51 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/console_exec.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- + +""" +Console Exec + +Plugin for Sublime Text 2 to execute a command and redirect its output +into a console window. This is based on the default exec command. +""" + +import sublime +import sublime_plugin +import os +import sys +import subprocess +import time + + +class Process(object): + def __init__(self, arg_list, env, listener, + # "path" is an option in build systems + path='', + # "shell" is an options in build systems + shell=False): + + self.listener = listener + self.killed = False + + self.start_time = time.time() + + # Set temporary PATH to locate executable in arg_list + if path: + old_path = os.environ["PATH"] + # The user decides in the build system whether he wants to append $PATH + # or tuck it at the front: "$PATH;C:\\new\\path", "C:\\new\\path;$PATH" + os.environ["PATH"] = os.path.expandvars(path).encode(sys.getfilesystemencoding()) + + proc_env = os.environ.copy() + proc_env.update(env) + for k, v in proc_env.iteritems(): + proc_env[k] = os.path.expandvars(v).encode(sys.getfilesystemencoding()) + + self.proc = subprocess.Popen(arg_list, env=proc_env, shell=shell) + + if path: + os.environ["PATH"] = old_path + + def kill(self): + if not self.killed: + self.killed = True + self.proc.terminate() + self.listener = None + + def poll(self): + return self.proc.poll() == None + + +class ConsoleExecCommand(sublime_plugin.WindowCommand): + def run(self, cmd=[], file_regex='', line_regex='', working_dir='', encoding='utf-8', env={}, quiet=False, kill=False, **kwargs): + launcher = os.path.join(sublime.packages_path(), 'ConsoleExec', 'launch.exe') + if not os.path.exists(launcher): + if not quiet: + print 'Error: Could not find the ConsoleExec package.' + return + cmd = [launcher] + map(lambda s: '"%s"' % s if ' ' in s else s, cmd) + + if kill: + if self.proc: + self.proc.kill() + self.proc = None + return + + # Default the to the current files directory if no working directory was given + if (working_dir == '' and self.window.active_view() + and self.window.active_view().file_name()): + working_dir = os.path.dirname(self.window.active_view().file_name()) + + # Call get_output_panel a second time after assigning the above + # settings, so that it'll be picked up as a result buffer + self.window.get_output_panel("exec") + + self.encoding = encoding + self.quiet = quiet + + self.proc = None + if not self.quiet: + print "Running " + " ".join(cmd) + sublime.status_message("Building") + + merged_env = env.copy() + if self.window.active_view(): + user_env = self.window.active_view().settings().get('build_env') + if user_env: + merged_env.update(user_env) + + # Change to the working dir, rather than spawning the process with it, + # so that emitted working dir relative path names make sense + if working_dir != '': + os.chdir(working_dir) + + # Forward kwargs to Process + self.proc = Process(cmd, merged_env, self, **kwargs) + + def is_enabled(self, kill=False): + if kill: + return hasattr(self, 'proc') and self.proc and self.proc.poll() + else: + return True diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/package-metadata.json new file mode 100644 index 0000000..d14d21c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/joeyespo/sublimetext-console-exec", "version": "1.0.0", "description": "Plugin for Sublime Text 2 to execute a command in a console window."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/packages.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/packages.json new file mode 100644 index 0000000..3cb0263 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/packages.json @@ -0,0 +1,20 @@ +{ + "schema_version": "1.2", + "packages": [ + { + "name": "ConsoleExec", + "description": "Plugin for Sublime Text 2 to execute a command in a console window.", + "author": "Joe Esposito", + "homepage": "https://github.com/joeyespo/sublimetext-console-exec", + "last_modified": "2012-12-12 20:00:00", + "platforms": { + "windows": [ + { + "version": "1.0.0", + "url": "https://nodeload.github.com/joeyespo/sublimetext-console-exec/zipball/master" + } + ] + } + } + ] +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/.gitignore new file mode 100644 index 0000000..00c4ea8 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/.gitignore @@ -0,0 +1,4 @@ +*.pyc +*.cache +*.sublime-project +package-metadata.json \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.py new file mode 100644 index 0000000..a2e8f93 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.py @@ -0,0 +1,299 @@ +# coding=utf8 +import sublime, sublime_plugin +import codecs +import sys +import os +# sys.path.append(os.path.join(sublime.packages_path(), 'EncodingHelper', 'chardet')) +from chardet.universaldetector import UniversalDetector +import re +import threading +import time + +# don't parse binary files, just mark these as binary + #IMAGES-------------------------------------#sublime---------------#fonts-----------#compressed----------------#audio-video--------------------------------------------------#docs------------------------------#misc +BINARY = re.compile('\.(apng|png|jpg|gif|jpeg|bmp|psd|ai|cdr|ico|cache|sublime-package|eot|svgz|ttf|woff|zip|tar|gz|rar|bz2|jar|xpi|mov|mpeg|avi|mpg|flv|wmv|mp3|wav|aif|aiff|snd|wma|asf|asx|pcm|pdf|doc|docx|xls|xlsx|ppt|pptx|rtf|sqlite|sqlitedb|fla|swf|exe)$', re.I); + +SETTINGS = sublime.load_settings('EncodingHelper.sublime-settings') + +class EncodingOnStatusBarListener(sublime_plugin.EventListener): + + def on_load(self, v, ok = True): + + if not v: + return + if v.encoding() == 'Undefined' and ok: + # give time to sublime just one time + sublime.set_timeout(lambda:self.on_load(v, False), 120) + return + elif v.encoding() == 'Undefined' and not ok: + v.settings().set('encoding_helper_encoding_sublime', 'UTF-8') + + # if enabled, show encoding on status bar + if bool(SETTINGS.get('show_encoding_on_status_bar', True)): + + # mark as loading + v.settings().set('encoding_helper_loading', True) + + if not v.settings().has('encoding_helper_encoding_sublime'): + v.settings().set('encoding_helper_encoding_sublime', v.encoding()) + + #has cached state? + if v.settings().has('encoding_helper_encoding'): + v.settings().erase('encoding_helper_loading') + encoding = v.settings().get('encoding_helper_encoding') + encoding_sublime = v.settings().get('encoding_helper_encoding_sublime') + v.set_status('encoding_helper_statusbar', encoding) + if encoding_sublime != '' and encoding_sublime != encoding and encoding != 'BINARY' and encoding != 'Unknown': + v.set_status('encoding_helper_statusbar_convertion_status', 'Opened as '+encoding_sublime+' (document maybe broken)') + else: + # is the file is there + file_name = v.file_name() + if not file_name or file_name == '' or os.path.isfile(file_name) == False: + v.settings().erase('encoding_helper_loading') + v.set_status('encoding_helper_statusbar', ''); + #guess + else: + v.set_status('encoding_helper_statusbar', ''); + #print 'GuessEncoding' + GuessEncoding(file_name, SETTINGS.get('fallback_encodings'), v).start() + else: + v.erase_status('encoding_helper_statusbar') + + def on_activated(self, v): + if bool(SETTINGS.get('show_encoding_on_status_bar', True)): + if v.settings().has('encoding_helper_loading'): + pass + else: + if not v.is_loading(): + self.on_load(v) + else: + v.erase_status('encoding_helper_statusbar') + +SETTINGS.add_on_change('reload', lambda: EncodingOnStatusBarListener().on_load(sublime.active_window().active_view())) + +class GuessEncoding(threading.Thread): + + def __init__(self, file_name, fallback_encodings = [], v = False, callback = False): + threading.Thread.__init__(self) + self.file_name = file_name + + encoding_list = [] + for encoding in fallback_encodings: + if encoding != 'ISO88591' and encoding != 'iso88591' and encoding != 'iso-8859-1' and encoding != 'ISO-8859-1': + encoding_list.append(encoding) + self.fallback_encodings = encoding_list + + self.v = v + if callback == False: + self.callback = self.on_done + else: + self.callback = callback + + def run(self): + confidence = 0 + size = os.stat(self.file_name).st_size + if BINARY.search(self.file_name): + encoding = 'BINARY' + confidence = 1 + elif size > 1048576 and maybe_binary(self.file_name): + encoding = 'BINARY' + confidence = 0.7 + elif size > 1048576: # skip files > 1Mb + encoding = 'Unknown' + confidence = 1 + else: + started_at = time.time() + timeout = False + + detector = UniversalDetector() + fp = open(self.file_name, 'rb') + line = fp.readline(500) + while line != '': + detector.feed(line) + if time.time() - started_at > 8: + timeout = True + break + line = fp.readline(8000) + fp.close() + detector.close() + if timeout == False or (timeout == True and detector.done): + encoding = str(detector.result['encoding']).upper() + confidence = detector.result['confidence'] + else: + encoding = 'Unknown' + confidence = 1 + + if encoding == 'ASCII': + encoding = 'UTF-8' + elif encoding == None or encoding == 'NONE' or encoding == '' or encoding == 'Unknown' or confidence < 0.7: + if encoding == 'ISO-8859-2' and confidence > 0.69: + workaround = self.test_fallback_encodings(['UTF-8', 'ISO-8859-1']) + if workaround != False: + encoding = workaround + else: + encoding = 'Unknown' + elif encoding != 'ISO-8859-2' and confidence > 0.49: + if encoding == 'WINDOWS-1252': + encoding = 'ISO-8859-1' + else: + fallback = self.test_fallback_encodings() + if fallback == False: + encoding = 'Unknown' + else: + encoding = fallback + + # workarounds here + if encoding == 'ISO-8859-2' or encoding == 'MACCYRILLIC': + workaround = self.test_fallback_encodings(['UTF-8', 'ISO-8859-1']) + if workaround != False: + encoding = workaround + + del detector + sublime.set_timeout(lambda:self.callback(encoding, confidence), 0) + + def test_fallback_encodings(self, encodings = False): + if encodings == False: + encodings = self.fallback_encodings + for encoding in encodings: + _encoding = translateCodec(encoding.lower()) + try: + fp = codecs.open(self.file_name, "rb", _encoding, errors='strict') + line = fp.readline(500) + while line != '': + line = fp.readline(8000) + fp.close() + return encoding + except UnicodeDecodeError: + fp.close() + return False + + def on_done(self, encoding, confidence): + if self.v: + self.v.settings().set('encoding_helper_encoding', encoding) + self.v.settings().set('encoding_helper_confidence', confidence) + self.v.set_status('encoding_helper_statusbar', encoding) + + if not self.v.settings().has('encoding_helper_encoding_sublime'): + self.v.settings().set('encoding_helper_encoding_sublime', self.v.encoding()) + encoding_sublime = self.v.settings().get('encoding_helper_encoding_sublime') + + if encoding in SETTINGS.get('open_automatically_as_utf8', []) and self.v.is_dirty() == False: + ConvertToUTF8(self.file_name, encoding, self.v).start() + else: + if encoding_sublime != '' and encoding_sublime != encoding and encoding != 'BINARY' and encoding != 'Unknown': + self.v.set_status('encoding_helper_statusbar_convertion_status', 'Opened as '+encoding_sublime+' (document maybe broken)') + self.v.settings().erase('encoding_helper_loading') + +class Toutf8fromBestGuessCommand(sublime_plugin.WindowCommand): + + def run(self): + encoding = sublime.active_window().active_view().settings().get('encoding_helper_encoding') + if encoding != None and encoding != 'UTF-8' and encoding != 'BINARY' and encoding != 'Unknown' and encoding != '': + Toutf8fromCommand(sublime_plugin.WindowCommand).run(encoding) + + def description(self): + try: + encoding = sublime.active_window().active_view().settings().get('encoding_helper_encoding') + if encoding != None and encoding != 'UTF-8' and encoding != 'BINARY' and encoding != 'Unknown' and encoding != '': + return 'Convert to UTF-8 From '+encoding + else: + return 'Convert to UTF-8 From Best Guess' + except: + return 'Convert to UTF-8 From Best Guess' + + def is_enabled(self): + try: + encoding = sublime.active_window().active_view().settings().get('encoding_helper_encoding') + if encoding != None and encoding != 'UTF-8' and encoding != 'BINARY' and encoding != 'Unknown' and encoding != '': + return True + except: + return False + +class Toutf8fromCommand(sublime_plugin.WindowCommand): + + def run(self, encoding = ''): + try: + if encoding == None or encoding == 'UTF-8' or encoding == 'BINARY' or encoding == 'Unknown' or encoding == '': + return False + v = sublime.active_window().active_view() + file_name = v.file_name() + if not file_name or file_name == '' or os.path.isfile(file_name) == False: + return False + else: + ConvertToUTF8(file_name, encoding, v).start() + return True + except: + return False + + def is_enabled(self, encoding = ''): + try: + file_name = sublime.active_window().active_view().file_name() + if not file_name or file_name == '' or os.path.isfile(file_name) == False: + return False + else: + return True + except: + return False + +class ConvertToUTF8(threading.Thread): + + def __init__(self, file_name, encoding, v = False, callback = False): + threading.Thread.__init__(self) + self.file_name = file_name + + self.encoding = encoding + self.v = v + if callback == False: + self.callback = self.on_done + else: + self.callback = callback + + def run(self): + _encoding = translateCodec(self.encoding.lower()) + try: + content = codecs.open(self.file_name, "rb", _encoding, errors='strict').read() + if len(content) != 0: + sublime.set_timeout(lambda:self.callback(content, self.encoding), 0) + except UnicodeDecodeError, e: + print e + sublime.set_timeout(lambda:self.on_error(self.file_name, self.encoding), 0) + except LookupError, e: + print e + sublime.set_timeout(lambda:self.on_lookup_error(self.file_name, self.encoding), 0) + + def on_done(self, content, encoding): + if self.v: + edit = self.v.begin_edit() + self.v.replace(edit, sublime.Region(0, self.v.size()), content); + self.v.end_edit(edit) + self.v.settings().set('encoding_helper_encoding_sublime', 'UTF-8') + self.v.settings().set('encoding_helper_encoding', 'UTF-8') + if bool(SETTINGS.get('show_encoding_on_status_bar', True)): + self.v.set_status('encoding_helper_statusbar', 'UTF-8') + self.v.set_status('encoding_helper_statusbar_convertion_status', 'Converted to UTF-8 from '+encoding) + + def on_error(self, file_name, encoding): + sublime.error_message('Unable to convert to UTF-8 from encoding "'+encoding+'" the file: \n'+file_name); + + def on_lookup_error(self, file_name, encoding): + sublime.error_message('The encoding "'+encoding+'" is unknown in this system.\n Unable to convert to UTF-8 the file: \n'+file_name); + +def maybe_binary(file_name): + fp = open(file_name, 'rb') + line = fp.readline(500) + read = 500 + while line != '': + if '\0' in line: + fp.close() + return True + read += 8000 + if read > 1048576: + fp.close() + return False + line = fp.readline(8000) + fp.close() + return False + +# should map different codecs to what codec.open except to receive +def translateCodec(encoding): + return str(encoding) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.sublime-settings new file mode 100644 index 0000000..91a9b46 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.sublime-settings @@ -0,0 +1,13 @@ +{ + // To show encoding on status bar + "show_encoding_on_status_bar" : true, + + // Additional encodings to test when no acurrated guess can be done + // NOTE: Don't add ISO-8859-1 + "fallback_encodings": [ ], + + // Automatically opens as UTF-8 the following encodings list + // NOTE: Encoding detection is not acurrated + // don't abuse of this feature + "open_automatically_as_utf8": [ ] +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Main.sublime-menu new file mode 100644 index 0000000..39ef36b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Main.sublime-menu @@ -0,0 +1,291 @@ +[ + { + "caption": "Edit", + "mnemonic": "E", + "id": "edit", + "children":[ + { "caption": "-", "id": "encoding-separator" }, + + {"command":"toutf8from_best_guess"}, + {"caption": "Convert to UTF-8 From Encoding", + "children": + [ + //ALL + {"caption":"Complete List Sorted", "children": + [ + {"caption":"BIG5", "command":"toutf8from","args": {"encoding":"BIG5" } }, + {"caption":"BIG5HKSCS", "command":"toutf8from","args": {"encoding":"BIG5HKSCS" } }, + {"caption":"-"}, + {"caption": "CP", "children": + [ + {"caption":"CP037", "command":"toutf8from","args": {"encoding":"CP037" } }, + {"caption":"CP424", "command":"toutf8from","args": {"encoding":"CP424" } }, + {"caption":"CP437", "command":"toutf8from","args": {"encoding":"CP437" } }, + {"caption":"CP500", "command":"toutf8from","args": {"encoding":"CP500" } }, + {"caption":"CP720", "command":"toutf8from","args": {"encoding":"CP720" } }, + {"caption":"CP737", "command":"toutf8from","args": {"encoding":"CP737" } }, + {"caption":"CP775", "command":"toutf8from","args": {"encoding":"CP775" } }, + {"caption":"CP850", "command":"toutf8from","args": {"encoding":"CP850" } }, + {"caption":"CP852", "command":"toutf8from","args": {"encoding":"CP852" } }, + {"caption":"CP855", "command":"toutf8from","args": {"encoding":"CP855" } }, + {"caption":"CP856", "command":"toutf8from","args": {"encoding":"CP856" } }, + {"caption":"CP857", "command":"toutf8from","args": {"encoding":"CP857" } }, + {"caption":"CP858", "command":"toutf8from","args": {"encoding":"CP858" } }, + {"caption":"CP860", "command":"toutf8from","args": {"encoding":"CP860" } }, + {"caption":"CP861", "command":"toutf8from","args": {"encoding":"CP861" } }, + {"caption":"CP862", "command":"toutf8from","args": {"encoding":"CP862" } }, + {"caption":"CP863", "command":"toutf8from","args": {"encoding":"CP863" } }, + {"caption":"CP864", "command":"toutf8from","args": {"encoding":"CP864" } }, + {"caption":"CP865", "command":"toutf8from","args": {"encoding":"CP865" } }, + {"caption":"CP866", "command":"toutf8from","args": {"encoding":"CP866" } }, + {"caption":"CP869", "command":"toutf8from","args": {"encoding":"CP869" } }, + {"caption":"CP874", "command":"toutf8from","args": {"encoding":"CP874" } }, + {"caption":"CP875", "command":"toutf8from","args": {"encoding":"CP875" } }, + {"caption":"CP932", "command":"toutf8from","args": {"encoding":"CP932" } }, + {"caption":"CP949", "command":"toutf8from","args": {"encoding":"CP949" } }, + {"caption":"CP950", "command":"toutf8from","args": {"encoding":"CP950" } }, + {"caption":"CP1006", "command":"toutf8from","args": {"encoding":"CP1006" } }, + {"caption":"CP1026", "command":"toutf8from","args": {"encoding":"CP1026" } }, + {"caption":"CP1140", "command":"toutf8from","args": {"encoding":"CP1140" } }, + {"caption":"CP1250", "command":"toutf8from","args": {"encoding":"CP1250" } }, + {"caption":"CP1251", "command":"toutf8from","args": {"encoding":"CP1251" } }, + {"caption":"CP1252", "command":"toutf8from","args": {"encoding":"CP1252" } }, + {"caption":"CP1253", "command":"toutf8from","args": {"encoding":"CP1253" } }, + {"caption":"CP1254", "command":"toutf8from","args": {"encoding":"CP1254" } }, + {"caption":"CP1255", "command":"toutf8from","args": {"encoding":"CP1255" } }, + {"caption":"CP1256", "command":"toutf8from","args": {"encoding":"CP1256" } }, + {"caption":"CP1257", "command":"toutf8from","args": {"encoding":"CP1257" } }, + {"caption":"CP1258", "command":"toutf8from","args": {"encoding":"CP1258" } } + ]}, + {"caption":"-"}, + {"caption":"EUC JIS 2004", "command":"toutf8from","args": {"encoding":"EUC_JIS_2004" } }, + {"caption":"EUC JISX0213", "command":"toutf8from","args": {"encoding":"EUC_JISX0213" } }, + {"caption":"EUC JP", "command":"toutf8from","args": {"encoding":"EUC_JP" } }, + {"caption":"EUC KR", "command":"toutf8from","args": {"encoding":"EUC_KR" } }, + {"caption":"-"}, + {"caption":"GB2312", "command":"toutf8from","args": {"encoding":"GB2312" } }, + {"caption":"GB18030", "command":"toutf8from","args": {"encoding":"GB18030" } }, + {"caption":"GBK", "command":"toutf8from","args": {"encoding":"GBK" } }, + {"caption":"-"}, + {"caption":"HZ", "command":"toutf8from","args": {"encoding":"HZ" } }, + {"caption":"-"}, + {"caption": "ISO", "children": + [ + {"caption":"ISO2022 JP 1", "command":"toutf8from","args": {"encoding":"ISO2022_JP_1" } }, + {"caption":"ISO2022 JP 2", "command":"toutf8from","args": {"encoding":"ISO2022_JP_2" } }, + {"caption":"ISO2022 JP 3", "command":"toutf8from","args": {"encoding":"ISO2022_JP_3" } }, + {"caption":"ISO2022 JP 2004", "command":"toutf8from","args": {"encoding":"ISO2022_JP_2004" } }, + {"caption":"ISO2022 JP EXT", "command":"toutf8from","args": {"encoding":"ISO2022_JP_EXT" } }, + {"caption":"ISO2022 JP", "command":"toutf8from","args": {"encoding":"ISO2022_JP" } }, + {"caption":"ISO2022 KR", "command":"toutf8from","args": {"encoding":"ISO2022_KR" } }, + {"caption":"-"}, + {"caption":"ISO8859 1", "command":"toutf8from","args": {"encoding":"ISO8859_1" } }, + {"caption":"ISO8859 2", "command":"toutf8from","args": {"encoding":"ISO8859_2" } }, + {"caption":"ISO8859 3", "command":"toutf8from","args": {"encoding":"ISO8859_3" } }, + {"caption":"ISO8859 4", "command":"toutf8from","args": {"encoding":"ISO8859_4" } }, + {"caption":"ISO8859 5", "command":"toutf8from","args": {"encoding":"ISO8859_5" } }, + {"caption":"ISO8859 6", "command":"toutf8from","args": {"encoding":"ISO8859_6" } }, + {"caption":"ISO8859 7", "command":"toutf8from","args": {"encoding":"ISO8859_7" } }, + {"caption":"ISO8859 8", "command":"toutf8from","args": {"encoding":"ISO8859_8" } }, + {"caption":"ISO8859 9", "command":"toutf8from","args": {"encoding":"ISO8859_9" } }, + {"caption":"ISO8859 10", "command":"toutf8from","args": {"encoding":"ISO8859_10" } }, + {"caption":"ISO8859 13", "command":"toutf8from","args": {"encoding":"ISO8859_13" } }, + {"caption":"ISO8859 14", "command":"toutf8from","args": {"encoding":"ISO8859_14" } }, + {"caption":"ISO8859 15", "command":"toutf8from","args": {"encoding":"ISO8859_15" } }, + {"caption":"ISO8859 16", "command":"toutf8from","args": {"encoding":"ISO8859_16" } } + ]}, + {"caption":"-"}, + {"caption":"JOHAB", "command":"toutf8from","args": {"encoding":"JOHAB" } }, + {"caption":"KOI8 R", "command":"toutf8from","args": {"encoding":"KOI8_R" } }, + {"caption":"KOI8 U", "command":"toutf8from","args": {"encoding":"KOI8_U" } }, + {"caption":"LATIN 1", "command":"toutf8from","args": {"encoding":"LATIN_1" } }, + {"caption":"-"}, + {"caption":"MAC CYRILLIC", "command":"toutf8from","args": {"encoding":"MAC_CYRILLIC" } }, + {"caption":"MAC GREEK", "command":"toutf8from","args": {"encoding":"MAC_GREEK" } }, + {"caption":"MAC ICELAND", "command":"toutf8from","args": {"encoding":"MAC_ICELAND" } }, + {"caption":"MAC LATIN2", "command":"toutf8from","args": {"encoding":"MAC_LATIN2" } }, + {"caption":"MAC ROMAN", "command":"toutf8from","args": {"encoding":"MAC_ROMAN" } }, + {"caption":"MAC TURKISH", "command":"toutf8from","args": {"encoding":"MAC_TURKISH" } }, + {"caption":"-"}, + {"caption":"PTCP154", "command":"toutf8from","args": {"encoding":"PTCP154" } }, + {"caption":"-"}, + {"caption":"SHIFT JIS", "command":"toutf8from","args": {"encoding":"SHIFT_JIS" } }, + {"caption":"SHIFT JIS 2004", "command":"toutf8from","args": {"encoding":"SHIFT_JIS_2004" } }, + {"caption":"SHIFT JISX0213", "command":"toutf8from","args": {"encoding":"SHIFT_JISX0213" } }, + {"caption":"-"}, + {"caption": "UTF", "children": + [ + {"caption":"UTF 7", "command":"toutf8from","args": {"encoding":"UTF_7" } }, + {"caption":"UTF 16", "command":"toutf8from","args": {"encoding":"UTF_16" } }, + {"caption":"UTF 16 LE", "command":"toutf8from","args": {"encoding":"UTF_16_LE" } }, + {"caption":"UTF 16 BE", "command":"toutf8from","args": {"encoding":"UTF_16_BE" } }, + {"caption":"UTF 32", "command":"toutf8from","args": {"encoding":"UTF_32" } }, + {"caption":"UTF 32 LE", "command":"toutf8from","args": {"encoding":"UTF_32_LE" } }, + {"caption":"UTF 32 BE", "command":"toutf8from","args": {"encoding":"UTF_32_BE" } } + ] + } + ] + }, + {"caption":"-"}, + {"caption": "UTF", "children": + [ + {"caption":"UTF 7" ,"command":"toutf8from","args": {"encoding":"UTF_7" } }, + {"caption":"UTF 16" , "command": "toutf8from", "args": {"encoding": "UTF_16" } }, + {"caption":"UTF 16 BE (BMP only)" ,"command":"toutf8from","args": {"encoding":"UTF_16_BE" } }, + {"caption":"UTF 16 LE (BMP only)" ,"command":"toutf8from","args": {"encoding":"UTF_16_LE" } }, + {"caption":"UTF 32" ,"command":"toutf8from","args": {"encoding":"UTF_32" } }, + {"caption":"UTF 32 BE" ,"command":"toutf8from","args": {"encoding":"UTF_32_BE" } }, + {"caption":"UTF 32 LE" ,"command":"toutf8from","args": {"encoding":"UTF_32_LE" } } + ] + }, + {"caption":"-"}, + {"caption": "Chinese, Japanese, Korean", "children": + [ + {"caption":"Traditional Chinese (BIG5)" ,"command":"toutf8from","args": {"encoding":"BIG5" } }, + {"caption":"Traditional Chinese (BIG5HKSCS)" ,"command":"toutf8from","args": {"encoding":"BIG5HKSCS" } }, + {"caption":"Traditional Chinese (CP950)" ,"command":"toutf8from","args": {"encoding":"CP950" } }, + {"caption":"-"}, + {"caption":"Simplified Chinese (GB2312)" ,"command":"toutf8from","args": {"encoding":"GB2312" } }, + {"caption":"Simplified Chinese (HZ)" ,"command":"toutf8from","args": {"encoding":"HZ" } }, + {"caption":"-"}, + {"caption":"Unified Chinese (GB18030)" ,"command":"toutf8from","args": {"encoding":"GB18030" } }, + {"caption":"Unified Chinese (GBK)" ,"command":"toutf8from","args": {"encoding":"GBK" } }, + {"caption":"-"}, + {"caption":"Japanese (CP932)" ,"command":"toutf8from","args": {"encoding":"CP932" } }, + {"caption":"Japanese (EUC JIS 2004)" ,"command":"toutf8from","args": {"encoding":"EUC_JIS_2004" } }, + {"caption":"Japanese (EUC JISX0213)" ,"command":"toutf8from","args": {"encoding":"EUC_JISX0213" } }, + {"caption":"Japanese (EUC JP)" ,"command":"toutf8from","args": {"encoding":"EUC_JP" } }, + {"caption":"Japanese (ISO2022 JP)" ,"command":"toutf8from","args": {"encoding":"ISO2022_JP" } }, + {"caption":"Japanese (ISO2022 JP 1)" ,"command":"toutf8from","args": {"encoding":"ISO2022_JP_1" } }, + {"caption":"Japanese, Korean, Simplified Chinese, Western Europe, Greek (ISO2022 JP 2)" ,"command":"toutf8from","args": {"encoding":"ISO2022_JP_2" } }, + {"caption":"Japanese (ISO2022 JP 3)" ,"command":"toutf8from","args": {"encoding":"ISO2022_JP_3" } }, + {"caption":"Japanese (ISO2022 JP 2004)" ,"command":"toutf8from","args": {"encoding":"ISO2022_JP_2004" } }, + {"caption":"Japanese (ISO2022 JP EXT)" ,"command":"toutf8from","args": {"encoding":"ISO2022_JP_EXT" } }, + {"caption":"Japanese (SHIFT JIS)" ,"command":"toutf8from","args": {"encoding":"SHIFT_JIS" } }, + {"caption":"Japanese (SHIFT JIS 2004)" ,"command":"toutf8from","args": {"encoding":"SHIFT_JIS_2004" } }, + {"caption":"Japanese (SHIFT JISX0213)" ,"command":"toutf8from","args": {"encoding":"SHIFT_JISX0213" } }, + {"caption":"-"}, + {"caption":"Korean (CP949)" ,"command":"toutf8from","args": {"encoding":"CP949" } }, + {"caption":"Korean (EUC KR)" ,"command":"toutf8from","args": {"encoding":"EUC_KR" } }, + {"caption":"Korean (ISO2022 KR)" ,"command":"toutf8from","args": {"encoding":"ISO2022_KR" } }, + {"caption":"Korean (JOHAB)" ,"command":"toutf8from","args": {"encoding":"JOHAB" } } + ] + }, + {"caption": "Russian, Ukrainian", "children": + [ + {"caption":"CP855" ,"command":"toutf8from","args": {"encoding":"CP855" } }, + {"caption":"CP1251" ,"command":"toutf8from","args": {"encoding":"CP1251" } }, + {"caption":"ISO8859 5" ,"command":"toutf8from","args": {"encoding":"ISO8859_5" } }, + {"caption":"MAC CYRILLIC" ,"command":"toutf8from","args": {"encoding":"MAC_CYRILLIC" } }, + {"caption":"-"}, + {"caption":"Russian (CP866)" ,"command":"toutf8from","args": {"encoding":"CP866" } }, + {"caption":"Russian (KOI8 R)" ,"command":"toutf8from","args": {"encoding":"KOI8_R" } }, + {"caption":"-"}, + {"caption":"Ukrainian (KOI8 U)" ,"command":"toutf8from","args": {"encoding":"KOI8_U" } } + ] + }, + + {"caption":"-"}, + {"caption": "Arabic", "children": + [ + {"caption":"CP720" ,"command":"toutf8from","args": {"encoding":"CP720" } }, + {"caption":"CP864" ,"command":"toutf8from","args": {"encoding":"CP864" } }, + {"caption":"CP1256" ,"command":"toutf8from","args": {"encoding":"CP1256" } }, + {"caption":"ISO8859 6" ,"command":"toutf8from","args": {"encoding":"ISO8859_6" } } + ] + }, + {"caption":"Canadian (CP863)" ,"command":"toutf8from","args": {"encoding":"CP863" } }, + {"caption":"Danish, Norwegian (CP865)" ,"command":"toutf8from","args": {"encoding":"CP865" } }, + {"caption": "English", "children": + [ + {"caption":"CP037" ,"command":"toutf8from","args": {"encoding":"CP037" } }, + {"caption":"CP437" ,"command":"toutf8from","args": {"encoding":"CP437" } } + ] + }, + {"caption":"Esperanto, Maltese (ISO8859 3)" ,"command":"toutf8from","args": {"encoding":"ISO8859_3" } }, + {"caption": "Greek", "children": + [ + {"caption":"CP737" ,"command":"toutf8from","args": {"encoding":"CP737" } }, + {"caption":"CP869" ,"command":"toutf8from","args": {"encoding":"CP869" } }, + {"caption":"CP875" ,"command":"toutf8from","args": {"encoding":"CP875" } }, + {"caption":"CP1253" ,"command":"toutf8from","args": {"encoding":"CP1253" } }, + {"caption":"ISO8859 7" ,"command":"toutf8from","args": {"encoding":"ISO8859_7" } }, + {"caption":"MAC GREEK" ,"command":"toutf8from","args": {"encoding":"MAC_GREEK" } } + ] + }, + { "caption": "Hebrew", "children": + [ + {"caption":"CP424" ,"command":"toutf8from","args": {"encoding":"CP424" } }, + {"caption":"CP856" ,"command":"toutf8from","args": {"encoding":"CP856" } }, + {"caption":"CP862" ,"command":"toutf8from","args": {"encoding":"CP862" } }, + {"caption":"CP1255" ,"command":"toutf8from","args": {"encoding":"CP1255" } }, + {"caption":"ISO8859 8" ,"command":"toutf8from","args": {"encoding":"ISO8859_8" } } + ] + }, + {"caption": "Icelandic", "children": + [ + {"caption":"CP861" ,"command":"toutf8from","args": {"encoding":"CP861" } }, + {"caption":"MAC ICELAND" ,"command":"toutf8from","args": {"encoding":"MAC_ICELAND" } } + ] + }, + {"caption":"Kazakh (PTCP154)" ,"command":"toutf8from","args": {"encoding":"PTCP154" } }, + {"caption":"Portuguese (CP860)" ,"command":"toutf8from","args": {"encoding":"CP860" } }, + {"caption":"Thai (CP874)" ,"command":"toutf8from","args": {"encoding":"CP874" } }, + {"caption": "Turkish", "children": + [ + {"caption":"CP857" ,"command":"toutf8from","args": {"encoding":"CP857" } }, + {"caption":"CP1026" ,"command":"toutf8from","args": {"encoding":"CP1026" } }, + {"caption":"CP1254" ,"command":"toutf8from","args": {"encoding":"CP1254" } }, + {"caption":"ISO8859 9" ,"command":"toutf8from","args": {"encoding":"ISO8859_9" } }, + {"caption":"MAC TURKISH" ,"command":"toutf8from","args": {"encoding":"MAC_TURKISH" } } + ] + }, + {"caption":"Urdu (CP1006)" ,"command":"toutf8from","args": {"encoding":"CP1006" } }, + {"caption":"Vietnamese (CP1258)" ,"command":"toutf8from","args": {"encoding":"CP1258" } }, + + + + //REGION + {"caption":"-"}, + {"caption": "Baltic languages", "children": + [ + {"caption":"CP775" ,"command":"toutf8from","args": {"encoding":"CP775" } }, + {"caption":"CP1257" ,"command":"toutf8from","args": {"encoding":"CP1257" } }, + {"caption":"ISO8859 13" ,"command":"toutf8from","args": {"encoding":"ISO8859_13" } }, + {"caption":"ISO8859 4" ,"command":"toutf8from","args": {"encoding":"ISO8859_4" } } + ] + }, + {"caption":"Celtic languages (ISO8859 14)" ,"command":"toutf8from","args": {"encoding":"ISO8859_14" } }, + {"caption":"Nordic languages (ISO8859 10)" ,"command":"toutf8from","args": {"encoding":"ISO8859_10" } }, + + + //LOCATION + {"caption":"-"}, + {"caption": "Central and Eastern Europe", "children": + [ + {"caption":"CP852" ,"command":"toutf8from","args": {"encoding":"CP852" } }, + {"caption":"CP1250" ,"command":"toutf8from","args": {"encoding":"CP1250" } }, + {"caption":"ISO8859 2" ,"command":"toutf8from","args": {"encoding":"ISO8859_2" } }, + {"caption":"CMAC LATIN2" ,"command":"toutf8from","args": {"encoding":"MAC_LATIN2" } } + ] + }, + {"caption":"South-Eastern Europe (ISO8859 16)" ,"command":"toutf8from","args": {"encoding":"ISO8859_16" } }, + {"caption":"West Europe (LATIN 1)" ,"command":"toutf8from","args": {"encoding":"LATIN_1" } }, + {"caption": "Western Europe", "children": + [ + {"caption":"CP500" ,"command":"toutf8from","args": {"encoding":"CP500" } }, + {"caption":"CP850" ,"command":"toutf8from","args": {"encoding":"CP850" } }, + {"caption":"CP858" ,"command":"toutf8from","args": {"encoding":"CP858" } }, + {"caption":"CP1140" ,"command":"toutf8from","args": {"encoding":"CP1140" } }, + {"caption":"CP1252" ,"command":"toutf8from","args": {"encoding":"CP1252" } }, + {"caption":"ISO8859 15" ,"command":"toutf8from","args": {"encoding":"ISO8859_15" } }, + {"caption":"MAC ROMAN" ,"command":"toutf8from","args": {"encoding":"MAC_ROMAN" } } + ] + } + ] + } + ] + + + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Settings/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Settings/Main.sublime-menu new file mode 100644 index 0000000..c6b637c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Settings/Main.sublime-menu @@ -0,0 +1,39 @@ +[ + { + "caption": "Preferences", + "mnemonic": "n", + "id": "preferences", + "children": + [ + { + "caption": "Package Settings", + "mnemonic": "P", + "id": "package-settings", + "children": + [ + { + "caption": "Encoding Helper", + "children": + [ + { + "command": "open_file", "args": + { + "file": "${packages}/EncodingHelper/EncodingHelper.sublime-settings" + }, + "caption": "Settings – Default" + }, + { + "command": "open_file", "args": + { + "file": "${packages}/User/EncodingHelper.sublime-settings" + }, + "caption": "Settings – User" + }, + { "caption": "-" } + ] + } + ] + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/COPYING b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/COPYING new file mode 100644 index 0000000..8add30a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/__init__.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/__init__.py new file mode 100644 index 0000000..953b399 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/__init__.py @@ -0,0 +1,26 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +__version__ = "2.0.1" + +def detect(aBuf): + import universaldetector + u = universaldetector.UniversalDetector() + u.reset() + u.feed(aBuf) + u.close() + return u.result diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5freq.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5freq.py new file mode 100644 index 0000000..c1b0f3c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5freq.py @@ -0,0 +1,923 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +Big5CharToFreqOrder = ( \ + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 #last 512 +#Everything below is of no interest for detection purpose +2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392 +2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408 +5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424 +5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440 +5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456 +5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472 +5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488 +5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504 +5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520 +5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536 +5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552 +5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568 +5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584 +5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600 +6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616 +6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632 +6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648 +6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664 +6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680 +6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696 +6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712 +6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728 +6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744 +6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760 +6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776 +6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792 +6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808 +6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824 +6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840 +6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856 +6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872 +6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888 +6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904 +6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920 +6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936 +6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952 +6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968 +6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984 +6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000 +6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016 +6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032 +6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048 +6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064 +6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080 +6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096 +6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112 +6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128 +6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144 +6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160 +6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176 +6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192 +6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208 +6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224 +6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240 +6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256 +3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272 +6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288 +6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304 +3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320 +6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336 +6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352 +6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368 +6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384 +6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400 +6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416 +6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432 +4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448 +6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464 +6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480 +3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496 +6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512 +6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528 +6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544 +6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560 +6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576 +6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592 +6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608 +6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624 +6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640 +6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656 +6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672 +7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688 +7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704 +7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720 +7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736 +7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752 +7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768 +7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784 +7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800 +7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816 +7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832 +7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848 +7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864 +7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880 +7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896 +7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912 +7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928 +7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944 +7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960 +7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976 +7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992 +7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008 +7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024 +7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040 +7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056 +7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072 +7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088 +7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104 +7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120 +7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136 +7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152 +7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168 +7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184 +7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200 +7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216 +7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232 +7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248 +7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264 +7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280 +7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296 +7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312 +7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328 +7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344 +7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360 +7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376 +7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392 +7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408 +7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424 +7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440 +3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456 +7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472 +7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488 +7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504 +7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520 +4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536 +7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552 +7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568 +7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584 +7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600 +7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616 +7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632 +7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648 +7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664 +7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680 +7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696 +7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712 +8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728 +8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744 +8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760 +8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776 +8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792 +8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808 +8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824 +8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840 +8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856 +8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872 +8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888 +8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904 +8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920 +8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936 +8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952 +8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968 +8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984 +8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000 +8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016 +8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032 +8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048 +8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064 +8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080 +8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096 +8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112 +8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128 +8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144 +8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160 +8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176 +8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192 +8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208 +8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224 +8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240 +8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256 +8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272 +8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288 +8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304 +8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320 +8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336 +8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352 +8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368 +8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384 +8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400 +8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416 +8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432 +8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448 +8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464 +8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480 +8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496 +8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512 +8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528 +8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544 +8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560 +8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576 +8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592 +8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608 +8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624 +8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640 +8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656 +8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672 +8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688 +4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704 +8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720 +8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736 +8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752 +8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768 +9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784 +9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800 +9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816 +9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832 +9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848 +9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864 +9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880 +9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896 +9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912 +9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928 +9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944 +9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960 +9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976 +9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992 +9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008 +9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024 +9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040 +9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056 +9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072 +9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088 +9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104 +9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120 +9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136 +9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152 +9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168 +9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184 +9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200 +9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216 +9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232 +9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248 +9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264 +9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280 +9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296 +9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312 +9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328 +9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344 +9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360 +9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376 +3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392 +9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408 +9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424 +9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440 +4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456 +9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472 +9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488 +9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504 +9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520 +9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536 +9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552 +9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568 +9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584 +9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600 +9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616 +9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632 +9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648 +9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664 +9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680 +9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696 +9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712 +9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728 +9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744 +9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760 +9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776 +9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792 +9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808 +9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824 +10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840 +10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856 +10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872 +10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888 +10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904 +10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920 +10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936 +10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952 +10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968 +4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984 +10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000 +10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016 +10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032 +10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048 +10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064 +10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080 +10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096 +10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112 +4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128 +10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144 +10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160 +10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176 +10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192 +10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208 +10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224 +10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240 +10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256 +10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272 +10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288 +10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304 +10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320 +10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336 +10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352 +10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368 +10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384 +10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400 +4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416 +10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432 +10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448 +10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464 +10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480 +10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496 +10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512 +10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528 +10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544 +10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560 +10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576 +10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592 +10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608 +10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624 +10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640 +10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656 +10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672 +10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688 +10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704 +10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720 +10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736 +10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752 +10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768 +10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784 +10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800 +10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816 +10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832 +10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848 +10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864 +10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880 +10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896 +11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912 +11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928 +11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944 +4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960 +11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976 +11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992 +11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008 +11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024 +11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040 +11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056 +11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072 +11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088 +11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104 +11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120 +11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136 +11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152 +11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168 +11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184 +11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200 +11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216 +11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232 +11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248 +11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264 +11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280 +11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296 +11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312 +11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328 +11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344 +11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360 +11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376 +11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392 +11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408 +11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424 +11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440 +11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456 +11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472 +4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488 +11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504 +11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520 +11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536 +11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552 +11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568 +11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584 +11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600 +11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616 +11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632 +11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648 +11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664 +11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680 +11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696 +11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712 +11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728 +11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744 +11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760 +11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776 +11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792 +11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808 +11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824 +11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840 +11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856 +11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872 +11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888 +11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904 +11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920 +11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936 +12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952 +12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968 +12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984 +12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000 +12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016 +12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032 +12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048 +12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064 +12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080 +12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096 +12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112 +12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128 +12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144 +12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160 +12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176 +4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192 +4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208 +4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224 +12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240 +12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256 +12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272 +12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288 +12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304 +12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320 +12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336 +12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352 +12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368 +12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384 +12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400 +12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416 +12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432 +12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448 +12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464 +12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480 +12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496 +12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512 +12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528 +12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544 +12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560 +12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576 +12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592 +12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608 +12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624 +12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640 +12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656 +12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672 +12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688 +12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704 +12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720 +12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736 +12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752 +12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768 +12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784 +12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800 +12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816 +12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832 +12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848 +12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864 +12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880 +12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896 +12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912 +12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928 +12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944 +12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960 +12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976 +4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992 +13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008 +13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024 +13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040 +13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056 +13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072 +13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088 +13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104 +4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120 +13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136 +13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152 +13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168 +13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184 +13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200 +13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216 +13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232 +13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248 +13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264 +13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280 +13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296 +13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312 +13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328 +13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344 +13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360 +5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376 +13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392 +13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408 +13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424 +13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440 +13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456 +13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472 +13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488 +13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504 +13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520 +13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536 +13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552 +13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568 +13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584 +13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600 +13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616 +13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632 +13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648 +13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664 +13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680 +13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696 +13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712 +13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728 +13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744 +13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760 +13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776 +13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792 +13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808 +13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824 +13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840 +13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856 +13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872 +13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888 +13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904 +13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920 +13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936 +13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952 +13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968 +13968,13969,13970,13971,13972) #13973 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5prober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5prober.py new file mode 100644 index 0000000..e6b52aa --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5prober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from mbcharsetprober import MultiByteCharSetProber +from codingstatemachine import CodingStateMachine +from chardistribution import Big5DistributionAnalysis +from mbcssm import Big5SMModel + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(Big5SMModel) + self._mDistributionAnalyzer = Big5DistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "Big5" diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/chardistribution.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/chardistribution.py new file mode 100644 index 0000000..b893341 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/chardistribution.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants +from euctwfreq import EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, EUCTW_TYPICAL_DISTRIBUTION_RATIO +from euckrfreq import EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, EUCKR_TYPICAL_DISTRIBUTION_RATIO +from gb2312freq import GB2312CharToFreqOrder, GB2312_TABLE_SIZE, GB2312_TYPICAL_DISTRIBUTION_RATIO +from big5freq import Big5CharToFreqOrder, BIG5_TABLE_SIZE, BIG5_TYPICAL_DISTRIBUTION_RATIO +from jisfreq import JISCharToFreqOrder, JIS_TABLE_SIZE, JIS_TYPICAL_DISTRIBUTION_RATIO + +ENOUGH_DATA_THRESHOLD = 1024 +SURE_YES = 0.99 +SURE_NO = 0.01 + +class CharDistributionAnalysis: + def __init__(self): + self._mCharToFreqOrder = None # Mapping table to get frequency order from char order (get from GetOrder()) + self._mTableSize = None # Size of above table + self._mTypicalDistributionRatio = None # This is a constant value which varies from language to language, used in calculating confidence. See http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html for further detail. + self.reset() + + def reset(self): + """reset analyser, clear any state""" + self._mDone = constants.False # If this flag is set to constants.True, detection is done and conclusion has been made + self._mTotalChars = 0 # Total characters encountered + self._mFreqChars = 0 # The number of characters whose frequency order is less than 512 + + def feed(self, aStr, aCharLen): + """feed a character with known length""" + if aCharLen == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(aStr) + else: + order = -1 + if order >= 0: + self._mTotalChars += 1 + # order is valid + if order < self._mTableSize: + if 512 > self._mCharToFreqOrder[order]: + self._mFreqChars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, return negative answer + if self._mTotalChars <= 0: + return SURE_NO + + if self._mTotalChars != self._mFreqChars: + r = self._mFreqChars / ((self._mTotalChars - self._mFreqChars) * self._mTypicalDistributionRatio) + if r < SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. For charset detection, + # certain amount of data is enough + return self._mTotalChars > ENOUGH_DATA_THRESHOLD + + def get_order(self, aStr): + # We do not handle characters based on the original encoding string, but + # convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency table. + return -1 + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = EUCTWCharToFreqOrder + self._mTableSize = EUCTW_TABLE_SIZE + self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aStr): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + if aStr[0] >= '\xC4': + return 94 * (ord(aStr[0]) - 0xC4) + ord(aStr[1]) - 0xA1 + else: + return -1 + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = EUCKRCharToFreqOrder + self._mTableSize = EUCKR_TABLE_SIZE + self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aStr): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + if aStr[0] >= '\xB0': + return 94 * (ord(aStr[0]) - 0xB0) + ord(aStr[1]) - 0xA1 + else: + return -1; + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = GB2312CharToFreqOrder + self._mTableSize = GB2312_TABLE_SIZE + self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aStr): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + if (aStr[0] >= '\xB0') and (aStr[1] >= '\xA1'): + return 94 * (ord(aStr[0]) - 0xB0) + ord(aStr[1]) - 0xA1 + else: + return -1; + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = Big5CharToFreqOrder + self._mTableSize = BIG5_TABLE_SIZE + self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aStr): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + if aStr[0] >= '\xA4': + if aStr[1] >= '\xA1': + return 157 * (ord(aStr[0]) - 0xA4) + ord(aStr[1]) - 0xA1 + 63 + else: + return 157 * (ord(aStr[0]) - 0xA4) + ord(aStr[1]) - 0x40 + else: + return -1 + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = JISCharToFreqOrder + self._mTableSize = JIS_TABLE_SIZE + self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aStr): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + if (aStr[0] >= '\x81') and (aStr[0] <= '\x9F'): + order = 188 * (ord(aStr[0]) - 0x81) + elif (aStr[0] >= '\xE0') and (aStr[0] <= '\xEF'): + order = 188 * (ord(aStr[0]) - 0xE0 + 31) + else: + return -1; + order = order + ord(aStr[1]) - 0x40 + if aStr[1] > '\x7F': + order =- 1 + return order + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = JISCharToFreqOrder + self._mTableSize = JIS_TABLE_SIZE + self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aStr): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + if aStr[0] >= '\xA0': + return 94 * (ord(aStr[0]) - 0xA1) + ord(aStr[1]) - 0xa1 + else: + return -1 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetgroupprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetgroupprober.py new file mode 100644 index 0000000..5188069 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetgroupprober.py @@ -0,0 +1,96 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from charsetprober import CharSetProber + +class CharSetGroupProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mActiveNum = 0 + self._mProbers = [] + self._mBestGuessProber = None + + def reset(self): + CharSetProber.reset(self) + self._mActiveNum = 0 + for prober in self._mProbers: + if prober: + prober.reset() + prober.active = constants.True + self._mActiveNum += 1 + self._mBestGuessProber = None + + def get_charset_name(self): + if not self._mBestGuessProber: + self.get_confidence() + if not self._mBestGuessProber: return None +# self._mBestGuessProber = self._mProbers[0] + return self._mBestGuessProber.get_charset_name() + + def feed(self, aBuf): + for prober in self._mProbers: + if not prober: continue + if not prober.active: continue + st = prober.feed(aBuf) + if not st: continue + if st == constants.eFoundIt: + self._mBestGuessProber = prober + return self.get_state() + elif st == constants.eNotMe: + prober.active = constants.False + self._mActiveNum -= 1 + if self._mActiveNum <= 0: + self._mState = constants.eNotMe + return self.get_state() + return self.get_state() + + def get_confidence(self): + st = self.get_state() + if st == constants.eFoundIt: + return 0.99 + elif st == constants.eNotMe: + return 0.01 + bestConf = 0.0 + self._mBestGuessProber = None + for prober in self._mProbers: + if not prober: continue + if not prober.active: + if constants._debug: + sys.stderr.write(prober.get_charset_name() + ' not active\n') + continue + cf = prober.get_confidence() + if constants._debug: + sys.stderr.write('%s confidence = %s\n' % (prober.get_charset_name(), cf)) + if bestConf < cf: + bestConf = cf + self._mBestGuessProber = prober + if not self._mBestGuessProber: return 0.0 + return bestConf +# else: +# self._mBestGuessProber = self._mProbers[0] +# return self._mBestGuessProber.get_confidence() diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetprober.py new file mode 100644 index 0000000..3ac1683 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetprober.py @@ -0,0 +1,60 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, re + +class CharSetProber: + def __init__(self): + pass + + def reset(self): + self._mState = constants.eDetecting + + def get_charset_name(self): + return None + + def feed(self, aBuf): + pass + + def get_state(self): + return self._mState + + def get_confidence(self): + return 0.0 + + def filter_high_bit_only(self, aBuf): + aBuf = re.sub(r'([\x00-\x7F])+', ' ', aBuf) + return aBuf + + def filter_without_english_letters(self, aBuf): + aBuf = re.sub(r'([A-Za-z])+', ' ', aBuf) + return aBuf + + def filter_with_english_letters(self, aBuf): + # TODO + return aBuf diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/codingstatemachine.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/codingstatemachine.py new file mode 100644 index 0000000..452d3b0 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/codingstatemachine.py @@ -0,0 +1,56 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from constants import eStart, eError, eItsMe + +class CodingStateMachine: + def __init__(self, sm): + self._mModel = sm + self._mCurrentBytePos = 0 + self._mCurrentCharLen = 0 + self.reset() + + def reset(self): + self._mCurrentState = eStart + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byteCls = self._mModel['classTable'][ord(c)] + if self._mCurrentState == eStart: + self._mCurrentBytePos = 0 + self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] + # from byte's class and stateTable, we get its next state + self._mCurrentState = self._mModel['stateTable'][self._mCurrentState * self._mModel['classFactor'] + byteCls] + self._mCurrentBytePos += 1 + return self._mCurrentState + + def get_current_charlen(self): + return self._mCurrentCharLen + + def get_coding_state_machine(self): + return self._mModel['name'] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/constants.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/constants.py new file mode 100644 index 0000000..e94e226 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/constants.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +_debug = 0 + +eDetecting = 0 +eFoundIt = 1 +eNotMe = 2 + +eStart = 0 +eError = 1 +eItsMe = 2 + +SHORTCUT_THRESHOLD = 0.95 + +import __builtin__ +if not hasattr(__builtin__, 'False'): + False = 0 + True = 1 +else: + False = __builtin__.False + True = __builtin__.True diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escprober.py new file mode 100644 index 0000000..572ed7b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escprober.py @@ -0,0 +1,79 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from escsm import HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, ISO2022KRSMModel +from charsetprober import CharSetProber +from codingstatemachine import CodingStateMachine + +class EscCharSetProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mCodingSM = [ \ + CodingStateMachine(HZSMModel), + CodingStateMachine(ISO2022CNSMModel), + CodingStateMachine(ISO2022JPSMModel), + CodingStateMachine(ISO2022KRSMModel) + ] + self.reset() + + def reset(self): + CharSetProber.reset(self) + for codingSM in self._mCodingSM: + if not codingSM: continue + codingSM.active = constants.True + codingSM.reset() + self._mActiveSM = len(self._mCodingSM) + self._mDetectedCharset = None + + def get_charset_name(self): + return self._mDetectedCharset + + def get_confidence(self): + if self._mDetectedCharset: + return 0.99 + else: + return 0.00 + + def feed(self, aBuf): + for c in aBuf: + for codingSM in self._mCodingSM: + if not codingSM: continue + if not codingSM.active: continue + codingState = codingSM.next_state(c) + if codingState == constants.eError: + codingSM.active = constants.False + self._mActiveSM -= 1 + if self._mActiveSM <= 0: + self._mState = constants.eNotMe + return self.get_state() + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + self._mDetectedCharset = codingSM.get_coding_state_machine() + return self.get_state() + + return self.get_state() diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escsm.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escsm.py new file mode 100644 index 0000000..9fa2295 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escsm.py @@ -0,0 +1,240 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from constants import eStart, eError, eItsMe + +HZ_cls = ( \ +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_st = ( \ +eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f +eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 + 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f + 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 + 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f +) + +HZCharLenTable = (0, 0, 0, 0, 0, 0) + +HZSMModel = {'classTable': HZ_cls, + 'classFactor': 6, + 'stateTable': HZ_st, + 'charLenTable': HZCharLenTable, + 'name': "HZ-GB-2312"} + +ISO2022CN_cls = ( \ +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_st = ( \ +eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 +eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f +eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 +eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 + 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 +eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f +) + +ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CNSMModel = {'classTable': ISO2022CN_cls, + 'classFactor': 9, + 'stateTable': ISO2022CN_st, + 'charLenTable': ISO2022CNCharLenTable, + 'name': "ISO-2022-CN"} + +ISO2022JP_cls = ( \ +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_st = ( \ +eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 +eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 +eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f +eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 +eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f +eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f +eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 +) + +ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JPSMModel = {'classTable': ISO2022JP_cls, + 'classFactor': 10, + 'stateTable': ISO2022JP_st, + 'charLenTable': ISO2022JPCharLenTable, + 'name': "ISO-2022-JP"} + +ISO2022KR_cls = ( \ +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_st = ( \ +eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f +eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 +eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f +eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 +) + +ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) + +ISO2022KRSMModel = {'classTable': ISO2022KR_cls, + 'classFactor': 6, + 'stateTable': ISO2022KR_st, + 'charLenTable': ISO2022KRCharLenTable, + 'name': "ISO-2022-KR"} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/eucjpprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/eucjpprober.py new file mode 100644 index 0000000..46a8b38 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/eucjpprober.py @@ -0,0 +1,85 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from constants import eStart, eError, eItsMe +from mbcharsetprober import MultiByteCharSetProber +from codingstatemachine import CodingStateMachine +from chardistribution import EUCJPDistributionAnalysis +from jpcntx import EUCJPContextAnalysis +from mbcssm import EUCJPSMModel + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCJPSMModel) + self._mDistributionAnalyzer = EUCJPDistributionAnalysis() + self._mContextAnalyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + MultiByteCharSetProber.reset(self) + self._mContextAnalyzer.reset() + + def get_charset_name(self): + return "EUC-JP" + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n') + self._mState = constants.eNotMe + break + elif codingState == eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mContextAnalyzer.feed(self._mLastChar, charLen) + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mContextAnalyzer.feed(aBuf[i-1:i+1], charLen) + self._mDistributionAnalyzer.feed(aBuf[i-1:i+1], charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if self._mContextAnalyzer.got_enough_data() and \ + (self.get_confidence() > constants.SHORTCUT_THRESHOLD): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + contxtCf = self._mContextAnalyzer.get_confidence() + distribCf = self._mDistributionAnalyzer.get_confidence() + return max(contxtCf, distribCf) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrfreq.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrfreq.py new file mode 100644 index 0000000..1463fa1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrfreq.py @@ -0,0 +1,594 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKRCharToFreqOrder = ( \ + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +#Everything below is of no interest for detection purpose +2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, +2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, +2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, +2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, +2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, +2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, +2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, +2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, +2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, +2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, +2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, +2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, +2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, +2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, +1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, +2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, +2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, +2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, +2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, +2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, +2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, +2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, +2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, +2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, +3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, +3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, +3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, +3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, +3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, +3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, +3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, +3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, +3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, +3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, +3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, +3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, +3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, +3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, +3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, +3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, +3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, +3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, +3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, +3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, +3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, +3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, +3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, +3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, +3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, +3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, +3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, +3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, +3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, +3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, +3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, +3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, +1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, +1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, +3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, +3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, +3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, +3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, +3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, +3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, +3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, +3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, +3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, +3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, +3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, +3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, +3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, +1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, +3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, +3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, +3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, +3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, +3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, +3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, +3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, +1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, +3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, +3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, +3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, +3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, +1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, +3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, +3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, +3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, +3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, +3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, +3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, +3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, +4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, +4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, +1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, +4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, +4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, +4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, +4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, +4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, +4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, +4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, +4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, +4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, +4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, +4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, +4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, +4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, +4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, +4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, +4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, +4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, +4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, +4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, +4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, +4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, +4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, +4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, +4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, +4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, +4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, +4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, +4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, +4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, +4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, +4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, +4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, +4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, +4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, +4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, +4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, +4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, +4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, +4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, +4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, +4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, +4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, +1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, +4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, +4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, +4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, +4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, +4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, +4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, +4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, +4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, +4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, +4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, +4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, +4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, +4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, +4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, +4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, +4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, +4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, +4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, +4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, +4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, +5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, +5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, +1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, +5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, +5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, +5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, +5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, +5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, +1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, +5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, +5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, +5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, +5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, +5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, +1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, +5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, +5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, +5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, +5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, +5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, +5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, +5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, +5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, +5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, +5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, +5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, +5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, +5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, +5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, +5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, +5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, +5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, +5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, +5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, +5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, +5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, +5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, +5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, +1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, +5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, +5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, +5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, +5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, +1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, +5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, +5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, +5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, +5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, +5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, +1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, +5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, +1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, +5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, +5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, +5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, +5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, +5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, +5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, +5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, +5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, +5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, +5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, +5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, +5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, +5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, +5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, +6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, +6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, +6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, +6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, +6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, +6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, +6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, +6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, +6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, +6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, +6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, +6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, +6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, +6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, +6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, +6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, +6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, #1024 +6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, +6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, +6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, +6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, +6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, +6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, +6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, +6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, +6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, +6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, +6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, +6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, +6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, +6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, +6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, +6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, +6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, +6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, +1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, +6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, +6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, +6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, +6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, +6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, +1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, +6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, +1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, +6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, +6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, +6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, +1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, +6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, +6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, +6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, +6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, +6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, +6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, +6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, +6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, +6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, +6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, +6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, +6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, +6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, +6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, +6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, +6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, +6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, +7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, +7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, +7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, +7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, +7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, +7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, +7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, +7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, +7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, +7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, +7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, +7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, +7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, +7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, +7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, +7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, +7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, +7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, +7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, +7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, +7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, +7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, +7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, +7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, +7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, +7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, +7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, +7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, +7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, +7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, +7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, +7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, +7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, +7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, +7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, +7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, +7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, +7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, +7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, +7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, +7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, +7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, +7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, +7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, +7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, +7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, +7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, +7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, +7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, +7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, +7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, +7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, +7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, +7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, +7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, +7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, +7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, +7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, +7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, +7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, +7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, +7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, +8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, +8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, +8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, +8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, +8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, +8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, +8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, +8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, +8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, +8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, +8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, +8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, +8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, +8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, +8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, +8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, +8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, +8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, +8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, +8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, +8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, +8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, +8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, +8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, +8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, +8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, +8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, +8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, +8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, +8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, +8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, +8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, +8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, +8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, +8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, +8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, +8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, +8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, +8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, +8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, +8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, +8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, +8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, +8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, +8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, +8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, +8736,8737,8738,8739,8740,8741) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrprober.py new file mode 100644 index 0000000..bd697eb --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrprober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from mbcharsetprober import MultiByteCharSetProber +from codingstatemachine import CodingStateMachine +from chardistribution import EUCKRDistributionAnalysis +from mbcssm import EUCKRSMModel + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCKRSMModel) + self._mDistributionAnalyzer = EUCKRDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "EUC-KR" diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwfreq.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwfreq.py new file mode 100644 index 0000000..c057209 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwfreq.py @@ -0,0 +1,426 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 8102 + +EUCTWCharToFreqOrder = ( \ + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +#Everything below is of no interest for detection purpose +2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118 +2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134 +8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150 +8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166 +8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182 +8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198 +8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214 +8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230 +8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246 +8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262 +8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278 +8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294 +8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310 +8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326 +8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342 +8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358 +8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374 +8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390 +8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406 +8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422 +8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438 +8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454 +8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470 +8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486 +8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502 +8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518 +8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534 +8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550 +8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566 +8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582 +8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598 +8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614 +8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630 +8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646 +8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662 +8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678 +8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694 +8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710 +8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726 +8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwprober.py new file mode 100644 index 0000000..b073f13 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwprober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from mbcharsetprober import MultiByteCharSetProber +from codingstatemachine import CodingStateMachine +from chardistribution import EUCTWDistributionAnalysis +from mbcssm import EUCTWSMModel + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCTWSMModel) + self._mDistributionAnalyzer = EUCTWDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "EUC-TW" diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312freq.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312freq.py new file mode 100644 index 0000000..7a4d5a1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312freq.py @@ -0,0 +1,471 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312CharToFreqOrder = ( \ +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, # last 512 +#Everything below is of no interest for detection purpose +5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, +5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, +5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, +3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, +4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, +5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, +5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, +4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, +4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, +4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, +4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, +3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, +6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, +4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, +6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, +4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, +4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, +4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, +5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, +3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, +4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, +3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, +4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, +4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, +6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, +6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, +5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, +4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, +6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, +4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, +5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, +5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, +5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, +6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, +3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, +6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, +4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, +5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, +6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, +6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, +4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, +5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, +4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, +5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, +5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, +4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, +4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, +5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, +4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, +4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, +5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, +4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, +4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, +4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, +5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, +5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, +4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, +3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, +4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, +6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, +5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, +5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, +4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, +6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, +5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, +6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, +4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, +5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, +5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, +3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, +5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, +6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, +4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, +6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, +4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, +4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, +6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, +3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, +6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, +4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, +3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, +3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, +3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, +4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, +2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, +5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, +4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, +5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, +5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, +5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, +4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, +5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, +4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, +5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, +1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, +3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, +4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, +4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, +6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, +4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, +5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, +3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, +5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, +5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, +5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, +3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, +5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, +5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, +3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, +5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, +5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, +5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, +6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, +4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, +6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, +4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, +3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, +4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, +5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, +5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, +5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, +3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, +3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, +6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, +6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, +5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, +6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, +6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, +6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, +6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, +6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, +5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, +6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, +6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, +3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, +3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, +4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, +4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, +3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, +5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, +5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, +5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, +5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, +5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, +4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, +5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, +6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, +5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, +4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, +4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, +6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, +3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, +4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, +4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, +5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, +6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, +6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, +4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, +6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, +5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, +5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, +5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, +5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, +5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, +4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, +5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, +5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, +5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, +5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, +6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, +4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, +5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, +4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, +4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, +6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, +4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, +6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, +3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, +5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, +6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, +6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, +6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, +5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, +6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, +6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, +3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, +5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, +4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767) + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312prober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312prober.py new file mode 100644 index 0000000..91eb392 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312prober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from mbcharsetprober import MultiByteCharSetProber +from codingstatemachine import CodingStateMachine +from chardistribution import GB2312DistributionAnalysis +from mbcssm import GB2312SMModel + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(GB2312SMModel) + self._mDistributionAnalyzer = GB2312DistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "GB2312" diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/hebrewprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/hebrewprober.py new file mode 100644 index 0000000..a2b1eaa --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/hebrewprober.py @@ -0,0 +1,269 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from charsetprober import CharSetProber +import constants + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +# windows-1255 / ISO-8859-8 code points of interest +FINAL_KAF = '\xea' +NORMAL_KAF = '\xeb' +FINAL_MEM = '\xed' +NORMAL_MEM = '\xee' +FINAL_NUN = '\xef' +NORMAL_NUN = '\xf0' +FINAL_PE = '\xf3' +NORMAL_PE = '\xf4' +FINAL_TSADI = '\xf5' +NORMAL_TSADI = '\xf6' + +# Minimum Visual vs Logical final letter score difference. +# If the difference is below this, don't rely solely on the final letter score distance. +MIN_FINAL_CHAR_DISTANCE = 5 + +# Minimum Visual vs Logical model score difference. +# If the difference is below this, don't rely at all on the model score distance. +MIN_MODEL_DISTANCE = 0.01 + +VISUAL_HEBREW_NAME = "ISO-8859-8" +LOGICAL_HEBREW_NAME = "windows-1255" + +class HebrewProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mLogicalProber = None + self._mVisualProber = None + self.reset() + + def reset(self): + self._mFinalCharLogicalScore = 0 + self._mFinalCharVisualScore = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate a word + # delimiter at the beginning of the data + self._mPrev = ' ' + self._mBeforePrev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._mLogicalProber = logicalProber + self._mVisualProber = visualProber + + def is_final(self, c): + return c in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters causing + # the Non-Final tsadi to appear at an end of a word even though this is not + # the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being a + # good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' for + # example legally end with a Non-Final Pe or Kaf. However, the benefit of + # these letters as Non-Final letters outweighs the damage since these words + # are quite rare. + return c in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] + + def feed(self, aBuf): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew or + # visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is an + # indication that the text is laid out "naturally" since the final letter + # really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In normal + # Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, should not end with + # the Non-Final form of that letter. Exceptions to this rule are mentioned + # above in isNonFinal(). This is an indication that the text is laid out + # backwards. +1 for visual score + # 3) A word longer than 1 letter, starting with a final letter. Final letters + # should not appear at the beginning of a word. This is an indication that + # the text is laid out backwards. +1 for visual score. + # + # The visual score and logical score are accumulated throughout the text and + # are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since that case + # is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with spaces) + # so the word boundary detection works properly. [MAP] + + if self.get_state() == constants.eNotMe: + # Both model probers say it's not them. No reason to continue. + return constants.eNotMe + + aBuf = self.filter_high_bit_only(aBuf) + + for cur in aBuf: + if cur == ' ': + # We stand on a space - a word just ended + if self._mBeforePrev != ' ': + # next-to-last char was not a space so self._mPrev is not a 1 letter word + if self.is_final(self._mPrev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._mFinalCharLogicalScore += 1 + elif self.is_non_final(self._mPrev): + # case (2) [-2:not space][-1:Non-Final letter][cur:space] + self._mFinalCharVisualScore += 1 + else: + # Not standing on a space + if (self._mBeforePrev == ' ') and (self.is_final(self._mPrev)) and (cur != ' '): + # case (3) [-2:space][-1:final letter][cur:not space] + self._mFinalCharVisualScore += 1 + self._mBeforePrev = self._mPrev + self._mPrev = cur + + # Forever detecting, till the end or until both model probers return eNotMe (handled above) + return constants.eDetecting + + def get_charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore + if finalsub >= MIN_FINAL_CHAR_DISTANCE: + return LOGICAL_HEBREW_NAME + if finalsub <= -MIN_FINAL_CHAR_DISTANCE: + return VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = self._mLogicalProber.get_confidence() - self._mVisualProber.get_confidence() + if modelsub > MIN_MODEL_DISTANCE: + return LOGICAL_HEBREW_NAME + if modelsub < -MIN_MODEL_DISTANCE: + return VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the day. + if finalsub < 0.0: + return VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to Logical. + return LOGICAL_HEBREW_NAME + + def get_state(self): + # Remain active as long as any of the model probers are active. + if (self._mLogicalProber.get_state() == constants.eNotMe) and \ + (self._mVisualProber.get_state() == constants.eNotMe): + return constants.eNotMe + return constants.eDetecting diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jisfreq.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jisfreq.py new file mode 100644 index 0000000..5fe4a5c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jisfreq.py @@ -0,0 +1,567 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JISCharToFreqOrder = ( \ + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +#Everything below is of no interest for detection purpose +2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384 +6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400 +6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416 +6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432 +6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448 +4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464 +4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480 +3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496 +3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512 +4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528 +3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544 +6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560 +4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576 +6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592 +6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608 +6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624 +6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640 +6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656 +6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672 +3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688 +3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704 +6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720 +2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736 +4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752 +4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768 +4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784 +6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800 +3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816 +4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832 +4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848 +6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864 +4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880 +6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896 +3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912 +2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928 +4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944 +2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960 +6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976 +4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992 +6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008 +6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024 +6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040 +4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056 +6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072 +2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088 +6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104 +4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120 +6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136 +4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152 +4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168 +6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184 +6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200 +6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216 +3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232 +1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248 +3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264 +3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280 +4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296 +6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312 +3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328 +6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344 +3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360 +3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376 +2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392 +6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408 +6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424 +3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440 +6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456 +3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472 +6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488 +6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504 +6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520 +4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536 +6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552 +4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568 +3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584 +3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600 +6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616 +6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632 +4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648 +6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664 +6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680 +6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696 +6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712 +6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728 +6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744 +4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760 +4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776 +3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792 +6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808 +4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824 +2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840 +6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856 +6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872 +4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888 +2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904 +4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920 +2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936 +4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952 +4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968 +4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984 +6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000 +3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016 +6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032 +3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048 +6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064 +2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080 +3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096 +7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112 +2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128 +3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144 +3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160 +3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176 +3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192 +7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208 +7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224 +7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240 +7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256 +7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272 +4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288 +3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304 +3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320 +4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336 +3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352 +3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368 +7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384 +4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400 +7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416 +7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432 +7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448 +7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464 +7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480 +4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496 +4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512 +7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528 +3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544 +4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560 +7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576 +7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592 +4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608 +3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624 +3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640 +7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656 +4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672 +4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688 +4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704 +4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720 +4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736 +4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752 +7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768 +7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784 +7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800 +7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816 +7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832 +2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848 +3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864 +7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880 +7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896 +3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912 +4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928 +3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944 +3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960 +2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976 +7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992 +7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008 +4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024 +3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040 +3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056 +7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072 +7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088 +7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104 +4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120 +7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136 +2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152 +3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168 +4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184 +7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200 +4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216 +4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232 +7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248 +7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264 +5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280 +7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296 +7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312 +7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328 +7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344 +7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360 +5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376 +5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392 +7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408 +3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424 +7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440 +7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456 +3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472 +7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488 +7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504 +1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520 +3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536 +4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552 +2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568 +3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584 +2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600 +5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616 +4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632 +4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648 +5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664 +7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680 +7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696 +7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712 +7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728 +3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744 +7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760 +3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776 +7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792 +4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808 +7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824 +7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840 +7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856 +7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872 +7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888 +7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904 +7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920 +7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936 +7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952 +7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968 +7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984 +7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000 +8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016 +8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032 +8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048 +8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064 +8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080 +8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096 +8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112 +8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128 +8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144 +8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160 +8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176 +8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192 +8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208 +8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224 +8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240 +8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256 +8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jpcntx.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jpcntx.py new file mode 100644 index 0000000..93db4a9 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jpcntx.py @@ -0,0 +1,210 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +NUM_OF_CATEGORY = 6 +DONT_KNOW = -1 +ENOUGH_REL_THRESHOLD = 100 +MAX_REL_THRESHOLD = 1000 +MINIMUM_DATA_THRESHOLD = 4 + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( \ +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis: + def __init__(self): + self.reset() + + def reset(self): + self._mTotalRel = 0 # total sequence received + self._mRelSample = [0] * NUM_OF_CATEGORY # category counters, each interger counts sequence in its category + self._mNeedToSkipCharNum = 0 # if last byte in current buffer is not the last byte of a character, we need to know how many bytes to skip in next buffer + self._mLastCharOrder = -1 # The order of previous char + self._mDone = constants.False # If this flag is set to constants.True, detection is done and conclusion has been made + + def feed(self, aBuf, aLen): + if self._mDone: return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not complete, we + # record how many byte needed to complete that character and skip these bytes here. + # We can choose to record those bytes as well and analyse the character once it + # is complete, but since a character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._mNeedToSkipCharNum + while i < aLen: + order, charLen = self.get_order(aBuf[i:i+2]) + i += charLen + if i > aLen: + self._mNeedToSkipCharNum = i - aLen + self._mLastCharOrder = -1 + else: + if (order != -1) and (self._mLastCharOrder != -1): + self._mTotalRel += 1 + if self._mTotalRel > MAX_REL_THRESHOLD: + self._mDone = constants.True + break + self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 + self._mLastCharOrder = order + + def got_enough_data(self): + return self._mTotalRel > ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._mTotalRel > MINIMUM_DATA_THRESHOLD: + return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel + else: + return DONT_KNOW + + def get_order(self, aStr): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def get_order(self, aStr): + if not aStr: return -1, 1 + # find out current char's byte length + if ((aStr[0] >= '\x81') and (aStr[0] <= '\x9F')) or \ + ((aStr[0] >= '\xE0') and (aStr[0] <= '\xFC')): + charLen = 2 + else: + charLen = 1 + + # return its order if it is hiragana + if len(aStr) > 1: + if (aStr[0] == '\202') and \ + (aStr[1] >= '\x9F') and \ + (aStr[1] <= '\xF1'): + return ord(aStr[1]) - 0x9F, charLen + + return -1, charLen + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, aStr): + if not aStr: return -1, 1 + # find out current char's byte length + if (aStr[0] == '\x8E') or \ + ((aStr[0] >= '\xA1') and (aStr[0] <= '\xFE')): + charLen = 2 + elif aStr[0] == '\x8F': + charLen = 3 + else: + charLen = 1 + + # return its order if it is hiragana + if len(aStr) > 1: + if (aStr[0] == '\xA4') and \ + (aStr[1] >= '\xA1') and \ + (aStr[1] <= '\xF3'): + return ord(aStr[1]) - 0xA1, charLen + + return -1, charLen diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langbulgarianmodel.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..bf5641e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( \ +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { \ + 'charToOrderMap': Latin5_BulgarianCharToOrderMap, + 'precedenceMatrix': BulgarianLangModel, + 'mTypicalPositiveRatio': 0.969392, + 'keepEnglishLetter': constants.False, + 'charsetName': "ISO-8859-5" +} + +Win1251BulgarianModel = { \ + 'charToOrderMap': win1251BulgarianCharToOrderMap, + 'precedenceMatrix': BulgarianLangModel, + 'mTypicalPositiveRatio': 0.969392, + 'keepEnglishLetter': constants.False, + 'charsetName': "windows-1251" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langcyrillicmodel.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e604cc7 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langcyrillicmodel.py @@ -0,0 +1,329 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +# KOI8-R language model +# Character Mapping Table: +KOI8R_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( \ +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { \ + 'charToOrderMap': KOI8R_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': constants.False, + 'charsetName': "KOI8-R" +} + +Win1251CyrillicModel = { \ + 'charToOrderMap': win1251_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': constants.False, + 'charsetName': "windows-1251" +} + +Latin5CyrillicModel = { \ + 'charToOrderMap': latin5_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': constants.False, + 'charsetName': "ISO-8859-5" +} + +MacCyrillicModel = { \ + 'charToOrderMap': macCyrillic_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': constants.False, + 'charsetName': "MacCyrillic" +}; + +Ibm866Model = { \ + 'charToOrderMap': IBM866_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': constants.False, + 'charsetName': "IBM866" +} + +Ibm855Model = { \ + 'charToOrderMap': IBM855_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': constants.False, + 'charsetName': "IBM855" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langgreekmodel.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langgreekmodel.py new file mode 100644 index 0000000..ec6d49e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( \ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { \ + 'charToOrderMap': Latin7_CharToOrderMap, + 'precedenceMatrix': GreekLangModel, + 'mTypicalPositiveRatio': 0.982851, + 'keepEnglishLetter': constants.False, + 'charsetName': "ISO-8859-7" +} + +Win1253GreekModel = { \ + 'charToOrderMap': win1253_CharToOrderMap, + 'precedenceMatrix': GreekLangModel, + 'mTypicalPositiveRatio': 0.982851, + 'keepEnglishLetter': constants.False, + 'charsetName': "windows-1253" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhebrewmodel.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhebrewmodel.py new file mode 100644 index 0000000..a8bcc65 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhebrewmodel.py @@ -0,0 +1,201 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +win1255_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HebrewLangModel = ( \ +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { \ + 'charToOrderMap': win1255_CharToOrderMap, + 'precedenceMatrix': HebrewLangModel, + 'mTypicalPositiveRatio': 0.984004, + 'keepEnglishLetter': constants.False, + 'charsetName': "windows-1255" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhungarianmodel.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhungarianmodel.py new file mode 100644 index 0000000..d635f03 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( \ +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { \ + 'charToOrderMap': Latin2_HungarianCharToOrderMap, + 'precedenceMatrix': HungarianLangModel, + 'mTypicalPositiveRatio': 0.947368, + 'keepEnglishLetter': constants.True, + 'charsetName': "ISO-8859-2" +} + +Win1250HungarianModel = { \ + 'charToOrderMap': win1250HungarianCharToOrderMap, + 'precedenceMatrix': HungarianLangModel, + 'mTypicalPositiveRatio': 0.947368, + 'keepEnglishLetter': constants.True, + 'charsetName': "windows-1250" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langthaimodel.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langthaimodel.py new file mode 100644 index 0000000..96ec054 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langthaimodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( \ +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { \ + 'charToOrderMap': TIS620CharToOrderMap, + 'precedenceMatrix': ThaiLangModel, + 'mTypicalPositiveRatio': 0.926386, + 'keepEnglishLetter': constants.False, + 'charsetName': "TIS-620" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/latin1prober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/latin1prober.py new file mode 100644 index 0000000..b46129b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/latin1prober.py @@ -0,0 +1,136 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from charsetprober import CharSetProber +import constants +import operator + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( \ + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( \ +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + +class Latin1Prober(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self.reset() + + def reset(self): + self._mLastCharClass = OTH + self._mFreqCounter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + def get_charset_name(self): + return "windows-1252" + + def feed(self, aBuf): + aBuf = self.filter_with_english_letters(aBuf) + for c in aBuf: + charClass = Latin1_CharToClass[ord(c)] + freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) + charClass] + if freq == 0: + self._mState = constants.eNotMe + break + self._mFreqCounter[freq] += 1 + self._mLastCharClass = charClass + + return self.get_state() + + def get_confidence(self): + if self.get_state() == constants.eNotMe: + return 0.01 + + total = reduce(operator.add, self._mFreqCounter) + if total < 0.01: + confidence = 0.0 + else: + confidence = (self._mFreqCounter[3] / total) - (self._mFreqCounter[1] * 20.0 / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate detector + # can take priority. + confidence = confidence * 0.5 + return confidence diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcharsetprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcharsetprober.py new file mode 100644 index 0000000..a813144 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcharsetprober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from constants import eStart, eError, eItsMe +from charsetprober import CharSetProber + +class MultiByteCharSetProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mDistributionAnalyzer = None + self._mCodingSM = None + self._mLastChar = ['\x00', '\x00'] + + def reset(self): + CharSetProber.reset(self) + if self._mCodingSM: + self._mCodingSM.reset() + if self._mDistributionAnalyzer: + self._mDistributionAnalyzer.reset() + self._mLastChar = ['\x00', '\x00'] + + def get_charset_name(self): + pass + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n') + self._mState = constants.eNotMe + break + elif codingState == eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mDistributionAnalyzer.feed(aBuf[i-1:i+1], charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if self._mDistributionAnalyzer.got_enough_data() and \ + (self.get_confidence() > constants.SHORTCUT_THRESHOLD): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + return self._mDistributionAnalyzer.get_confidence() diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcsgroupprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..941cc3e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcsgroupprober.py @@ -0,0 +1,50 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from charsetgroupprober import CharSetGroupProber +from utf8prober import UTF8Prober +from sjisprober import SJISProber +from eucjpprober import EUCJPProber +from gb2312prober import GB2312Prober +from euckrprober import EUCKRProber +from big5prober import Big5Prober +from euctwprober import EUCTWProber + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self): + CharSetGroupProber.__init__(self) + self._mProbers = [ \ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + Big5Prober(), + EUCTWProber()] + self.reset() diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcssm.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcssm.py new file mode 100644 index 0000000..e46c1ff --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcssm.py @@ -0,0 +1,514 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from constants import eStart, eError, eItsMe + +# BIG5 + +BIG5_cls = ( \ + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0) # f8 - ff + +BIG5_st = ( \ + eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 + eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f + eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart)#10-17 + +Big5CharLenTable = (0, 1, 1, 2, 0) + +Big5SMModel = {'classTable': BIG5_cls, + 'classFactor': 5, + 'stateTable': BIG5_st, + 'charLenTable': Big5CharLenTable, + 'name': 'Big5'} + +# EUC-JP + +EUCJP_cls = ( \ + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5) # f8 - ff + +EUCJP_st = ( \ + 3, 4, 3, 5,eStart,eError,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 + eError,eError,eStart,eError,eError,eError, 3,eError,#18-1f + 3,eError,eError,eError,eStart,eStart,eStart,eStart)#20-27 + +EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) + +EUCJPSMModel = {'classTable': EUCJP_cls, + 'classFactor': 6, + 'stateTable': EUCJP_st, + 'charLenTable': EUCJPCharLenTable, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_cls = ( \ + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0) # f8 - ff + +EUCKR_st = ( + eError,eStart, 3,eError,eError,eError,eError,eError,#00-07 + eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart)#08-0f + +EUCKRCharLenTable = (0, 1, 2, 0) + +EUCKRSMModel = {'classTable': EUCKR_cls, + 'classFactor': 4, + 'stateTable': EUCKR_st, + 'charLenTable': EUCKRCharLenTable, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_cls = ( \ + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0) # f8 - ff + +EUCTW_st = ( \ + eError,eError,eStart, 3, 3, 3, 4,eError,#00-07 + eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 + eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f + 5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 + eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart)#28-2f + +EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) + +EUCTWSMModel = {'classTable': EUCTW_cls, + 'classFactor': 7, + 'stateTable': EUCTW_st, + 'charLenTable': EUCTWCharLenTable, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_cls = ( \ + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0) # f8 - ff + +GB2312_st = ( \ + eError,eStart,eStart,eStart,eStart,eStart, 3,eError,#00-07 + eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 + 4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f + eError,eError, 5,eError,eError,eError,eItsMe,eError,#20-27 + eError,eError,eStart,eStart,eStart,eStart,eStart,eStart)#28-2f + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validing +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2) + +GB2312SMModel = {'classTable': GB2312_cls, + 'classFactor': 7, + 'stateTable': GB2312_st, + 'charLenTable': GB2312CharLenTable, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_cls = ( \ + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,3,3,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 4,4,4,4,4,4,4,4, # f0 - f7 + 4,4,4,4,4,0,0,0) # f8 - ff + +SJIS_st = ( \ + eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart)#10-17 + +SJISCharLenTable = (0, 1, 1, 2, 0, 0) + +SJISSMModel = {'classTable': SJIS_cls, + 'classFactor': 6, + 'stateTable': SJIS_st, + 'charLenTable': SJISCharLenTable, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_cls = ( \ + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5) # f8 - ff + +UCS2BE_st = ( \ + 5, 7, 7,eError, 4, 3,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe, 6, 6, 6, 6,eError,eError,#10-17 + 6, 6, 6, 6, 6,eItsMe, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,eError,#20-27 + 5, 8, 6, 6,eError, 6, 6, 6,#28-2f + 6, 6, 6, 6,eError,eError,eStart,eStart)#30-37 + +UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) + +UCS2BESMModel = {'classTable': UCS2BE_cls, + 'classFactor': 6, + 'stateTable': UCS2BE_st, + 'charLenTable': UCS2BECharLenTable, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_cls = ( \ + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5) # f8 - ff + +UCS2LE_st = ( \ + 6, 6, 7, 6, 4, 3,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError,#10-17 + 5, 5, 5,eError, 5,eError, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,eError,#20-27 + 5, 5, 5,eError,eError,eError, 5, 5,#28-2f + 5, 5, 5,eError, 5,eError,eStart,eStart)#30-37 + +UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) + +UCS2LESMModel = {'classTable': UCS2LE_cls, + 'classFactor': 6, + 'stateTable': UCS2LE_st, + 'charLenTable': UCS2LECharLenTable, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_cls = ( \ + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0) # f8 - ff + +UTF8_st = ( \ + eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + eError,eError,eError,eError,eError,eError,eError,eError,#10-17 + eError,eError,eError,eError,eError,eError,eError,eError,#18-1f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f + eError,eError, 5, 5, 5, 5,eError,eError,#30-37 + eError,eError,eError,eError,eError,eError,eError,eError,#38-3f + eError,eError,eError, 5, 5, 5,eError,eError,#40-47 + eError,eError,eError,eError,eError,eError,eError,eError,#48-4f + eError,eError, 7, 7, 7, 7,eError,eError,#50-57 + eError,eError,eError,eError,eError,eError,eError,eError,#58-5f + eError,eError,eError,eError, 7, 7,eError,eError,#60-67 + eError,eError,eError,eError,eError,eError,eError,eError,#68-6f + eError,eError, 9, 9, 9, 9,eError,eError,#70-77 + eError,eError,eError,eError,eError,eError,eError,eError,#78-7f + eError,eError,eError,eError,eError, 9,eError,eError,#80-87 + eError,eError,eError,eError,eError,eError,eError,eError,#88-8f + eError,eError, 12, 12, 12, 12,eError,eError,#90-97 + eError,eError,eError,eError,eError,eError,eError,eError,#98-9f + eError,eError,eError,eError,eError, 12,eError,eError,#a0-a7 + eError,eError,eError,eError,eError,eError,eError,eError,#a8-af + eError,eError, 12, 12, 12,eError,eError,eError,#b0-b7 + eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf + eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 + eError,eError,eError,eError,eError,eError,eError,eError)#c8-cf + +UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8SMModel = {'classTable': UTF8_cls, + 'classFactor': 16, + 'stateTable': UTF8_st, + 'charLenTable': UTF8CharLenTable, + 'name': 'UTF-8'} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcharsetprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcharsetprober.py new file mode 100644 index 0000000..da07116 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcharsetprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from charsetprober import CharSetProber + +SAMPLE_SIZE = 64 +SB_ENOUGH_REL_THRESHOLD = 1024 +POSITIVE_SHORTCUT_THRESHOLD = 0.95 +NEGATIVE_SHORTCUT_THRESHOLD = 0.05 +SYMBOL_CAT_ORDER = 250 +NUMBER_OF_SEQ_CAT = 4 +POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1 +#NEGATIVE_CAT = 0 + +class SingleByteCharSetProber(CharSetProber): + def __init__(self, model, reversed=constants.False, nameProber=None): + CharSetProber.__init__(self) + self._mModel = model + self._mReversed = reversed # TRUE if we need to reverse every pair in the model lookup + self._mNameProber = nameProber # Optional auxiliary prober for name decision + self.reset() + + def reset(self): + CharSetProber.reset(self) + self._mLastOrder = 255 # char order of last character + self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT + self._mTotalSeqs = 0 + self._mTotalChar = 0 + self._mFreqChar = 0 # characters that fall in our sampling range + + def get_charset_name(self): + if self._mNameProber: + return self._mNameProber.get_charset_name() + else: + return self._mModel['charsetName'] + + def feed(self, aBuf): + if not self._mModel['keepEnglishLetter']: + aBuf = self.filter_without_english_letters(aBuf) + aLen = len(aBuf) + if not aLen: + return self.get_state() + for c in aBuf: + order = self._mModel['charToOrderMap'][ord(c)] + if order < SYMBOL_CAT_ORDER: + self._mTotalChar += 1 + if order < SAMPLE_SIZE: + self._mFreqChar += 1 + if self._mLastOrder < SAMPLE_SIZE: + self._mTotalSeqs += 1 + if not self._mReversed: + self._mSeqCounters[self._mModel['precedenceMatrix'][(self._mLastOrder * SAMPLE_SIZE) + order]] += 1 + else: # reverse the order of the letters in the lookup + self._mSeqCounters[self._mModel['precedenceMatrix'][(order * SAMPLE_SIZE) + self._mLastOrder]] += 1 + self._mLastOrder = order + + if self.get_state() == constants.eDetecting: + if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD: + cf = self.get_confidence() + if cf > POSITIVE_SHORTCUT_THRESHOLD: + if constants._debug: + sys.stderr.write('%s confidence = %s, we have a winner\n' % (self._mModel['charsetName'], cf)) + self._mState = constants.eFoundIt + elif cf < NEGATIVE_SHORTCUT_THRESHOLD: + if constants._debug: + sys.stderr.write('%s confidence = %s, below negative shortcut threshhold %s\n' % (self._mModel['charsetName'], cf, NEGATIVE_SHORTCUT_THRESHOLD)) + self._mState = constants.eNotMe + + return self.get_state() + + def get_confidence(self): + r = 0.01 + if self._mTotalSeqs > 0: +# print self._mSeqCounters[POSITIVE_CAT], self._mTotalSeqs, self._mModel['mTypicalPositiveRatio'] + r = (1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs / self._mModel['mTypicalPositiveRatio'] +# print r, self._mFreqChar, self._mTotalChar + r = r * self._mFreqChar / self._mTotalChar + if r >= 1.0: + r = 0.99 + return r diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcsgroupprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..d19160c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcsgroupprober.py @@ -0,0 +1,64 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from charsetgroupprober import CharSetGroupProber +from sbcharsetprober import SingleByteCharSetProber +from langcyrillicmodel import Win1251CyrillicModel, Koi8rModel, Latin5CyrillicModel, MacCyrillicModel, Ibm866Model, Ibm855Model +from langgreekmodel import Latin7GreekModel, Win1253GreekModel +from langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +from langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from langthaimodel import TIS620ThaiModel +from langhebrewmodel import Win1255HebrewModel +from hebrewprober import HebrewProber + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + CharSetGroupProber.__init__(self) + self._mProbers = [ \ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + SingleByteCharSetProber(Latin2HungarianModel), + SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + ] + hebrewProber = HebrewProber() + logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, constants.False, hebrewProber) + visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, constants.True, hebrewProber) + hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) + self._mProbers.extend([hebrewProber, logicalHebrewProber, visualHebrewProber]) + + self.reset() diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sjisprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sjisprober.py new file mode 100644 index 0000000..fea2690 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sjisprober.py @@ -0,0 +1,85 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from mbcharsetprober import MultiByteCharSetProber +from codingstatemachine import CodingStateMachine +from chardistribution import SJISDistributionAnalysis +from jpcntx import SJISContextAnalysis +from mbcssm import SJISSMModel +import constants, sys +from constants import eStart, eError, eItsMe + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(SJISSMModel) + self._mDistributionAnalyzer = SJISDistributionAnalysis() + self._mContextAnalyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + MultiByteCharSetProber.reset(self) + self._mContextAnalyzer.reset() + + def get_charset_name(self): + return "SHIFT_JIS" + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n') + self._mState = constants.eNotMe + break + elif codingState == eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mContextAnalyzer.feed(self._mLastChar[2 - charLen :], charLen) + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mContextAnalyzer.feed(aBuf[i + 1 - charLen : i + 3 - charLen], charLen) + self._mDistributionAnalyzer.feed(aBuf[i - 1 : i + 1], charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if self._mContextAnalyzer.got_enough_data() and \ + (self.get_confidence() > constants.SHORTCUT_THRESHOLD): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + contxtCf = self._mContextAnalyzer.get_confidence() + distribCf = self._mDistributionAnalyzer.get_confidence() + return max(contxtCf, distribCf) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/test.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/test.py new file mode 100644 index 0000000..2ebf3a4 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/test.py @@ -0,0 +1,20 @@ +import sys, glob +sys.path.insert(0, '..') +from chardet.universaldetector import UniversalDetector + +count = 0 +u = UniversalDetector() +for f in glob.glob(sys.argv[1]): + print f.ljust(60), + u.reset() + for line in file(f, 'rb'): + u.feed(line) + if u.done: break + u.close() + result = u.result + if result['encoding']: + print result['encoding'], 'with confidence', result['confidence'] + else: + print '******** no result' + count += 1 +print count, 'tests' diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/universaldetector.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/universaldetector.py new file mode 100644 index 0000000..809df22 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/universaldetector.py @@ -0,0 +1,154 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from latin1prober import Latin1Prober # windows-1252 +from mbcsgroupprober import MBCSGroupProber # multi-byte character sets +from sbcsgroupprober import SBCSGroupProber # single-byte character sets +from escprober import EscCharSetProber # ISO-2122, etc. +import re + +MINIMUM_THRESHOLD = 0.20 +ePureAscii = 0 +eEscAscii = 1 +eHighbyte = 2 + +class UniversalDetector: + def __init__(self): + self._highBitDetector = re.compile(r'[\x80-\xFF]') + self._escDetector = re.compile(r'(\033|~{)') + self._mEscCharSetProber = None + self._mCharSetProbers = [] + self.reset() + + def reset(self): + self.result = {'encoding': None, 'confidence': 0.0} + self.done = constants.False + self._mStart = constants.True + self._mGotData = constants.False + self._mInputState = ePureAscii + self._mLastChar = '' + if self._mEscCharSetProber: + self._mEscCharSetProber.reset() + for prober in self._mCharSetProbers: + prober.reset() + + def feed(self, aBuf): + if self.done: return + + aLen = len(aBuf) + if not aLen: return + + if not self._mGotData: + # If the data starts with BOM, we know it is UTF + if aBuf[:3] == '\xEF\xBB\xBF': + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8", 'confidence': 1.0} + elif aBuf[:4] == '\xFF\xFE\x00\x00': + # FF FE 00 00 UTF-32, little-endian BOM + self.result = {'encoding': "UTF-32LE", 'confidence': 1.0} + elif aBuf[:4] == '\x00\x00\xFE\xFF': + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32BE", 'confidence': 1.0} + elif aBuf[:4] == '\xFE\xFF\x00\x00': + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", 'confidence': 1.0} + elif aBuf[:4] == '\x00\x00\xFF\xFE': + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", 'confidence': 1.0} + elif aBuf[:2] == '\xFF\xFE': + # FF FE UTF-16, little endian BOM + self.result = {'encoding': "UTF-16LE", 'confidence': 1.0} + elif aBuf[:2] == '\xFE\xFF': + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16BE", 'confidence': 1.0} + + self._mGotData = constants.True + if self.result['encoding'] and (self.result['confidence'] > 0.0): + self.done = constants.True + return + + if self._mInputState == ePureAscii: + if self._highBitDetector.search(aBuf): + self._mInputState = eHighbyte + elif (self._mInputState == ePureAscii) and self._escDetector.search(self._mLastChar + aBuf): + self._mInputState = eEscAscii + + self._mLastChar = aBuf[-1] + + if self._mInputState == eEscAscii: + if not self._mEscCharSetProber: + self._mEscCharSetProber = EscCharSetProber() + if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: + self.result = {'encoding': self._mEscCharSetProber.get_charset_name(), + 'confidence': self._mEscCharSetProber.get_confidence()} + self.done = constants.True + elif self._mInputState == eHighbyte: + if not self._mCharSetProbers: + self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), Latin1Prober()] + for prober in self._mCharSetProbers: + if prober.feed(aBuf) == constants.eFoundIt: + self.result = {'encoding': prober.get_charset_name(), + 'confidence': prober.get_confidence()} + self.done = constants.True + break + + def close(self): + if self.done: return + if not self._mGotData: + if constants._debug: + sys.stderr.write('no data received!\n') + return + self.done = constants.True + + if self._mInputState == ePureAscii: + self.result = {'encoding': 'ascii', 'confidence': 1.0} + return self.result + + if self._mInputState == eHighbyte: + proberConfidence = None + maxProberConfidence = 0.0 + maxProber = None + for prober in self._mCharSetProbers: + if not prober: continue + proberConfidence = prober.get_confidence() + if proberConfidence > maxProberConfidence: + maxProberConfidence = proberConfidence + maxProber = prober + if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): + self.result = {'encoding': maxProber.get_charset_name(), + 'confidence': maxProber.get_confidence()} + return self.result + + if constants._debug: + sys.stderr.write('no probers hit minimum threshhold\n') + for prober in self._mCharSetProbers[0].mProbers: + if not prober: continue + sys.stderr.write('%s confidence = %s\n' % \ + (prober.get_charset_name(), \ + prober.get_confidence())) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/utf8prober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/utf8prober.py new file mode 100644 index 0000000..c1792bb --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/utf8prober.py @@ -0,0 +1,76 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from constants import eStart, eError, eItsMe +from charsetprober import CharSetProber +from codingstatemachine import CodingStateMachine +from mbcssm import UTF8SMModel + +ONE_CHAR_PROB = 0.5 + +class UTF8Prober(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(UTF8SMModel) + self.reset() + + def reset(self): + CharSetProber.reset(self) + self._mCodingSM.reset() + self._mNumOfMBChar = 0 + + def get_charset_name(self): + return "utf-8" + + def feed(self, aBuf): + for c in aBuf: + codingState = self._mCodingSM.next_state(c) + if codingState == eError: + self._mState = constants.eNotMe + break + elif codingState == eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == eStart: + if self._mCodingSM.get_current_charlen() >= 2: + self._mNumOfMBChar += 1 + + if self.get_state() == constants.eDetecting: + if self.get_confidence() > constants.SHORTCUT_THRESHOLD: + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + unlike = 0.99 + if self._mNumOfMBChar < 6: + for i in range(0, self._mNumOfMBChar): + unlike = unlike * ONE_CHAR_PROB + return 1.0 - unlike + else: + return unlike diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/license.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/license.txt new file mode 100644 index 0000000..ed95cfe --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/license.txt @@ -0,0 +1,19 @@ +"None are so hopelessly enslaved as those who falsely believe they are free." + Johann Wolfgang von Goethe + +Copyright (C) 2012 Tito Bouzout + +This license apply to all the files inside this program unless noted +different for some files or portions of code inside these files. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation. http://www.gnu.org/licenses/gpl.html + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see http://www.gnu.org/licenses/gpl.html \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/readme.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/readme.md new file mode 100644 index 0000000..6b8e26e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/readme.md @@ -0,0 +1,63 @@ +Description +------------------ + +Encoding Helper is a [Sublime Text](http://www.sublimetext.com/ ) plug-in which provides the following features: + + * attempts to guess encoding of files + * show encoding on status bar + * show when the current document is maybe broken because was opened with an incorrect encoding + * convert to UTF-8 from a variete of encodings organized in a menu. + * convert to UTF-8 quickly from guessed encoding via menuitem + * convert to UTF-8 automatically when opening a file via some defined encodings found on User preferences + +You should know that attempt to guess the encoding of a file is hard and the results for some encodings is not 100% acurrated. Also, is a task that consume CPU, for this reason this plug-in includes a lot of optimizations. + + + +Some more info +------------------ + +* I'm not an expert on encodings, don't talk to me as an expert. I just like a lot to build software compatible with every language using UTF-8 +* python chardet library is a port of chardet by Mozilla http://www-archive.mozilla.org/projects/intl/chardet.html +* python chardet library is a 'Gone' project http://feedparser.org/ +* By looking for the null character '\0' on files, means that every UTF16 file will be marked as binary ( same as in git source ) +* When converting a file to UTF-8 from some other encoding, the plugin calls to codecs.open with the selected encoding as argument. See http://docs.python.org/library/codecs.html +* If you are going to report that some file is reported with an incorrect encoding, please upload the file as is to some reliable resource and provide detailed information. Please be informed that even doing this I'm unable to look into the low levels on why this is happening. This is just to collect data that maybe is informative to someone curious on this topic. +* Just for fun, It would be nice if someone can create a dataset of pure txt files with every char found in a complete list of character sets. This: http://www.mauvecloud.net/charsets/manual/index.html but with the files in this format: http://vancouver-webpages.com/multilingual/russian-koi.html ( without html, without imgs, just text ) + +Resources +------------------ + +chardet library: +http://pypi.python.org/pypi/chardet + +dataset small: +http://vancouver-webpages.com/multilingual/ +http://charsetplus.tripod.com/HTMLs/index.html + +dataset huge: +http://www.mauvecloud.net/charsets/index.html + +codecs: +http://docs.python.org/library/codecs.html + +Installation +------------------ + +Install this repository via "Package Control" http://wbond.net/sublime_packages/package_control + +Source-code +------------------ + +https://github.com/SublimeText/EncodingHelper + +Forum Thread +------------------ + +http://www.sublimetext.com/forum/viewtopic.php?f=5&t=3453 + + +License +------------------ + +See license.txt \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Linux).sublime-keymap new file mode 100644 index 0000000..2a8b9ca --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Linux).sublime-keymap @@ -0,0 +1,8 @@ +[ + { + "command": "keymap_manager", + "keys": [ + "ctrl+alt+k" + ] + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (OSX).sublime-keymap new file mode 100644 index 0000000..2a8b9ca --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (OSX).sublime-keymap @@ -0,0 +1,8 @@ +[ + { + "command": "keymap_manager", + "keys": [ + "ctrl+alt+k" + ] + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Windows).sublime-keymap new file mode 100644 index 0000000..e6e0cb7 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Windows).sublime-keymap @@ -0,0 +1,8 @@ +[ + { + "command": "keymap_manager", + "keys": [ + "ctrl+alt+k" + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.py new file mode 100644 index 0000000..3d0ae0d --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.py @@ -0,0 +1,138 @@ +import sublime, sublime_plugin +import os +import json + +settings = sublime.load_settings("KeymapManager.sublime-settings") + +class KeymapManagerCommand(sublime_plugin.TextCommand): + """ + keymap manager for plugins + """ + osname = sublime.platform() + ctrlname = "ctrl" + #ctrlname is cmd on macos + if osname.lower() == "osx": + ctrlname = "cmd" + #add some default very usefull commands + defaultCommand = [ + {"name": "Goto Anything...", "keys": [ctrlname + "+p"], "command": "show_overlay", "args": {"overlay": "goto", "show_files": True} }, + {"name": "Command Palette", "keys": [ctrlname + "+shift+p"], "command": "show_overlay", "args": {"overlay": "command_palette"} }, + {"name": "Goto Symbol...", "keys": [ctrlname + "+r"], "command": "show_overlay", "args": {"overlay": "goto", "text": "@"} }, + {"name": "Goto Line...", "keys": [ctrlname + "+g"], "command": "show_overlay", "args": {"overlay": "goto", "text": ":"} }, + {"name": "Search Keywords", "keys": [ctrlname + "+;"], "command": "show_overlay", "args": {"overlay": "goto", "text": "#"} }, + {"name": "Show Console", "keys": [ctrlname + "+`"], "command": "show_panel", "args": {"panel": "console", "toggle": True} } + ] + #installed plugins list + plugins = None + + plugins_keys = None + + def run(self, edit): + self.defaultCommand.sort(key=lambda x: x["name"].lower()) + + if self.plugins == None: + self.plugins = [] + if self.plugins_keys == None: + self.plugins_keys = {} + path = sublime.packages_path() + dirs = os.listdir(path) + #sort with insensitive + dirs.sort(key=lambda x: x.lower()) + plugins = [] + ignored_packages = settings.get("ignored_packages") or [] + single_max_nums = int(settings.get("single_max_nums") or 3) + for name in dirs: + if name in ignored_packages: + continue + dir = path + '/' + name + '/' + if not os.path.isdir(dir): + continue + platform = sublime.platform() + platform = platform[0].upper() + platform[1:].lower() + keymapFile = dir + "Default (" + platform + ").sublime-keymap" + if not os.path.isfile(keymapFile): + continue + #plugins.append(keymapFile) + with open(keymapFile) as f: + content = open(keymapFile).read() + try: + jsonData = json.loads(content) + except (ValueError): + continue + + if not isinstance(jsonData, list): + continue + i = 0 + for item in jsonData: + if "keys" not in item or "command" not in item: + continue + if single_max_nums <= 0 or i <= single_max_nums : + keys = item["keys"] + if not isinstance(keys, list): + keys = [keys] + for key in keys: + if key not in self.plugins_keys: + self.plugins_keys[key] = [] + if item["command"] not in self.plugins_keys[key]: + self.plugins_keys[key].append(item["command"]) + + if isinstance(keys, list): + keys = ", " . join(keys) + command = item["command"] + item["name"] = name + plugins.append([name, command + " : " + keys]) + self.plugins.append(item) + i += 1 + + for item in self.defaultCommand: + plugins.append([item['name'], item['command'] + " : " + ",".join(item['keys'])]) + self.plugins.append(item) + + plugins.append(["KeymapConflict", "check plugins keymap conflict"]) + self.plugins.append({"name": "KeymapConflict"}) + + self.view.window().show_quick_panel(plugins, self.panel_done) + + #panel done + def panel_done(self, picked): + if picked == -1: + return + item = self.plugins[picked] + if item["name"] == "KeymapConflict": + self.checkKeymapConflict() + return + if self.checkContext(item) == False: + return + args = {} + if "args" in item: + args = item['args'] + #thanks wuliang + self.view.run_command(item['command'], args) + self.view.window().run_command(item['command'], args) + sublime.run_command(item['command'], args) + + #check context condition + def checkContext(self, plugin): + return True + if "context" not in plugin: + return True + if "window" in plugin and plugin["window"]: + return True + context = plugin["context"] + name = plugin["name"] + path = path = sublime.packages_path() + '/' + name + '/' + import glob + pyFiles = glob.glob("*.py") + sublime.status_message(",".join(pyFiles)) + return True + + def checkKeymapConflict(self): + keymapConflict=[] + for key,item in self.plugins_keys.items(): + if len(item) > 1: + keymapConflict.append([key, "Conflict in \""+", ".join(item) + "\" commands"]) + if len(keymapConflict) > 0: + self.view.window().show_quick_panel(keymapConflict, self.check_panel_done) + + def check_panel_done(self, picked): + pass \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.sublime-settings new file mode 100644 index 0000000..aa63c1b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.sublime-settings @@ -0,0 +1,4 @@ +{ + "ignored_packages": ["CSS", "Vintage", "User", "Default", "KeymapManager"], + "single_max_nums": 3 +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Main.sublime-menu new file mode 100644 index 0000000..b5c1344 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Main.sublime-menu @@ -0,0 +1,13 @@ +[ + { + "id": "view", + "children": + [ + { + "caption": "Keymap Manager", + "id": "keymap-manager", + "command": "keymap_manager" + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/README.md new file mode 100644 index 0000000..34872d2 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/README.md @@ -0,0 +1,4 @@ +## about +KeymapManager plugin can manage all plugins keymap what user installed. +## how to use +view -> Keymap Manager or ctrl+alt+K diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/package-metadata.json new file mode 100644 index 0000000..56a13b3 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/welefen/KeymapManager", "version": "2012.08.19.23.05.38", "description": "KeymapManager for sublime text 2"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/.gitignore new file mode 100644 index 0000000..0205d62 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/.gitignore @@ -0,0 +1,2 @@ +*.pyc +.DS_Store diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Linux).sublime-keymap new file mode 100644 index 0000000..c84fbfb --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Linux).sublime-keymap @@ -0,0 +1,22 @@ +[ + { + "keys": ["ctrl+shift+end"], + "command": "move_tab", + "args": { "position": "999" } + }, + { + "keys": ["ctrl+shift+home"], + "command": "move_tab", + "args": { "position": "0" } + }, + { + "keys": ["ctrl+shift+pageup"], + "command": "move_tab", + "args": { "position": "-1" } + }, + { + "keys": ["ctrl+shift+pagedown"], + "command": "move_tab", + "args": { "position": "+1" } + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (OSX).sublime-keymap new file mode 100644 index 0000000..d6a47bf --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (OSX).sublime-keymap @@ -0,0 +1,22 @@ +[ + { + "keys": ["super+alt+shift+down"], + "command": "move_tab", + "args": { "position": "999" } + }, + { + "keys": ["super+alt+shift+up"], + "command": "move_tab", + "args": { "position": "0" } + }, + { + "keys": ["super+alt+shift+left"], + "command": "move_tab", + "args": { "position": "-1" } + }, + { + "keys": ["super+alt+shift+right"], + "command": "move_tab", + "args": { "position": "+1" } + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Windows).sublime-keymap new file mode 100644 index 0000000..c84fbfb --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Windows).sublime-keymap @@ -0,0 +1,22 @@ +[ + { + "keys": ["ctrl+shift+end"], + "command": "move_tab", + "args": { "position": "999" } + }, + { + "keys": ["ctrl+shift+home"], + "command": "move_tab", + "args": { "position": "0" } + }, + { + "keys": ["ctrl+shift+pageup"], + "command": "move_tab", + "args": { "position": "-1" } + }, + { + "keys": ["ctrl+shift+pagedown"], + "command": "move_tab", + "args": { "position": "+1" } + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default.sublime-commands b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default.sublime-commands new file mode 100644 index 0000000..fab32c3 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default.sublime-commands @@ -0,0 +1,22 @@ +[ + { + "caption": "Move Tab: To the left", + "command": "move_tab", + "args": { "position": "-1" } + }, + { + "caption": "Move Tab: To the right", + "command": "move_tab", + "args": { "position": "+1" } + }, + { + "caption": "Move Tab: To first position", + "command": "move_tab", + "args": { "position": "0" } + }, + { + "caption": "Move Tab: To last position", + "command": "move_tab", + "args": { "position": "999" } + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/LICENSE.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/LICENSE.txt new file mode 100644 index 0000000..b699169 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/LICENSE.txt @@ -0,0 +1,18 @@ +Copyright (c) 2012 Frédéric Massart - FMCorz.net + +Permission 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: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE 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. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/README.md new file mode 100644 index 0000000..aee5e46 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/README.md @@ -0,0 +1,33 @@ +Move Tab +======== + +Plugin for Sublime Text 2 to move tabs around. + +Usage +----- + +The following commands are accessible via the command palette: + +- Move Tab: To the left +- Move Tab: To the right +- Move Tab: To first position +- Move Tab: To last position + +The shortcuts are: + +- Linux/Windows: CTRL + Shift + (Page up / Page down / Home / End) +- MacOS X: Command + Alt + Shift + (Left / Right / Up / Down) + +Installation +------------ + +Clone this repository into the Packages directory. If you don't know where it is, enter the following command in the console: + + print sublime.packages_path() + +_To access the console press CTRL + `_ + +License +------- + +Licensed under the [MIT License](http://www.opensource.org/licenses/mit-license.php) \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/move_tab.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/move_tab.py new file mode 100644 index 0000000..104c84b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/move_tab.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +""" +Move Tab + +Plugin for Sublime Text 2 to move tabs around + +Copyright (c) 2012 Frédéric Massart - FMCorz.net + +Licensed under The MIT License +Redistributions of files must retain the above copyright notice. + +http://github.com/FMCorz/MoveTab +""" + +import sublime, sublime_plugin + +class MoveTabCommand(sublime_plugin.WindowCommand): + + def run(self, position): + position = str(position) + view = self.window.active_view() + (group, index) = self.window.get_view_index(view) + if index < 0: + return + count = len(self.window.views_in_group(group)) + + direction = None + if position.startswith('-') or position.startswith('+'): + direction = position[0] + steps = int(position[1:]) + if direction == '-': + position = index - steps + else: + position = index + steps + + position = int(position) + if position < 0: + position = count - 1 + elif position > count - 1: + if direction: position = 0 + else: position = count - 1 + + # Avoid flashing tab when moving to same index + if position == index: + return + + self.window.set_view_index(view, group, position) + self.window.focus_view(view) + + def is_enabled(self): + view = self.window.active_view() + if view == None: + return False + (group, index) = self.window.get_view_index(view) + return len(self.window.views_in_group(group)) > 1 + + def is_visible(self): + return True + + def description(self): + return None diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/package-metadata.json new file mode 100644 index 0000000..00de1ed --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/SublimeText/MoveTab", "version": "2012.08.24.06.11.17", "description": "Plugin for Sublime Text 2 to move tabs around"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Linux).sublime-keymap new file mode 100644 index 0000000..c2559ab --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Linux).sublime-keymap @@ -0,0 +1,4 @@ +[ + { "keys": ["ctrl+alt+left"], "command": "navigation_history_back"}, + { "keys": ["ctrl+alt+right"], "command": "navigation_history_forward"} +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (OSX).sublime-keymap new file mode 100644 index 0000000..fc80b91 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (OSX).sublime-keymap @@ -0,0 +1,4 @@ +[ + { "keys": ["super+ctrl+alt+left"], "command": "navigation_history_back"}, + { "keys": ["super+ctrl+alt+right"], "command": "navigation_history_forward"} +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Windows).sublime-keymap new file mode 100644 index 0000000..c2559ab --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Windows).sublime-keymap @@ -0,0 +1,4 @@ +[ + { "keys": ["ctrl+alt+left"], "command": "navigation_history_back"}, + { "keys": ["ctrl+alt+right"], "command": "navigation_history_forward"} +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/README.md new file mode 100644 index 0000000..51720fd --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/README.md @@ -0,0 +1,44 @@ +Sublime Navigation History +======================== + +A Sublime Text plugin to jump forward and back around your code. + +### Installation ### + +**ST2** + +1. Install package control if you haven't already http://wbond.net/sublime_packages/package_control). +2. Search for package "Sublime Navigation History" +3. Install and enjoy. + +**ST3** + +This plugin is no longer needed for ST3, as of build 3019 Navigation History has been natively added via the new Jump Back and Jump Forward commands. They are called "jump_back" and "jump_forward" and you can add them to your key bindings (Preferences -> Key Bindings - User) with the following snippet: + + { "keys": ["ctrl+alt+left"], "command": "jump_back" }, + { "keys": ["ctrl+alt+right"], "command": "jump_forward" } + + +### Controls ### + +**OSX** +* Command + Control + Alt + Left - Navigate Backwards +* Command + Control + Alt + Right - Navigate Forwards + +**Windows / Linux** +* Control + Alt + Left - Navigate Backwards +* Control + Alt + Right - Navigate Forwards + + +### Issues ### + +This plugin does not track small navigation changes such as moving one line or character, this is so it's easier to go back to the last big block of code you were working on and moving one line or character backwards via a hotkey is not something most users want to do. + + +### Credits ### + +This was not originally created by me, it was created by Martin Aspeli (https://github.com/optilude) and came from this forum thread: http://www.sublimetext.com/forum/viewtopic.php?f=5&t=2738 + +I'm hosting this repository to keep it updated for Sublime Text 3 and also to add it to Package Control (because everyone should have access to such an awesome plugin). + + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/navigation-history.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/navigation-history.py new file mode 100644 index 0000000..df0d698 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/navigation-history.py @@ -0,0 +1,179 @@ +# Forked from: https://github.com/optilude/SublimeTextMisc/blob/master/navigationHistory.py +import sublime, sublime_plugin +from collections import deque + +MAX_SIZE = 64 +LINE_THRESHOLD = 2 + +class Location(object): + """A location in the history + """ + + def __init__(self, path, line, col): + self.path = path + self.line = line + self.col = col + + def __eq__(self, other): + return self.path == other.path and self.line == other.line + + def __ne__(self, other): + return not self.__eq__(other) + + def __nonzero__(self): + return (self.path is not None and self.line is not None) + + def near(self, other): + return self.path == other.path and abs(self.line - other.line) <= LINE_THRESHOLD + + def copy(self): + return Location(self.path, self.line, self.col) + +class History(object): + """Keep track of the history for a single window + """ + + def __init__(self, max_size=MAX_SIZE): + self._current = None # current location as far as the + # history is concerned + self._back = deque([], max_size) # items before self._current + self._forward = deque([], max_size) # items after self._current + + self._last_movement = None # last recorded movement + + def record_movement(self, location): + """Record movement to the given location, pushing history if + applicable + """ + + if location: + if self.has_changed(location): + #Push the current location if it hasn't been added already, so when going back after using goto it goes to the correct location + if self._back and self._last_movement is not self._back[-1]: + self.push(self._last_movement) + self.push(location) + self.mark_location(location) + + def mark_location(self, location): + """Remember the current location, for the purposes of being able + to do a has_changed() check. + """ + self._last_movement = location.copy() + + def has_changed(self, location): + """Determine if the given location combination represents a + significant enough change to warrant pushing history. + """ + + return self._last_movement is None or not self._last_movement.near(location) + + def push(self, location): + """Push the given location to the back history. Clear the forward + history. + """ + + if self._current is not None: + self._back.append(self._current.copy()) + self._current = location.copy() + self._forward.clear() + + def back(self): + """Move backward in history, returning the location to jump to. + Returns None if no history. + """ + + if not self._back: + return None + + self._forward.appendleft(self._current) + self._current = self._back.pop() + self._last_movement = self._current # preempt, so we don't re-push + return self._current + + def forward(self): + """Move forward in history, returning the location to jump to. + Returns None if no history. + """ + + if not self._forward: + return None + + self._back.append(self._current) + self._current = self._forward.popleft() + self._last_movement = self._current # preempt, so we don't re-push + return self._current + +_histories = {} # window id -> History + +def get_history(): + """Get a History object for the current window, + creating a new one if required + """ + + window = sublime.active_window() + if window is None: + return None + + window_id = window.id() + history = _histories.get(window_id, None) + if history is None: + _histories[window_id] = history = History() + return history + +class NavigationHistoryRecorder(sublime_plugin.EventListener): + """Keep track of history + """ + + def on_selection_modified(self, view): + """When the selection is changed, possibly record movement in the + history + """ + history = get_history() + if history is None: + return + + path = view.file_name() + row, col = view.rowcol(view.sel()[0].a) + history.record_movement(Location(path, row + 1, col + 1)) + + # def on_close(self, view): + # """When a view is closed, check to see if the window was closed too + # and clean up orphan histories + # """ + # + # # XXX: This doesn't work - event runs before window is removed + # # from sublime.windows() + # + # windows_with_history = set(_histories.keys()) + # window_ids = set([w.id() for w in sublime.windows()]) + # closed_windows = windows_with_history.difference(window_ids) + # for window_id in closed_windows: + # del _histories[window_id] + +class NavigationHistoryBack(sublime_plugin.TextCommand): + """Go back in history + """ + + def run(self, edit): + history = get_history() + if history is None: + return + + location = history.back() + if location: + window = sublime.active_window() + window.open_file("{0}:{1}:{2}".format(location.path, location.line, location.col), sublime.ENCODED_POSITION) + +class NavigationHistoryForward(sublime_plugin.TextCommand): + """Go forward in history + """ + + def run(self, edit): + history = get_history() + if history is None: + return + + location = history.forward() + if location: + window = sublime.active_window() + window.open_file("{0}:{1}:{2}".format(location.path, location.line, location.col), sublime.ENCODED_POSITION) \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/package-metadata.json new file mode 100644 index 0000000..345fe4a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/timjrobinson/SublimeNavigationHistory", "version": "2013.03.17.15.51.45", "description": "SublimeText 2/3 Navigation History - jump forward and back around your code. "} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/Default.sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/Default.sublime-keymap new file mode 100644 index 0000000..0b4309b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/Default.sublime-keymap @@ -0,0 +1,3 @@ +[ + { "keys": ["ctrl+shift+t"], "command": "open_recent_files" } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/README.md new file mode 100644 index 0000000..fc8332c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/README.md @@ -0,0 +1,8 @@ +This package adds a shortcut to open the most recently closed files. + +Keyboard shortcut is `Ctrl+Shift+T`. Press it multiple times to go further back through previously closed files. + +Version 1.01 +------------ + +- Plugin now will open up to the 20 latest files. There may be a brief flicker when opening subsequent files (by repeatedly pressing the shortcut key) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/open_recent_files.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/open_recent_files.py new file mode 100644 index 0000000..46aa485 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/open_recent_files.py @@ -0,0 +1,14 @@ +import sublime +import sublime_plugin + + +class OpenRecentFilesCommand(sublime_plugin.WindowCommand): + def run(self): + w = sublime.active_window() + counter = 0 + numViews = len(w.views()) + while (counter < 20): + w.run_command('open_recent_file', {"index": counter}) + if numViews < len(w.views()): + break + counter += 1 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/package-metadata.json new file mode 100644 index 0000000..fdec3ca --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/spadgos/sublime-OpenRecentFiles", "version": "2011.10.03.10.20.08", "description": "A package which adds Ctrl+Shift+T to open the most recent files."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/.gitignore new file mode 100644 index 0000000..99ec428 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/.gitignore @@ -0,0 +1,2 @@ +*.pyc +.idea diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Base File (OSX).sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Base File (OSX).sublime-settings new file mode 100644 index 0000000..0ed3659 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Base File (OSX).sublime-settings @@ -0,0 +1,5 @@ +{ + "highlight_search_icon": "bookmark", + "highlight_search_scope": "entity.name.function", + "highlight_search_results": false +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/CONTRIBUTORS.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/CONTRIBUTORS.md new file mode 100644 index 0000000..86fdce1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/CONTRIBUTORS.md @@ -0,0 +1,5 @@ +# Contributors + +The following people have contributed code to the OpenSearchResult plugin. + +Chris Barnett diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Default.sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Default.sublime-keymap new file mode 100644 index 0000000..2018feb --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Default.sublime-keymap @@ -0,0 +1,7 @@ +[ + { + "keys": ["g", "o"], + "command": "open_search_result", + "context": [{"key": "setting.command_mode"}] + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/LICENSE.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/LICENSE.txt new file mode 100644 index 0000000..49a9c3f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/LICENSE.txt @@ -0,0 +1,18 @@ +Copyright (c) 2012 Andrew Brookins + +Permission 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: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE 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. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/README.md new file mode 100644 index 0000000..ed2ce2a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/README.md @@ -0,0 +1,26 @@ +# Open Search Result Plugin for Sublime Text 2 + +This plugin creates a command that allows you to open files listed in the search +results of the 'Find in Files' command. + +- When run on a line in the search results that includes a line number, e.g., +"102: print 'foo'" it opens the file at the correct line number. + +- When run on a line that contains a file path like '/path/to/somewhere:' +in the search listing, it opens the file without a line number specified. + +## Key Binding + +- The default key binding is a Vintage command mode key: "g, o". + +## Customizing + +You can change various things about the plugin by adding user settings: + +- 'highlight_search_results': Set to false to disable highlighting openable +paths (the open command will still work) +- 'highlight_search_scope': The scope that will be used to color the outline for +openable paths or the icon. See your theme file for examples of colors. +- 'highlight_search_icon': If you want an icon to show up in the gutter next to +openable paths, include a valid icon name as a string (e.g., 'circle', 'dot' or +'bookmark') diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/open_search_result.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/open_search_result.py new file mode 100644 index 0000000..ccaa753 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/open_search_result.py @@ -0,0 +1,126 @@ +import os +import sublime, sublime_plugin +import util + + +class HighlightFilePaths(sublime_plugin.EventListener): + HIGHLIGHT_REGION_NAME = 'HighlightFilePaths' + HIGHLIGHT_ENABLED_KEY = 'highlight_search_results' + SCOPE_SETTINGS_KEY = 'highlight_search_scope' + ICON_SETTINGS_KEY = 'highlight_search_icon' + DEFAULT_SCOPE = 'search_result_highlight' + DEFAULT_ICON = '' + + def show_highlight(self, view): + valid_regions = [] + show_highlight = view.settings().get(self.HIGHLIGHT_ENABLED_KEY, False) + scope = view.settings().get(self.SCOPE_SETTINGS_KEY, self.DEFAULT_SCOPE) + icon = view.settings().get(self.ICON_SETTINGS_KEY, self.DEFAULT_ICON) + + if view.name() != 'Find Results': + return + + for s in view.sel(): + line = view.line(s) + line_str = view.substr(view.line(s)) + line_num = util.parse_line_number(line_str) + + if util.is_file_path(line_str) or line_num: + valid_regions.append(line) + + if valid_regions: + if show_highlight: + options = sublime.DRAW_EMPTY | sublime.DRAW_OUTLINED + else: + options = sublime.HIDDEN + + view.add_regions( + self.HIGHLIGHT_REGION_NAME, valid_regions, scope, icon, options) + else: + view.erase_regions(self.HIGHLIGHT_REGION_NAME) + + def on_selection_modified(self, view): + highlight_enabled = (view.settings().get(self.HIGHLIGHT_ENABLED_KEY) + or view.settings().get(self.ICON_SETTINGS_KEY)) + + if view.settings().get('is_widget') \ + or not view.settings().get('command_mode') \ + or not highlight_enabled: + view.erase_regions(self.HIGHLIGHT_REGION_NAME) + return + + self.show_highlight(view) + + def on_deactivated(self, view): + view.erase_regions(self.HIGHLIGHT_REGION_NAME) + + def on_activated(self, view): + if view.settings().get('highlight_file_paths'): + self.show_highlight(view) + + +class OpenSearchResultCommand(sublime_plugin.TextCommand): + """ + Open a file listed in the Find In File search results at the line the + cursor is on, or just open the file if the cursor is on the file path. + """ + + def open_file_from_line(self, line, line_num): + """ + Attempt to parse a file path from the string `line` and open it in a + new buffer. + """ + if ':' not in line: + return + + file_path = line[0:-1] + + if os.path.exists(file_path): + self.view.window().open_file( + "%s:%s" % (file_path, line_num), sublime.ENCODED_POSITION) + + def previous_line(self, region): + """ `region` should be a Region covering the entire hard line """ + if region.begin() == 0: + return None + else: + return self.view.full_line(region.begin() - 1) + + def open_file_path(self, line_str): + """ + Parse a file path from a string `line_str` of the format: ":" + """ + file_path = line_str[0:-1] + + if os.path.exists(file_path): + self.view.window().open_file(file_path) + + def open_file_at_line_num(self, cur_line, line_num): + """ + Starting at the position `cur_line` (a `Region`), count backwards + until we find a path or the beginning of the file. If we find a file + path, open it in a new tab at `line_num`. + """ + prev = cur_line + while True: + prev = self.previous_line(prev) + if prev is None: + break + + line = self.view.substr(prev).strip() + if util.is_file_path(line): + return self.open_file_from_line(line, line_num) + + def run(self, edit): + for cursor in self.view.sel(): + cur_line = self.view.line(cursor) + line_str = self.view.substr(cur_line).strip() + line_num = util.parse_line_number(line_str) + + if self.view.name() != 'Find Results': + return + + if util.is_file_path(line_str): + self.open_file_path(line_str) + elif line_num: + self.open_file_at_line_num(cur_line, line_num) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/package-metadata.json new file mode 100644 index 0000000..898c230 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/abrookins/OpenSearchResult", "version": "2012.09.11.15.18.59", "description": "a Sublime Text 2 plugin that opens files listed in the Find in File output"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/util.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/util.py new file mode 100644 index 0000000..1196191 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/util.py @@ -0,0 +1,36 @@ +""" +util.py: Utility functions for opening Sublime Text 2 search results. +""" +import re + + +def parse_line_number(line_str): + """ + In a line of the format ": "or " " + this grabs line_num. + + >>> parse_line_number('5: def parse_line_number(line_str):') + '5' + >>> parse_line_number('43 line = view.line(s)') + '43' + >>> parse_line_number('136: line_num = parse_line_number(line_str)') + '136' + """ + parts = line_str.split() + line_num = parts[0].strip().replace(':', '') + return line_num + + +def is_file_path(line_str): + """ + Test if `line_str` is a file path. + + >>> is_file_path('/Users/me/code/OpenSearchResult/open_search_result.py:') + True + >>> is_file_path('C:\Users\me\\test.txt:') + True + >>> is_file_path('5: def parse_line_number(line_str):') + False + """ + return re.match("^(/|\w:\\\).*:$", line_str) is not None + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Default.sublime-commands b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Default.sublime-commands new file mode 100644 index 0000000..7d823ee --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Default.sublime-commands @@ -0,0 +1,64 @@ +[ + { + "caption": "Package Control: Add Repository", + "command": "add_repository" + }, + { + "caption": "Package Control: Add Channel", + "command": "add_repository_channel" + }, + { + "caption": "Package Control: Create Binary Package File", + "command": "create_binary_package" + }, + { + "caption": "Package Control: Create Package File", + "command": "create_package" + }, + { + "caption": "Package Control: Disable Package", + "command": "disable_package" + }, + { + "caption": "Package Control: Discover Packages", + "command": "discover_packages" + }, + { + "caption": "Package Control: Enable Package", + "command": "enable_package" + }, + { + "caption": "Package Control: Install Package", + "command": "install_package" + }, + { + "caption": "Package Control: List Packages", + "command": "list_packages" + }, + { + "caption": "Package Control: Remove Package", + "command": "remove_package" + }, + { + "caption": "Package Control: Upgrade Package", + "command": "upgrade_package" + }, + { + "caption": "Package Control: Upgrade/Overwrite All Packages", + "command": "upgrade_all_packages" + }, + { + "caption": "Preferences: Package Control Settings – Default", + "command": "open_file", "args": + { + "file": "${packages}/Package Control/Package Control.sublime-settings" + } + }, + { + "caption": "Preferences: Package Control Settings – User", + "command": "open_file", "args": + { + "file": "${packages}/User/Package Control.sublime-settings" + } + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Main.sublime-menu new file mode 100644 index 0000000..cbe83d1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Main.sublime-menu @@ -0,0 +1,45 @@ +[ + { + "caption": "Preferences", + "mnemonic": "n", + "id": "preferences", + "children": + [ + { + "caption": "Package Settings", + "mnemonic": "P", + "id": "package-settings", + "children": + [ + { + "caption": "Package Control", + "children": + [ + { + "command": "open_file", "args": + { + "file": "${packages}/Package Control/Package Control.sublime-settings" + }, + "caption": "Settings – Default" + }, + { + "command": "open_file", "args": + { + "file": "${packages}/User/Package Control.sublime-settings" + }, + "caption": "Settings – User" + }, + { "caption": "-" } + ] + } + ] + }, + { + "caption": "Package Control", + "mnemonic": "C", + "command": "show_overlay", + "args": {"overlay": "command_palette", "text": "Package Control: "} + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.py new file mode 100644 index 0000000..4b62978 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.py @@ -0,0 +1,4810 @@ +# coding=utf-8 +import sublime +import sublime_plugin +import os +import sys +import subprocess +import zipfile +import urllib +import urllib2 +import json +from fnmatch import fnmatch +import re +import threading +import datetime +import time +import shutil +import tempfile +import httplib +import socket +import hashlib +import base64 +import locale +import urlparse +import gzip +import StringIO +import zlib + + +if os.name == 'nt': + from ctypes import windll, create_unicode_buffer + + +def add_to_path(path): + # Python 2.x on Windows can't properly import from non-ASCII paths, so + # this code added the DOC 8.3 version of the lib folder to the path in + # case the user's username includes non-ASCII characters + if os.name == 'nt': + buf = create_unicode_buffer(512) + if windll.kernel32.GetShortPathNameW(path, buf, len(buf)): + path = buf.value + + if path not in sys.path: + sys.path.append(path) + + +lib_folder = os.path.join(sublime.packages_path(), 'Package Control', 'lib') +add_to_path(os.path.join(lib_folder, 'all')) + + +import semver + + +if os.name == 'nt': + add_to_path(os.path.join(lib_folder, 'windows')) + from ntlm import ntlm + + +def unicode_from_os(e): + # This is needed as some exceptions coming from the OS are + # already encoded and so just calling unicode(e) will result + # in an UnicodeDecodeError as the string isn't in ascii form. + try: + # Sublime Text on OS X does not seem to report the correct encoding + # so we hard-code that to UTF-8 + encoding = 'UTF-8' if os.name == 'darwin' else locale.getpreferredencoding() + return unicode(str(e), encoding) + + # If the "correct" encoding did not work, try some defaults, and then just + # obliterate characters that we can't seen to decode properly + except UnicodeDecodeError: + encodings = ['utf-8', 'cp1252'] + for encoding in encodings: + try: + return unicode(str(e), encoding, errors='strict') + except: + pass + return unicode(str(e), errors='replace') + + +def create_cmd(args, basename_binary=False): + if basename_binary: + args[0] = os.path.basename(args[0]) + + if os.name == 'nt': + return subprocess.list2cmdline(args) + else: + escaped_args = [] + for arg in args: + if re.search('^[a-zA-Z0-9/_^\\-\\.:=]+$', arg) == None: + arg = u"'" + arg.replace(u"'", u"'\\''") + u"'" + escaped_args.append(arg) + return u' '.join(escaped_args) + + +# Monkey patch AbstractBasicAuthHandler to prevent infinite recursion +def non_recursive_http_error_auth_reqed(self, authreq, host, req, headers): + authreq = headers.get(authreq, None) + + if not hasattr(self, 'retried'): + self.retried = 0 + + if self.retried > 5: + raise urllib2.HTTPError(req.get_full_url(), 401, "basic auth failed", + headers, None) + else: + self.retried += 1 + + if authreq: + mo = urllib2.AbstractBasicAuthHandler.rx.search(authreq) + if mo: + scheme, quote, realm = mo.groups() + if scheme.lower() == 'basic': + return self.retry_http_basic_auth(host, req, realm) + +urllib2.AbstractBasicAuthHandler.http_error_auth_reqed = non_recursive_http_error_auth_reqed + + +class DebuggableHTTPResponse(httplib.HTTPResponse): + """ + A custom HTTPResponse that formats debugging info for Sublime Text + """ + + _debug_protocol = 'HTTP' + + def __init__(self, sock, debuglevel=0, strict=0, method=None): + # We have to use a positive debuglevel to get it passed to here, + # however we don't want to use it because by default debugging prints + # to the stdout and we can't capture it, so we use a special -1 value + if debuglevel == 5: + debuglevel = -1 + httplib.HTTPResponse.__init__(self, sock, debuglevel, strict, method) + + def begin(self): + return_value = httplib.HTTPResponse.begin(self) + if self.debuglevel == -1: + print '%s: Urllib2 %s Debug Read' % (__name__, self._debug_protocol) + headers = self.msg.headers + versions = { + 9: 'HTTP/0.9', + 10: 'HTTP/1.0', + 11: 'HTTP/1.1' + } + status_line = versions[self.version] + ' ' + str(self.status) + ' ' + self.reason + headers.insert(0, status_line) + for line in headers: + print u" %s" % line.rstrip() + return return_value + + def read(self, *args): + try: + return httplib.HTTPResponse.read(self, *args) + except (httplib.IncompleteRead) as (e): + return e.partial + + +class DebuggableHTTPSResponse(DebuggableHTTPResponse): + """ + A version of DebuggableHTTPResponse that sets the debug protocol to HTTPS + """ + + _debug_protocol = 'HTTPS' + + +class DebuggableHTTPConnection(httplib.HTTPConnection): + """ + A custom HTTPConnection that formats debugging info for Sublime Text + """ + + response_class = DebuggableHTTPResponse + _debug_protocol = 'HTTP' + + def __init__(self, host, port=None, strict=None, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT, **kwargs): + self.passwd = kwargs.get('passwd') + + # Python 2.6.1 on OS X 10.6 does not include these + self._tunnel_host = None + self._tunnel_port = None + self._tunnel_headers = {} + + httplib.HTTPConnection.__init__(self, host, port, strict, timeout) + + def connect(self): + if self.debuglevel == -1: + print '%s: Urllib2 %s Debug General' % (__name__, self._debug_protocol) + print u" Connecting to %s on port %s" % (self.host, self.port) + httplib.HTTPConnection.connect(self) + + def send(self, string): + # We have to use a positive debuglevel to get it passed to the + # HTTPResponse object, however we don't want to use it because by + # default debugging prints to the stdout and we can't capture it, so + # we temporarily set it to -1 for the standard httplib code + reset_debug = False + if self.debuglevel == 5: + reset_debug = 5 + self.debuglevel = -1 + httplib.HTTPConnection.send(self, string) + if reset_debug or self.debuglevel == -1: + if len(string.strip()) > 0: + print '%s: Urllib2 %s Debug Write' % (__name__, self._debug_protocol) + for line in string.strip().splitlines(): + print ' ' + line + if reset_debug: + self.debuglevel = reset_debug + + def request(self, method, url, body=None, headers={}): + original_headers = headers.copy() + + # Handles the challenge request response cycle before the real request + proxy_auth = headers.get('Proxy-Authorization') + if os.name == 'nt' and proxy_auth and proxy_auth.lstrip()[0:4] == 'NTLM': + # The default urllib2.AbstractHTTPHandler automatically sets the + # Connection header to close because of urllib.addinfourl(), but in + # this case we are going to do some back and forth first for the NTLM + # proxy auth + headers['Connection'] = 'Keep-Alive' + self._send_request(method, url, body, headers) + + response = self.getresponse() + + content_length = int(response.getheader('content-length', 0)) + if content_length: + response._safe_read(content_length) + + proxy_authenticate = response.getheader('proxy-authenticate', None) + if not proxy_authenticate: + raise URLError('Invalid NTLM proxy authentication response') + ntlm_challenge = re.sub('^\s*NTLM\s+', '', proxy_authenticate) + + if self.host.find(':') != -1: + host_port = self.host + else: + host_port = "%s:%s" % (self.host, self.port) + username, password = self.passwd.find_user_password(None, host_port) + domain = '' + user = username + if username.find('\\') != -1: + domain, user = username.split('\\', 1) + + challenge, negotiate_flags = ntlm.parse_NTLM_CHALLENGE_MESSAGE(ntlm_challenge) + new_proxy_authorization = 'NTLM %s' % ntlm.create_NTLM_AUTHENTICATE_MESSAGE(challenge, user, + domain, password, negotiate_flags) + original_headers['Proxy-Authorization'] = new_proxy_authorization + response.close() + + httplib.HTTPConnection.request(self, method, url, body, original_headers) + + +class DebuggableHTTPHandler(urllib2.HTTPHandler): + """ + A custom HTTPHandler that formats debugging info for Sublime Text + """ + + def __init__(self, debuglevel=0, debug=False, **kwargs): + # This is a special value that will not trigger the standard debug + # functionality, but custom code where we can format the output + if debug: + self._debuglevel = 5 + else: + self._debuglevel = debuglevel + self.passwd = kwargs.get('passwd') + + def http_open(self, req): + def http_class_wrapper(host, **kwargs): + kwargs['passwd'] = self.passwd + return DebuggableHTTPConnection(host, **kwargs) + + return self.do_open(http_class_wrapper, req) + + +class RateLimitException(httplib.HTTPException, urllib2.URLError): + """ + An exception for when the rate limit of an API has been exceeded. + """ + + def __init__(self, host, limit): + httplib.HTTPException.__init__(self) + self.host = host + self.limit = limit + + def __str__(self): + return ('Rate limit of %s exceeded for %s' % (self.limit, self.host)) + + +if os.name == 'nt': + class ProxyNtlmAuthHandler(urllib2.BaseHandler): + + handler_order = 300 + auth_header = 'Proxy-Authorization' + + def __init__(self, password_manager=None): + if password_manager is None: + password_manager = HTTPPasswordMgr() + self.passwd = password_manager + self.retried = 0 + + def http_error_407(self, req, fp, code, msg, headers): + proxy_authenticate = headers.get('proxy-authenticate') + if os.name != 'nt' or proxy_authenticate[0:4] != 'NTLM': + return None + + type1_flags = ntlm.NTLM_TYPE1_FLAGS + + if req.host.find(':') != -1: + host_port = req.host + else: + host_port = "%s:%s" % (req.host, req.port) + username, password = self.passwd.find_user_password(None, host_port) + if not username: + return None + + if username.find('\\') == -1: + type1_flags &= ~ntlm.NTLM_NegotiateOemDomainSupplied + + negotiate_message = ntlm.create_NTLM_NEGOTIATE_MESSAGE(username, type1_flags) + auth = 'NTLM %s' % negotiate_message + if req.headers.get(self.auth_header, None) == auth: + return None + req.add_unredirected_header(self.auth_header, auth) + return self.parent.open(req, timeout=req.timeout) + + +# The following code is wrapped in a try because the Linux versions of Sublime +# Text do not include the ssl module due to the fact that different distros +# have different versions +try: + import ssl + + class InvalidCertificateException(httplib.HTTPException, urllib2.URLError): + """ + An exception for when an SSL certification is not valid for the URL + it was presented for. + """ + + def __init__(self, host, cert, reason): + httplib.HTTPException.__init__(self) + self.host = host + self.cert = cert + self.reason = reason + + def __str__(self): + return ('Host %s returned an invalid certificate (%s) %s\n' % + (self.host, self.reason, self.cert)) + + + class ValidatingHTTPSConnection(DebuggableHTTPConnection): + """ + A custom HTTPConnection class that validates SSL certificates, and + allows proxy authentication for HTTPS connections. + """ + + default_port = httplib.HTTPS_PORT + + response_class = DebuggableHTTPSResponse + _debug_protocol = 'HTTPS' + + def __init__(self, host, port=None, key_file=None, cert_file=None, + ca_certs=None, strict=None, **kwargs): + passed_args = {} + if 'timeout' in kwargs: + passed_args['timeout'] = kwargs['timeout'] + DebuggableHTTPConnection.__init__(self, host, port, strict, **passed_args) + + self.passwd = kwargs.get('passwd') + self.key_file = key_file + self.cert_file = cert_file + self.ca_certs = ca_certs + if 'user_agent' in kwargs: + self.user_agent = kwargs['user_agent'] + if self.ca_certs: + self.cert_reqs = ssl.CERT_REQUIRED + else: + self.cert_reqs = ssl.CERT_NONE + + def get_valid_hosts_for_cert(self, cert): + """ + Returns a list of valid hostnames for an SSL certificate + + :param cert: A dict from SSLSocket.getpeercert() + + :return: An array of hostnames + """ + + if 'subjectAltName' in cert: + return [x[1] for x in cert['subjectAltName'] + if x[0].lower() == 'dns'] + else: + return [x[0][1] for x in cert['subject'] + if x[0][0].lower() == 'commonname'] + + def validate_cert_host(self, cert, hostname): + """ + Checks if the cert is valid for the hostname + + :param cert: A dict from SSLSocket.getpeercert() + + :param hostname: A string hostname to check + + :return: A boolean if the cert is valid for the hostname + """ + + hosts = self.get_valid_hosts_for_cert(cert) + for host in hosts: + host_re = host.replace('.', '\.').replace('*', '[^.]*') + if re.search('^%s$' % (host_re,), hostname, re.I): + return True + return False + + def _tunnel(self, ntlm_follow_up=False): + """ + This custom _tunnel method allows us to read and print the debug + log for the whole response before throwing an error, and adds + support for proxy authentication + """ + + self._proxy_host = self.host + self._proxy_port = self.port + self._set_hostport(self._tunnel_host, self._tunnel_port) + + self._tunnel_headers['Host'] = u"%s:%s" % (self.host, self.port) + self._tunnel_headers['User-Agent'] = self.user_agent + self._tunnel_headers['Proxy-Connection'] = 'Keep-Alive' + + request = "CONNECT %s:%d HTTP/1.1\r\n" % (self.host, self.port) + for header, value in self._tunnel_headers.iteritems(): + request += "%s: %s\r\n" % (header, value) + self.send(request + "\r\n") + + response = self.response_class(self.sock, strict=self.strict, + method=self._method) + (version, code, message) = response._read_status() + + status_line = u"%s %s %s" % (version, code, message.rstrip()) + headers = [status_line] + + if self.debuglevel in [-1, 5]: + print '%s: Urllib2 %s Debug Read' % (__name__, self._debug_protocol) + print u" %s" % status_line + + content_length = 0 + close_connection = False + while True: + line = response.fp.readline() + if line == '\r\n': break + + headers.append(line.rstrip()) + + parts = line.rstrip().split(': ', 1) + name = parts[0].lower() + value = parts[1].lower().strip() + if name == 'content-length': + content_length = int(value) + + if name in ['connection', 'proxy-connection'] and value == 'close': + close_connection = True + + if self.debuglevel in [-1, 5]: + print u" %s" % line.rstrip() + + # Handle proxy auth for SSL connections since regular urllib2 punts on this + if code == 407 and self.passwd and ('Proxy-Authorization' not in self._tunnel_headers or ntlm_follow_up): + if content_length: + response._safe_read(content_length) + + supported_auth_methods = {} + for line in headers: + parts = line.split(': ', 1) + if parts[0].lower() != 'proxy-authenticate': + continue + details = parts[1].split(' ', 1) + supported_auth_methods[details[0].lower()] = details[1] if len(details) > 1 else '' + + username, password = self.passwd.find_user_password(None, "%s:%s" % ( + self._proxy_host, self._proxy_port)) + + do_ntlm_follow_up = False + + if 'digest' in supported_auth_methods: + response_value = self.build_digest_response( + supported_auth_methods['digest'], username, password) + if response_value: + self._tunnel_headers['Proxy-Authorization'] = u"Digest %s" % response_value + + elif 'basic' in supported_auth_methods: + response_value = u"%s:%s" % (username, password) + response_value = base64.b64encode(response_value).strip() + self._tunnel_headers['Proxy-Authorization'] = u"Basic %s" % response_value + + elif 'ntlm' in supported_auth_methods and os.name == 'nt': + ntlm_challenge = supported_auth_methods['ntlm'] + if not len(ntlm_challenge): + type1_flags = ntlm.NTLM_TYPE1_FLAGS + if username.find('\\') == -1: + type1_flags &= ~ntlm.NTLM_NegotiateOemDomainSupplied + + negotiate_message = ntlm.create_NTLM_NEGOTIATE_MESSAGE(username, type1_flags) + self._tunnel_headers['Proxy-Authorization'] = 'NTLM %s' % negotiate_message + do_ntlm_follow_up = True + else: + domain = '' + user = username + if username.find('\\') != -1: + domain, user = username.split('\\', 1) + + challenge, negotiate_flags = ntlm.parse_NTLM_CHALLENGE_MESSAGE(ntlm_challenge) + self._tunnel_headers['Proxy-Authorization'] = 'NTLM %s' % ntlm.create_NTLM_AUTHENTICATE_MESSAGE(challenge, user, + domain, password, negotiate_flags) + + if 'Proxy-Authorization' in self._tunnel_headers: + self.host = self._proxy_host + self.port = self._proxy_port + + # If the proxy wanted the connection closed, we need to make a new connection + if close_connection: + self.sock.close() + self.sock = socket.create_connection((self.host, self.port), self.timeout) + + return self._tunnel(do_ntlm_follow_up) + + if code != 200: + self.close() + raise socket.error("Tunnel connection failed: %d %s" % (code, + message.strip())) + + def build_digest_response(self, fields, username, password): + """ + Takes a Proxy-Authenticate: Digest header and creates a response + header + + :param fields: + The string portion of the Proxy-Authenticate header after + "Digest " + + :param username: + The username to use for the response + + :param password: + The password to use for the response + + :return: + None if invalid Proxy-Authenticate header, otherwise the + string of fields for the Proxy-Authorization: Digest header + """ + + fields = urllib2.parse_keqv_list(urllib2.parse_http_list(fields)) + + realm = fields.get('realm') + nonce = fields.get('nonce') + qop = fields.get('qop') + algorithm = fields.get('algorithm') + if algorithm: + algorithm = algorithm.lower() + opaque = fields.get('opaque') + + if algorithm in ['md5', None]: + def hash(string): + return hashlib.md5(string).hexdigest() + elif algorithm == 'sha': + def hash(string): + return hashlib.sha1(string).hexdigest() + else: + return None + + host_port = u"%s:%s" % (self.host, self.port) + + a1 = "%s:%s:%s" % (username, realm, password) + a2 = "CONNECT:%s" % host_port + ha1 = hash(a1) + ha2 = hash(a2) + + if qop == None: + response = hash(u"%s:%s:%s" % (ha1, nonce, ha2)) + elif qop == 'auth': + nc = '00000001' + cnonce = hash(urllib2.randombytes(8))[:8] + response = hash(u"%s:%s:%s:%s:%s:%s" % (ha1, nonce, nc, cnonce, qop, ha2)) + else: + return None + + response_fields = { + 'username': username, + 'realm': realm, + 'nonce': nonce, + 'response': response, + 'uri': host_port + } + if algorithm: + response_fields['algorithm'] = algorithm + if qop == 'auth': + response_fields['nc'] = nc + response_fields['cnonce'] = cnonce + response_fields['qop'] = qop + if opaque: + response_fields['opaque'] = opaque + + return ', '.join([u"%s=\"%s\"" % (field, response_fields[field]) for field in response_fields]) + + def connect(self): + """ + Adds debugging and SSL certification validation + """ + + if self.debuglevel == -1: + print '%s: Urllib2 HTTPS Debug General' % __name__ + print u" Connecting to %s on port %s" % (self.host, self.port) + + self.sock = socket.create_connection((self.host, self.port), self.timeout) + if self._tunnel_host: + self._tunnel() + + if self.debuglevel == -1: + print u"%s: Urllib2 HTTPS Debug General" % __name__ + print u" Connecting to %s on port %s" % (self.host, self.port) + print u" CA certs file at %s" % (self.ca_certs) + + self.sock = ssl.wrap_socket(self.sock, keyfile=self.key_file, + certfile=self.cert_file, cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs) + + if self.debuglevel == -1: + print u" Successfully upgraded connection to %s:%s with SSL" % ( + self.host, self.port) + + # This debugs and validates the SSL certificate + if self.cert_reqs & ssl.CERT_REQUIRED: + cert = self.sock.getpeercert() + + if self.debuglevel == -1: + subjectMap = { + 'organizationName': 'O', + 'commonName': 'CN', + 'organizationalUnitName': 'OU', + 'countryName': 'C', + 'serialNumber': 'serialNumber', + 'commonName': 'CN', + 'localityName': 'L', + 'stateOrProvinceName': 'S' + } + subject_list = list(cert['subject']) + subject_list.reverse() + subject_parts = [] + for pair in subject_list: + if pair[0][0] in subjectMap: + field_name = subjectMap[pair[0][0]] + else: + field_name = pair[0][0] + subject_parts.append(field_name + '=' + pair[0][1]) + + print u" Server SSL certificate:" + print u" subject: " + ','.join(subject_parts) + if 'subjectAltName' in cert: + print u" common name: " + cert['subjectAltName'][0][1] + if 'notAfter' in cert: + print u" expire date: " + cert['notAfter'] + + hostname = self.host.split(':', 0)[0] + + if not self.validate_cert_host(cert, hostname): + if self.debuglevel == -1: + print u" Certificate INVALID" + + raise InvalidCertificateException(hostname, cert, + 'hostname mismatch') + + if self.debuglevel == -1: + print u" Certificate validated for %s" % hostname + + if hasattr(urllib2, 'HTTPSHandler'): + class ValidatingHTTPSHandler(urllib2.HTTPSHandler): + """ + A urllib2 handler that validates SSL certificates for HTTPS requests + """ + + def __init__(self, **kwargs): + # This is a special value that will not trigger the standard debug + # functionality, but custom code where we can format the output + self._debuglevel = 0 + if 'debug' in kwargs and kwargs['debug']: + self._debuglevel = 5 + elif 'debuglevel' in kwargs: + self._debuglevel = kwargs['debuglevel'] + self._connection_args = kwargs + + def https_open(self, req): + def http_class_wrapper(host, **kwargs): + full_kwargs = dict(self._connection_args) + full_kwargs.update(kwargs) + return ValidatingHTTPSConnection(host, **full_kwargs) + + try: + return self.do_open(http_class_wrapper, req) + except urllib2.URLError, e: + if type(e.reason) == ssl.SSLError and e.reason.args[0] == 1: + raise InvalidCertificateException(req.host, '', + e.reason.args[1]) + raise + + https_request = urllib2.AbstractHTTPHandler.do_request_ + +except (ImportError): + pass + + +def preferences_filename(): + """:return: The appropriate settings filename based on the version of Sublime Text""" + + if int(sublime.version()) >= 2174: + return 'Preferences.sublime-settings' + return 'Global.sublime-settings' + + +class ThreadProgress(): + """ + Animates an indicator, [= ], in the status area while a thread runs + + :param thread: + The thread to track for activity + + :param message: + The message to display next to the activity indicator + + :param success_message: + The message to display once the thread is complete + """ + + def __init__(self, thread, message, success_message): + self.thread = thread + self.message = message + self.success_message = success_message + self.addend = 1 + self.size = 8 + sublime.set_timeout(lambda: self.run(0), 100) + + def run(self, i): + if not self.thread.is_alive(): + if hasattr(self.thread, 'result') and not self.thread.result: + sublime.status_message('') + return + sublime.status_message(self.success_message) + return + + before = i % self.size + after = (self.size - 1) - before + + sublime.status_message('%s [%s=%s]' % \ + (self.message, ' ' * before, ' ' * after)) + + if not after: + self.addend = -1 + if not before: + self.addend = 1 + i += self.addend + + sublime.set_timeout(lambda: self.run(i), 100) + + +class PlatformComparator(): + def get_best_platform(self, platforms): + ids = [sublime.platform() + '-' + sublime.arch(), sublime.platform(), + '*'] + + for id in ids: + if id in platforms: + return id + + return None + + +class ChannelProvider(PlatformComparator): + """ + Retrieves a channel and provides an API into the information + + The current channel/repository infrastructure caches repository info into + the channel to improve the Package Control client performance. This also + has the side effect of lessening the load on the GitHub and BitBucket APIs + and getting around not-infrequent HTTP 503 errors from those APIs. + + :param channel: + The URL of the channel + + :param package_manager: + An instance of :class:`PackageManager` used to download the file + """ + + def __init__(self, channel, package_manager): + self.channel_info = None + self.channel = channel + self.package_manager = package_manager + self.unavailable_packages = [] + + def match_url(self): + """Indicates if this provider can handle the provided channel""" + + return True + + def fetch_channel(self): + """Retrieves and loads the JSON for other methods to use""" + + if self.channel_info != None: + return + + channel_json = self.package_manager.download_url(self.channel, + 'Error downloading channel.') + if channel_json == False: + self.channel_info = False + return + + try: + channel_info = json.loads(channel_json) + except (ValueError): + print '%s: Error parsing JSON from channel %s.' % (__name__, + self.channel) + channel_info = False + + self.channel_info = channel_info + + def get_name_map(self): + """:return: A dict of the mapping for URL slug -> package name""" + + self.fetch_channel() + if self.channel_info == False: + return False + return self.channel_info.get('package_name_map', {}) + + def get_renamed_packages(self): + """:return: A dict of the packages that have been renamed""" + + self.fetch_channel() + if self.channel_info == False: + return False + return self.channel_info.get('renamed_packages', {}) + + def get_repositories(self): + """:return: A list of the repository URLs""" + + self.fetch_channel() + if self.channel_info == False: + return False + return self.channel_info['repositories'] + + def get_certs(self): + """ + Provides a secure way for distribution of SSL CA certificates + + Unfortunately Python does not include a bundle of CA certs with urllib2 + to perform SSL certificate validation. To circumvent this issue, + Package Control acts as a distributor of the CA certs for all HTTPS + URLs of package downloads. + + The default channel scrapes and caches info about all packages + periodically, and in the process it checks the CA certs for all of + the HTTPS URLs listed in the repositories. The contents of the CA cert + files are then hashed, and the CA cert is stored in a filename with + that hash. This is a fingerprint to ensure that Package Control has + the appropriate CA cert for a domain name. + + Next, the default channel file serves up a JSON object of the domain + names and the hashes of their current CA cert files. If Package Control + does not have the appropriate hash for a domain, it may retrieve it + from the channel server. To ensure that Package Control is talking to + a trusted authority to get the CA certs from, the CA cert for + sublime.wbond.net is bundled with Package Control. Then when downloading + the channel file, Package Control can ensure that the channel file's + SSL certificate is valid, thus ensuring the resulting CA certs are + legitimate. + + As a matter of optimization, the distribution of Package Control also + includes the current CA certs for all known HTTPS domains that are + included in the channel, as of the time when Package Control was + last released. + + :return: A dict of {'Domain Name': ['cert_file_hash', 'cert_file_download_url']} + """ + + self.fetch_channel() + if self.channel_info == False: + return False + return self.channel_info.get('certs', {}) + + def get_packages(self, repo): + """ + Provides access to the repository info that is cached in a channel + + :param repo: + The URL of the repository to get the cached info of + + :return: + A dict in the format: + { + 'Package Name': { + # Package details - see example-packages.json for format + }, + ... + } + or False if there is an error + """ + + self.fetch_channel() + if self.channel_info == False: + return False + if self.channel_info.get('packages', False) == False: + return False + if self.channel_info['packages'].get(repo, False) == False: + return False + + output = {} + for package in self.channel_info['packages'][repo]: + copy = package.copy() + + platforms = copy['platforms'].keys() + best_platform = self.get_best_platform(platforms) + + if not best_platform: + self.unavailable_packages.append(copy['name']) + continue + + copy['downloads'] = copy['platforms'][best_platform] + + del copy['platforms'] + + copy['url'] = copy['homepage'] + del copy['homepage'] + + output[copy['name']] = copy + + return output + + def get_unavailable_packages(self): + """ + Provides a list of packages that are unavailable for the current + platform/architecture that Sublime Text is running on. + + This list will be empty unless get_packages() is called first. + + :return: A list of package names + """ + + return self.unavailable_packages + + +# The providers (in order) to check when trying to download a channel +_channel_providers = [ChannelProvider] + + +class PackageProvider(PlatformComparator): + """ + Generic repository downloader that fetches package info + + With the current channel/repository architecture where the channel file + caches info from all includes repositories, these package providers just + serve the purpose of downloading packages not in the default channel. + + The structure of the JSON a repository should contain is located in + example-packages.json. + + :param repo: + The URL of the package repository + + :param package_manager: + An instance of :class:`PackageManager` used to download the file + """ + def __init__(self, repo, package_manager): + self.repo_info = None + self.repo = repo + self.package_manager = package_manager + self.unavailable_packages = [] + + def match_url(self): + """Indicates if this provider can handle the provided repo""" + + return True + + def fetch_repo(self): + """Retrieves and loads the JSON for other methods to use""" + + if self.repo_info != None: + return + + repository_json = self.package_manager.download_url(self.repo, + 'Error downloading repository.') + if repository_json == False: + self.repo_info = False + return + + try: + self.repo_info = json.loads(repository_json) + except (ValueError): + print '%s: Error parsing JSON from repository %s.' % (__name__, + self.repo) + self.repo_info = False + + def get_packages(self): + """ + Provides access to the repository info that is cached in a channel + + :return: + A dict in the format: + { + 'Package Name': { + # Package details - see example-packages.json for format + }, + ... + } + or False if there is an error + """ + + self.fetch_repo() + if self.repo_info == False: + return False + + output = {} + + for package in self.repo_info['packages']: + + platforms = package['platforms'].keys() + best_platform = self.get_best_platform(platforms) + + if not best_platform: + self.unavailable_packages.append(package['name']) + continue + + # Rewrites the legacy "zipball" URLs to the new "zip" format + downloads = package['platforms'][best_platform] + rewritten_downloads = [] + for download in downloads: + download['url'] = re.sub( + '^(https://nodeload.github.com/[^/]+/[^/]+/)zipball(/.*)$', + '\\1zip\\2', download['url']) + rewritten_downloads.append(download) + + info = { + 'name': package['name'], + 'description': package.get('description'), + 'url': package.get('homepage', self.repo), + 'author': package.get('author'), + 'last_modified': package.get('last_modified'), + 'downloads': rewritten_downloads + } + + output[package['name']] = info + + return output + + def get_renamed_packages(self): + """:return: A dict of the packages that have been renamed""" + + return self.repo_info.get('renamed_packages', {}) + + def get_unavailable_packages(self): + """ + Provides a list of packages that are unavailable for the current + platform/architecture that Sublime Text is running on. + + This list will be empty unless get_packages() is called first. + + :return: A list of package names + """ + + return self.unavailable_packages + + +class NonCachingProvider(): + """ + Base for package providers that do not need to cache the JSON + """ + + def fetch_json(self, url): + """ + Retrieves and parses the JSON from a URL + + :return: A dict or list from the JSON, or False on error + """ + + repository_json = self.package_manager.download_url(url, + 'Error downloading repository.') + if repository_json == False: + return False + try: + return json.loads(repository_json) + except (ValueError): + print '%s: Error parsing JSON from repository %s.' % (__name__, + url) + return False + + def get_unavailable_packages(self): + """ + Method for compatibility with PackageProvider class. These providers + are based on API calls, and thus do not support different platform + downloads, making it impossible for there to be unavailable packages. + + :return: An empty list + """ + + return [] + + +class GitHubPackageProvider(NonCachingProvider): + """ + Allows using a public GitHub repository as the source for a single package + + :param repo: + The public web URL to the GitHub repository. Should be in the format + `https://github.com/user/package` for the master branch, or + `https://github.com/user/package/tree/{branch_name}` for any other + branch. + + :param package_manager: + An instance of :class:`PackageManager` used to access the API + """ + + def __init__(self, repo, package_manager): + # Clean off the trailing .git to be more forgiving + self.repo = re.sub('\.git$', '', repo) + self.package_manager = package_manager + + def match_url(self): + """Indicates if this provider can handle the provided repo""" + + master = re.search('^https?://github.com/[^/]+/[^/]+/?$', self.repo) + branch = re.search('^https?://github.com/[^/]+/[^/]+/tree/[^/]+/?$', + self.repo) + return master != None or branch != None + + def get_packages(self): + """Uses the GitHub API to construct necessary info for a package""" + + branch = 'master' + branch_match = re.search( + '^https?://github.com/[^/]+/[^/]+/tree/([^/]+)/?$', self.repo) + if branch_match != None: + branch = branch_match.group(1) + + api_url = re.sub('^https?://github.com/([^/]+)/([^/]+)($|/.*$)', + 'https://api.github.com/repos/\\1/\\2', self.repo) + + repo_info = self.fetch_json(api_url) + if repo_info == False: + return False + + # In addition to hitting the main API endpoint for this repo, we + # also have to list the commits to get the timestamp of the last + # commit since we use that to generate a version number + commit_api_url = api_url + '/commits?' + \ + urllib.urlencode({'sha': branch, 'per_page': 1}) + + commit_info = self.fetch_json(commit_api_url) + if commit_info == False: + return False + + # We specifically use nodeload.github.com here because the download + # URLs all redirect there, and some of the downloaders don't follow + # HTTP redirect headers + download_url = 'https://nodeload.github.com/' + \ + repo_info['owner']['login'] + '/' + \ + repo_info['name'] + '/zip/' + urllib.quote(branch) + + commit_date = commit_info[0]['commit']['committer']['date'] + timestamp = datetime.datetime.strptime(commit_date[0:19], + '%Y-%m-%dT%H:%M:%S') + utc_timestamp = timestamp.strftime( + '%Y.%m.%d.%H.%M.%S') + + homepage = repo_info['homepage'] + if not homepage: + homepage = repo_info['html_url'] + + package = { + 'name': repo_info['name'], + 'description': repo_info['description'] if \ + repo_info['description'] else 'No description provided', + 'url': homepage, + 'author': repo_info['owner']['login'], + 'last_modified': timestamp.strftime('%Y-%m-%d %H:%M:%S'), + 'downloads': [ + { + 'version': utc_timestamp, + 'url': download_url + } + ] + } + return {package['name']: package} + + def get_renamed_packages(self): + """For API-compatibility with :class:`PackageProvider`""" + + return {} + + +class GitHubUserProvider(NonCachingProvider): + """ + Allows using a GitHub user/organization as the source for multiple packages + + :param repo: + The public web URL to the GitHub user/org. Should be in the format + `https://github.com/user`. + + :param package_manager: + An instance of :class:`PackageManager` used to access the API + """ + + def __init__(self, repo, package_manager): + self.repo = repo + self.package_manager = package_manager + + def match_url(self): + """Indicates if this provider can handle the provided repo""" + + return re.search('^https?://github.com/[^/]+/?$', self.repo) != None + + def get_packages(self): + """Uses the GitHub API to construct necessary info for all packages""" + + user_match = re.search('^https?://github.com/([^/]+)/?$', self.repo) + user = user_match.group(1) + + api_url = 'https://api.github.com/users/%s/repos?per_page=100' % user + + repo_info = self.fetch_json(api_url) + if repo_info == False: + return False + + packages = {} + for package_info in repo_info: + # All packages for the user are made available, and always from + # the master branch. Anything else requires a custom packages.json + commit_api_url = ('https://api.github.com/repos/%s/%s/commits' + \ + '?sha=master&per_page=1') % (user, package_info['name']) + + commit_info = self.fetch_json(commit_api_url) + if commit_info == False: + return False + + commit_date = commit_info[0]['commit']['committer']['date'] + timestamp = datetime.datetime.strptime(commit_date[0:19], + '%Y-%m-%dT%H:%M:%S') + utc_timestamp = timestamp.strftime( + '%Y.%m.%d.%H.%M.%S') + + homepage = package_info['homepage'] + if not homepage: + homepage = package_info['html_url'] + + package = { + 'name': package_info['name'], + 'description': package_info['description'] if \ + package_info['description'] else 'No description provided', + 'url': homepage, + 'author': package_info['owner']['login'], + 'last_modified': timestamp.strftime('%Y-%m-%d %H:%M:%S'), + 'downloads': [ + { + 'version': utc_timestamp, + # We specifically use nodeload.github.com here because + # the download URLs all redirect there, and some of the + # downloaders don't follow HTTP redirect headers + 'url': 'https://nodeload.github.com/' + \ + package_info['owner']['login'] + '/' + \ + package_info['name'] + '/zip/master' + } + ] + } + packages[package['name']] = package + return packages + + def get_renamed_packages(self): + """For API-compatibility with :class:`PackageProvider`""" + + return {} + + +class BitBucketPackageProvider(NonCachingProvider): + """ + Allows using a public BitBucket repository as the source for a single package + + :param repo: + The public web URL to the BitBucket repository. Should be in the format + `https://bitbucket.org/user/package`. + + :param package_manager: + An instance of :class:`PackageManager` used to access the API + """ + + def __init__(self, repo, package_manager): + self.repo = repo + self.package_manager = package_manager + + def match_url(self): + """Indicates if this provider can handle the provided repo""" + + return re.search('^https?://bitbucket.org', self.repo) != None + + def get_packages(self): + """Uses the BitBucket API to construct necessary info for a package""" + + api_url = re.sub('^https?://bitbucket.org/', + 'https://api.bitbucket.org/1.0/repositories/', self.repo) + api_url = api_url.rstrip('/') + + repo_info = self.fetch_json(api_url) + if repo_info == False: + return False + + # Since HG allows for arbitrary main branch names, we have to hit + # this URL just to get that info + main_branch_url = api_url + '/main-branch/' + main_branch_info = self.fetch_json(main_branch_url) + if main_branch_info == False: + return False + + # Grabbing the changesets is necessary because we construct the + # version number from the last commit timestamp + changeset_url = api_url + '/changesets/' + main_branch_info['name'] + last_commit = self.fetch_json(changeset_url) + if last_commit == False: + return False + + commit_date = last_commit['timestamp'] + timestamp = datetime.datetime.strptime(commit_date[0:19], + '%Y-%m-%d %H:%M:%S') + utc_timestamp = timestamp.strftime( + '%Y.%m.%d.%H.%M.%S') + + homepage = repo_info['website'] + if not homepage: + homepage = self.repo + package = { + 'name': repo_info['name'], + 'description': repo_info['description'] if \ + repo_info['description'] else 'No description provided', + 'url': homepage, + 'author': repo_info['owner'], + 'last_modified': timestamp.strftime('%Y-%m-%d %H:%M:%S'), + 'downloads': [ + { + 'version': utc_timestamp, + 'url': self.repo + '/get/' + \ + last_commit['node'] + '.zip' + } + ] + } + return {package['name']: package} + + def get_renamed_packages(self): + """For API-compatibility with :class:`PackageProvider`""" + + return {} + + +# The providers (in order) to check when trying to download repository info +_package_providers = [BitBucketPackageProvider, GitHubPackageProvider, + GitHubUserProvider, PackageProvider] + + +class BinaryNotFoundError(Exception): + """If a necessary executable is not found in the PATH on the system""" + + pass + + +class NonCleanExitError(Exception): + """ + When an subprocess does not exit cleanly + + :param returncode: + The command line integer return code of the subprocess + """ + + def __init__(self, returncode): + self.returncode = returncode + + def __str__(self): + return repr(self.returncode) + + +class NonHttpError(Exception): + """If a downloader had a non-clean exit, but it was not due to an HTTP error""" + + pass + + +class Downloader(): + """ + A base downloader that actually performs downloading URLs + + The SSL module is not included with the bundled Python for Linux + users of Sublime Text, so Linux machines will fall back to using curl + or wget for HTTPS URLs. + """ + + def check_certs(self, domain, timeout): + """ + Ensures that the SSL CA cert for a domain is present on the machine + + :param domain: + The domain to ensure there is a CA cert for + + :param timeout: + The int timeout for downloading the CA cert from the channel + + :return: + The CA cert bundle path on success, or False on error + """ + + cert_match = False + + certs_list = self.settings.get('certs', {}) + certs_dir = os.path.join(sublime.packages_path(), 'Package Control', + 'certs') + ca_bundle_path = os.path.join(certs_dir, 'ca-bundle.crt') + + cert_info = certs_list.get(domain) + if cert_info: + cert_match = self.locate_cert(certs_dir, cert_info[0], cert_info[1]) + + wildcard_info = certs_list.get('*') + if wildcard_info: + cert_match = self.locate_cert(certs_dir, wildcard_info[0], wildcard_info[1]) or cert_match + + if not cert_match: + print '%s: No CA certs available for %s.' % (__name__, domain) + return False + + return ca_bundle_path + + def locate_cert(self, certs_dir, cert_id, location): + """ + Makes sure the SSL cert specified has been added to the CA cert + bundle that is present on the machine + + :param certs_dir: + The path of the folder that contains the cert files + + :param cert_id: + The identifier for CA cert(s). For those provided by the channel + system, this will be an md5 of the contents of the cert(s). For + user-provided certs, this is something they provide. + + :param location: + An http(s) URL, or absolute filesystem path to the CA cert(s) + + :return: + If the cert specified (by cert_id) is present on the machine and + part of the ca-bundle.crt file in the certs_dir + """ + + cert_path = os.path.join(certs_dir, cert_id) + if not os.path.exists(cert_path): + if str(location) != '': + if re.match('^https?://', location): + contents = self.download_cert(cert_id, location) + else: + contents = self.load_cert(cert_id, location) + if contents: + self.save_cert(certs_dir, cert_id, contents) + return True + return False + return True + + def download_cert(self, cert_id, url): + """ + Downloads CA cert(s) from a URL + + :param cert_id: + The identifier for CA cert(s). For those provided by the channel + system, this will be an md5 of the contents of the cert(s). For + user-provided certs, this is something they provide. + + :param url: + An http(s) URL to the CA cert(s) + + :return: + The contents of the CA cert(s) + """ + + cert_downloader = self.__class__(self.settings) + return cert_downloader.download(url, + 'Error downloading CA certs for %s.' % (domain), timeout, 1) + + def load_cert(self, cert_id, path): + """ + Copies CA cert(s) from a file path + + :param cert_id: + The identifier for CA cert(s). For those provided by the channel + system, this will be an md5 of the contents of the cert(s). For + user-provided certs, this is something they provide. + + :param path: + The absolute filesystem path to a file containing the CA cert(s) + + :return: + The contents of the CA cert(s) + """ + + if os.path.exists(path): + with open(path, 'rb') as f: + return f.read() + + def save_cert(self, certs_dir, cert_id, contents): + """ + Saves CA cert(s) to the certs_dir (and ca-bundle.crt file) + + :param certs_dir: + The path of the folder that contains the cert files + + :param cert_id: + The identifier for CA cert(s). For those provided by the channel + system, this will be an md5 of the contents of the cert(s). For + user-provided certs, this is something they provide. + + :param contents: + The contents of the CA cert(s) + """ + + ca_bundle_path = os.path.join(certs_dir, 'ca-bundle.crt') + cert_path = os.path.join(certs_dir, cert_id) + with open(cert_path, 'wb') as f: + f.write(contents) + with open(ca_bundle_path, 'ab') as f: + f.write("\n" + contents) + + def decode_response(self, encoding, response): + if encoding == 'gzip': + return gzip.GzipFile(fileobj=StringIO.StringIO(response)).read() + elif encoding == 'deflate': + decompresser = zlib.decompressobj(-zlib.MAX_WBITS) + return decompresser.decompress(response) + decompresser.flush() + return response + + +class CliDownloader(Downloader): + """ + Base for downloaders that use a command line program + + :param settings: + A dict of the various Package Control settings. The Sublime Text + Settings API is not used because this code is run in a thread. + """ + + def __init__(self, settings): + self.settings = settings + + def clean_tmp_file(self): + if os.path.exists(self.tmp_file): + os.remove(self.tmp_file) + + def find_binary(self, name): + """ + Finds the given executable name in the system PATH + + :param name: + The exact name of the executable to find + + :return: + The absolute path to the executable + + :raises: + BinaryNotFoundError when the executable can not be found + """ + + for dir in os.environ['PATH'].split(os.pathsep): + path = os.path.join(dir, name) + if os.path.exists(path): + return path + + raise BinaryNotFoundError('The binary %s could not be located' % name) + + def execute(self, args): + """ + Runs the executable and args and returns the result + + :param args: + A list of the executable path and all arguments to be passed to it + + :return: + The text output of the executable + + :raises: + NonCleanExitError when the executable exits with an error + """ + + if self.settings.get('debug'): + print u"%s: Trying to execute command %s" % ( + __name__, create_cmd(args)) + + proc = subprocess.Popen(args, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + output = proc.stdout.read() + self.stderr = proc.stderr.read() + returncode = proc.wait() + if returncode != 0: + error = NonCleanExitError(returncode) + error.stderr = self.stderr + error.stdout = output + raise error + return output + + +class UrlLib2Downloader(Downloader): + """ + A downloader that uses the Python urllib2 module + + :param settings: + A dict of the various Package Control settings. The Sublime Text + Settings API is not used because this code is run in a thread. + """ + + def __init__(self, settings): + self.settings = settings + + def download(self, url, error_message, timeout, tries): + """ + Downloads a URL and returns the contents + + Uses the proxy settings from the Package Control.sublime-settings file, + however there seem to be a decent number of proxies that this code + does not work with. Patches welcome! + + :param url: + The URL to download + + :param error_message: + A string to include in the console error that is printed + when an error occurs + + :param timeout: + The int number of seconds to set the timeout to + + :param tries: + The int number of times to try and download the URL in the case of + a timeout or HTTP 503 error + + :return: + The string contents of the URL, or False on error + """ + + http_proxy = self.settings.get('http_proxy') + https_proxy = self.settings.get('https_proxy') + if http_proxy or https_proxy: + proxies = {} + if http_proxy: + proxies['http'] = http_proxy + if https_proxy: + proxies['https'] = https_proxy + proxy_handler = urllib2.ProxyHandler(proxies) + else: + proxy_handler = urllib2.ProxyHandler() + + password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm() + proxy_username = self.settings.get('proxy_username') + proxy_password = self.settings.get('proxy_password') + if proxy_username and proxy_password: + if http_proxy: + password_manager.add_password(None, http_proxy, proxy_username, + proxy_password) + if https_proxy: + password_manager.add_password(None, https_proxy, proxy_username, + proxy_password) + + handlers = [proxy_handler] + if os.name == 'nt': + ntlm_auth_handler = ProxyNtlmAuthHandler(password_manager) + handlers.append(ntlm_auth_handler) + + basic_auth_handler = urllib2.ProxyBasicAuthHandler(password_manager) + digest_auth_handler = urllib2.ProxyDigestAuthHandler(password_manager) + handlers.extend([digest_auth_handler, basic_auth_handler]) + + debug = self.settings.get('debug') + + if debug: + print u"%s: Urllib2 Debug Proxy" % __name__ + print u" http_proxy: %s" % http_proxy + print u" https_proxy: %s" % https_proxy + print u" proxy_username: %s" % proxy_username + print u" proxy_password: %s" % proxy_password + + secure_url_match = re.match('^https://([^/]+)', url) + if secure_url_match != None: + secure_domain = secure_url_match.group(1) + bundle_path = self.check_certs(secure_domain, timeout) + if not bundle_path: + return False + bundle_path = bundle_path.encode(sys.getfilesystemencoding()) + handlers.append(ValidatingHTTPSHandler(ca_certs=bundle_path, + debug=debug, passwd=password_manager, + user_agent=self.settings.get('user_agent'))) + else: + handlers.append(DebuggableHTTPHandler(debug=debug, + passwd=password_manager)) + urllib2.install_opener(urllib2.build_opener(*handlers)) + + while tries > 0: + tries -= 1 + try: + request = urllib2.Request(url, headers={ + "User-Agent": self.settings.get('user_agent'), + # Don't be alarmed if the response from the server does not + # select one of these since the server runs a relatively new + # version of OpenSSL which supports compression on the SSL + # layer, and Apache will use that instead of HTTP-level + # encoding. + "Accept-Encoding": "gzip,deflate"}) + http_file = urllib2.urlopen(request, timeout=timeout) + self.handle_rate_limit(http_file, url) + result = http_file.read() + encoding = http_file.headers.get('Content-Encoding') + return self.decode_response(encoding, result) + + except (httplib.HTTPException) as (e): + print '%s: %s HTTP exception %s (%s) downloading %s.' % ( + __name__, error_message, e.__class__.__name__, + unicode_from_os(e), url) + + except (urllib2.HTTPError) as (e): + # Make sure we obey Github's rate limiting headers + self.handle_rate_limit(e, url) + + # Bitbucket and Github return 503 a decent amount + if unicode_from_os(e.code) == '503': + print ('%s: Downloading %s was rate limited, ' + + 'trying again') % (__name__, url) + continue + print '%s: %s HTTP error %s downloading %s.' % (__name__, + error_message, unicode_from_os(e.code), url) + + except (urllib2.URLError) as (e): + + # Bitbucket and Github timeout a decent amount + if unicode_from_os(e.reason) == 'The read operation timed out' \ + or unicode_from_os(e.reason) == 'timed out': + print (u'%s: Downloading %s timed out, trying ' + + u'again') % (__name__, url) + continue + print u'%s: %s URL error %s downloading %s.' % (__name__, + error_message, unicode_from_os(e.reason), url) + break + return False + + def handle_rate_limit(self, response, url): + """ + Checks the headers of a respone object to make sure we are obeying the + rate limit + + :param response: + The response object that has a headers dict + + :param url: + The URL that was requested + + :raises: + RateLimitException when the rate limit has been hit + """ + + limit_remaining = response.headers.get('X-RateLimit-Remaining', 1) + if str(limit_remaining) == '0': + hostname = urlparse.urlparse(url).hostname + limit = response.headers.get('X-RateLimit-Limit', 1) + raise RateLimitException(hostname, limit) + + +class WgetDownloader(CliDownloader): + """ + A downloader that uses the command line program wget + + :param settings: + A dict of the various Package Control settings. The Sublime Text + Settings API is not used because this code is run in a thread. + """ + + def __init__(self, settings): + self.settings = settings + self.debug = settings.get('debug') + self.wget = self.find_binary('wget') + + def download(self, url, error_message, timeout, tries): + """ + Downloads a URL and returns the contents + + :param url: + The URL to download + + :param error_message: + A string to include in the console error that is printed + when an error occurs + + :param timeout: + The int number of seconds to set the timeout to + + :param tries: + The int number of times to try and download the URL in the case of + a timeout or HTTP 503 error + + :return: + The string contents of the URL, or False on error + """ + + if not self.wget: + return False + + self.tmp_file = tempfile.NamedTemporaryFile().name + command = [self.wget, '--connect-timeout=' + str(int(timeout)), '-o', + self.tmp_file, '-O', '-', '-U', + self.settings.get('user_agent'), '--header', + # Don't be alarmed if the response from the server does not select + # one of these since the server runs a relatively new version of + # OpenSSL which supports compression on the SSL layer, and Apache + # will use that instead of HTTP-level encoding. + 'Accept-Encoding: gzip,deflate'] + + secure_url_match = re.match('^https://([^/]+)', url) + if secure_url_match != None: + secure_domain = secure_url_match.group(1) + bundle_path = self.check_certs(secure_domain, timeout) + if not bundle_path: + return False + command.append(u'--ca-certificate=' + bundle_path) + + if self.debug: + command.append('-d') + else: + command.append('-S') + + http_proxy = self.settings.get('http_proxy') + https_proxy = self.settings.get('https_proxy') + proxy_username = self.settings.get('proxy_username') + proxy_password = self.settings.get('proxy_password') + + if proxy_username: + command.append(u"--proxy-user=%s" % proxy_username) + if proxy_password: + command.append(u"--proxy-password=%s" % proxy_password) + + if self.debug: + print u"%s: Wget Debug Proxy" % __name__ + print u" http_proxy: %s" % http_proxy + print u" https_proxy: %s" % https_proxy + print u" proxy_username: %s" % proxy_username + print u" proxy_password: %s" % proxy_password + + command.append(url) + + if http_proxy: + os.putenv('http_proxy', http_proxy) + if https_proxy: + os.putenv('https_proxy', https_proxy) + + while tries > 0: + tries -= 1 + try: + result = self.execute(command) + + general, headers = self.parse_output() + encoding = headers.get('content-encoding') + if encoding: + result = self.decode_response(encoding, result) + + return result + + except (NonCleanExitError) as (e): + + try: + general, headers = self.parse_output() + self.handle_rate_limit(headers, url) + + if general['status'] == '503': + # GitHub and BitBucket seem to rate limit via 503 + print ('%s: Downloading %s was rate limited' + + ', trying again') % (__name__, url) + continue + + error_string = 'HTTP error %s %s' % (general['status'], + general['message']) + + except (NonHttpError) as (e): + + error_string = unicode_from_os(e) + + # GitHub and BitBucket seem to time out a lot + if error_string.find('timed out') != -1: + print ('%s: Downloading %s timed out, ' + + 'trying again') % (__name__, url) + continue + + print (u'%s: %s %s downloading %s.' % (__name__, error_message, + error_string, url)).encode('UTF-8') + + break + return False + + def parse_output(self): + with open(self.tmp_file, 'r') as f: + output = f.read().splitlines() + self.clean_tmp_file() + + error = None + header_lines = [] + if self.debug: + section = 'General' + last_section = None + for line in output: + if section == 'General': + if self.skippable_line(line): + continue + + # Skip blank lines + if line.strip() == '': + continue + + # Error lines + if line[0:5] == 'wget:': + error = line[5:].strip() + if line[0:7] == 'failed:': + error = line[7:].strip() + + if line == '---request begin---': + section = 'Write' + continue + elif line == '---request end---': + section = 'General' + continue + elif line == '---response begin---': + section = 'Read' + continue + elif line == '---response end---': + section = 'General' + continue + + if section != last_section: + print "%s: Wget HTTP Debug %s" % (__name__, section) + + if section == 'Read': + header_lines.append(line) + + print ' ' + line + last_section = section + + else: + for line in output: + if self.skippable_line(line): + continue + + # Check the resolving and connecting to lines for errors + if re.match('(Resolving |Connecting to )', line): + failed_match = re.search(' failed: (.*)$', line) + if failed_match: + error = failed_match.group(1).strip() + + # Error lines + if line[0:5] == 'wget:': + error = line[5:].strip() + if line[0:7] == 'failed:': + error = line[7:].strip() + + if line[0:2] == ' ': + header_lines.append(line.lstrip()) + + if error: + raise NonHttpError(error) + + return self.parse_headers(header_lines) + + def skippable_line(self, line): + # Skip date lines + if re.match('--\d{4}-\d{2}-\d{2}', line): + return True + if re.match('\d{4}-\d{2}-\d{2}', line): + return True + # Skip HTTP status code lines since we already have that info + if re.match('\d{3} ', line): + return True + # Skip Saving to and progress lines + if re.match('(Saving to:|\s*\d+K)', line): + return True + # Skip notice about ignoring body on HTTP error + if re.match('Skipping \d+ byte', line): + return True + + def parse_headers(self, output=None): + if not output: + with open(self.tmp_file, 'r') as f: + output = f.read().splitlines() + self.clean_tmp_file() + + general = { + 'version': '0.9', + 'status': '200', + 'message': 'OK' + } + headers = {} + for line in output: + # When using the -S option, headers have two spaces before them, + # additionally, valid headers won't have spaces, so this is always + # a safe operation to perform + line = line.lstrip() + if line.find('HTTP/') == 0: + match = re.match('HTTP/(\d\.\d)\s+(\d+)\s+(.*)$', line) + general['version'] = match.group(1) + general['status'] = match.group(2) + general['message'] = match.group(3) + else: + name, value = line.split(':', 1) + headers[name.lower()] = value.strip() + + return (general, headers) + + def handle_rate_limit(self, headers, url): + limit_remaining = headers.get('x-ratelimit-remaining', '1') + limit = headers.get('x-ratelimit-limit', '1') + + if str(limit_remaining) == '0': + hostname = urlparse.urlparse(url).hostname + raise RateLimitException(hostname, limit) + + +class CurlDownloader(CliDownloader): + """ + A downloader that uses the command line program curl + + :param settings: + A dict of the various Package Control settings. The Sublime Text + Settings API is not used because this code is run in a thread. + """ + + def __init__(self, settings): + self.settings = settings + self.curl = self.find_binary('curl') + + def download(self, url, error_message, timeout, tries): + """ + Downloads a URL and returns the contents + + :param url: + The URL to download + + :param error_message: + A string to include in the console error that is printed + when an error occurs + + :param timeout: + The int number of seconds to set the timeout to + + :param tries: + The int number of times to try and download the URL in the case of + a timeout or HTTP 503 error + + :return: + The string contents of the URL, or False on error + """ + + if not self.curl: + return False + + self.tmp_file = tempfile.NamedTemporaryFile().name + command = [self.curl, '--user-agent', self.settings.get('user_agent'), + '--connect-timeout', str(int(timeout)), '-sSL', + # Don't be alarmed if the response from the server does not select + # one of these since the server runs a relatively new version of + # OpenSSL which supports compression on the SSL layer, and Apache + # will use that instead of HTTP-level encoding. + '--compressed', + # We have to capture the headers to check for rate limit info + '--dump-header', self.tmp_file] + + secure_url_match = re.match('^https://([^/]+)', url) + if secure_url_match != None: + secure_domain = secure_url_match.group(1) + bundle_path = self.check_certs(secure_domain, timeout) + if not bundle_path: + return False + command.extend(['--cacert', bundle_path]) + + debug = self.settings.get('debug') + if debug: + command.append('-v') + + http_proxy = self.settings.get('http_proxy') + https_proxy = self.settings.get('https_proxy') + proxy_username = self.settings.get('proxy_username') + proxy_password = self.settings.get('proxy_password') + + if debug: + print u"%s: Curl Debug Proxy" % __name__ + print u" http_proxy: %s" % http_proxy + print u" https_proxy: %s" % https_proxy + print u" proxy_username: %s" % proxy_username + print u" proxy_password: %s" % proxy_password + + if http_proxy or https_proxy: + command.append('--proxy-anyauth') + + if proxy_username or proxy_password: + command.extend(['-U', u"%s:%s" % (proxy_username, proxy_password)]) + + if http_proxy: + os.putenv('http_proxy', http_proxy) + if https_proxy: + os.putenv('HTTPS_PROXY', https_proxy) + + command.append(url) + + while tries > 0: + tries -= 1 + try: + output = self.execute(command) + + with open(self.tmp_file, 'r') as f: + headers = f.read() + self.clean_tmp_file() + + limit = 1 + limit_remaining = 1 + status = '200 OK' + for header in headers.splitlines(): + if header[0:5] == 'HTTP/': + status = re.sub('^HTTP/\d\.\d\s+', '', header) + if header.lower()[0:22] == 'x-ratelimit-remaining:': + limit_remaining = header.lower()[22:].strip() + if header.lower()[0:18] == 'x-ratelimit-limit:': + limit = header.lower()[18:].strip() + + if debug: + self.print_debug(self.stderr) + + if str(limit_remaining) == '0': + hostname = urlparse.urlparse(url).hostname + raise RateLimitException(hostname, limit) + + if status != '200 OK': + e = NonCleanExitError(22) + e.stderr = status + raise e + + return output + + except (NonCleanExitError) as (e): + # Stderr is used for both the error message and the debug info + # so we need to process it to extra the debug info + if self.settings.get('debug'): + e.stderr = self.print_debug(e.stderr) + + self.clean_tmp_file() + + if e.returncode == 22: + code = re.sub('^.*?(\d+)([\w\s]+)?$', '\\1', e.stderr) + if code == '503': + # GitHub and BitBucket seem to rate limit via 503 + print ('%s: Downloading %s was rate limited' + + ', trying again') % (__name__, url) + continue + error_string = 'HTTP error ' + code + elif e.returncode == 6: + error_string = 'URL error host not found' + elif e.returncode == 28: + # GitHub and BitBucket seem to time out a lot + print ('%s: Downloading %s timed out, trying ' + + 'again') % (__name__, url) + continue + else: + error_string = e.stderr.rstrip() + + print '%s: %s %s downloading %s.' % (__name__, error_message, + error_string, url) + break + + return False + + def print_debug(self, string): + section = 'General' + last_section = None + + output = '' + + for line in string.splitlines(): + # Placeholder for body of request + if line and line[0:2] == '{ ': + continue + + if len(line) > 1: + subtract = 0 + if line[0:2] == '* ': + section = 'General' + subtract = 2 + elif line[0:2] == '> ': + section = 'Write' + subtract = 2 + elif line[0:2] == '< ': + section = 'Read' + subtract = 2 + line = line[subtract:] + + # If the line does not start with "* ", "< ", "> " or " " + # then it is a real stderr message + if subtract == 0 and line[0:2] != ' ': + output += line + continue + + if line.strip() == '': + continue + + if section != last_section: + print "%s: Curl HTTP Debug %s" % (__name__, section) + + print ' ' + line + last_section = section + + return output + + +# A cache of channel and repository info to allow users to install multiple +# packages without having to wait for the metadata to be downloaded more +# than once. The keys are managed locally by the utilizing code. +_channel_repository_cache = {} + + +class RepositoryDownloader(threading.Thread): + """ + Downloads information about a repository in the background + + :param package_manager: + An instance of :class:`PackageManager` used to download files + + :param name_map: + The dict of name mapping for URL slug -> package name + + :param repo: + The URL of the repository to download info about + """ + + def __init__(self, package_manager, name_map, repo): + self.package_manager = package_manager + self.repo = repo + self.packages = {} + self.name_map = name_map + threading.Thread.__init__(self) + + def run(self): + for provider_class in _package_providers: + provider = provider_class(self.repo, self.package_manager) + if provider.match_url(): + break + packages = provider.get_packages() + if packages == False: + self.packages = False + return + + mapped_packages = {} + for package in packages.keys(): + mapped_package = self.name_map.get(package, package) + mapped_packages[mapped_package] = packages[package] + mapped_packages[mapped_package]['name'] = mapped_package + packages = mapped_packages + + self.packages = packages + self.renamed_packages = provider.get_renamed_packages() + self.unavailable_packages = provider.get_unavailable_packages() + + +class VcsUpgrader(): + """ + Base class for updating packages that are a version control repository on local disk + + :param vcs_binary: + The full filesystem path to the executable for the version control + system. May be set to None to allow the code to try and find it. + + :param update_command: + The command to pass to the version control executable to update the + repository. + + :param working_copy: + The local path to the working copy/package directory + + :param cache_length: + The lenth of time to cache if incoming changesets are available + """ + + def __init__(self, vcs_binary, update_command, working_copy, cache_length, debug): + self.binary = vcs_binary + self.update_command = update_command + self.working_copy = working_copy + self.cache_length = cache_length + self.debug = debug + + def execute(self, args, dir): + """ + Creates a subprocess with the executable/args + + :param args: + A list of the executable path and all arguments to it + + :param dir: + The directory in which to run the executable + + :return: A string of the executable output + """ + + startupinfo = None + if os.name == 'nt': + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + + if self.debug: + print u"%s: Trying to execute command %s" % ( + __name__, create_cmd(args)) + proc = subprocess.Popen(args, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + startupinfo=startupinfo, cwd=dir) + + return proc.stdout.read().replace('\r\n', '\n').rstrip(' \n\r') + + def find_binary(self, name): + """ + Locates the executable by looking in the PATH and well-known directories + + :param name: + The string filename of the executable + + :return: The filesystem path to the executable, or None if not found + """ + + if self.binary: + if self.debug: + print u"%s: Using \"%s_binary\" from settings \"%s\"" % ( + __name__, self.vcs_type, self.binary) + return self.binary + + # Try the path first + for dir in os.environ['PATH'].split(os.pathsep): + path = os.path.join(dir, name) + if os.path.exists(path): + if self.debug: + print u"%s: Found %s at \"%s\"" % (__name__, self.vcs_type, + path) + return path + + # This is left in for backwards compatibility and for windows + # users who may have the binary, albeit in a common dir that may + # not be part of the PATH + if os.name == 'nt': + dirs = ['C:\\Program Files\\Git\\bin', + 'C:\\Program Files (x86)\\Git\\bin', + 'C:\\Program Files\\TortoiseGit\\bin', + 'C:\\Program Files\\Mercurial', + 'C:\\Program Files (x86)\\Mercurial', + 'C:\\Program Files (x86)\\TortoiseHg', + 'C:\\Program Files\\TortoiseHg', + 'C:\\cygwin\\bin'] + else: + dirs = ['/usr/local/git/bin'] + + for dir in dirs: + path = os.path.join(dir, name) + if os.path.exists(path): + if self.debug: + print u"%s: Found %s at \"%s\"" % (__name__, self.vcs_type, + path) + return path + + if self.debug: + print u"%s: Could not find %s on your machine" % (__name__, + self.vcs_type) + return None + + +class GitUpgrader(VcsUpgrader): + """ + Allows upgrading a local git-repository-based package + """ + + vcs_type = 'git' + + def retrieve_binary(self): + """ + Returns the path to the git executable + + :return: The string path to the executable or False on error + """ + + name = 'git' + if os.name == 'nt': + name += '.exe' + binary = self.find_binary(name) + if binary and os.path.isdir(binary): + full_path = os.path.join(binary, name) + if os.path.exists(full_path): + binary = full_path + if not binary: + sublime.error_message(('%s: Unable to find %s. ' + + 'Please set the git_binary setting by accessing the ' + + 'Preferences > Package Settings > %s > ' + + u'Settings – User menu entry. The Settings – Default entry ' + + 'can be used for reference, but changes to that will be ' + + 'overwritten upon next upgrade.') % (__name__, name, __name__)) + return False + + if os.name == 'nt': + tortoise_plink = self.find_binary('TortoisePlink.exe') + if tortoise_plink: + os.environ.setdefault('GIT_SSH', tortoise_plink) + return binary + + def run(self): + """ + Updates the repository with remote changes + + :return: False or error, or True on success + """ + + binary = self.retrieve_binary() + if not binary: + return False + args = [binary] + args.extend(self.update_command) + self.execute(args, self.working_copy) + return True + + def incoming(self): + """:return: bool if remote revisions are available""" + + cache_key = self.working_copy + '.incoming' + working_copy_cache = _channel_repository_cache.get(cache_key) + if working_copy_cache and working_copy_cache.get('time') > \ + time.time(): + return working_copy_cache.get('data') + + binary = self.retrieve_binary() + if not binary: + return False + self.execute([binary, 'fetch'], self.working_copy) + args = [binary, 'log'] + args.append('..' + '/'.join(self.update_command[-2:])) + output = self.execute(args, self.working_copy) + incoming = len(output) > 0 + + _channel_repository_cache[cache_key] = { + 'time': time.time() + self.cache_length, + 'data': incoming + } + return incoming + + +class HgUpgrader(VcsUpgrader): + """ + Allows upgrading a local mercurial-repository-based package + """ + + vcs_type = 'hg' + + def retrieve_binary(self): + """ + Returns the path to the hg executable + + :return: The string path to the executable or False on error + """ + + name = 'hg' + if os.name == 'nt': + name += '.exe' + binary = self.find_binary(name) + if binary and os.path.isdir(binary): + full_path = os.path.join(binary, name) + if os.path.exists(full_path): + binary = full_path + if not binary: + sublime.error_message(('%s: Unable to find %s. ' + + 'Please set the hg_binary setting by accessing the ' + + 'Preferences > Package Settings > %s > ' + + u'Settings – User menu entry. The Settings – Default entry ' + + 'can be used for reference, but changes to that will be ' + + 'overwritten upon next upgrade.') % (__name__, name, __name__)) + return False + return binary + + def run(self): + """ + Updates the repository with remote changes + + :return: False or error, or True on success + """ + + binary = self.retrieve_binary() + if not binary: + return False + args = [binary] + args.extend(self.update_command) + self.execute(args, self.working_copy) + return True + + def incoming(self): + """:return: bool if remote revisions are available""" + + cache_key = self.working_copy + '.incoming' + working_copy_cache = _channel_repository_cache.get(cache_key) + if working_copy_cache and working_copy_cache.get('time') > \ + time.time(): + return working_copy_cache.get('data') + + binary = self.retrieve_binary() + if not binary: + return False + args = [binary, 'in', '-q'] + args.append(self.update_command[-1]) + output = self.execute(args, self.working_copy) + incoming = len(output) > 0 + + _channel_repository_cache[cache_key] = { + 'time': time.time() + self.cache_length, + 'data': incoming + } + return incoming + + +def clear_directory(directory, ignore_paths=None): + was_exception = False + for root, dirs, files in os.walk(directory, topdown=False): + paths = [os.path.join(root, f) for f in files] + paths.extend([os.path.join(root, d) for d in dirs]) + + for path in paths: + try: + # Don't delete the metadata file, that way we have it + # when the reinstall happens, and the appropriate + # usage info can be sent back to the server + if ignore_paths and path in ignore_paths: + continue + if os.path.isdir(path): + os.rmdir(path) + else: + os.remove(path) + except (OSError, IOError) as (e): + was_exception = True + + return not was_exception + + + +class PackageManager(): + """ + Allows downloading, creating, installing, upgrading, and deleting packages + + Delegates metadata retrieval to the _channel_providers and + _package_providers classes. Uses VcsUpgrader-based classes for handling + git and hg repositories in the Packages folder. Downloader classes are + utilized to fetch contents of URLs. + + Also handles displaying package messaging, and sending usage information to + the usage server. + """ + + def __init__(self): + # Here we manually copy the settings since sublime doesn't like + # code accessing settings from threads + self.settings = {} + settings = sublime.load_settings(__name__ + '.sublime-settings') + for setting in ['timeout', 'repositories', 'repository_channels', + 'package_name_map', 'dirs_to_ignore', 'files_to_ignore', + 'package_destination', 'cache_length', 'auto_upgrade', + 'files_to_ignore_binary', 'files_to_keep', 'dirs_to_keep', + 'git_binary', 'git_update_command', 'hg_binary', + 'hg_update_command', 'http_proxy', 'https_proxy', + 'auto_upgrade_ignore', 'auto_upgrade_frequency', + 'submit_usage', 'submit_url', 'renamed_packages', + 'files_to_include', 'files_to_include_binary', 'certs', + 'ignore_vcs_packages', 'proxy_username', 'proxy_password', + 'debug', 'user_agent']: + if settings.get(setting) == None: + continue + self.settings[setting] = settings.get(setting) + + # https_proxy will inherit from http_proxy unless it is set to a + # string value or false + no_https_proxy = self.settings.get('https_proxy') in ["", None] + if no_https_proxy and self.settings.get('http_proxy'): + self.settings['https_proxy'] = self.settings.get('http_proxy') + if self.settings['https_proxy'] == False: + self.settings['https_proxy'] = '' + + self.settings['platform'] = sublime.platform() + self.settings['version'] = sublime.version() + + def compare_versions(self, version1, version2): + """ + Compares to version strings to see which is greater + + Date-based version numbers (used by GitHub and BitBucket providers) + are automatically pre-pended with a 0 so they are always less than + version 1.0. + + :return: + -1 if version1 is less than version2 + 0 if they are equal + 1 if version1 is greater than version2 + """ + + def date_compat(v): + # We prepend 0 to all date-based version numbers so that developers + # may switch to explicit versioning from GitHub/BitBucket + # versioning based on commit dates + date_match = re.match('(\d{4})\.(\d{2})\.(\d{2})\.(\d{2})\.(\d{2})\.(\d{2})$', v) + if date_match: + v = '0.%s.%s.%s.%s.%s.%s' % date_match.groups() + return v + + def semver_compat(v): + # When translating dates into semver, the way to get each date + # segment into the version is to treat the year and month as + # minor and patch, and then the rest as a numeric build version + # with four different parts. The result looks like: + # 0.2012.11+10.31.23.59 + date_match = re.match('(\d{4}(?:\.\d{2}){2})\.(\d{2}(?:\.\d{2}){3})$', v) + if date_match: + v = '%s+%s' % (date_match.group(1), date_match.group(2)) + + # Semver must have major, minor, patch + elif re.match('^\d+$', v): + v += '.0.0' + elif re.match('^\d+\.\d+$', v): + v += '.0' + return v + + def cmp_compat(v): + return [int(x) for x in re.sub(r'(\.0+)*$', '', v).split(".")] + + version1 = date_compat(version1) + version2 = date_compat(version2) + try: + return semver.compare(semver_compat(version1), semver_compat(version2)) + except (ValueError): + return cmp(cmp_compat(version1), cmp_compat(version2)) + + def download_url(self, url, error_message): + """ + Downloads a URL and returns the contents + + :param url: + The string URL to download + + :param error_message: + The error message to include if the download fails + + :return: + The string contents of the URL, or False on error + """ + + has_ssl = 'ssl' in sys.modules and hasattr(urllib2, 'HTTPSHandler') + is_ssl = re.search('^https://', url) != None + downloader = None + + if (is_ssl and has_ssl) or not is_ssl: + downloader = UrlLib2Downloader(self.settings) + else: + for downloader_class in [CurlDownloader, WgetDownloader]: + try: + downloader = downloader_class(self.settings) + break + except (BinaryNotFoundError): + pass + + if not downloader: + sublime.error_message(('%s: Unable to download %s due to no ' + + 'ssl module available and no capable program found. Please ' + + 'install curl or wget.') % (__name__, url)) + return False + + url = url.replace(' ', '%20') + hostname = urlparse.urlparse(url).hostname.lower() + timeout = self.settings.get('timeout', 3) + + rate_limited_cache = _channel_repository_cache.get('rate_limited_domains', {}) + if rate_limited_cache.get('time') and rate_limited_cache.get('time') > time.time(): + rate_limited_domains = rate_limited_cache.get('data', []) + else: + rate_limited_domains = [] + + if self.settings.get('debug'): + try: + ip = socket.gethostbyname(hostname) + except (socket.gaierror) as (e): + ip = unicode_from_os(e) + + print u"%s: Download Debug" % __name__ + print u" URL: %s" % url + print u" Resolved IP: %s" % ip + print u" Timeout: %s" % str(timeout) + + if hostname in rate_limited_domains: + if self.settings.get('debug'): + print u" Skipping due to hitting rate limit for %s" % hostname + return False + + try: + return downloader.download(url, error_message, timeout, 3) + except (RateLimitException) as (e): + + rate_limited_domains.append(hostname) + _channel_repository_cache['rate_limited_domains'] = { + 'data': rate_limited_domains, + 'time': time.time() + self.settings.get('cache_length', + 300) + } + + print ('%s: Hit rate limit of %s for %s, skipping all futher ' + + 'download requests for this domain') % (__name__, + e.limit, e.host) + return False + + def get_metadata(self, package): + """ + Returns the package metadata for an installed package + + :return: + A dict with the keys: + version + url + description + or an empty dict on error + """ + + metadata_filename = os.path.join(self.get_package_dir(package), + 'package-metadata.json') + if os.path.exists(metadata_filename): + with open(metadata_filename) as f: + try: + return json.load(f) + except (ValueError): + return {} + return {} + + def list_repositories(self): + """ + Returns a master list of all repositories pulled from all sources + + These repositories come from the channels specified in the + "repository_channels" setting, plus any repositories listed in the + "repositories" setting. + + :return: + A list of all available repositories + """ + + repositories = self.settings.get('repositories') + repository_channels = self.settings.get('repository_channels') + for channel in repository_channels: + channel = channel.strip() + + channel_repositories = None + + # Caches various info from channels for performance + cache_key = channel + '.repositories' + repositories_cache = _channel_repository_cache.get(cache_key) + if repositories_cache and repositories_cache.get('time') > \ + time.time(): + channel_repositories = repositories_cache.get('data') + + name_map_cache_key = channel + '.package_name_map' + name_map_cache = _channel_repository_cache.get( + name_map_cache_key) + if name_map_cache and name_map_cache.get('time') > \ + time.time(): + name_map = name_map_cache.get('data') + name_map.update(self.settings.get('package_name_map', {})) + self.settings['package_name_map'] = name_map + + renamed_cache_key = channel + '.renamed_packages' + renamed_cache = _channel_repository_cache.get( + renamed_cache_key) + if renamed_cache and renamed_cache.get('time') > \ + time.time(): + renamed_packages = renamed_cache.get('data') + renamed_packages.update(self.settings.get('renamed_packages', + {})) + self.settings['renamed_packages'] = renamed_packages + + unavailable_cache_key = channel + '.unavailable_packages' + unavailable_cache = _channel_repository_cache.get( + unavailable_cache_key) + if unavailable_cache and unavailable_cache.get('time') > \ + time.time(): + unavailable_packages = unavailable_cache.get('data') + unavailable_packages.extend(self.settings.get('unavailable_packages', + [])) + self.settings['unavailable_packages'] = unavailable_packages + + certs_cache_key = channel + '.certs' + certs_cache = _channel_repository_cache.get(certs_cache_key) + if certs_cache and certs_cache.get('time') > time.time(): + certs = self.settings.get('certs', {}) + certs.update(certs_cache.get('data')) + self.settings['certs'] = certs + + # If any of the info was not retrieved from the cache, we need to + # grab the channel to get it + if channel_repositories == None or \ + self.settings.get('package_name_map') == None or \ + self.settings.get('renamed_packages') == None: + + for provider_class in _channel_providers: + provider = provider_class(channel, self) + if provider.match_url(): + break + + channel_repositories = provider.get_repositories() + + if channel_repositories == False: + continue + _channel_repository_cache[cache_key] = { + 'time': time.time() + self.settings.get('cache_length', + 300), + 'data': channel_repositories + } + + for repo in channel_repositories: + if provider.get_packages(repo) == False: + continue + packages_cache_key = repo + '.packages' + _channel_repository_cache[packages_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', + 300), + 'data': provider.get_packages(repo) + } + + # Have the local name map override the one from the channel + name_map = provider.get_name_map() + name_map.update(self.settings.get('package_name_map', {})) + self.settings['package_name_map'] = name_map + _channel_repository_cache[name_map_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', + 300), + 'data': name_map + } + + renamed_packages = provider.get_renamed_packages() + _channel_repository_cache[renamed_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', + 300), + 'data': renamed_packages + } + if renamed_packages: + self.settings['renamed_packages'] = self.settings.get( + 'renamed_packages', {}) + self.settings['renamed_packages'].update(renamed_packages) + + unavailable_packages = provider.get_unavailable_packages() + _channel_repository_cache[unavailable_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', + 300), + 'data': unavailable_packages + } + if unavailable_packages: + self.settings['unavailable_packages'] = self.settings.get( + 'unavailable_packages', []) + self.settings['unavailable_packages'].extend(unavailable_packages) + + certs = provider.get_certs() + _channel_repository_cache[certs_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', + 300), + 'data': certs + } + if certs: + self.settings['certs'] = self.settings.get('certs', {}) + self.settings['certs'].update(certs) + + repositories.extend(channel_repositories) + return [repo.strip() for repo in repositories] + + def list_available_packages(self): + """ + Returns a master list of every available package from all sources + + :return: + A dict in the format: + { + 'Package Name': { + # Package details - see example-packages.json for format + }, + ... + } + """ + + repositories = self.list_repositories() + packages = {} + downloaders = [] + grouped_downloaders = {} + + # Repositories are run in reverse order so that the ones first + # on the list will overwrite those last on the list + for repo in repositories[::-1]: + repository_packages = None + + cache_key = repo + '.packages' + packages_cache = _channel_repository_cache.get(cache_key) + if packages_cache and packages_cache.get('time') > \ + time.time(): + repository_packages = packages_cache.get('data') + packages.update(repository_packages) + + if repository_packages == None: + downloader = RepositoryDownloader(self, + self.settings.get('package_name_map', {}), repo) + domain = re.sub('^https?://[^/]*?(\w+\.\w+)($|/.*$)', '\\1', + repo) + + # downloaders are grouped by domain so that multiple can + # be run in parallel without running into API access limits + if not grouped_downloaders.get(domain): + grouped_downloaders[domain] = [] + grouped_downloaders[domain].append(downloader) + + # Allows creating a separate named function for each downloader + # delay. Not having this contained in a function causes all of the + # schedules to reference the same downloader.start() + def schedule(downloader, delay): + downloader.has_started = False + + def inner(): + downloader.start() + downloader.has_started = True + sublime.set_timeout(inner, delay) + + # Grabs every repo grouped by domain and delays the start + # of each download from that domain by a fixed amount + for domain_downloaders in grouped_downloaders.values(): + for i in range(len(domain_downloaders)): + downloader = domain_downloaders[i] + downloaders.append(downloader) + schedule(downloader, i * 150) + + complete = [] + + # Wait for all of the downloaders to finish + while downloaders: + downloader = downloaders.pop() + if downloader.has_started: + downloader.join() + complete.append(downloader) + else: + downloaders.insert(0, downloader) + + # Grabs the results and stuff if all in the cache + for downloader in complete: + repository_packages = downloader.packages + if repository_packages == False: + continue + cache_key = downloader.repo + '.packages' + _channel_repository_cache[cache_key] = { + 'time': time.time() + self.settings.get('cache_length', 300), + 'data': repository_packages + } + packages.update(repository_packages) + + renamed_packages = downloader.renamed_packages + if renamed_packages == False: + continue + renamed_cache_key = downloader.repo + '.renamed_packages' + _channel_repository_cache[renamed_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', 300), + 'data': renamed_packages + } + if renamed_packages: + self.settings['renamed_packages'] = self.settings.get( + 'renamed_packages', {}) + self.settings['renamed_packages'].update(renamed_packages) + + unavailable_packages = downloader.unavailable_packages + unavailable_cache_key = downloader.repo + '.unavailable_packages' + _channel_repository_cache[unavailable_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', 300), + 'data': unavailable_packages + } + if unavailable_packages: + self.settings['unavailable_packages'] = self.settings.get( + 'unavailable_packages', []) + self.settings['unavailable_packages'].extend(unavailable_packages) + + return packages + + def list_packages(self): + """ :return: A list of all installed, non-default, package names""" + + package_names = os.listdir(sublime.packages_path()) + package_names = [path for path in package_names if + os.path.isdir(os.path.join(sublime.packages_path(), path))] + + # Ignore things to be deleted + ignored = [] + for package in package_names: + cleanup_file = os.path.join(sublime.packages_path(), package, + 'package-control.cleanup') + if os.path.exists(cleanup_file): + ignored.append(package) + + packages = list(set(package_names) - set(ignored) - + set(self.list_default_packages())) + packages = sorted(packages, key=lambda s: s.lower()) + + return packages + + def list_all_packages(self): + """ :return: A list of all installed package names, including default packages""" + + packages = os.listdir(sublime.packages_path()) + packages = sorted(packages, key=lambda s: s.lower()) + return packages + + def list_default_packages(self): + """ :return: A list of all default package names""" + + files = os.listdir(os.path.join(os.path.dirname( + sublime.packages_path()), 'Pristine Packages')) + files = list(set(files) - set(os.listdir( + sublime.installed_packages_path()))) + packages = [file.replace('.sublime-package', '') for file in files] + packages = sorted(packages, key=lambda s: s.lower()) + return packages + + def get_package_dir(self, package): + """:return: The full filesystem path to the package directory""" + + return os.path.join(sublime.packages_path(), package) + + def get_mapped_name(self, package): + """:return: The name of the package after passing through mapping rules""" + + return self.settings.get('package_name_map', {}).get(package, package) + + def create_package(self, package_name, package_destination, + binary_package=False): + """ + Creates a .sublime-package file from the running Packages directory + + :param package_name: + The package to create a .sublime-package file for + + :param package_destination: + The full filesystem path of the directory to save the new + .sublime-package file in. + + :param binary_package: + If the created package should follow the binary package include/ + exclude patterns from the settings. These normally include a setup + to exclude .py files and include .pyc files, but that can be + changed via settings. + + :return: bool if the package file was successfully created + """ + + package_dir = self.get_package_dir(package_name) + '/' + + if not os.path.exists(package_dir): + sublime.error_message(('%s: The folder for the package name ' + + 'specified, %s, does not exist in %s') % + (__name__, package_name, sublime.packages_path())) + return False + + package_filename = package_name + '.sublime-package' + package_path = os.path.join(package_destination, + package_filename) + + if not os.path.exists(sublime.installed_packages_path()): + os.mkdir(sublime.installed_packages_path()) + + if os.path.exists(package_path): + os.remove(package_path) + + try: + package_file = zipfile.ZipFile(package_path, "w", + compression=zipfile.ZIP_DEFLATED) + except (OSError, IOError) as (exception): + sublime.error_message(('%s: An error occurred creating the ' + + 'package file %s in %s. %s') % (__name__, package_filename, + package_destination, unicode_from_os(exception))) + return False + + dirs_to_ignore = self.settings.get('dirs_to_ignore', []) + if not binary_package: + files_to_ignore = self.settings.get('files_to_ignore', []) + files_to_include = self.settings.get('files_to_include', []) + else: + files_to_ignore = self.settings.get('files_to_ignore_binary', []) + files_to_include = self.settings.get('files_to_include_binary', []) + + package_dir_regex = re.compile('^' + re.escape(package_dir)) + for root, dirs, files in os.walk(package_dir): + [dirs.remove(dir) for dir in dirs if dir in dirs_to_ignore] + paths = dirs + paths.extend(files) + for path in paths: + full_path = os.path.join(root, path) + relative_path = re.sub(package_dir_regex, '', full_path) + + ignore_matches = [fnmatch(relative_path, p) for p in files_to_ignore] + include_matches = [fnmatch(relative_path, p) for p in files_to_include] + if any(ignore_matches) and not any(include_matches): + continue + + if os.path.isdir(full_path): + continue + package_file.write(full_path, relative_path) + + package_file.close() + + return True + + def install_package(self, package_name): + """ + Downloads and installs (or upgrades) a package + + Uses the self.list_available_packages() method to determine where to + retrieve the package file from. + + The install process consists of: + + 1. Finding the package + 2. Downloading the .sublime-package/.zip file + 3. Extracting the package file + 4. Showing install/upgrade messaging + 5. Submitting usage info + 6. Recording that the package is installed + + :param package_name: + The package to download and install + + :return: bool if the package was successfully installed + """ + + packages = self.list_available_packages() + + if package_name in self.settings.get('unavailable_packages', []): + print ('%s: The package "%s" is not available ' + + 'on this platform.') % (__name__, package_name) + return False + + if package_name not in packages.keys(): + sublime.error_message(('%s: The package specified, %s, is ' + + 'not available.') % (__name__, package_name)) + return False + + download = packages[package_name]['downloads'][0] + url = download['url'] + + package_filename = package_name + \ + '.sublime-package' + package_path = os.path.join(sublime.installed_packages_path(), + package_filename) + pristine_package_path = os.path.join(os.path.dirname( + sublime.packages_path()), 'Pristine Packages', package_filename) + + package_dir = self.get_package_dir(package_name) + + package_metadata_file = os.path.join(package_dir, + 'package-metadata.json') + + if os.path.exists(os.path.join(package_dir, '.git')): + if self.settings.get('ignore_vcs_packages'): + sublime.error_message(('%s: Skipping git package %s since ' + + 'the setting ignore_vcs_packages is set to true') % + (__name__, package_name)) + return False + return GitUpgrader(self.settings['git_binary'], + self.settings['git_update_command'], package_dir, + self.settings['cache_length'], self.settings['debug']).run() + elif os.path.exists(os.path.join(package_dir, '.hg')): + if self.settings.get('ignore_vcs_packages'): + sublime.error_message(('%s: Skipping hg package %s since ' + + 'the setting ignore_vcs_packages is set to true') % + (__name__, package_name)) + return False + return HgUpgrader(self.settings['hg_binary'], + self.settings['hg_update_command'], package_dir, + self.settings['cache_length'], self.settings['debug']).run() + + is_upgrade = os.path.exists(package_metadata_file) + old_version = None + if is_upgrade: + old_version = self.get_metadata(package_name).get('version') + + package_bytes = self.download_url(url, 'Error downloading package.') + if package_bytes == False: + return False + with open(package_path, "wb") as package_file: + package_file.write(package_bytes) + + if not os.path.exists(package_dir): + os.mkdir(package_dir) + + # We create a backup copy incase something was edited + else: + try: + backup_dir = os.path.join(os.path.dirname( + sublime.packages_path()), 'Backup', + datetime.datetime.now().strftime('%Y%m%d%H%M%S')) + if not os.path.exists(backup_dir): + os.makedirs(backup_dir) + package_backup_dir = os.path.join(backup_dir, package_name) + shutil.copytree(package_dir, package_backup_dir) + except (OSError, IOError) as (exception): + sublime.error_message(('%s: An error occurred while trying ' + + 'to backup the package directory for %s. %s') % + (__name__, package_name, unicode_from_os(exception))) + shutil.rmtree(package_backup_dir) + return False + + try: + package_zip = zipfile.ZipFile(package_path, 'r') + except (zipfile.BadZipfile): + sublime.error_message(('%s: An error occurred while ' + + 'trying to unzip the package file for %s. Please try ' + + 'installing the package again.') % (__name__, package_name)) + return False + + root_level_paths = [] + last_path = None + for path in package_zip.namelist(): + last_path = path + if path.find('/') in [len(path) - 1, -1]: + root_level_paths.append(path) + if path[0] == '/' or path.find('../') != -1 or path.find('..\\') != -1: + sublime.error_message(('%s: The package specified, %s, ' + + 'contains files outside of the package dir and cannot ' + + 'be safely installed.') % (__name__, package_name)) + return False + + if last_path and len(root_level_paths) == 0: + root_level_paths.append(last_path[0:last_path.find('/') + 1]) + + os.chdir(package_dir) + + overwrite_failed = False + + # Here we don’t use .extractall() since it was having issues on OS X + skip_root_dir = len(root_level_paths) == 1 and \ + root_level_paths[0].endswith('/') + extracted_paths = [] + for path in package_zip.namelist(): + dest = path + try: + if not isinstance(dest, unicode): + dest = unicode(dest, 'utf-8', 'strict') + except (UnicodeDecodeError): + dest = unicode(dest, 'cp1252', 'replace') + + if os.name == 'nt': + regex = ':|\*|\?|"|<|>|\|' + if re.search(regex, dest) != None: + print ('%s: Skipping file from package named %s due to ' + + 'an invalid filename') % (__name__, path) + continue + + # If there was only a single directory in the package, we remove + # that folder name from the paths as we extract entries + if skip_root_dir: + dest = dest[len(root_level_paths[0]):] + + if os.name == 'nt': + dest = dest.replace('/', '\\') + else: + dest = dest.replace('\\', '/') + + dest = os.path.join(package_dir, dest) + + def add_extracted_dirs(dir): + while dir not in extracted_paths: + extracted_paths.append(dir) + dir = os.path.dirname(dir) + if dir == package_dir: + break + + if path.endswith('/'): + if not os.path.exists(dest): + os.makedirs(dest) + add_extracted_dirs(dest) + else: + dest_dir = os.path.dirname(dest) + if not os.path.exists(dest_dir): + os.makedirs(dest_dir) + add_extracted_dirs(dest_dir) + extracted_paths.append(dest) + try: + open(dest, 'wb').write(package_zip.read(path)) + except (IOError) as (e): + message = unicode_from_os(e) + if re.search('[Ee]rrno 13', message): + overwrite_failed = True + break + print ('%s: Skipping file from package named %s due to ' + + 'an invalid filename') % (__name__, path) + + except (UnicodeDecodeError): + print ('%s: Skipping file from package named %s due to ' + + 'an invalid filename') % (__name__, path) + package_zip.close() + + + # If upgrading failed, queue the package to upgrade upon next start + if overwrite_failed: + reinstall_file = os.path.join(package_dir, 'package-control.reinstall') + open(reinstall_file, 'w').close() + + # Don't delete the metadata file, that way we have it + # when the reinstall happens, and the appropriate + # usage info can be sent back to the server + clear_directory(package_dir, [reinstall_file, package_metadata_file]) + + sublime.error_message(('%s: An error occurred while trying to ' + + 'upgrade %s. Please restart Sublime Text to finish the ' + + 'upgrade.') % (__name__, package_name)) + return False + + + # Here we clean out any files that were not just overwritten. It is ok + # if there is an error removing a file. The next time there is an + # upgrade, it should be cleaned out successfully then. + clear_directory(package_dir, extracted_paths) + + + self.print_messages(package_name, package_dir, is_upgrade, old_version) + + with open(package_metadata_file, 'w') as f: + metadata = { + "version": packages[package_name]['downloads'][0]['version'], + "url": packages[package_name]['url'], + "description": packages[package_name]['description'] + } + json.dump(metadata, f) + + # Submit install and upgrade info + if is_upgrade: + params = { + 'package': package_name, + 'operation': 'upgrade', + 'version': packages[package_name]['downloads'][0]['version'], + 'old_version': old_version + } + else: + params = { + 'package': package_name, + 'operation': 'install', + 'version': packages[package_name]['downloads'][0]['version'] + } + self.record_usage(params) + + # Record the install in the settings file so that you can move + # settings across computers and have the same packages installed + def save_package(): + settings = sublime.load_settings(__name__ + '.sublime-settings') + installed_packages = settings.get('installed_packages', []) + if not installed_packages: + installed_packages = [] + installed_packages.append(package_name) + installed_packages = list(set(installed_packages)) + installed_packages = sorted(installed_packages, + key=lambda s: s.lower()) + settings.set('installed_packages', installed_packages) + sublime.save_settings(__name__ + '.sublime-settings') + sublime.set_timeout(save_package, 1) + + # Here we delete the package file from the installed packages directory + # since we don't want to accidentally overwrite user changes + os.remove(package_path) + # We have to remove the pristine package too or else Sublime Text 2 + # will silently delete the package + if os.path.exists(pristine_package_path): + os.remove(pristine_package_path) + + os.chdir(sublime.packages_path()) + return True + + def print_messages(self, package, package_dir, is_upgrade, old_version): + """ + Prints out package install and upgrade messages + + The functionality provided by this allows package maintainers to + show messages to the user when a package is installed, or when + certain version upgrade occur. + + :param package: + The name of the package the message is for + + :param package_dir: + The full filesystem path to the package directory + + :param is_upgrade: + If the install was actually an upgrade + + :param old_version: + The string version of the package before the upgrade occurred + """ + + messages_file = os.path.join(package_dir, 'messages.json') + if not os.path.exists(messages_file): + return + + messages_fp = open(messages_file, 'r') + try: + message_info = json.load(messages_fp) + except (ValueError): + print '%s: Error parsing messages.json for %s' % (__name__, package) + return + messages_fp.close() + + output = '' + if not is_upgrade and message_info.get('install'): + install_messages = os.path.join(package_dir, + message_info.get('install')) + message = '\n\n%s:\n%s\n\n ' % (package, + ('-' * len(package))) + with open(install_messages, 'r') as f: + message += unicode(f.read(), 'utf-8', errors='replace').replace('\n', '\n ') + output += message + '\n' + + elif is_upgrade and old_version: + upgrade_messages = list(set(message_info.keys()) - + set(['install'])) + upgrade_messages = sorted(upgrade_messages, + cmp=self.compare_versions, reverse=True) + for version in upgrade_messages: + if self.compare_versions(old_version, version) >= 0: + break + if not output: + message = '\n\n%s:\n%s\n' % (package, + ('-' * len(package))) + output += message + upgrade_messages = os.path.join(package_dir, + message_info.get(version)) + message = '\n ' + with open(upgrade_messages, 'r') as f: + message += unicode(f.read(), 'utf-8', errors='replace').replace('\n', '\n ') + output += message + '\n' + + if not output: + return + + def print_to_panel(): + window = sublime.active_window() + + views = window.views() + view = None + for _view in views: + if _view.name() == 'Package Control Messages': + view = _view + break + + if not view: + view = window.new_file() + view.set_name('Package Control Messages') + view.set_scratch(True) + + def write(string): + edit = view.begin_edit() + view.insert(edit, view.size(), string) + view.end_edit(edit) + + if not view.size(): + view.settings().set("word_wrap", True) + write('Package Control Messages\n' + + '========================') + + write(output) + sublime.set_timeout(print_to_panel, 1) + + def remove_package(self, package_name): + """ + Deletes a package + + The deletion process consists of: + + 1. Deleting the directory (or marking it for deletion if deletion fails) + 2. Submitting usage info + 3. Removing the package from the list of installed packages + + :param package_name: + The package to delete + + :return: bool if the package was successfully deleted + """ + + installed_packages = self.list_packages() + + if package_name not in installed_packages: + sublime.error_message(('%s: The package specified, %s, is not ' + + 'installed.') % (__name__, package_name)) + return False + + os.chdir(sublime.packages_path()) + + # Give Sublime Text some time to ignore the package + time.sleep(1) + + package_filename = package_name + '.sublime-package' + package_path = os.path.join(sublime.installed_packages_path(), + package_filename) + installed_package_path = os.path.join(os.path.dirname( + sublime.packages_path()), 'Installed Packages', package_filename) + pristine_package_path = os.path.join(os.path.dirname( + sublime.packages_path()), 'Pristine Packages', package_filename) + package_dir = self.get_package_dir(package_name) + + version = self.get_metadata(package_name).get('version') + + try: + if os.path.exists(package_path): + os.remove(package_path) + except (OSError, IOError) as (exception): + sublime.error_message(('%s: An error occurred while trying to ' + + 'remove the package file for %s. %s') % (__name__, + package_name, unicode_from_os(exception))) + return False + + try: + if os.path.exists(installed_package_path): + os.remove(installed_package_path) + except (OSError, IOError) as (exception): + sublime.error_message(('%s: An error occurred while trying to ' + + 'remove the installed package file for %s. %s') % (__name__, + package_name, unicode_from_os(exception))) + return False + + try: + if os.path.exists(pristine_package_path): + os.remove(pristine_package_path) + except (OSError, IOError) as (exception): + sublime.error_message(('%s: An error occurred while trying to ' + + 'remove the pristine package file for %s. %s') % (__name__, + package_name, unicode_from_os(exception))) + return False + + # We don't delete the actual package dir immediately due to a bug + # in sublime_plugin.py + can_delete_dir = True + if not clear_directory(package_dir): + # If there is an error deleting now, we will mark it for + # cleanup the next time Sublime Text starts + open(os.path.join(package_dir, 'package-control.cleanup'), + 'w').close() + can_delete_dir = False + + params = { + 'package': package_name, + 'operation': 'remove', + 'version': version + } + self.record_usage(params) + + # Remove the package from the installed packages list + def clear_package(): + settings = sublime.load_settings('%s.sublime-settings' % __name__) + installed_packages = settings.get('installed_packages', []) + if not installed_packages: + installed_packages = [] + installed_packages.remove(package_name) + settings.set('installed_packages', installed_packages) + sublime.save_settings('%s.sublime-settings' % __name__) + sublime.set_timeout(clear_package, 1) + + if can_delete_dir: + os.rmdir(package_dir) + + return True + + def record_usage(self, params): + """ + Submits install, upgrade and delete actions to a usage server + + The usage information is currently displayed on the Package Control + community package list at http://wbond.net/sublime_packages/community + + :param params: + A dict of the information to submit + """ + + if not self.settings.get('submit_usage'): + return + params['package_control_version'] = \ + self.get_metadata('Package Control').get('version') + params['sublime_platform'] = self.settings.get('platform') + params['sublime_version'] = self.settings.get('version') + url = self.settings.get('submit_url') + '?' + urllib.urlencode(params) + + result = self.download_url(url, 'Error submitting usage information.') + if result == False: + return + + try: + result = json.loads(result) + if result['result'] != 'success': + raise ValueError() + except (ValueError): + print '%s: Error submitting usage information for %s' % (__name__, + params['package']) + + +class PackageCreator(): + """ + Abstract class for commands that create .sublime-package files + """ + + def show_panel(self): + """ + Shows a list of packages that can be turned into a .sublime-package file + """ + + self.manager = PackageManager() + self.packages = self.manager.list_packages() + if not self.packages: + sublime.error_message(('%s: There are no packages available to ' + + 'be packaged.') % (__name__)) + return + self.window.show_quick_panel(self.packages, self.on_done) + + def get_package_destination(self): + """ + Retrieves the destination for .sublime-package files + + :return: + A string - the path to the folder to save .sublime-package files in + """ + + destination = self.manager.settings.get('package_destination') + + # We check destination via an if statement instead of using + # the dict.get() method since the key may be set, but to a blank value + if not destination: + destination = os.path.join(os.path.expanduser('~'), 'Desktop') + + return destination + + +class CreatePackageCommand(sublime_plugin.WindowCommand, PackageCreator): + """ + Command to create a regular .sublime-package file + """ + + def run(self): + self.show_panel() + + def on_done(self, picked): + """ + Quick panel user selection handler - processes the user package + selection and create the package file + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + package_name = self.packages[picked] + package_destination = self.get_package_destination() + + if self.manager.create_package(package_name, package_destination): + self.window.run_command('open_dir', {"dir": + package_destination, "file": package_name + + '.sublime-package'}) + + +class CreateBinaryPackageCommand(sublime_plugin.WindowCommand, PackageCreator): + """ + Command to create a binary .sublime-package file. Binary packages in + general exclude the .py source files and instead include the .pyc files. + Actual included and excluded files are controlled by settings. + """ + + def run(self): + self.show_panel() + + def on_done(self, picked): + """ + Quick panel user selection handler - processes the user package + selection and create the package file + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + package_name = self.packages[picked] + package_destination = self.get_package_destination() + + if self.manager.create_package(package_name, package_destination, + binary_package=True): + self.window.run_command('open_dir', {"dir": + package_destination, "file": package_name + + '.sublime-package'}) + + +class PackageRenamer(): + """ + Class to handle renaming packages via the renamed_packages setting + gathered from channels and repositories. + """ + + def load_settings(self): + """ + Loads the list of installed packages from the + Package Control.sublime-settings file. + """ + + self.settings_file = '%s.sublime-settings' % __name__ + self.settings = sublime.load_settings(self.settings_file) + self.installed_packages = self.settings.get('installed_packages', []) + if not isinstance(self.installed_packages, list): + self.installed_packages = [] + + def rename_packages(self, installer): + """ + Renames any installed packages that the user has installed. + + :param installer: + An instance of :class:`PackageInstaller` + """ + + # Fetch the packages since that will pull in the renamed packages list + installer.manager.list_available_packages() + renamed_packages = installer.manager.settings.get('renamed_packages', {}) + if not renamed_packages: + renamed_packages = {} + + # These are packages that have been tracked as installed + installed_pkgs = self.installed_packages + # There are the packages actually present on the filesystem + present_packages = installer.manager.list_packages() + + # Rename directories for packages that have changed names + for package_name in renamed_packages: + package_dir = os.path.join(sublime.packages_path(), package_name) + metadata_path = os.path.join(package_dir, 'package-metadata.json') + if not os.path.exists(metadata_path): + continue + + new_package_name = renamed_packages[package_name] + new_package_dir = os.path.join(sublime.packages_path(), + new_package_name) + + changing_case = package_name.lower() == new_package_name.lower() + case_insensitive_fs = sublime.platform() in ['windows', 'osx'] + + # Since Windows and OSX use case-insensitive filesystems, we have to + # scan through the list of installed packages if the rename of the + # package is just changing the case of it. If we don't find the old + # name for it, we continue the loop since os.path.exists() will return + # true due to the case-insensitive nature of the filesystems. + if case_insensitive_fs and changing_case: + has_old = False + for present_package_name in present_packages: + if present_package_name == package_name: + has_old = True + break + if not has_old: + continue + + if not os.path.exists(new_package_dir) or (case_insensitive_fs and changing_case): + + # Windows will not allow you to rename to the same name with + # a different case, so we work around that with a temporary name + if os.name == 'nt' and changing_case: + temp_package_name = '__' + new_package_name + temp_package_dir = os.path.join(sublime.packages_path(), + temp_package_name) + os.rename(package_dir, temp_package_dir) + package_dir = temp_package_dir + + os.rename(package_dir, new_package_dir) + installed_pkgs.append(new_package_name) + + print '%s: Renamed %s to %s' % (__name__, package_name, + new_package_name) + + else: + installer.manager.remove_package(package_name) + print ('%s: Removed %s since package with new name (%s) ' + + 'already exists') % (__name__, package_name, + new_package_name) + + try: + installed_pkgs.remove(package_name) + except (ValueError): + pass + + sublime.set_timeout(lambda: self.save_packages(installed_pkgs), 10) + + def save_packages(self, installed_packages): + """ + Saves the list of installed packages (after having been appropriately + renamed) + + :param installed_packages: + The new list of installed packages + """ + + installed_packages = list(set(installed_packages)) + installed_packages = sorted(installed_packages, + key=lambda s: s.lower()) + + if installed_packages != self.installed_packages: + self.settings.set('installed_packages', installed_packages) + sublime.save_settings(self.settings_file) + + +class PackageInstaller(): + """ + Provides helper functionality related to installing packages + """ + + def __init__(self): + self.manager = PackageManager() + + def make_package_list(self, ignore_actions=[], override_action=None, + ignore_packages=[]): + """ + Creates a list of packages and what operation would be performed for + each. Allows filtering by the applicable action or package name. + Returns the information in a format suitable for displaying in the + quick panel. + + :param ignore_actions: + A list of actions to ignore packages by. Valid actions include: + `install`, `upgrade`, `downgrade`, `reinstall`, `overwrite`, + `pull` and `none`. `pull` andd `none` are for Git and Hg + repositories. `pull` is present when incoming changes are detected, + where as `none` is selected if no commits are available. `overwrite` + is for packages that do not include version information via the + `package-metadata.json` file. + + :param override_action: + A string action name to override the displayed action for all listed + packages. + + :param ignore_packages: + A list of packages names that should not be returned in the list + + :return: + A list of lists, each containing three strings: + 0 - package name + 1 - package description + 2 - action; [extra info;] package url + """ + + packages = self.manager.list_available_packages() + installed_packages = self.manager.list_packages() + + package_list = [] + for package in sorted(packages.iterkeys(), key=lambda s: s.lower()): + if ignore_packages and package in ignore_packages: + continue + package_entry = [package] + info = packages[package] + download = info['downloads'][0] + + if package in installed_packages: + installed = True + metadata = self.manager.get_metadata(package) + if metadata.get('version'): + installed_version = metadata['version'] + else: + installed_version = None + else: + installed = False + + installed_version_name = 'v' + installed_version if \ + installed and installed_version else 'unknown version' + new_version = 'v' + download['version'] + + vcs = None + package_dir = self.manager.get_package_dir(package) + settings = self.manager.settings + + if override_action: + action = override_action + extra = '' + + else: + if os.path.exists(os.path.join(sublime.packages_path(), + package, '.git')): + if settings.get('ignore_vcs_packages'): + continue + vcs = 'git' + incoming = GitUpgrader(settings.get('git_binary'), + settings.get('git_update_command'), package_dir, + settings.get('cache_length'), settings.get('debug') + ).incoming() + elif os.path.exists(os.path.join(sublime.packages_path(), + package, '.hg')): + if settings.get('ignore_vcs_packages'): + continue + vcs = 'hg' + incoming = HgUpgrader(settings.get('hg_binary'), + settings.get('hg_update_command'), package_dir, + settings.get('cache_length'), settings.get('debug') + ).incoming() + + if installed: + if not installed_version: + if vcs: + if incoming: + action = 'pull' + extra = ' with ' + vcs + else: + action = 'none' + extra = '' + else: + action = 'overwrite' + extra = ' %s with %s' % (installed_version_name, + new_version) + else: + res = self.manager.compare_versions( + installed_version, download['version']) + if res < 0: + action = 'upgrade' + extra = ' to %s from %s' % (new_version, + installed_version_name) + elif res > 0: + action = 'downgrade' + extra = ' to %s from %s' % (new_version, + installed_version_name) + else: + action = 'reinstall' + extra = ' %s' % new_version + else: + action = 'install' + extra = ' %s' % new_version + extra += ';' + + if action in ignore_actions: + continue + + description = info.get('description') + if not description: + description = 'No description provided' + package_entry.append(description) + package_entry.append(action + extra + ' ' + + re.sub('^https?://', '', info['url'])) + package_list.append(package_entry) + return package_list + + def disable_package(self, package): + """ + Disables a package before installing or upgrading to prevent errors + where Sublime Text tries to read files that no longer exist, or read a + half-written file. + + :param package: The string package name + """ + + # Don't disable Package Control so it does not get stuck disabled + if package == 'Package Control': + return False + + settings = sublime.load_settings(preferences_filename()) + ignored = settings.get('ignored_packages') + if not ignored: + ignored = [] + if not package in ignored: + ignored.append(package) + settings.set('ignored_packages', ignored) + sublime.save_settings(preferences_filename()) + return True + return False + + def reenable_package(self, package): + """ + Re-enables a package after it has been installed or upgraded + + :param package: The string package name + """ + + settings = sublime.load_settings(preferences_filename()) + ignored = settings.get('ignored_packages') + if not ignored: + return + if package in ignored: + settings.set('ignored_packages', + list(set(ignored) - set([package]))) + sublime.save_settings(preferences_filename()) + + def on_done(self, picked): + """ + Quick panel user selection handler - disables a package, installs or + upgrades it, then re-enables the package + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + name = self.package_list[picked][0] + + if self.disable_package(name): + on_complete = lambda: self.reenable_package(name) + else: + on_complete = None + + thread = PackageInstallerThread(self.manager, name, on_complete) + thread.start() + ThreadProgress(thread, 'Installing package %s' % name, + 'Package %s successfully %s' % (name, self.completion_type)) + + +class PackageInstallerThread(threading.Thread): + """ + A thread to run package install/upgrade operations in so that the main + Sublime Text thread does not get blocked and freeze the UI + """ + + def __init__(self, manager, package, on_complete): + """ + :param manager: + An instance of :class:`PackageManager` + + :param package: + The string package name to install/upgrade + + :param on_complete: + A callback to run after installing/upgrading the package + """ + + self.package = package + self.manager = manager + self.on_complete = on_complete + threading.Thread.__init__(self) + + def run(self): + try: + self.result = self.manager.install_package(self.package) + finally: + if self.on_complete: + sublime.set_timeout(self.on_complete, 1) + + +class InstallPackageCommand(sublime_plugin.WindowCommand): + """ + A command that presents the list of available packages and allows the + user to pick one to install. + """ + + def run(self): + thread = InstallPackageThread(self.window) + thread.start() + ThreadProgress(thread, 'Loading repositories', '') + + +class InstallPackageThread(threading.Thread, PackageInstaller): + """ + A thread to run the action of retrieving available packages in. Uses the + default PackageInstaller.on_done quick panel handler. + """ + + def __init__(self, window): + """ + :param window: + An instance of :class:`sublime.Window` that represents the Sublime + Text window to show the available package list in. + """ + + self.window = window + self.completion_type = 'installed' + threading.Thread.__init__(self) + PackageInstaller.__init__(self) + + def run(self): + self.package_list = self.make_package_list(['upgrade', 'downgrade', + 'reinstall', 'pull', 'none']) + + def show_quick_panel(): + if not self.package_list: + sublime.error_message(('%s: There are no packages ' + + 'available for installation.') % __name__) + return + self.window.show_quick_panel(self.package_list, self.on_done) + sublime.set_timeout(show_quick_panel, 10) + + +class DiscoverPackagesCommand(sublime_plugin.WindowCommand): + """ + A command that opens the community package list webpage + """ + + def run(self): + self.window.run_command('open_url', + {'url': 'http://wbond.net/sublime_packages/community'}) + + +class UpgradePackageCommand(sublime_plugin.WindowCommand): + """ + A command that presents the list of installed packages that can be upgraded. + """ + + def run(self): + package_renamer = PackageRenamer() + package_renamer.load_settings() + + thread = UpgradePackageThread(self.window, package_renamer) + thread.start() + ThreadProgress(thread, 'Loading repositories', '') + + +class UpgradePackageThread(threading.Thread, PackageInstaller): + """ + A thread to run the action of retrieving upgradable packages in. + """ + + def __init__(self, window, package_renamer): + """ + :param window: + An instance of :class:`sublime.Window` that represents the Sublime + Text window to show the list of upgradable packages in. + + :param package_renamer: + An instance of :class:`PackageRenamer` + """ + self.window = window + self.package_renamer = package_renamer + self.completion_type = 'upgraded' + threading.Thread.__init__(self) + PackageInstaller.__init__(self) + + def run(self): + self.package_renamer.rename_packages(self) + + self.package_list = self.make_package_list(['install', 'reinstall', + 'none']) + + def show_quick_panel(): + if not self.package_list: + sublime.error_message(('%s: There are no packages ' + + 'ready for upgrade.') % __name__) + return + self.window.show_quick_panel(self.package_list, self.on_done) + sublime.set_timeout(show_quick_panel, 10) + + def on_done(self, picked): + """ + Quick panel user selection handler - disables a package, upgrades it, + then re-enables the package + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + name = self.package_list[picked][0] + + if self.disable_package(name): + on_complete = lambda: self.reenable_package(name) + else: + on_complete = None + + thread = PackageInstallerThread(self.manager, name, on_complete) + thread.start() + ThreadProgress(thread, 'Upgrading package %s' % name, + 'Package %s successfully %s' % (name, self.completion_type)) + + +class UpgradeAllPackagesCommand(sublime_plugin.WindowCommand): + """ + A command to automatically upgrade all installed packages that are + upgradable. + """ + + def run(self): + package_renamer = PackageRenamer() + package_renamer.load_settings() + + thread = UpgradeAllPackagesThread(self.window, package_renamer) + thread.start() + ThreadProgress(thread, 'Loading repositories', '') + + +class UpgradeAllPackagesThread(threading.Thread, PackageInstaller): + """ + A thread to run the action of retrieving upgradable packages in. + """ + + def __init__(self, window, package_renamer): + self.window = window + self.package_renamer = package_renamer + self.completion_type = 'upgraded' + threading.Thread.__init__(self) + PackageInstaller.__init__(self) + + def run(self): + self.package_renamer.rename_packages(self) + package_list = self.make_package_list(['install', 'reinstall', 'none']) + + disabled_packages = {} + + def do_upgrades(): + # Pause so packages can be disabled + time.sleep(0.5) + + # We use a function to generate the on-complete lambda because if + # we don't, the lambda will bind to info at the current scope, and + # thus use the last value of info from the loop + def make_on_complete(name): + return lambda: self.reenable_package(name) + + for info in package_list: + if disabled_packages.get(info[0]): + on_complete = make_on_complete(info[0]) + else: + on_complete = None + thread = PackageInstallerThread(self.manager, info[0], on_complete) + thread.start() + ThreadProgress(thread, 'Upgrading package %s' % info[0], + 'Package %s successfully %s' % (info[0], self.completion_type)) + + # Disabling a package means changing settings, which can only be done + # in the main thread. We then create a new background thread so that + # the upgrade process does not block the UI. + def disable_packages(): + for info in package_list: + disabled_packages[info[0]] = self.disable_package(info[0]) + threading.Thread(target=do_upgrades).start() + + sublime.set_timeout(disable_packages, 1) + + +class ExistingPackagesCommand(): + """ + Allows listing installed packages and their current version + """ + + def __init__(self): + self.manager = PackageManager() + + def make_package_list(self, action=''): + """ + Returns a list of installed packages suitable for displaying in the + quick panel. + + :param action: + An action to display at the beginning of the third element of the + list returned for each package + + :return: + A list of lists, each containing three strings: + 0 - package name + 1 - package description + 2 - [action] installed version; package url + """ + + packages = self.manager.list_packages() + + if action: + action += ' ' + + package_list = [] + for package in sorted(packages, key=lambda s: s.lower()): + package_entry = [package] + metadata = self.manager.get_metadata(package) + package_dir = os.path.join(sublime.packages_path(), package) + + description = metadata.get('description') + if not description: + description = 'No description provided' + package_entry.append(description) + + version = metadata.get('version') + if not version and os.path.exists(os.path.join(package_dir, + '.git')): + installed_version = 'git repository' + elif not version and os.path.exists(os.path.join(package_dir, + '.hg')): + installed_version = 'hg repository' + else: + installed_version = 'v' + version if version else \ + 'unknown version' + + url = metadata.get('url') + if url: + url = '; ' + re.sub('^https?://', '', url) + else: + url = '' + + package_entry.append(action + installed_version + url) + package_list.append(package_entry) + + return package_list + + +class ListPackagesCommand(sublime_plugin.WindowCommand): + """ + A command that shows a list of all installed packages in the quick panel + """ + + def run(self): + ListPackagesThread(self.window).start() + + +class ListPackagesThread(threading.Thread, ExistingPackagesCommand): + """ + A thread to prevent the listing of existing packages from freezing the UI + """ + + def __init__(self, window): + """ + :param window: + An instance of :class:`sublime.Window` that represents the Sublime + Text window to show the list of installed packages in. + """ + + self.window = window + threading.Thread.__init__(self) + ExistingPackagesCommand.__init__(self) + + def run(self): + self.package_list = self.make_package_list() + + def show_quick_panel(): + if not self.package_list: + sublime.error_message(('%s: There are no packages ' + + 'to list.') % __name__) + return + self.window.show_quick_panel(self.package_list, self.on_done) + sublime.set_timeout(show_quick_panel, 10) + + def on_done(self, picked): + """ + Quick panel user selection handler - opens the homepage for any + selected package in the user's browser + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + package_name = self.package_list[picked][0] + + def open_dir(): + self.window.run_command('open_dir', + {"dir": os.path.join(sublime.packages_path(), package_name)}) + sublime.set_timeout(open_dir, 10) + + +class RemovePackageCommand(sublime_plugin.WindowCommand, + ExistingPackagesCommand): + """ + A command that presents a list of installed packages, allowing the user to + select one to remove + """ + + def __init__(self, window): + """ + :param window: + An instance of :class:`sublime.Window` that represents the Sublime + Text window to show the list of installed packages in. + """ + + self.window = window + ExistingPackagesCommand.__init__(self) + + def run(self): + self.package_list = self.make_package_list('remove') + if not self.package_list: + sublime.error_message(('%s: There are no packages ' + + 'that can be removed.') % __name__) + return + self.window.show_quick_panel(self.package_list, self.on_done) + + def on_done(self, picked): + """ + Quick panel user selection handler - deletes the selected package + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + package = self.package_list[picked][0] + + # Don't disable Package Control so it does not get stuck disabled + if package != 'Package Control': + settings = sublime.load_settings(preferences_filename()) + ignored = settings.get('ignored_packages') + if not ignored: + ignored = [] + if not package in ignored: + ignored.append(package) + settings.set('ignored_packages', ignored) + sublime.save_settings(preferences_filename()) + + ignored.remove(package) + thread = RemovePackageThread(self.manager, package, + ignored) + thread.start() + ThreadProgress(thread, 'Removing package %s' % package, + 'Package %s successfully removed' % package) + + +class RemovePackageThread(threading.Thread): + """ + A thread to run the remove package operation in so that the Sublime Text + UI does not become frozen + """ + + def __init__(self, manager, package, ignored): + self.manager = manager + self.package = package + self.ignored = ignored + threading.Thread.__init__(self) + + def run(self): + self.result = self.manager.remove_package(self.package) + + def unignore_package(): + settings = sublime.load_settings(preferences_filename()) + settings.set('ignored_packages', self.ignored) + sublime.save_settings(preferences_filename()) + sublime.set_timeout(unignore_package, 10) + + +class AddRepositoryChannelCommand(sublime_plugin.WindowCommand): + """ + A command to add a new channel (list of repositories) to the user's machine + """ + + def run(self): + self.window.show_input_panel('Channel JSON URL', '', + self.on_done, self.on_change, self.on_cancel) + + def on_done(self, input): + """ + Input panel handler - adds the provided URL as a channel + + :param input: + A string of the URL to the new channel + """ + + settings = sublime.load_settings('%s.sublime-settings' % __name__) + repository_channels = settings.get('repository_channels', []) + if not repository_channels: + repository_channels = [] + repository_channels.append(input) + settings.set('repository_channels', repository_channels) + sublime.save_settings('%s.sublime-settings' % __name__) + sublime.status_message(('Channel %s successfully ' + + 'added') % input) + + def on_change(self, input): + pass + + def on_cancel(self): + pass + + +class AddRepositoryCommand(sublime_plugin.WindowCommand): + """ + A command to add a new repository to the user's machine + """ + + def run(self): + self.window.show_input_panel('GitHub or BitBucket Web URL, or Custom' + + ' JSON Repository URL', '', self.on_done, + self.on_change, self.on_cancel) + + def on_done(self, input): + """ + Input panel handler - adds the provided URL as a repository + + :param input: + A string of the URL to the new repository + """ + + settings = sublime.load_settings('%s.sublime-settings' % __name__) + repositories = settings.get('repositories', []) + if not repositories: + repositories = [] + repositories.append(input) + settings.set('repositories', repositories) + sublime.save_settings('%s.sublime-settings' % __name__) + sublime.status_message('Repository %s successfully added' % input) + + def on_change(self, input): + pass + + def on_cancel(self): + pass + + +class DisablePackageCommand(sublime_plugin.WindowCommand): + """ + A command that adds a package to Sublime Text's ignored packages list + """ + + def run(self): + manager = PackageManager() + packages = manager.list_all_packages() + self.settings = sublime.load_settings(preferences_filename()) + ignored = self.settings.get('ignored_packages') + if not ignored: + ignored = [] + self.package_list = list(set(packages) - set(ignored)) + self.package_list.sort() + if not self.package_list: + sublime.error_message(('%s: There are no enabled packages' + + 'to disable.') % __name__) + return + self.window.show_quick_panel(self.package_list, self.on_done) + + def on_done(self, picked): + """ + Quick panel user selection handler - disables the selected package + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + package = self.package_list[picked] + ignored = self.settings.get('ignored_packages') + if not ignored: + ignored = [] + ignored.append(package) + self.settings.set('ignored_packages', ignored) + sublime.save_settings(preferences_filename()) + sublime.status_message(('Package %s successfully added to list of ' + + 'disabled packages - restarting Sublime Text may be required') % + package) + + +class EnablePackageCommand(sublime_plugin.WindowCommand): + """ + A command that removes a package from Sublime Text's ignored packages list + """ + + def run(self): + self.settings = sublime.load_settings(preferences_filename()) + self.disabled_packages = self.settings.get('ignored_packages') + self.disabled_packages.sort() + if not self.disabled_packages: + sublime.error_message(('%s: There are no disabled packages ' + + 'to enable.') % __name__) + return + self.window.show_quick_panel(self.disabled_packages, self.on_done) + + def on_done(self, picked): + """ + Quick panel user selection handler - enables the selected package + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + package = self.disabled_packages[picked] + ignored = self.settings.get('ignored_packages') + self.settings.set('ignored_packages', + list(set(ignored) - set([package]))) + sublime.save_settings(preferences_filename()) + sublime.status_message(('Package %s successfully removed from list ' + + 'of disabled packages - restarting Sublime Text may be required') % + package) + + +class AutomaticUpgrader(threading.Thread): + """ + Automatically checks for updated packages and installs them. controlled + by the `auto_upgrade`, `auto_upgrade_ignore`, `auto_upgrade_frequency` and + `auto_upgrade_last_run` settings. + """ + + def __init__(self, found_packages): + """ + :param found_packages: + A list of package names for the packages that were found to be + installed on the machine. + """ + + self.installer = PackageInstaller() + self.manager = self.installer.manager + + self.load_settings() + + self.package_renamer = PackageRenamer() + self.package_renamer.load_settings() + + self.auto_upgrade = self.settings.get('auto_upgrade') + self.auto_upgrade_ignore = self.settings.get('auto_upgrade_ignore') + + self.next_run = int(time.time()) + self.last_run = None + last_run_file = os.path.join(sublime.packages_path(), 'User', + 'Package Control.last-run') + + if os.path.isfile(last_run_file): + with open(last_run_file) as fobj: + try: + self.last_run = int(fobj.read()) + except ValueError: + pass + + frequency = self.settings.get('auto_upgrade_frequency') + if frequency: + if self.last_run: + self.next_run = int(self.last_run) + (frequency * 60 * 60) + else: + self.next_run = time.time() + + # Detect if a package is missing that should be installed + self.missing_packages = list(set(self.installed_packages) - + set(found_packages)) + + if self.auto_upgrade and self.next_run <= time.time(): + with open(last_run_file, 'w') as fobj: + fobj.write(str(int(time.time()))) + + threading.Thread.__init__(self) + + def load_settings(self): + """ + Loads the list of installed packages from the + Package Control.sublime-settings file + """ + + self.settings_file = '%s.sublime-settings' % __name__ + self.settings = sublime.load_settings(self.settings_file) + self.installed_packages = self.settings.get('installed_packages', []) + self.should_install_missing = self.settings.get('install_missing') + if not isinstance(self.installed_packages, list): + self.installed_packages = [] + + def run(self): + self.install_missing() + + if self.next_run > time.time(): + self.print_skip() + return + + self.upgrade_packages() + + def install_missing(self): + """ + Installs all packages that were listed in the list of + `installed_packages` from Package Control.sublime-settings but were not + found on the filesystem and passed as `found_packages`. + """ + + if not self.missing_packages or not self.should_install_missing: + return + + print '%s: Installing %s missing packages' % \ + (__name__, len(self.missing_packages)) + for package in self.missing_packages: + if self.installer.manager.install_package(package): + print '%s: Installed missing package %s' % \ + (__name__, package) + + def print_skip(self): + """ + Prints a notice in the console if the automatic upgrade is skipped + due to already having been run in the last `auto_upgrade_frequency` + hours. + """ + + last_run = datetime.datetime.fromtimestamp(self.last_run) + next_run = datetime.datetime.fromtimestamp(self.next_run) + date_format = '%Y-%m-%d %H:%M:%S' + print ('%s: Skipping automatic upgrade, last run at ' + + '%s, next run at %s or after') % (__name__, + last_run.strftime(date_format), next_run.strftime(date_format)) + + def upgrade_packages(self): + """ + Upgrades all packages that are not currently upgraded to the lastest + version. Also renames any installed packages to their new names. + """ + + if not self.auto_upgrade: + return + + self.package_renamer.rename_packages(self.installer) + + packages = self.installer.make_package_list(['install', + 'reinstall', 'downgrade', 'overwrite', 'none'], + ignore_packages=self.auto_upgrade_ignore) + + # If Package Control is being upgraded, just do that and restart + for package in packages: + if package[0] != __name__: + continue + + def reset_last_run(): + settings = sublime.load_settings(self.settings_file) + settings.set('auto_upgrade_last_run', None) + sublime.save_settings(self.settings_file) + sublime.set_timeout(reset_last_run, 1) + packages = [package] + break + + if not packages: + print '%s: No updated packages' % __name__ + return + + print '%s: Installing %s upgrades' % (__name__, len(packages)) + for package in packages: + self.installer.manager.install_package(package[0]) + version = re.sub('^.*?(v[\d\.]+).*?$', '\\1', package[2]) + if version == package[2] and version.find('pull with') != -1: + vcs = re.sub('^pull with (\w+).*?$', '\\1', version) + version = 'latest %s commit' % vcs + print '%s: Upgraded %s to %s' % (__name__, package[0], version) + + +class PackageCleanup(threading.Thread, PackageRenamer): + """ + Cleans up folders for packages that were removed, but that still have files + in use. + """ + + def __init__(self): + self.manager = PackageManager() + self.load_settings() + threading.Thread.__init__(self) + + def run(self): + found_pkgs = [] + installed_pkgs = self.installed_packages + for package_name in os.listdir(sublime.packages_path()): + package_dir = os.path.join(sublime.packages_path(), package_name) + metadata_path = os.path.join(package_dir, 'package-metadata.json') + + # Cleanup packages that could not be removed due to in-use files + cleanup_file = os.path.join(package_dir, 'package-control.cleanup') + if os.path.exists(cleanup_file): + try: + shutil.rmtree(package_dir) + print '%s: Removed old directory for package %s' % \ + (__name__, package_name) + except (OSError) as (e): + if not os.path.exists(cleanup_file): + open(cleanup_file, 'w').close() + print ('%s: Unable to remove old directory for package ' + + '%s - deferring until next start: %s') % (__name__, + package_name, unicode_from_os(e)) + + # Finish reinstalling packages that could not be upgraded due to + # in-use files + reinstall = os.path.join(package_dir, 'package-control.reinstall') + if os.path.exists(reinstall): + if not clear_directory(package_dir, [metadata_path]): + if not os.path.exists(reinstall): + open(reinstall, 'w').close() + # Assigning this here prevents the callback from referencing the value + # of the "package_name" variable when it is executed + restart_message = ('%s: An error occurred while trying to ' + + 'finish the upgrade of %s. You will most likely need to ' + + 'restart your computer to complete the upgrade.') % ( + __name__, package_name) + def show_still_locked(): + sublime.error_message(restart_message) + sublime.set_timeout(show_still_locked, 10) + else: + self.manager.install_package(package_name) + + # This adds previously installed packages from old versions of PC + if os.path.exists(metadata_path) and \ + package_name not in self.installed_packages: + installed_pkgs.append(package_name) + params = { + 'package': package_name, + 'operation': 'install', + 'version': \ + self.manager.get_metadata(package_name).get('version') + } + self.manager.record_usage(params) + + found_pkgs.append(package_name) + + sublime.set_timeout(lambda: self.finish(installed_pkgs, found_pkgs), 10) + + def finish(self, installed_pkgs, found_pkgs): + """ + A callback that can be run the main UI thread to perform saving of the + Package Control.sublime-settings file. Also fires off the + :class:`AutomaticUpgrader`. + + :param installed_pkgs: + A list of the string package names of all "installed" packages, + even ones that do not appear to be in the filesystem. + + :param found_pkgs: + A list of the string package names of all packages that are + currently installed on the filesystem. + """ + + self.save_packages(installed_pkgs) + AutomaticUpgrader(found_pkgs).start() + + +# Start shortly after Sublime starts so package renames don't cause errors +# with keybindings, settings, etc disappearing in the middle of parsing +sublime.set_timeout(lambda: PackageCleanup().start(), 2000) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.sublime-settings new file mode 100644 index 0000000..2726c3f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.sublime-settings @@ -0,0 +1,138 @@ +{ + // A list of URLs that each contain a JSON file with a list of repositories. + // The repositories from these channels are placed in order after the + // repositories from the "repositories" setting + "repository_channels": [ + "https://sublime.wbond.net/repositories.json" + ], + + // A list of URLs that contain a packages JSON file. These repositories + // are placed in order before repositories from the "repository_channels" + // setting + "repositories": [], + + // A list of CA certs needed for domains. The default channel provides a + // list of domains and an identifier (the md5 hash) for the CA cert(s) + // necessary for each. + // + // If a custom cert is required for a proxy or for an alternate channel + // or repository domain name, it should be added in one of the two forms: + // + // "*": ["my_identifier", "https://example.com/url/of/cert_file"] + // "*": ["my_identifier_2", "/absolute/filesystem/path/to/cert_file"] + // + // In both cases the literal "*" means the cert will be checked to ensure + // it is present for accessing any URL. This is necessary for proxy + // connections, but also useful if you want to provide you own + // ca-bundle.crt file. + // + // The "my_identifier" and "my_identifier_2" can be any unique string + // that Package Control can use as a filename, and ensures that it has + // merged the cert file with the ca-bundle.crt file in the certs/ directory + // since that is what is passed to the downloaders. + "certs": { + "api.bitbucket.org": ["d867a7b2aecc46f9c31afc4f2f50de05", ""], + "api.github.com": ["1c5282418e2cb4989cd6beddcdbab0b5", ""], + "bitbucket.org": ["897abe0b41fd2f64e9e2e351cbc36d76", ""], + "nodeload.github.com": ["1c5282418e2cb4989cd6beddcdbab0b5", ""], + "raw.github.com": ["1c5282418e2cb4989cd6beddcdbab0b5", ""], + "sublime.wbond.net": ["7f4f8622b4fd001c7f648e09aae7edaa", ""] + }, + + // If debugging information for HTTP/HTTPS connections should be printed + // to the Sublime Text console + "debug": false, + + // This helps solve naming issues where a repository it not named the + // same as the package should be. This is primarily only useful for + // GitHub and BitBucket repositories. This mapping will override the + // mapping that is retrieved from the repository channels. + "package_name_map": {}, + + // If package install, upgrade and removal info should be submitted to + // the channel for aggregated statistics + "submit_usage": true, + + // The URL to post install, upgrade and removal notices to + "submit_url": "https://sublime.wbond.net/submit", + + // If packages should be automatically upgraded when ST2 starts + "auto_upgrade": true, + + // If missing packages should be automatically installed when ST2 starts + "install_missing": true, + + // The minimum frequency in hours in which to check for automatic upgrades, + // setting this to 0 will always check for automatic upgrades + "auto_upgrade_frequency": 1, + + // Packages to not auto upgrade + "auto_upgrade_ignore": [], + + // Timeout for downloading channels, repositories and packages + "timeout": 30, + + // The number of seconds to cache repository and package info for + "cache_length": 300, + + // An HTTP proxy server to use for requests + "http_proxy": "", + // An HTTPS proxy server to use for requests - this will inherit from + // http_proxy if it is set to "" or null and http_proxy has a value. You + // can set this to false to prevent inheriting from http_proxy. + "https_proxy": "", + + // Username and password for both http_proxy and https_proxy + "proxy_username": "", + "proxy_password": "", + + // User agent for HTTP requests + "user_agent": "Sublime Package Control", + + // Setting this to true will cause Package Control to ignore all git + // and hg repositories - this may help if trying to list packages to install + // hangs + "ignore_vcs_packages": false, + + // Custom paths to VCS binaries for when they can't be automatically + // found on the system and a package includes a VCS metadata directory + "git_binary": "", + "git_update_command": ["pull", "origin", "master", "--ff", "--commit"], + + "hg_binary": "", + + // Be sure to keep the remote name as the last argument + "hg_update_command": ["pull", "--update", "default"], + + // Directories to ignore when creating a package + "dirs_to_ignore": [ + ".hg", ".git", ".svn", "_darcs", "CVS" + ], + + // Files to ignore when creating a package + "files_to_ignore": [ + ".hgignore", ".gitignore", ".bzrignore", "*.pyc", "*.sublime-project", + "*.sublime-workspace", "*.tmTheme.cache" + ], + + // Files to include, even if they match a pattern in files_to_ignore + "files_to_include": [], + + // Files to ignore when creating a binary package. By default binary + // packages ship with .pyc files instead of .py files. If an __init__.py + // file exists, it will always be included, even if it matches one of + // these patterns. + "files_to_ignore_binary": [ + ".hgignore", ".gitignore", ".bzrignore", "*.py", "*.sublime-project", + "*.sublime-workspace", "*.tmTheme.cache" + ], + + // Files to include for a binary package, even if they match a pattern i + // files_to_ignore_binary + "files_to_include_binary": [ + "__init__.py" + ], + + // When a package is created, copy it to this folder - defaults to Desktop + "package_destination": "" +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/1c5282418e2cb4989cd6beddcdbab0b5 b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/1c5282418e2cb4989cd6beddcdbab0b5 new file mode 100644 index 0000000..432b087 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/1c5282418e2cb4989cd6beddcdbab0b5 @@ -0,0 +1,113 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 0a:5f:11:4d:03:5b:17:91:17:d2:ef:d4:03:8c:3f:3b + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Validity + Not Before: Apr 2 12:00:00 2008 GMT + Not After : Apr 3 00:00:00 2022 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance CA-3 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:bf:61:0a:29:10:1f:5e:fe:34:37:51:08:f8:1e: + fb:22:ed:61:be:0b:0d:70:4c:50:63:26:75:15:b9: + 41:88:97:b6:f0:a0:15:bb:08:60:e0:42:e8:05:29: + 10:87:36:8a:28:65:a8:ef:31:07:74:6d:36:97:2f: + 28:46:66:04:c7:2a:79:26:7a:99:d5:8e:c3:6d:4f: + a0:5e:ad:bc:3d:91:c2:59:7b:5e:36:6c:c0:53:cf: + 00:08:32:3e:10:64:58:10:13:69:c7:0c:ee:9c:42: + 51:00:f9:05:44:ee:24:ce:7a:1f:ed:8c:11:bd:12: + a8:f3:15:f4:1c:7a:31:69:01:1b:a7:e6:5d:c0:9a: + 6c:7e:09:9e:e7:52:44:4a:10:3a:23:e4:9b:b6:03: + af:a8:9c:b4:5b:9f:d4:4b:ad:92:8c:ce:b5:11:2a: + aa:37:18:8d:b4:c2:b8:d8:5c:06:8c:f8:ff:23:bd: + 35:5e:d4:7c:3e:7e:83:0e:91:96:05:98:c3:b2:1f: + e3:c8:65:eb:a9:7b:5d:a0:2c:cc:fc:3c:d9:6d:ed: + cc:fa:4b:43:8c:c9:d4:b8:a5:61:1c:b2:40:b6:28: + 12:df:b9:f8:5f:fe:d3:b2:c9:ef:3d:b4:1e:4b:7c: + 1c:4c:99:36:9e:3d:eb:ec:a7:68:5e:1d:df:67:6e: + 5e:fb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Certificate Policies: + Policy: 2.16.840.1.114412.1.3.0.2 + CPS: http://www.digicert.com/ssl-cps-repository.htm + User Notice: + Explicit Text: + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Authority Information Access: + OCSP - URI:http://ocsp.digicert.com + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + Full Name: + URI:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + X509v3 Authority Key Identifier: + keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + + X509v3 Subject Key Identifier: + 50:EA:73:89:DB:29:FB:10:8F:9E:E5:01:20:D4:DE:79:99:48:83:F7 + Signature Algorithm: sha1WithRSAEncryption + 1e:e2:a5:48:9e:6c:db:53:38:0f:ef:a6:1a:2a:ac:e2:03:43: + ed:9a:bc:3e:8e:75:1b:f0:fd:2e:22:59:ac:13:c0:61:e2:e7: + fa:e9:99:cd:87:09:75:54:28:bf:46:60:dc:be:51:2c:92:f3: + 1b:91:7c:31:08:70:e2:37:b9:c1:5b:a8:bd:a3:0b:00:fb:1a: + 15:fd:03:ad:58:6a:c5:c7:24:99:48:47:46:31:1e:92:ef:b4: + 5f:4e:34:c7:90:bf:31:c1:f8:b1:84:86:d0:9c:01:aa:df:8a: + 56:06:ce:3a:e9:0e:ae:97:74:5d:d7:71:9a:42:74:5f:de:8d: + 43:7c:de:e9:55:ed:69:00:cb:05:e0:7a:61:61:33:d1:19:4d: + f9:08:ee:a0:39:c5:25:35:b7:2b:c4:0f:b2:dd:f1:a5:b7:0e: + 24:c4:26:28:8d:79:77:f5:2f:f0:57:ba:7c:07:d4:e1:fc:cd: + 5a:30:57:7e:86:10:47:dd:31:1f:d7:fc:a2:c2:bf:30:7c:5d: + 24:aa:e8:f9:ae:5f:6a:74:c2:ce:6b:b3:46:d8:21:be:29:d4: + 8e:5e:15:d6:42:4a:e7:32:6f:a4:b1:6b:51:83:58:be:3f:6d: + c7:fb:da:03:21:cb:6a:16:19:4e:0a:f0:ad:84:ca:5d:94:b3: + 5a:76:f7:61 +-----BEGIN CERTIFICATE----- +MIIGWDCCBUCgAwIBAgIQCl8RTQNbF5EX0u/UA4w/OzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA4MDQwMjEyMDAwMFoXDTIyMDQwMzAwMDAwMFowZjEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTElMCMGA1UEAxMcRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +Q0EtMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9hCikQH17+NDdR +CPge+yLtYb4LDXBMUGMmdRW5QYiXtvCgFbsIYOBC6AUpEIc2iihlqO8xB3RtNpcv +KEZmBMcqeSZ6mdWOw21PoF6tvD2Rwll7XjZswFPPAAgyPhBkWBATaccM7pxCUQD5 +BUTuJM56H+2MEb0SqPMV9Bx6MWkBG6fmXcCabH4JnudSREoQOiPkm7YDr6ictFuf +1EutkozOtREqqjcYjbTCuNhcBoz4/yO9NV7UfD5+gw6RlgWYw7If48hl66l7XaAs +zPw82W3tzPpLQ4zJ1LilYRyyQLYoEt+5+F/+07LJ7z20Hkt8HEyZNp496+ynaF4d +32duXvsCAwEAAaOCAvowggL2MA4GA1UdDwEB/wQEAwIBhjCCAcYGA1UdIASCAb0w +ggG5MIIBtQYLYIZIAYb9bAEDAAIwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3 +LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUH +AgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQBy +AHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBj +AGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAg +AEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQ +AGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBt +AGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBj +AG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBl +AHIAZQBuAGMAZQAuMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYIKwYBBQUHAQEEKDAm +MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wgY8GA1UdHwSB +hzCBhDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGln +aEFzc3VyYW5jZUVWUm9vdENBLmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNl +cnQuY29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDAfBgNVHSME +GDAWgBSxPsNpA/i/RwHUmCYaCALvY2QrwzAdBgNVHQ4EFgQUUOpzidsp+xCPnuUB +INTeeZlIg/cwDQYJKoZIhvcNAQEFBQADggEBAB7ipUiebNtTOA/vphoqrOIDQ+2a +vD6OdRvw/S4iWawTwGHi5/rpmc2HCXVUKL9GYNy+USyS8xuRfDEIcOI3ucFbqL2j +CwD7GhX9A61YasXHJJlIR0YxHpLvtF9ONMeQvzHB+LGEhtCcAarfilYGzjrpDq6X +dF3XcZpCdF/ejUN83ulV7WkAywXgemFhM9EZTfkI7qA5xSU1tyvED7Ld8aW3DiTE +JiiNeXf1L/BXunwH1OH8zVowV36GEEfdMR/X/KLCvzB8XSSq6PmuX2p0ws5rs0bY +Ib4p1I5eFdZCSucyb6Sxa1GDWL4/bcf72gMhy2oWGU4K8K2Eyl2Us1p292E= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/7f4f8622b4fd001c7f648e09aae7edaa b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/7f4f8622b4fd001c7f648e09aae7edaa new file mode 100644 index 0000000..cb680c1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/7f4f8622b4fd001c7f648e09aae7edaa @@ -0,0 +1,165 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 145105 (0x236d1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA + Validity + Not Before: Feb 19 22:45:05 2010 GMT + Not After : Feb 18 22:45:05 2020 GMT + Subject: C=US, O=GeoTrust, Inc., CN=RapidSSL CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:c7:71:f8:56:c7:1e:d9:cc:b5:ad:f6:b4:97:a3: + fb:a1:e6:0b:50:5f:50:aa:3a:da:0f:fc:3d:29:24: + 43:c6:10:29:c1:fc:55:40:72:ee:bd:ea:df:9f:b6: + 41:f4:48:4b:c8:6e:fe:4f:57:12:8b:5b:fa:92:dd: + 5e:e8:ad:f3:f0:1b:b1:7b:4d:fb:cf:fd:d1:e5:f8: + e3:dc:e7:f5:73:7f:df:01:49:cf:8c:56:c1:bd:37: + e3:5b:be:b5:4f:8b:8b:f0:da:4f:c7:e3:dd:55:47: + 69:df:f2:5b:7b:07:4f:3d:e5:ac:21:c1:c8:1d:7a: + e8:e7:f6:0f:a1:aa:f5:6f:de:a8:65:4f:10:89:9c: + 03:f3:89:7a:a5:5e:01:72:33:ed:a9:e9:5a:1e:79: + f3:87:c8:df:c8:c5:fc:37:c8:9a:9a:d7:b8:76:cc: + b0:3e:e7:fd:e6:54:ea:df:5f:52:41:78:59:57:ad: + f1:12:d6:7f:bc:d5:9f:70:d3:05:6c:fa:a3:7d:67: + 58:dd:26:62:1d:31:92:0c:79:79:1c:8e:cf:ca:7b: + c1:66:af:a8:74:48:fb:8e:82:c2:9e:2c:99:5c:7b: + 2d:5d:9b:bc:5b:57:9e:7c:3a:7a:13:ad:f2:a3:18: + 5b:2b:59:0f:cd:5c:3a:eb:68:33:c6:28:1d:82:d1: + 50:8b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 6B:69:3D:6A:18:42:4A:DD:8F:02:65:39:FD:35:24:86:78:91:16:30 + X509v3 Authority Key Identifier: + keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 CRL Distribution Points: + URI:http://crl.geotrust.com/crls/gtglobal.crl + + Authority Information Access: + OCSP - URI:http://ocsp.geotrust.com + + Signature Algorithm: sha1WithRSAEncryption + ab:bc:bc:0a:5d:18:94:e3:c1:b1:c3:a8:4c:55:d6:be:b4:98: + f1:ee:3c:1c:cd:cf:f3:24:24:5c:96:03:27:58:fc:36:ae:a2: + 2f:8f:f1:fe:da:2b:02:c3:33:bd:c8:dd:48:22:2b:60:0f:a5: + 03:10:fd:77:f8:d0:ed:96:67:4f:fd:ea:47:20:70:54:dc:a9: + 0c:55:7e:e1:96:25:8a:d9:b5:da:57:4a:be:8d:8e:49:43:63: + a5:6c:4e:27:87:25:eb:5b:6d:fe:a2:7f:38:28:e0:36:ab:ad: + 39:a5:a5:62:c4:b7:5c:58:2c:aa:5d:01:60:a6:62:67:a3:c0: + c7:62:23:f4:e7:6c:46:ee:b5:d3:80:6a:22:13:d2:2d:3f:74: + 4f:ea:af:8c:5f:b4:38:9c:db:ae:ce:af:84:1e:a6:f6:34:51: + 59:79:d3:e3:75:dc:bc:d7:f3:73:df:92:ec:d2:20:59:6f:9c: + fb:95:f8:92:76:18:0a:7c:0f:2c:a6:ca:de:8a:62:7b:d8:f3: + ce:5f:68:bd:8f:3e:c1:74:bb:15:72:3a:16:83:a9:0b:e6:4d: + 99:9c:d8:57:ec:a8:01:51:c7:6f:57:34:5e:ab:4a:2c:42:f6: + 4f:1c:89:78:de:26:4e:f5:6f:93:4c:15:6b:27:56:4d:00:54: + 6c:7a:b7:b7 +-----BEGIN CERTIFICATE----- +MIID1TCCAr2gAwIBAgIDAjbRMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMTAwMjE5MjI0NTA1WhcNMjAwMjE4MjI0NTA1WjA8MQswCQYDVQQG +EwJVUzEXMBUGA1UEChMOR2VvVHJ1c3QsIEluYy4xFDASBgNVBAMTC1JhcGlkU1NM +IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx3H4Vsce2cy1rfa0 +l6P7oeYLUF9QqjraD/w9KSRDxhApwfxVQHLuverfn7ZB9EhLyG7+T1cSi1v6kt1e +6K3z8Buxe037z/3R5fjj3Of1c3/fAUnPjFbBvTfjW761T4uL8NpPx+PdVUdp3/Jb +ewdPPeWsIcHIHXro5/YPoar1b96oZU8QiZwD84l6pV4BcjPtqelaHnnzh8jfyMX8 +N8iamte4dsywPuf95lTq319SQXhZV63xEtZ/vNWfcNMFbPqjfWdY3SZiHTGSDHl5 +HI7PynvBZq+odEj7joLCniyZXHstXZu8W1eefDp6E63yoxhbK1kPzVw662gzxigd +gtFQiwIDAQABo4HZMIHWMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUa2k9ahhC +St2PAmU5/TUkhniRFjAwHwYDVR0jBBgwFoAUwHqYaI2J+6sFZAwRfap9ZbjKzE4w +EgYDVR0TAQH/BAgwBgEB/wIBADA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8vY3Js +Lmdlb3RydXN0LmNvbS9jcmxzL2d0Z2xvYmFsLmNybDA0BggrBgEFBQcBAQQoMCYw +JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmdlb3RydXN0LmNvbTANBgkqhkiG9w0B +AQUFAAOCAQEAq7y8Cl0YlOPBscOoTFXWvrSY8e48HM3P8yQkXJYDJ1j8Nq6iL4/x +/torAsMzvcjdSCIrYA+lAxD9d/jQ7ZZnT/3qRyBwVNypDFV+4ZYlitm12ldKvo2O +SUNjpWxOJ4cl61tt/qJ/OCjgNqutOaWlYsS3XFgsql0BYKZiZ6PAx2Ij9OdsRu61 +04BqIhPSLT90T+qvjF+0OJzbrs6vhB6m9jRRWXnT43XcvNfzc9+S7NIgWW+c+5X4 +knYYCnwPLKbK3opie9jzzl9ovY8+wXS7FXI6FoOpC+ZNmZzYV+yoAVHHb1c0XqtK +LEL2TxyJeN4mTvVvk0wVaydWTQBUbHq3tw== +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 144470 (0x23456) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA + Validity + Not Before: May 21 04:00:00 2002 GMT + Not After : May 21 04:00:00 2022 GMT + Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:da:cc:18:63:30:fd:f4:17:23:1a:56:7e:5b:df: + 3c:6c:38:e4:71:b7:78:91:d4:bc:a1:d8:4c:f8:a8: + 43:b6:03:e9:4d:21:07:08:88:da:58:2f:66:39:29: + bd:05:78:8b:9d:38:e8:05:b7:6a:7e:71:a4:e6:c4: + 60:a6:b0:ef:80:e4:89:28:0f:9e:25:d6:ed:83:f3: + ad:a6:91:c7:98:c9:42:18:35:14:9d:ad:98:46:92: + 2e:4f:ca:f1:87:43:c1:16:95:57:2d:50:ef:89:2d: + 80:7a:57:ad:f2:ee:5f:6b:d2:00:8d:b9:14:f8:14: + 15:35:d9:c0:46:a3:7b:72:c8:91:bf:c9:55:2b:cd: + d0:97:3e:9c:26:64:cc:df:ce:83:19:71:ca:4e:e6: + d4:d5:7b:a9:19:cd:55:de:c8:ec:d2:5e:38:53:e5: + 5c:4f:8c:2d:fe:50:23:36:fc:66:e6:cb:8e:a4:39: + 19:00:b7:95:02:39:91:0b:0e:fe:38:2e:d1:1d:05: + 9a:f6:4d:3e:6f:0f:07:1d:af:2c:1e:8f:60:39:e2: + fa:36:53:13:39:d4:5e:26:2b:db:3d:a8:14:bd:32: + eb:18:03:28:52:04:71:e5:ab:33:3d:e1:38:bb:07: + 36:84:62:9c:79:ea:16:30:f4:5f:c0:2b:e8:71:6b: + e4:f9 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E + X509v3 Authority Key Identifier: + keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E + + Signature Algorithm: sha1WithRSAEncryption + 35:e3:29:6a:e5:2f:5d:54:8e:29:50:94:9f:99:1a:14:e4:8f: + 78:2a:62:94:a2:27:67:9e:d0:cf:1a:5e:47:e9:c1:b2:a4:cf: + dd:41:1a:05:4e:9b:4b:ee:4a:6f:55:52:b3:24:a1:37:0a:eb: + 64:76:2a:2e:2c:f3:fd:3b:75:90:bf:fa:71:d8:c7:3d:37:d2: + b5:05:95:62:b9:a6:de:89:3d:36:7b:38:77:48:97:ac:a6:20: + 8f:2e:a6:c9:0c:c2:b2:99:45:00:c7:ce:11:51:22:22:e0:a5: + ea:b6:15:48:09:64:ea:5e:4f:74:f7:05:3e:c7:8a:52:0c:db: + 15:b4:bd:6d:9b:e5:c6:b1:54:68:a9:e3:69:90:b6:9a:a5:0f: + b8:b9:3f:20:7d:ae:4a:b5:b8:9c:e4:1d:b6:ab:e6:94:a5:c1: + c7:83:ad:db:f5:27:87:0e:04:6c:d5:ff:dd:a0:5d:ed:87:52: + b7:2b:15:02:ae:39:a6:6a:74:e9:da:c4:e7:bc:4d:34:1e:a9: + 5c:4d:33:5f:92:09:2f:88:66:5d:77:97:c7:1d:76:13:a9:d5: + e5:f1:16:09:11:35:d5:ac:db:24:71:70:2c:98:56:0b:d9:17: + b4:d1:e3:51:2b:5e:75:e8:d5:d0:dc:4f:34:ed:c2:05:66:80: + a1:cb:e6:33 +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/897abe0b41fd2f64e9e2e351cbc36d76 b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/897abe0b41fd2f64e9e2e351cbc36d76 new file mode 100644 index 0000000..591907f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/897abe0b41fd2f64e9e2e351cbc36d76 @@ -0,0 +1,285 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 03:37:b9:28:34:7c:60:a6:ae:c5:ad:b1:21:7f:38:60 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Validity + Not Before: Nov 9 12:00:00 2007 GMT + Not After : Nov 10 00:00:00 2021 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV CA-1 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:f3:96:62:d8:75:6e:19:ff:3f:34:7c:49:4f:31: + 7e:0d:04:4e:99:81:e2:b3:85:55:91:30:b1:c0:af: + 70:bb:2c:a8:e7:18:aa:3f:78:f7:90:68:52:86:01: + 88:97:e2:3b:06:65:90:aa:bd:65:76:c2:ec:be:10: + 5b:37:78:83:60:75:45:c6:bd:74:aa:b6:9f:a4:3a: + 01:50:17:c4:39:69:b9:f1:4f:ef:82:c1:ca:f3:4a: + db:cc:9e:50:4f:4d:40:a3:3a:90:e7:86:66:bc:f0: + 3e:76:28:4c:d1:75:80:9e:6a:35:14:35:03:9e:db: + 0c:8c:c2:28:ad:50:b2:ce:f6:91:a3:c3:a5:0a:58: + 49:f6:75:44:6c:ba:f9:ce:e9:ab:3a:02:e0:4d:f3: + ac:e2:7a:e0:60:22:05:3c:82:d3:52:e2:f3:9c:47: + f8:3b:d8:b2:4b:93:56:4a:bf:70:ab:3e:e9:68:c8: + 1d:8f:58:1d:2a:4d:5e:27:3d:ad:0a:59:2f:5a:11: + 20:40:d9:68:04:68:2d:f4:c0:84:0b:0a:1b:78:df: + ed:1a:58:dc:fb:41:5a:6d:6b:f2:ed:1c:ee:5c:32: + b6:5c:ec:d7:a6:03:32:a6:e8:de:b7:28:27:59:88: + 80:ff:7b:ad:89:58:d5:1e:14:a4:f2:b0:70:d4:a0: + 3e:a7 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication, Code Signing, E-mail Protection, Time Stamping + X509v3 Certificate Policies: + Policy: 2.16.840.1.114412.2.1 + CPS: http://www.digicert.com/ssl-cps-repository.htm + User Notice: + Explicit Text: + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Authority Information Access: + OCSP - URI:http://ocsp.digicert.com + CA Issuers - URI:http://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt + + X509v3 CRL Distribution Points: + URI:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl + URI:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + X509v3 Subject Key Identifier: + 4C:58:CB:25:F0:41:4F:52:F4:28:C8:81:43:9B:A6:A8:A0:E6:92:E5 + X509v3 Authority Key Identifier: + keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + + Signature Algorithm: sha1WithRSAEncryption + 4c:7a:17:87:28:5d:17:bc:b2:32:73:bf:cd:2e:f5:58:31:1d: + f0:b1:71:54:9c:d6:9b:67:93:db:2f:03:3e:16:6f:1e:03:c9: + 53:84:a3:56:60:1e:78:94:1b:a2:a8:6f:a3:a4:8b:52:91:d7: + dd:5c:95:bb:ef:b5:16:49:e9:a5:42:4f:34:f2:47:ff:ae:81: + 7f:13:54:b7:20:c4:70:15:cb:81:0a:81:cb:74:57:dc:9c:df: + 24:a4:29:0c:18:f0:1c:e4:ae:07:33:ec:f1:49:3e:55:cf:6e: + 4f:0d:54:7b:d3:c9:e8:15:48:d4:c5:bb:dc:35:1c:77:45:07: + 48:45:85:bd:d7:7e:53:b8:c0:16:d9:95:cd:8b:8d:7d:c9:60: + 4f:d1:a2:9b:e3:d0:30:d6:b4:73:36:e6:d2:f9:03:b2:e3:a4: + f5:e5:b8:3e:04:49:00:ba:2e:a6:4a:72:83:72:9d:f7:0b:8c: + a9:89:e7:b3:d7:64:1f:d6:e3:60:cb:03:c4:dc:88:e9:9d:25: + 01:00:71:cb:03:b4:29:60:25:8f:f9:46:d1:7b:71:ae:cd:53: + 12:5b:84:8e:c2:0f:c7:ed:93:19:d9:c9:fa:8f:58:34:76:32: + 2f:ae:e1:50:14:61:d4:a8:58:a3:c8:30:13:23:ef:c6:25:8c: + 36:8f:1c:80 +-----BEGIN CERTIFICATE----- +MIIG5jCCBc6gAwIBAgIQAze5KDR8YKauxa2xIX84YDANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA3MTEwOTEyMDAwMFoXDTIxMTExMDAwMDAwMFowaTEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTEoMCYGA1UEAxMfRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgQ0EtMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPOWYth1bhn/ +PzR8SU8xfg0ETpmB4rOFVZEwscCvcLssqOcYqj9495BoUoYBiJfiOwZlkKq9ZXbC +7L4QWzd4g2B1Rca9dKq2n6Q6AVAXxDlpufFP74LByvNK28yeUE9NQKM6kOeGZrzw +PnYoTNF1gJ5qNRQ1A57bDIzCKK1Qss72kaPDpQpYSfZ1RGy6+c7pqzoC4E3zrOJ6 +4GAiBTyC01Li85xH+DvYskuTVkq/cKs+6WjIHY9YHSpNXic9rQpZL1oRIEDZaARo +LfTAhAsKG3jf7RpY3PtBWm1r8u0c7lwytlzs16YDMqbo3rcoJ1mIgP97rYlY1R4U +pPKwcNSgPqcCAwEAAaOCA4UwggOBMA4GA1UdDwEB/wQEAwIBhjA7BgNVHSUENDAy +BggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUH +AwgwggHEBgNVHSAEggG7MIIBtzCCAbMGCWCGSAGG/WwCATCCAaQwOgYIKwYBBQUH +AgEWLmh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5o +dG0wggFkBggrBgEFBQcCAjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0 +AGgAaQBzACAAQwBlAHIAdABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1 +AHQAZQBzACAAYQBjAGMAZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABp +AGcAaQBDAGUAcgB0ACAARQBWACAAQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBl +AGwAeQBpAG4AZwAgAFAAYQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBo +AGkAYwBoACAAbABpAG0AaQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAg +AGEAcgBlACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAg +AGIAeQAgAHIAZQBmAGUAcgBlAG4AYwBlAC4wEgYDVR0TAQH/BAgwBgEB/wIBADCB +gwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy +dC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NBQ2Vy +dHMvRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3J0MIGPBgNVHR8EgYcw +gYQwQKA+oDyGOmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEhpZ2hB +c3N1cmFuY2VFVlJvb3RDQS5jcmwwQKA+oDyGOmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0 +LmNvbS9EaWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5jcmwwHQYDVR0OBBYE +FExYyyXwQU9S9CjIgUObpqig5pLlMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSYJhoI +Au9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQBMeheHKF0XvLIyc7/NLvVYMR3wsXFU +nNabZ5PbLwM+Fm8eA8lThKNWYB54lBuiqG+jpItSkdfdXJW777UWSemlQk808kf/ +roF/E1S3IMRwFcuBCoHLdFfcnN8kpCkMGPAc5K4HM+zxST5Vz25PDVR708noFUjU +xbvcNRx3RQdIRYW9135TuMAW2ZXNi419yWBP0aKb49Aw1rRzNubS+QOy46T15bg+ +BEkAui6mSnKDcp33C4ypieez12Qf1uNgywPE3IjpnSUBAHHLA7QpYCWP+UbRe3Gu +zVMSW4SOwg/H7ZMZ2cn6j1g0djIvruFQFGHUqFijyDATI+/GJYw2jxyA +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1116160165 (0x428740a5) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Validity + Not Before: Oct 1 05:00:00 2006 GMT + Not After : Jul 26 18:15:15 2014 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:c6:cc:e5:73:e6:fb:d4:bb:e5:2d:2d:32:a6:df: + e5:81:3f:c9:cd:25:49:b6:71:2a:c3:d5:94:34:67: + a2:0a:1c:b0:5f:69:a6:40:b1:c4:b7:b2:8f:d0:98: + a4:a9:41:59:3a:d3:dc:94:d6:3c:db:74:38:a4:4a: + cc:4d:25:82:f7:4a:a5:53:12:38:ee:f3:49:6d:71: + 91:7e:63:b6:ab:a6:5f:c3:a4:84:f8:4f:62:51:be: + f8:c5:ec:db:38:92:e3:06:e5:08:91:0c:c4:28:41: + 55:fb:cb:5a:89:15:7e:71:e8:35:bf:4d:72:09:3d: + be:3a:38:50:5b:77:31:1b:8d:b3:c7:24:45:9a:a7: + ac:6d:00:14:5a:04:b7:ba:13:eb:51:0a:98:41:41: + 22:4e:65:61:87:81:41:50:a6:79:5c:89:de:19:4a: + 57:d5:2e:e6:5d:1c:53:2c:7e:98:cd:1a:06:16:a4: + 68:73:d0:34:04:13:5c:a1:71:d3:5a:7c:55:db:5e: + 64:e1:37:87:30:56:04:e5:11:b4:29:80:12:f1:79: + 39:88:a2:02:11:7c:27:66:b7:88:b7:78:f2:ca:0a: + a8:38:ab:0a:64:c2:bf:66:5d:95:84:c1:a1:25:1e: + 87:5d:1a:50:0b:20:12:cc:41:bb:6e:0b:51:38:b8: + 4b:cb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:1 + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication, E-mail Protection + Authority Information Access: + OCSP - URI:http://ocsp.entrust.net + + X509v3 CRL Distribution Points: + URI:http://crl.entrust.net/server1.crl + + X509v3 Subject Key Identifier: + B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + + 1.2.840.113533.7.65.0: + 0 +..V7.1.... + Signature Algorithm: sha1WithRSAEncryption + 48:0e:2b:6f:20:62:4c:28:93:a3:24:3d:58:ab:21:cf:80:f8: + 9a:97:90:6a:22:ed:5a:7c:47:36:99:e7:79:84:75:ab:24:8f: + 92:0a:d5:61:04:ae:c3:6a:5c:b2:cc:d9:e4:44:87:6f:db:8f: + 38:62:f7:44:36:9d:ba:bc:6e:07:c4:d4:8d:e8:1f:d1:0b:60: + a3:b5:9c:ce:63:be:ed:67:dc:f8:ba:de:6e:c9:25:cb:5b:b5: + 9d:76:70:0b:df:42:72:f8:4f:41:11:64:a5:d2:ea:fc:d5:af: + 11:f4:15:38:67:9c:20:a8:4b:77:5a:91:32:42:32:e7:85:b3: + df:36 +-----BEGIN CERTIFICATE----- +MIIEQjCCA6ugAwIBAgIEQodApTANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEw +MDEwNTAwMDBaFw0xNDA3MjYxODE1MTVaMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNV +BAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGzOVz5vvUu+UtLTKm3+WBP8nNJUm2cSrD +1ZQ0Z6IKHLBfaaZAscS3so/QmKSpQVk609yU1jzbdDikSsxNJYL3SqVTEjju80lt +cZF+Y7arpl/DpIT4T2JRvvjF7Ns4kuMG5QiRDMQoQVX7y1qJFX5x6DW/TXIJPb46 +OFBbdzEbjbPHJEWap6xtABRaBLe6E+tRCphBQSJOZWGHgUFQpnlcid4ZSlfVLuZd +HFMsfpjNGgYWpGhz0DQEE1yhcdNafFXbXmThN4cwVgTlEbQpgBLxeTmIogIRfCdm +t4i3ePLKCqg4qwpkwr9mXZWEwaElHoddGlALIBLMQbtuC1E4uEvLAgMBAAGjggET +MIIBDzASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwQwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdo +dHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v +Y3JsLmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMB0GA1UdDgQWBBSxPsNpA/i/RwHU +mCYaCALvY2QrwzALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7 +UISX8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEF +BQADgYEASA4rbyBiTCiToyQ9WKshz4D4mpeQaiLtWnxHNpnneYR1qySPkgrVYQSu +w2pcsszZ5ESHb9uPOGL3RDadurxuB8TUjegf0Qtgo7WczmO+7Wfc+Lrebskly1u1 +nXZwC99CcvhPQRFkpdLq/NWvEfQVOGecIKhLd1qRMkIy54Wz3zY= +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 927650371 (0x374ad243) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Validity + Not Before: May 25 16:09:40 1999 GMT + Not After : May 25 16:39:40 2019 GMT + Subject: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:cd:28:83:34:54:1b:89:f3:0f:af:37:91:31:ff: + af:31:60:c9:a8:e8:b2:10:68:ed:9f:e7:93:36:f1: + 0a:64:bb:47:f5:04:17:3f:23:47:4d:c5:27:19:81: + 26:0c:54:72:0d:88:2d:d9:1f:9a:12:9f:bc:b3:71: + d3:80:19:3f:47:66:7b:8c:35:28:d2:b9:0a:df:24: + da:9c:d6:50:79:81:7a:5a:d3:37:f7:c2:4a:d8:29: + 92:26:64:d1:e4:98:6c:3a:00:8a:f5:34:9b:65:f8: + ed:e3:10:ff:fd:b8:49:58:dc:a0:de:82:39:6b:81: + b1:16:19:61:b9:54:b6:e6:43 + Exponent: 3 (0x3) + X509v3 extensions: + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + X509v3 CRL Distribution Points: + DirName:/C=US/O=Entrust.net/OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Secure Server Certification Authority/CN=CRL1 + URI:http://www.entrust.net/CRL/net1.crl + + X509v3 Private Key Usage Period: + Not Before: May 25 16:09:40 1999 GMT, Not After: May 25 16:09:40 2019 GMT + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + + X509v3 Subject Key Identifier: + F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + X509v3 Basic Constraints: + CA:TRUE + 1.2.840.113533.7.65.0: + 0 +..V4.0.... + Signature Algorithm: sha1WithRSAEncryption + 90:dc:30:02:fa:64:74:c2:a7:0a:a5:7c:21:8d:34:17:a8:fb: + 47:0e:ff:25:7c:8d:13:0a:fb:e4:98:b5:ef:8c:f8:c5:10:0d: + f7:92:be:f1:c3:d5:d5:95:6a:04:bb:2c:ce:26:36:65:c8:31: + c6:e7:ee:3f:e3:57:75:84:7a:11:ef:46:4f:18:f4:d3:98:bb: + a8:87:32:ba:72:f6:3c:e2:3d:9f:d7:1d:d9:c3:60:43:8c:58: + 0e:22:96:2f:62:a3:2c:1f:ba:ad:05:ef:ab:32:78:87:a0:54: + 73:19:b5:5c:05:f9:52:3e:6d:2d:45:0b:f7:0a:93:ea:ed:06: + f9:b2 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/ca-bundle.crt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/ca-bundle.crt new file mode 100644 index 0000000..1681842 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/ca-bundle.crt @@ -0,0 +1,563 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 145105 (0x236d1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA + Validity + Not Before: Feb 19 22:45:05 2010 GMT + Not After : Feb 18 22:45:05 2020 GMT + Subject: C=US, O=GeoTrust, Inc., CN=RapidSSL CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:c7:71:f8:56:c7:1e:d9:cc:b5:ad:f6:b4:97:a3: + fb:a1:e6:0b:50:5f:50:aa:3a:da:0f:fc:3d:29:24: + 43:c6:10:29:c1:fc:55:40:72:ee:bd:ea:df:9f:b6: + 41:f4:48:4b:c8:6e:fe:4f:57:12:8b:5b:fa:92:dd: + 5e:e8:ad:f3:f0:1b:b1:7b:4d:fb:cf:fd:d1:e5:f8: + e3:dc:e7:f5:73:7f:df:01:49:cf:8c:56:c1:bd:37: + e3:5b:be:b5:4f:8b:8b:f0:da:4f:c7:e3:dd:55:47: + 69:df:f2:5b:7b:07:4f:3d:e5:ac:21:c1:c8:1d:7a: + e8:e7:f6:0f:a1:aa:f5:6f:de:a8:65:4f:10:89:9c: + 03:f3:89:7a:a5:5e:01:72:33:ed:a9:e9:5a:1e:79: + f3:87:c8:df:c8:c5:fc:37:c8:9a:9a:d7:b8:76:cc: + b0:3e:e7:fd:e6:54:ea:df:5f:52:41:78:59:57:ad: + f1:12:d6:7f:bc:d5:9f:70:d3:05:6c:fa:a3:7d:67: + 58:dd:26:62:1d:31:92:0c:79:79:1c:8e:cf:ca:7b: + c1:66:af:a8:74:48:fb:8e:82:c2:9e:2c:99:5c:7b: + 2d:5d:9b:bc:5b:57:9e:7c:3a:7a:13:ad:f2:a3:18: + 5b:2b:59:0f:cd:5c:3a:eb:68:33:c6:28:1d:82:d1: + 50:8b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 6B:69:3D:6A:18:42:4A:DD:8F:02:65:39:FD:35:24:86:78:91:16:30 + X509v3 Authority Key Identifier: + keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 CRL Distribution Points: + URI:http://crl.geotrust.com/crls/gtglobal.crl + + Authority Information Access: + OCSP - URI:http://ocsp.geotrust.com + + Signature Algorithm: sha1WithRSAEncryption + ab:bc:bc:0a:5d:18:94:e3:c1:b1:c3:a8:4c:55:d6:be:b4:98: + f1:ee:3c:1c:cd:cf:f3:24:24:5c:96:03:27:58:fc:36:ae:a2: + 2f:8f:f1:fe:da:2b:02:c3:33:bd:c8:dd:48:22:2b:60:0f:a5: + 03:10:fd:77:f8:d0:ed:96:67:4f:fd:ea:47:20:70:54:dc:a9: + 0c:55:7e:e1:96:25:8a:d9:b5:da:57:4a:be:8d:8e:49:43:63: + a5:6c:4e:27:87:25:eb:5b:6d:fe:a2:7f:38:28:e0:36:ab:ad: + 39:a5:a5:62:c4:b7:5c:58:2c:aa:5d:01:60:a6:62:67:a3:c0: + c7:62:23:f4:e7:6c:46:ee:b5:d3:80:6a:22:13:d2:2d:3f:74: + 4f:ea:af:8c:5f:b4:38:9c:db:ae:ce:af:84:1e:a6:f6:34:51: + 59:79:d3:e3:75:dc:bc:d7:f3:73:df:92:ec:d2:20:59:6f:9c: + fb:95:f8:92:76:18:0a:7c:0f:2c:a6:ca:de:8a:62:7b:d8:f3: + ce:5f:68:bd:8f:3e:c1:74:bb:15:72:3a:16:83:a9:0b:e6:4d: + 99:9c:d8:57:ec:a8:01:51:c7:6f:57:34:5e:ab:4a:2c:42:f6: + 4f:1c:89:78:de:26:4e:f5:6f:93:4c:15:6b:27:56:4d:00:54: + 6c:7a:b7:b7 +-----BEGIN CERTIFICATE----- +MIID1TCCAr2gAwIBAgIDAjbRMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMTAwMjE5MjI0NTA1WhcNMjAwMjE4MjI0NTA1WjA8MQswCQYDVQQG +EwJVUzEXMBUGA1UEChMOR2VvVHJ1c3QsIEluYy4xFDASBgNVBAMTC1JhcGlkU1NM +IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx3H4Vsce2cy1rfa0 +l6P7oeYLUF9QqjraD/w9KSRDxhApwfxVQHLuverfn7ZB9EhLyG7+T1cSi1v6kt1e +6K3z8Buxe037z/3R5fjj3Of1c3/fAUnPjFbBvTfjW761T4uL8NpPx+PdVUdp3/Jb +ewdPPeWsIcHIHXro5/YPoar1b96oZU8QiZwD84l6pV4BcjPtqelaHnnzh8jfyMX8 +N8iamte4dsywPuf95lTq319SQXhZV63xEtZ/vNWfcNMFbPqjfWdY3SZiHTGSDHl5 +HI7PynvBZq+odEj7joLCniyZXHstXZu8W1eefDp6E63yoxhbK1kPzVw662gzxigd +gtFQiwIDAQABo4HZMIHWMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUa2k9ahhC +St2PAmU5/TUkhniRFjAwHwYDVR0jBBgwFoAUwHqYaI2J+6sFZAwRfap9ZbjKzE4w +EgYDVR0TAQH/BAgwBgEB/wIBADA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8vY3Js +Lmdlb3RydXN0LmNvbS9jcmxzL2d0Z2xvYmFsLmNybDA0BggrBgEFBQcBAQQoMCYw +JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmdlb3RydXN0LmNvbTANBgkqhkiG9w0B +AQUFAAOCAQEAq7y8Cl0YlOPBscOoTFXWvrSY8e48HM3P8yQkXJYDJ1j8Nq6iL4/x +/torAsMzvcjdSCIrYA+lAxD9d/jQ7ZZnT/3qRyBwVNypDFV+4ZYlitm12ldKvo2O +SUNjpWxOJ4cl61tt/qJ/OCjgNqutOaWlYsS3XFgsql0BYKZiZ6PAx2Ij9OdsRu61 +04BqIhPSLT90T+qvjF+0OJzbrs6vhB6m9jRRWXnT43XcvNfzc9+S7NIgWW+c+5X4 +knYYCnwPLKbK3opie9jzzl9ovY8+wXS7FXI6FoOpC+ZNmZzYV+yoAVHHb1c0XqtK +LEL2TxyJeN4mTvVvk0wVaydWTQBUbHq3tw== +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 144470 (0x23456) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA + Validity + Not Before: May 21 04:00:00 2002 GMT + Not After : May 21 04:00:00 2022 GMT + Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:da:cc:18:63:30:fd:f4:17:23:1a:56:7e:5b:df: + 3c:6c:38:e4:71:b7:78:91:d4:bc:a1:d8:4c:f8:a8: + 43:b6:03:e9:4d:21:07:08:88:da:58:2f:66:39:29: + bd:05:78:8b:9d:38:e8:05:b7:6a:7e:71:a4:e6:c4: + 60:a6:b0:ef:80:e4:89:28:0f:9e:25:d6:ed:83:f3: + ad:a6:91:c7:98:c9:42:18:35:14:9d:ad:98:46:92: + 2e:4f:ca:f1:87:43:c1:16:95:57:2d:50:ef:89:2d: + 80:7a:57:ad:f2:ee:5f:6b:d2:00:8d:b9:14:f8:14: + 15:35:d9:c0:46:a3:7b:72:c8:91:bf:c9:55:2b:cd: + d0:97:3e:9c:26:64:cc:df:ce:83:19:71:ca:4e:e6: + d4:d5:7b:a9:19:cd:55:de:c8:ec:d2:5e:38:53:e5: + 5c:4f:8c:2d:fe:50:23:36:fc:66:e6:cb:8e:a4:39: + 19:00:b7:95:02:39:91:0b:0e:fe:38:2e:d1:1d:05: + 9a:f6:4d:3e:6f:0f:07:1d:af:2c:1e:8f:60:39:e2: + fa:36:53:13:39:d4:5e:26:2b:db:3d:a8:14:bd:32: + eb:18:03:28:52:04:71:e5:ab:33:3d:e1:38:bb:07: + 36:84:62:9c:79:ea:16:30:f4:5f:c0:2b:e8:71:6b: + e4:f9 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E + X509v3 Authority Key Identifier: + keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E + + Signature Algorithm: sha1WithRSAEncryption + 35:e3:29:6a:e5:2f:5d:54:8e:29:50:94:9f:99:1a:14:e4:8f: + 78:2a:62:94:a2:27:67:9e:d0:cf:1a:5e:47:e9:c1:b2:a4:cf: + dd:41:1a:05:4e:9b:4b:ee:4a:6f:55:52:b3:24:a1:37:0a:eb: + 64:76:2a:2e:2c:f3:fd:3b:75:90:bf:fa:71:d8:c7:3d:37:d2: + b5:05:95:62:b9:a6:de:89:3d:36:7b:38:77:48:97:ac:a6:20: + 8f:2e:a6:c9:0c:c2:b2:99:45:00:c7:ce:11:51:22:22:e0:a5: + ea:b6:15:48:09:64:ea:5e:4f:74:f7:05:3e:c7:8a:52:0c:db: + 15:b4:bd:6d:9b:e5:c6:b1:54:68:a9:e3:69:90:b6:9a:a5:0f: + b8:b9:3f:20:7d:ae:4a:b5:b8:9c:e4:1d:b6:ab:e6:94:a5:c1: + c7:83:ad:db:f5:27:87:0e:04:6c:d5:ff:dd:a0:5d:ed:87:52: + b7:2b:15:02:ae:39:a6:6a:74:e9:da:c4:e7:bc:4d:34:1e:a9: + 5c:4d:33:5f:92:09:2f:88:66:5d:77:97:c7:1d:76:13:a9:d5: + e5:f1:16:09:11:35:d5:ac:db:24:71:70:2c:98:56:0b:d9:17: + b4:d1:e3:51:2b:5e:75:e8:d5:d0:dc:4f:34:ed:c2:05:66:80: + a1:cb:e6:33 +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 03:37:b9:28:34:7c:60:a6:ae:c5:ad:b1:21:7f:38:60 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Validity + Not Before: Nov 9 12:00:00 2007 GMT + Not After : Nov 10 00:00:00 2021 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV CA-1 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:f3:96:62:d8:75:6e:19:ff:3f:34:7c:49:4f:31: + 7e:0d:04:4e:99:81:e2:b3:85:55:91:30:b1:c0:af: + 70:bb:2c:a8:e7:18:aa:3f:78:f7:90:68:52:86:01: + 88:97:e2:3b:06:65:90:aa:bd:65:76:c2:ec:be:10: + 5b:37:78:83:60:75:45:c6:bd:74:aa:b6:9f:a4:3a: + 01:50:17:c4:39:69:b9:f1:4f:ef:82:c1:ca:f3:4a: + db:cc:9e:50:4f:4d:40:a3:3a:90:e7:86:66:bc:f0: + 3e:76:28:4c:d1:75:80:9e:6a:35:14:35:03:9e:db: + 0c:8c:c2:28:ad:50:b2:ce:f6:91:a3:c3:a5:0a:58: + 49:f6:75:44:6c:ba:f9:ce:e9:ab:3a:02:e0:4d:f3: + ac:e2:7a:e0:60:22:05:3c:82:d3:52:e2:f3:9c:47: + f8:3b:d8:b2:4b:93:56:4a:bf:70:ab:3e:e9:68:c8: + 1d:8f:58:1d:2a:4d:5e:27:3d:ad:0a:59:2f:5a:11: + 20:40:d9:68:04:68:2d:f4:c0:84:0b:0a:1b:78:df: + ed:1a:58:dc:fb:41:5a:6d:6b:f2:ed:1c:ee:5c:32: + b6:5c:ec:d7:a6:03:32:a6:e8:de:b7:28:27:59:88: + 80:ff:7b:ad:89:58:d5:1e:14:a4:f2:b0:70:d4:a0: + 3e:a7 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication, Code Signing, E-mail Protection, Time Stamping + X509v3 Certificate Policies: + Policy: 2.16.840.1.114412.2.1 + CPS: http://www.digicert.com/ssl-cps-repository.htm + User Notice: + Explicit Text: + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Authority Information Access: + OCSP - URI:http://ocsp.digicert.com + CA Issuers - URI:http://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt + + X509v3 CRL Distribution Points: + URI:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl + URI:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + X509v3 Subject Key Identifier: + 4C:58:CB:25:F0:41:4F:52:F4:28:C8:81:43:9B:A6:A8:A0:E6:92:E5 + X509v3 Authority Key Identifier: + keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + + Signature Algorithm: sha1WithRSAEncryption + 4c:7a:17:87:28:5d:17:bc:b2:32:73:bf:cd:2e:f5:58:31:1d: + f0:b1:71:54:9c:d6:9b:67:93:db:2f:03:3e:16:6f:1e:03:c9: + 53:84:a3:56:60:1e:78:94:1b:a2:a8:6f:a3:a4:8b:52:91:d7: + dd:5c:95:bb:ef:b5:16:49:e9:a5:42:4f:34:f2:47:ff:ae:81: + 7f:13:54:b7:20:c4:70:15:cb:81:0a:81:cb:74:57:dc:9c:df: + 24:a4:29:0c:18:f0:1c:e4:ae:07:33:ec:f1:49:3e:55:cf:6e: + 4f:0d:54:7b:d3:c9:e8:15:48:d4:c5:bb:dc:35:1c:77:45:07: + 48:45:85:bd:d7:7e:53:b8:c0:16:d9:95:cd:8b:8d:7d:c9:60: + 4f:d1:a2:9b:e3:d0:30:d6:b4:73:36:e6:d2:f9:03:b2:e3:a4: + f5:e5:b8:3e:04:49:00:ba:2e:a6:4a:72:83:72:9d:f7:0b:8c: + a9:89:e7:b3:d7:64:1f:d6:e3:60:cb:03:c4:dc:88:e9:9d:25: + 01:00:71:cb:03:b4:29:60:25:8f:f9:46:d1:7b:71:ae:cd:53: + 12:5b:84:8e:c2:0f:c7:ed:93:19:d9:c9:fa:8f:58:34:76:32: + 2f:ae:e1:50:14:61:d4:a8:58:a3:c8:30:13:23:ef:c6:25:8c: + 36:8f:1c:80 +-----BEGIN CERTIFICATE----- +MIIG5jCCBc6gAwIBAgIQAze5KDR8YKauxa2xIX84YDANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA3MTEwOTEyMDAwMFoXDTIxMTExMDAwMDAwMFowaTEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTEoMCYGA1UEAxMfRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgQ0EtMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPOWYth1bhn/ +PzR8SU8xfg0ETpmB4rOFVZEwscCvcLssqOcYqj9495BoUoYBiJfiOwZlkKq9ZXbC +7L4QWzd4g2B1Rca9dKq2n6Q6AVAXxDlpufFP74LByvNK28yeUE9NQKM6kOeGZrzw +PnYoTNF1gJ5qNRQ1A57bDIzCKK1Qss72kaPDpQpYSfZ1RGy6+c7pqzoC4E3zrOJ6 +4GAiBTyC01Li85xH+DvYskuTVkq/cKs+6WjIHY9YHSpNXic9rQpZL1oRIEDZaARo +LfTAhAsKG3jf7RpY3PtBWm1r8u0c7lwytlzs16YDMqbo3rcoJ1mIgP97rYlY1R4U +pPKwcNSgPqcCAwEAAaOCA4UwggOBMA4GA1UdDwEB/wQEAwIBhjA7BgNVHSUENDAy +BggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUH +AwgwggHEBgNVHSAEggG7MIIBtzCCAbMGCWCGSAGG/WwCATCCAaQwOgYIKwYBBQUH +AgEWLmh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5o +dG0wggFkBggrBgEFBQcCAjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0 +AGgAaQBzACAAQwBlAHIAdABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1 +AHQAZQBzACAAYQBjAGMAZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABp +AGcAaQBDAGUAcgB0ACAARQBWACAAQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBl +AGwAeQBpAG4AZwAgAFAAYQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBo +AGkAYwBoACAAbABpAG0AaQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAg +AGEAcgBlACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAg +AGIAeQAgAHIAZQBmAGUAcgBlAG4AYwBlAC4wEgYDVR0TAQH/BAgwBgEB/wIBADCB +gwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy +dC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NBQ2Vy +dHMvRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3J0MIGPBgNVHR8EgYcw +gYQwQKA+oDyGOmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEhpZ2hB +c3N1cmFuY2VFVlJvb3RDQS5jcmwwQKA+oDyGOmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0 +LmNvbS9EaWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5jcmwwHQYDVR0OBBYE +FExYyyXwQU9S9CjIgUObpqig5pLlMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSYJhoI +Au9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQBMeheHKF0XvLIyc7/NLvVYMR3wsXFU +nNabZ5PbLwM+Fm8eA8lThKNWYB54lBuiqG+jpItSkdfdXJW777UWSemlQk808kf/ +roF/E1S3IMRwFcuBCoHLdFfcnN8kpCkMGPAc5K4HM+zxST5Vz25PDVR708noFUjU +xbvcNRx3RQdIRYW9135TuMAW2ZXNi419yWBP0aKb49Aw1rRzNubS+QOy46T15bg+ +BEkAui6mSnKDcp33C4ypieez12Qf1uNgywPE3IjpnSUBAHHLA7QpYCWP+UbRe3Gu +zVMSW4SOwg/H7ZMZ2cn6j1g0djIvruFQFGHUqFijyDATI+/GJYw2jxyA +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1116160165 (0x428740a5) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Validity + Not Before: Oct 1 05:00:00 2006 GMT + Not After : Jul 26 18:15:15 2014 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:c6:cc:e5:73:e6:fb:d4:bb:e5:2d:2d:32:a6:df: + e5:81:3f:c9:cd:25:49:b6:71:2a:c3:d5:94:34:67: + a2:0a:1c:b0:5f:69:a6:40:b1:c4:b7:b2:8f:d0:98: + a4:a9:41:59:3a:d3:dc:94:d6:3c:db:74:38:a4:4a: + cc:4d:25:82:f7:4a:a5:53:12:38:ee:f3:49:6d:71: + 91:7e:63:b6:ab:a6:5f:c3:a4:84:f8:4f:62:51:be: + f8:c5:ec:db:38:92:e3:06:e5:08:91:0c:c4:28:41: + 55:fb:cb:5a:89:15:7e:71:e8:35:bf:4d:72:09:3d: + be:3a:38:50:5b:77:31:1b:8d:b3:c7:24:45:9a:a7: + ac:6d:00:14:5a:04:b7:ba:13:eb:51:0a:98:41:41: + 22:4e:65:61:87:81:41:50:a6:79:5c:89:de:19:4a: + 57:d5:2e:e6:5d:1c:53:2c:7e:98:cd:1a:06:16:a4: + 68:73:d0:34:04:13:5c:a1:71:d3:5a:7c:55:db:5e: + 64:e1:37:87:30:56:04:e5:11:b4:29:80:12:f1:79: + 39:88:a2:02:11:7c:27:66:b7:88:b7:78:f2:ca:0a: + a8:38:ab:0a:64:c2:bf:66:5d:95:84:c1:a1:25:1e: + 87:5d:1a:50:0b:20:12:cc:41:bb:6e:0b:51:38:b8: + 4b:cb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:1 + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication, E-mail Protection + Authority Information Access: + OCSP - URI:http://ocsp.entrust.net + + X509v3 CRL Distribution Points: + URI:http://crl.entrust.net/server1.crl + + X509v3 Subject Key Identifier: + B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + + 1.2.840.113533.7.65.0: + 0 +..V7.1.... + Signature Algorithm: sha1WithRSAEncryption + 48:0e:2b:6f:20:62:4c:28:93:a3:24:3d:58:ab:21:cf:80:f8: + 9a:97:90:6a:22:ed:5a:7c:47:36:99:e7:79:84:75:ab:24:8f: + 92:0a:d5:61:04:ae:c3:6a:5c:b2:cc:d9:e4:44:87:6f:db:8f: + 38:62:f7:44:36:9d:ba:bc:6e:07:c4:d4:8d:e8:1f:d1:0b:60: + a3:b5:9c:ce:63:be:ed:67:dc:f8:ba:de:6e:c9:25:cb:5b:b5: + 9d:76:70:0b:df:42:72:f8:4f:41:11:64:a5:d2:ea:fc:d5:af: + 11:f4:15:38:67:9c:20:a8:4b:77:5a:91:32:42:32:e7:85:b3: + df:36 +-----BEGIN CERTIFICATE----- +MIIEQjCCA6ugAwIBAgIEQodApTANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEw +MDEwNTAwMDBaFw0xNDA3MjYxODE1MTVaMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNV +BAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGzOVz5vvUu+UtLTKm3+WBP8nNJUm2cSrD +1ZQ0Z6IKHLBfaaZAscS3so/QmKSpQVk609yU1jzbdDikSsxNJYL3SqVTEjju80lt +cZF+Y7arpl/DpIT4T2JRvvjF7Ns4kuMG5QiRDMQoQVX7y1qJFX5x6DW/TXIJPb46 +OFBbdzEbjbPHJEWap6xtABRaBLe6E+tRCphBQSJOZWGHgUFQpnlcid4ZSlfVLuZd +HFMsfpjNGgYWpGhz0DQEE1yhcdNafFXbXmThN4cwVgTlEbQpgBLxeTmIogIRfCdm +t4i3ePLKCqg4qwpkwr9mXZWEwaElHoddGlALIBLMQbtuC1E4uEvLAgMBAAGjggET +MIIBDzASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwQwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdo +dHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v +Y3JsLmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMB0GA1UdDgQWBBSxPsNpA/i/RwHU +mCYaCALvY2QrwzALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7 +UISX8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEF +BQADgYEASA4rbyBiTCiToyQ9WKshz4D4mpeQaiLtWnxHNpnneYR1qySPkgrVYQSu +w2pcsszZ5ESHb9uPOGL3RDadurxuB8TUjegf0Qtgo7WczmO+7Wfc+Lrebskly1u1 +nXZwC99CcvhPQRFkpdLq/NWvEfQVOGecIKhLd1qRMkIy54Wz3zY= +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 927650371 (0x374ad243) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Validity + Not Before: May 25 16:09:40 1999 GMT + Not After : May 25 16:39:40 2019 GMT + Subject: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:cd:28:83:34:54:1b:89:f3:0f:af:37:91:31:ff: + af:31:60:c9:a8:e8:b2:10:68:ed:9f:e7:93:36:f1: + 0a:64:bb:47:f5:04:17:3f:23:47:4d:c5:27:19:81: + 26:0c:54:72:0d:88:2d:d9:1f:9a:12:9f:bc:b3:71: + d3:80:19:3f:47:66:7b:8c:35:28:d2:b9:0a:df:24: + da:9c:d6:50:79:81:7a:5a:d3:37:f7:c2:4a:d8:29: + 92:26:64:d1:e4:98:6c:3a:00:8a:f5:34:9b:65:f8: + ed:e3:10:ff:fd:b8:49:58:dc:a0:de:82:39:6b:81: + b1:16:19:61:b9:54:b6:e6:43 + Exponent: 3 (0x3) + X509v3 extensions: + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + X509v3 CRL Distribution Points: + DirName:/C=US/O=Entrust.net/OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Secure Server Certification Authority/CN=CRL1 + URI:http://www.entrust.net/CRL/net1.crl + + X509v3 Private Key Usage Period: + Not Before: May 25 16:09:40 1999 GMT, Not After: May 25 16:09:40 2019 GMT + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + + X509v3 Subject Key Identifier: + F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + X509v3 Basic Constraints: + CA:TRUE + 1.2.840.113533.7.65.0: + 0 +..V4.0.... + Signature Algorithm: sha1WithRSAEncryption + 90:dc:30:02:fa:64:74:c2:a7:0a:a5:7c:21:8d:34:17:a8:fb: + 47:0e:ff:25:7c:8d:13:0a:fb:e4:98:b5:ef:8c:f8:c5:10:0d: + f7:92:be:f1:c3:d5:d5:95:6a:04:bb:2c:ce:26:36:65:c8:31: + c6:e7:ee:3f:e3:57:75:84:7a:11:ef:46:4f:18:f4:d3:98:bb: + a8:87:32:ba:72:f6:3c:e2:3d:9f:d7:1d:d9:c3:60:43:8c:58: + 0e:22:96:2f:62:a3:2c:1f:ba:ad:05:ef:ab:32:78:87:a0:54: + 73:19:b5:5c:05:f9:52:3e:6d:2d:45:0b:f7:0a:93:ea:ed:06: + f9:b2 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 0a:5f:11:4d:03:5b:17:91:17:d2:ef:d4:03:8c:3f:3b + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Validity + Not Before: Apr 2 12:00:00 2008 GMT + Not After : Apr 3 00:00:00 2022 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance CA-3 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:bf:61:0a:29:10:1f:5e:fe:34:37:51:08:f8:1e: + fb:22:ed:61:be:0b:0d:70:4c:50:63:26:75:15:b9: + 41:88:97:b6:f0:a0:15:bb:08:60:e0:42:e8:05:29: + 10:87:36:8a:28:65:a8:ef:31:07:74:6d:36:97:2f: + 28:46:66:04:c7:2a:79:26:7a:99:d5:8e:c3:6d:4f: + a0:5e:ad:bc:3d:91:c2:59:7b:5e:36:6c:c0:53:cf: + 00:08:32:3e:10:64:58:10:13:69:c7:0c:ee:9c:42: + 51:00:f9:05:44:ee:24:ce:7a:1f:ed:8c:11:bd:12: + a8:f3:15:f4:1c:7a:31:69:01:1b:a7:e6:5d:c0:9a: + 6c:7e:09:9e:e7:52:44:4a:10:3a:23:e4:9b:b6:03: + af:a8:9c:b4:5b:9f:d4:4b:ad:92:8c:ce:b5:11:2a: + aa:37:18:8d:b4:c2:b8:d8:5c:06:8c:f8:ff:23:bd: + 35:5e:d4:7c:3e:7e:83:0e:91:96:05:98:c3:b2:1f: + e3:c8:65:eb:a9:7b:5d:a0:2c:cc:fc:3c:d9:6d:ed: + cc:fa:4b:43:8c:c9:d4:b8:a5:61:1c:b2:40:b6:28: + 12:df:b9:f8:5f:fe:d3:b2:c9:ef:3d:b4:1e:4b:7c: + 1c:4c:99:36:9e:3d:eb:ec:a7:68:5e:1d:df:67:6e: + 5e:fb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Certificate Policies: + Policy: 2.16.840.1.114412.1.3.0.2 + CPS: http://www.digicert.com/ssl-cps-repository.htm + User Notice: + Explicit Text: + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Authority Information Access: + OCSP - URI:http://ocsp.digicert.com + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + Full Name: + URI:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + X509v3 Authority Key Identifier: + keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + + X509v3 Subject Key Identifier: + 50:EA:73:89:DB:29:FB:10:8F:9E:E5:01:20:D4:DE:79:99:48:83:F7 + Signature Algorithm: sha1WithRSAEncryption + 1e:e2:a5:48:9e:6c:db:53:38:0f:ef:a6:1a:2a:ac:e2:03:43: + ed:9a:bc:3e:8e:75:1b:f0:fd:2e:22:59:ac:13:c0:61:e2:e7: + fa:e9:99:cd:87:09:75:54:28:bf:46:60:dc:be:51:2c:92:f3: + 1b:91:7c:31:08:70:e2:37:b9:c1:5b:a8:bd:a3:0b:00:fb:1a: + 15:fd:03:ad:58:6a:c5:c7:24:99:48:47:46:31:1e:92:ef:b4: + 5f:4e:34:c7:90:bf:31:c1:f8:b1:84:86:d0:9c:01:aa:df:8a: + 56:06:ce:3a:e9:0e:ae:97:74:5d:d7:71:9a:42:74:5f:de:8d: + 43:7c:de:e9:55:ed:69:00:cb:05:e0:7a:61:61:33:d1:19:4d: + f9:08:ee:a0:39:c5:25:35:b7:2b:c4:0f:b2:dd:f1:a5:b7:0e: + 24:c4:26:28:8d:79:77:f5:2f:f0:57:ba:7c:07:d4:e1:fc:cd: + 5a:30:57:7e:86:10:47:dd:31:1f:d7:fc:a2:c2:bf:30:7c:5d: + 24:aa:e8:f9:ae:5f:6a:74:c2:ce:6b:b3:46:d8:21:be:29:d4: + 8e:5e:15:d6:42:4a:e7:32:6f:a4:b1:6b:51:83:58:be:3f:6d: + c7:fb:da:03:21:cb:6a:16:19:4e:0a:f0:ad:84:ca:5d:94:b3: + 5a:76:f7:61 +-----BEGIN CERTIFICATE----- +MIIGWDCCBUCgAwIBAgIQCl8RTQNbF5EX0u/UA4w/OzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA4MDQwMjEyMDAwMFoXDTIyMDQwMzAwMDAwMFowZjEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTElMCMGA1UEAxMcRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +Q0EtMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9hCikQH17+NDdR +CPge+yLtYb4LDXBMUGMmdRW5QYiXtvCgFbsIYOBC6AUpEIc2iihlqO8xB3RtNpcv +KEZmBMcqeSZ6mdWOw21PoF6tvD2Rwll7XjZswFPPAAgyPhBkWBATaccM7pxCUQD5 +BUTuJM56H+2MEb0SqPMV9Bx6MWkBG6fmXcCabH4JnudSREoQOiPkm7YDr6ictFuf +1EutkozOtREqqjcYjbTCuNhcBoz4/yO9NV7UfD5+gw6RlgWYw7If48hl66l7XaAs +zPw82W3tzPpLQ4zJ1LilYRyyQLYoEt+5+F/+07LJ7z20Hkt8HEyZNp496+ynaF4d +32duXvsCAwEAAaOCAvowggL2MA4GA1UdDwEB/wQEAwIBhjCCAcYGA1UdIASCAb0w +ggG5MIIBtQYLYIZIAYb9bAEDAAIwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3 +LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUH +AgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQBy +AHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBj +AGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAg +AEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQ +AGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBt +AGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBj +AG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBl +AHIAZQBuAGMAZQAuMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYIKwYBBQUHAQEEKDAm +MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wgY8GA1UdHwSB +hzCBhDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGln +aEFzc3VyYW5jZUVWUm9vdENBLmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNl +cnQuY29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDAfBgNVHSME +GDAWgBSxPsNpA/i/RwHUmCYaCALvY2QrwzAdBgNVHQ4EFgQUUOpzidsp+xCPnuUB +INTeeZlIg/cwDQYJKoZIhvcNAQEFBQADggEBAB7ipUiebNtTOA/vphoqrOIDQ+2a +vD6OdRvw/S4iWawTwGHi5/rpmc2HCXVUKL9GYNy+USyS8xuRfDEIcOI3ucFbqL2j +CwD7GhX9A61YasXHJJlIR0YxHpLvtF9ONMeQvzHB+LGEhtCcAarfilYGzjrpDq6X +dF3XcZpCdF/ejUN83ulV7WkAywXgemFhM9EZTfkI7qA5xSU1tyvED7Ld8aW3DiTE +JiiNeXf1L/BXunwH1OH8zVowV36GEEfdMR/X/KLCvzB8XSSq6PmuX2p0ws5rs0bY +Ib4p1I5eFdZCSucyb6Sxa1GDWL4/bcf72gMhy2oWGU4K8K2Eyl2Us1p292E= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/d867a7b2aecc46f9c31afc4f2f50de05 b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/d867a7b2aecc46f9c31afc4f2f50de05 new file mode 100644 index 0000000..4ebe436 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/d867a7b2aecc46f9c31afc4f2f50de05 @@ -0,0 +1,197 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 0a:5f:11:4d:03:5b:17:91:17:d2:ef:d4:03:8c:3f:3b + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Validity + Not Before: Apr 2 12:00:00 2008 GMT + Not After : Apr 3 00:00:00 2022 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance CA-3 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:bf:61:0a:29:10:1f:5e:fe:34:37:51:08:f8:1e: + fb:22:ed:61:be:0b:0d:70:4c:50:63:26:75:15:b9: + 41:88:97:b6:f0:a0:15:bb:08:60:e0:42:e8:05:29: + 10:87:36:8a:28:65:a8:ef:31:07:74:6d:36:97:2f: + 28:46:66:04:c7:2a:79:26:7a:99:d5:8e:c3:6d:4f: + a0:5e:ad:bc:3d:91:c2:59:7b:5e:36:6c:c0:53:cf: + 00:08:32:3e:10:64:58:10:13:69:c7:0c:ee:9c:42: + 51:00:f9:05:44:ee:24:ce:7a:1f:ed:8c:11:bd:12: + a8:f3:15:f4:1c:7a:31:69:01:1b:a7:e6:5d:c0:9a: + 6c:7e:09:9e:e7:52:44:4a:10:3a:23:e4:9b:b6:03: + af:a8:9c:b4:5b:9f:d4:4b:ad:92:8c:ce:b5:11:2a: + aa:37:18:8d:b4:c2:b8:d8:5c:06:8c:f8:ff:23:bd: + 35:5e:d4:7c:3e:7e:83:0e:91:96:05:98:c3:b2:1f: + e3:c8:65:eb:a9:7b:5d:a0:2c:cc:fc:3c:d9:6d:ed: + cc:fa:4b:43:8c:c9:d4:b8:a5:61:1c:b2:40:b6:28: + 12:df:b9:f8:5f:fe:d3:b2:c9:ef:3d:b4:1e:4b:7c: + 1c:4c:99:36:9e:3d:eb:ec:a7:68:5e:1d:df:67:6e: + 5e:fb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Certificate Policies: + Policy: 2.16.840.1.114412.1.3.0.2 + CPS: http://www.digicert.com/ssl-cps-repository.htm + User Notice: + Explicit Text: + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Authority Information Access: + OCSP - URI:http://ocsp.digicert.com + + X509v3 CRL Distribution Points: + URI:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl + URI:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + X509v3 Authority Key Identifier: + keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + + X509v3 Subject Key Identifier: + 50:EA:73:89:DB:29:FB:10:8F:9E:E5:01:20:D4:DE:79:99:48:83:F7 + Signature Algorithm: sha1WithRSAEncryption + 1e:e2:a5:48:9e:6c:db:53:38:0f:ef:a6:1a:2a:ac:e2:03:43: + ed:9a:bc:3e:8e:75:1b:f0:fd:2e:22:59:ac:13:c0:61:e2:e7: + fa:e9:99:cd:87:09:75:54:28:bf:46:60:dc:be:51:2c:92:f3: + 1b:91:7c:31:08:70:e2:37:b9:c1:5b:a8:bd:a3:0b:00:fb:1a: + 15:fd:03:ad:58:6a:c5:c7:24:99:48:47:46:31:1e:92:ef:b4: + 5f:4e:34:c7:90:bf:31:c1:f8:b1:84:86:d0:9c:01:aa:df:8a: + 56:06:ce:3a:e9:0e:ae:97:74:5d:d7:71:9a:42:74:5f:de:8d: + 43:7c:de:e9:55:ed:69:00:cb:05:e0:7a:61:61:33:d1:19:4d: + f9:08:ee:a0:39:c5:25:35:b7:2b:c4:0f:b2:dd:f1:a5:b7:0e: + 24:c4:26:28:8d:79:77:f5:2f:f0:57:ba:7c:07:d4:e1:fc:cd: + 5a:30:57:7e:86:10:47:dd:31:1f:d7:fc:a2:c2:bf:30:7c:5d: + 24:aa:e8:f9:ae:5f:6a:74:c2:ce:6b:b3:46:d8:21:be:29:d4: + 8e:5e:15:d6:42:4a:e7:32:6f:a4:b1:6b:51:83:58:be:3f:6d: + c7:fb:da:03:21:cb:6a:16:19:4e:0a:f0:ad:84:ca:5d:94:b3: + 5a:76:f7:61 +-----BEGIN CERTIFICATE----- +MIIGWDCCBUCgAwIBAgIQCl8RTQNbF5EX0u/UA4w/OzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA4MDQwMjEyMDAwMFoXDTIyMDQwMzAwMDAwMFowZjEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTElMCMGA1UEAxMcRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +Q0EtMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9hCikQH17+NDdR +CPge+yLtYb4LDXBMUGMmdRW5QYiXtvCgFbsIYOBC6AUpEIc2iihlqO8xB3RtNpcv +KEZmBMcqeSZ6mdWOw21PoF6tvD2Rwll7XjZswFPPAAgyPhBkWBATaccM7pxCUQD5 +BUTuJM56H+2MEb0SqPMV9Bx6MWkBG6fmXcCabH4JnudSREoQOiPkm7YDr6ictFuf +1EutkozOtREqqjcYjbTCuNhcBoz4/yO9NV7UfD5+gw6RlgWYw7If48hl66l7XaAs +zPw82W3tzPpLQ4zJ1LilYRyyQLYoEt+5+F/+07LJ7z20Hkt8HEyZNp496+ynaF4d +32duXvsCAwEAAaOCAvowggL2MA4GA1UdDwEB/wQEAwIBhjCCAcYGA1UdIASCAb0w +ggG5MIIBtQYLYIZIAYb9bAEDAAIwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3 +LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUH +AgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQBy +AHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBj +AGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAg +AEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQ +AGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBt +AGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBj +AG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBl +AHIAZQBuAGMAZQAuMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYIKwYBBQUHAQEEKDAm +MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wgY8GA1UdHwSB +hzCBhDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGln +aEFzc3VyYW5jZUVWUm9vdENBLmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNl +cnQuY29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDAfBgNVHSME +GDAWgBSxPsNpA/i/RwHUmCYaCALvY2QrwzAdBgNVHQ4EFgQUUOpzidsp+xCPnuUB +INTeeZlIg/cwDQYJKoZIhvcNAQEFBQADggEBAB7ipUiebNtTOA/vphoqrOIDQ+2a +vD6OdRvw/S4iWawTwGHi5/rpmc2HCXVUKL9GYNy+USyS8xuRfDEIcOI3ucFbqL2j +CwD7GhX9A61YasXHJJlIR0YxHpLvtF9ONMeQvzHB+LGEhtCcAarfilYGzjrpDq6X +dF3XcZpCdF/ejUN83ulV7WkAywXgemFhM9EZTfkI7qA5xSU1tyvED7Ld8aW3DiTE +JiiNeXf1L/BXunwH1OH8zVowV36GEEfdMR/X/KLCvzB8XSSq6PmuX2p0ws5rs0bY +Ib4p1I5eFdZCSucyb6Sxa1GDWL4/bcf72gMhy2oWGU4K8K2Eyl2Us1p292E= +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1116160165 (0x428740a5) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Validity + Not Before: Oct 1 05:00:00 2006 GMT + Not After : Jul 26 18:15:15 2014 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:c6:cc:e5:73:e6:fb:d4:bb:e5:2d:2d:32:a6:df: + e5:81:3f:c9:cd:25:49:b6:71:2a:c3:d5:94:34:67: + a2:0a:1c:b0:5f:69:a6:40:b1:c4:b7:b2:8f:d0:98: + a4:a9:41:59:3a:d3:dc:94:d6:3c:db:74:38:a4:4a: + cc:4d:25:82:f7:4a:a5:53:12:38:ee:f3:49:6d:71: + 91:7e:63:b6:ab:a6:5f:c3:a4:84:f8:4f:62:51:be: + f8:c5:ec:db:38:92:e3:06:e5:08:91:0c:c4:28:41: + 55:fb:cb:5a:89:15:7e:71:e8:35:bf:4d:72:09:3d: + be:3a:38:50:5b:77:31:1b:8d:b3:c7:24:45:9a:a7: + ac:6d:00:14:5a:04:b7:ba:13:eb:51:0a:98:41:41: + 22:4e:65:61:87:81:41:50:a6:79:5c:89:de:19:4a: + 57:d5:2e:e6:5d:1c:53:2c:7e:98:cd:1a:06:16:a4: + 68:73:d0:34:04:13:5c:a1:71:d3:5a:7c:55:db:5e: + 64:e1:37:87:30:56:04:e5:11:b4:29:80:12:f1:79: + 39:88:a2:02:11:7c:27:66:b7:88:b7:78:f2:ca:0a: + a8:38:ab:0a:64:c2:bf:66:5d:95:84:c1:a1:25:1e: + 87:5d:1a:50:0b:20:12:cc:41:bb:6e:0b:51:38:b8: + 4b:cb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:1 + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication, E-mail Protection + Authority Information Access: + OCSP - URI:http://ocsp.entrust.net + + X509v3 CRL Distribution Points: + URI:http://crl.entrust.net/server1.crl + + X509v3 Subject Key Identifier: + B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + + 1.2.840.113533.7.65.0: + 0 +..V7.1.... + Signature Algorithm: sha1WithRSAEncryption + 48:0e:2b:6f:20:62:4c:28:93:a3:24:3d:58:ab:21:cf:80:f8: + 9a:97:90:6a:22:ed:5a:7c:47:36:99:e7:79:84:75:ab:24:8f: + 92:0a:d5:61:04:ae:c3:6a:5c:b2:cc:d9:e4:44:87:6f:db:8f: + 38:62:f7:44:36:9d:ba:bc:6e:07:c4:d4:8d:e8:1f:d1:0b:60: + a3:b5:9c:ce:63:be:ed:67:dc:f8:ba:de:6e:c9:25:cb:5b:b5: + 9d:76:70:0b:df:42:72:f8:4f:41:11:64:a5:d2:ea:fc:d5:af: + 11:f4:15:38:67:9c:20:a8:4b:77:5a:91:32:42:32:e7:85:b3: + df:36 +-----BEGIN CERTIFICATE----- +MIIEQjCCA6ugAwIBAgIEQodApTANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEw +MDEwNTAwMDBaFw0xNDA3MjYxODE1MTVaMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNV +BAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGzOVz5vvUu+UtLTKm3+WBP8nNJUm2cSrD +1ZQ0Z6IKHLBfaaZAscS3so/QmKSpQVk609yU1jzbdDikSsxNJYL3SqVTEjju80lt +cZF+Y7arpl/DpIT4T2JRvvjF7Ns4kuMG5QiRDMQoQVX7y1qJFX5x6DW/TXIJPb46 +OFBbdzEbjbPHJEWap6xtABRaBLe6E+tRCphBQSJOZWGHgUFQpnlcid4ZSlfVLuZd +HFMsfpjNGgYWpGhz0DQEE1yhcdNafFXbXmThN4cwVgTlEbQpgBLxeTmIogIRfCdm +t4i3ePLKCqg4qwpkwr9mXZWEwaElHoddGlALIBLMQbtuC1E4uEvLAgMBAAGjggET +MIIBDzASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwQwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdo +dHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v +Y3JsLmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMB0GA1UdDgQWBBSxPsNpA/i/RwHU +mCYaCALvY2QrwzALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7 +UISX8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEF +BQADgYEASA4rbyBiTCiToyQ9WKshz4D4mpeQaiLtWnxHNpnneYR1qySPkgrVYQSu +w2pcsszZ5ESHb9uPOGL3RDadurxuB8TUjegf0Qtgo7WczmO+7Wfc+Lrebskly1u1 +nXZwC99CcvhPQRFkpdLq/NWvEfQVOGecIKhLd1qRMkIy54Wz3zY= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-messages.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-messages.json new file mode 100644 index 0000000..09c7626 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-messages.json @@ -0,0 +1,5 @@ +{ + "install": "messages/install.txt", + "1.1.1": "messages/1.1.1.txt", + "1.2.0": "messages/1.2.0.txt" +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-packages.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-packages.json new file mode 100644 index 0000000..96945cc --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-packages.json @@ -0,0 +1,54 @@ +{ + "schema_version": "1.2", + "packages": [ + { + "name": "GitHub Example", + "description": "An example from GitHub, be sure to use the zipball URL", + "author": "John Smith", + "homepage": "http://example.com", + "last_modified": "2011-12-12 05:04:31", + "platforms": { + "*": [ + { + "version": "1.1", + "url": "http://nodeload.github.com/john_smith/github_example/zipball/master" + } + ] + } + }, + { + "name": "BitBucket Example", + "description": "An example from BitBucket, be sure to use the zip URL", + "author": "John Smith", + "homepage": "http://example.com", + "last_modified": "2011-08-12 12:21:09", + "platforms": { + "*": [ + { + "version": "1.0", + "url": "https://bitbucket.org/john_smith/bitbucket_example/get/tip.zip" + } + ] + } + }, + { + "name": "Tortoise", + "description": "Keyboard shortcuts and menu entries to execute TortoiseSVN, TortoiseHg and TortoiseGit commands", + "author": "Will Bond", + "homepage": "http://sublime.wbond.net", + "last_modified": "2011-11-30 22:55:52", + "platforms": { + "windows": [ + { + "version": "1.0", + "url": "http://sublime.wbond.net/Tortoise.sublime-package" + } + ] + } + } + ], + "renamed_packages": { + "sublime-old-package": "NewPackage", + "OldPackage": "NewName" + } +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-repositories.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-repositories.json new file mode 100644 index 0000000..9e03b1e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-repositories.json @@ -0,0 +1,60 @@ +{ + "schema_version": "1.2", + "repositories": [ + "http://sublime.wbond.net/packages.json", + "https://github.com/buymeasoda/soda-theme", + "https://github.com/SublimeText" + ], + "package_name_map": { + "soda-theme": "Theme - Soda" + }, + "renamed_packages": { + "old-name": "New Name" + }, + "packages": { + "http://sublime.wbond.net/packages.json": [ + { + "name": "GitHub Example", + "description": "An example from GitHub, be sure to use the zipball URL", + "author": "John Smith", + "homepage": "http://example.com", + "platforms": { + "*": [ + { + "version": "1.1", + "url": "http://nodeload.github.com/john_smith/github_example/zipball/master" + } + ] + } + }, + { + "name": "BitBucket Example", + "description": "An example from BitBucket, be sure to use the zip URL", + "author": "John Smith", + "homepage": "http://example.com", + "platforms": { + "*": [ + { + "version": "1.0", + "url": "https://bitbucket.org/john_smith/bitbucket_example/get/tip.zip" + } + ] + } + }, + { + "name": "Tortoise", + "description": "Keyboard shortcuts and menu entries to execute TortoiseSVN, TortoiseHg and TortoiseGit commands", + "author": "Will Bond", + "homepage": "http://sublime.wbond.net", + "platforms": { + "windows": [ + { + "version": "1.0", + "url": "http://sublime.wbond.net/Tortoise.sublime-package" + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/all/semver.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/all/semver.py new file mode 100644 index 0000000..73d4ea2 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/all/semver.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +# This code is copyright Konstantine Rybnikov , and is +# available at https://github.com/k-bx/python-semver and is licensed under the +# BSD License + +import re + +_REGEX = re.compile('^(?P[0-9]+)' + '\.(?P[0-9]+)' + '\.(?P[0-9]+)' + '(\-(?P[0-9A-Za-z]+(\.[0-9A-Za-z]+)*))?' + '(\+(?P[0-9A-Za-z]+(\.[0-9A-Za-z]+)*))?$') + +if 'cmp' not in __builtins__: + cmp = lambda a,b: (a > b) - (a < b) + +def parse(version): + """ + Parse version to major, minor, patch, pre-release, build parts. + """ + match = _REGEX.match(version) + if match is None: + raise ValueError('%s is not valid SemVer string' % version) + + verinfo = match.groupdict() + + verinfo['major'] = int(verinfo['major']) + verinfo['minor'] = int(verinfo['minor']) + verinfo['patch'] = int(verinfo['patch']) + + return verinfo + + +def compare(ver1, ver2): + def nat_cmp(a, b): + a, b = a or '', b or '' + convert = lambda text: text.isdigit() and int(text) or text.lower() + alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] + return cmp(alphanum_key(a), alphanum_key(b)) + + def compare_by_keys(d1, d2): + for key in ['major', 'minor', 'patch']: + v = cmp(d1.get(key), d2.get(key)) + if v: + return v + rc1, rc2 = d1.get('prerelease'), d2.get('prerelease') + build1, build2 = d1.get('build'), d2.get('build') + rccmp = nat_cmp(rc1, rc2) + buildcmp = nat_cmp(build1, build2) + if not (rc1 or rc2): + return buildcmp + elif not rc1: + return 1 + elif not rc2: + return -1 + return rccmp or buildcmp or 0 + + v1, v2 = parse(ver1), parse(ver2) + + return compare_by_keys(v1, v2) + + +def match(version, match_expr): + prefix = match_expr[:2] + if prefix in ('>=', '<=', '=='): + match_version = match_expr[2:] + elif prefix and prefix[0] in ('>', '<', '='): + prefix = prefix[0] + match_version = match_expr[1:] + else: + raise ValueError("match_expr parameter should be in format , " + "where is one of ['<', '>', '==', '<=', '>=']. " + "You provided: %r" % match_expr) + + possibilities_dict = { + '>': (1,), + '<': (-1,), + '==': (0,), + '>=': (0, 1), + '<=': (-1, 0) + } + + possibilities = possibilities_dict[prefix] + cmp_res = compare(version, match_version) + + return cmp_res in possibilities \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/U32.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/U32.py new file mode 100644 index 0000000..7b3e4c8 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/U32.py @@ -0,0 +1,113 @@ +# This file is part of 'NTLM Authorization Proxy Server' http://sourceforge.net/projects/ntlmaps/ +# Copyright 2001 Dmitry A. Rozmanov +# +# This library is free software: you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation, either +# version 3 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see or . + + +C = 0x1000000000L + +def norm(n): + return n & 0xFFFFFFFFL + + +class U32: + v = 0L + + def __init__(self, value = 0): + self.v = C + norm(abs(long(value))) + + def set(self, value = 0): + self.v = C + norm(abs(long(value))) + + def __repr__(self): + return hex(norm(self.v)) + + def __long__(self): return long(norm(self.v)) + def __int__(self): return int(norm(self.v)) + def __chr__(self): return chr(norm(self.v)) + + def __add__(self, b): + r = U32() + r.v = C + norm(self.v + b.v) + return r + + def __sub__(self, b): + r = U32() + if self.v < b.v: + r.v = C + norm(0x100000000L - (b.v - self.v)) + else: r.v = C + norm(self.v - b.v) + return r + + def __mul__(self, b): + r = U32() + r.v = C + norm(self.v * b.v) + return r + + def __div__(self, b): + r = U32() + r.v = C + (norm(self.v) / norm(b.v)) + return r + + def __mod__(self, b): + r = U32() + r.v = C + (norm(self.v) % norm(b.v)) + return r + + def __neg__(self): return U32(self.v) + def __pos__(self): return U32(self.v) + def __abs__(self): return U32(self.v) + + def __invert__(self): + r = U32() + r.v = C + norm(~self.v) + return r + + def __lshift__(self, b): + r = U32() + r.v = C + norm(self.v << b) + return r + + def __rshift__(self, b): + r = U32() + r.v = C + (norm(self.v) >> b) + return r + + def __and__(self, b): + r = U32() + r.v = C + norm(self.v & b.v) + return r + + def __or__(self, b): + r = U32() + r.v = C + norm(self.v | b.v) + return r + + def __xor__(self, b): + r = U32() + r.v = C + norm(self.v ^ b.v) + return r + + def __not__(self): + return U32(not norm(self.v)) + + def truth(self): + return norm(self.v) + + def __cmp__(self, b): + if norm(self.v) > norm(b.v): return 1 + elif norm(self.v) < norm(b.v): return -1 + else: return 0 + + def __nonzero__(self): + return norm(self.v) \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/__init__.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des.py new file mode 100644 index 0000000..6a59964 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des.py @@ -0,0 +1,92 @@ +# This file is part of 'NTLM Authorization Proxy Server' http://sourceforge.net/projects/ntlmaps/ +# Copyright 2001 Dmitry A. Rozmanov +# +# This library is free software: you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation, either +# version 3 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see or . + +import des_c + +#--------------------------------------------------------------------- +class DES: + + des_c_obj = None + + #----------------------------------------------------------------- + def __init__(self, key_str): + "" + k = str_to_key56(key_str) + k = key56_to_key64(k) + key_str = '' + for i in k: + key_str += chr(i & 0xFF) + self.des_c_obj = des_c.DES(key_str) + + #----------------------------------------------------------------- + def encrypt(self, plain_text): + "" + return self.des_c_obj.encrypt(plain_text) + + #----------------------------------------------------------------- + def decrypt(self, crypted_text): + "" + return self.des_c_obj.decrypt(crypted_text) + +#--------------------------------------------------------------------- +#Some Helpers +#--------------------------------------------------------------------- + +DESException = 'DESException' + +#--------------------------------------------------------------------- +def str_to_key56(key_str): + "" + if type(key_str) != type(''): + #rise DESException, 'ERROR. Wrong key type.' + pass + if len(key_str) < 7: + key_str = key_str + '\000\000\000\000\000\000\000'[:(7 - len(key_str))] + key_56 = [] + for i in key_str[:7]: key_56.append(ord(i)) + + return key_56 + +#--------------------------------------------------------------------- +def key56_to_key64(key_56): + "" + key = [] + for i in range(8): key.append(0) + + key[0] = key_56[0]; + key[1] = ((key_56[0] << 7) & 0xFF) | (key_56[1] >> 1); + key[2] = ((key_56[1] << 6) & 0xFF) | (key_56[2] >> 2); + key[3] = ((key_56[2] << 5) & 0xFF) | (key_56[3] >> 3); + key[4] = ((key_56[3] << 4) & 0xFF) | (key_56[4] >> 4); + key[5] = ((key_56[4] << 3) & 0xFF) | (key_56[5] >> 5); + key[6] = ((key_56[5] << 2) & 0xFF) | (key_56[6] >> 6); + key[7] = (key_56[6] << 1) & 0xFF; + + key = set_key_odd_parity(key) + + return key + +#--------------------------------------------------------------------- +def set_key_odd_parity(key): + "" + for i in range(len(key)): + for k in range(7): + bit = 0 + t = key[i] >> k + bit = (t ^ bit) & 0x1 + key[i] = (key[i] & 0xFE) | bit + + return key diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_c.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_c.py new file mode 100644 index 0000000..61af403 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_c.py @@ -0,0 +1,328 @@ +# This file is part of 'NTLM Authorization Proxy Server' http://sourceforge.net/projects/ntlmaps/ +# Copyright 2001 Dmitry A. Rozmanov +# +# This library is free software: you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation, either +# version 3 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see or . + +from U32 import U32 + +# --NON ASCII COMMENT ELIDED-- +#typedef unsigned char des_cblock[8]; +#define HDRSIZE 4 + +def c2l(c): + "char[4] to unsigned long" + l = U32(c[0]) + l = l | (U32(c[1]) << 8) + l = l | (U32(c[2]) << 16) + l = l | (U32(c[3]) << 24) + return l + +def c2ln(c,l1,l2,n): + "char[n] to two unsigned long???" + c = c + n + l1, l2 = U32(0), U32(0) + + f = 0 + if n == 8: + l2 = l2 | (U32(c[7]) << 24) + f = 1 + if f or (n == 7): + l2 = l2 | (U32(c[6]) << 16) + f = 1 + if f or (n == 6): + l2 = l2 | (U32(c[5]) << 8) + f = 1 + if f or (n == 5): + l2 = l2 | U32(c[4]) + f = 1 + if f or (n == 4): + l1 = l1 | (U32(c[3]) << 24) + f = 1 + if f or (n == 3): + l1 = l1 | (U32(c[2]) << 16) + f = 1 + if f or (n == 2): + l1 = l1 | (U32(c[1]) << 8) + f = 1 + if f or (n == 1): + l1 = l1 | U32(c[0]) + return (l1, l2) + +def l2c(l): + "unsigned long to char[4]" + c = [] + c.append(int(l & U32(0xFF))) + c.append(int((l >> 8) & U32(0xFF))) + c.append(int((l >> 16) & U32(0xFF))) + c.append(int((l >> 24) & U32(0xFF))) + return c + +def n2l(c, l): + "network to host long" + l = U32(c[0] << 24) + l = l | (U32(c[1]) << 16) + l = l | (U32(c[2]) << 8) + l = l | (U32(c[3])) + return l + +def l2n(l, c): + "host to network long" + c = [] + c.append(int((l >> 24) & U32(0xFF))) + c.append(int((l >> 16) & U32(0xFF))) + c.append(int((l >> 8) & U32(0xFF))) + c.append(int((l ) & U32(0xFF))) + return c + +def l2cn(l1, l2, c, n): + "" + for i in range(n): c.append(0x00) + f = 0 + if f or (n == 8): + c[7] = int((l2 >> 24) & U32(0xFF)) + f = 1 + if f or (n == 7): + c[6] = int((l2 >> 16) & U32(0xFF)) + f = 1 + if f or (n == 6): + c[5] = int((l2 >> 8) & U32(0xFF)) + f = 1 + if f or (n == 5): + c[4] = int((l2 ) & U32(0xFF)) + f = 1 + if f or (n == 4): + c[3] = int((l1 >> 24) & U32(0xFF)) + f = 1 + if f or (n == 3): + c[2] = int((l1 >> 16) & U32(0xFF)) + f = 1 + if f or (n == 2): + c[1] = int((l1 >> 8) & U32(0xFF)) + f = 1 + if f or (n == 1): + c[0] = int((l1 ) & U32(0xFF)) + f = 1 + return c[:n] + +# array of data +# static unsigned long des_SPtrans[8][64]={ +# static unsigned long des_skb[8][64]={ +from des_data import des_SPtrans, des_skb + +def D_ENCRYPT(tup, u, t, s): + L, R, S = tup + #print 'LRS1', L, R, S, u, t, '-->', + u = (R ^ s[S]) + t = R ^ s[S + 1] + t = ((t >> 4) + (t << 28)) + L = L ^ (des_SPtrans[1][int((t ) & U32(0x3f))] | \ + des_SPtrans[3][int((t >> 8) & U32(0x3f))] | \ + des_SPtrans[5][int((t >> 16) & U32(0x3f))] | \ + des_SPtrans[7][int((t >> 24) & U32(0x3f))] | \ + des_SPtrans[0][int((u ) & U32(0x3f))] | \ + des_SPtrans[2][int((u >> 8) & U32(0x3f))] | \ + des_SPtrans[4][int((u >> 16) & U32(0x3f))] | \ + des_SPtrans[6][int((u >> 24) & U32(0x3f))]) + #print 'LRS:', L, R, S, u, t + return ((L, R, S), u, t, s) + + +def PERM_OP (tup, n, m): + "tup - (a, b, t)" + a, b, t = tup + t = ((a >> n) ^ b) & m + b = b ^ t + a = a ^ (t << n) + return (a, b, t) + +def HPERM_OP (tup, n, m): + "tup - (a, t)" + a, t = tup + t = ((a << (16 - n)) ^ a) & m + a = a ^ t ^ (t >> (16 - n)) + return (a, t) + +shifts2 = [0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0] + +class DES: + KeySched = None # des_key_schedule + + def __init__(self, key_str): + # key - UChar[8] + key = [] + for i in key_str: key.append(ord(i)) + #print 'key:', key + self.KeySched = des_set_key(key) + #print 'schedule:', self.KeySched, len(self.KeySched) + + def decrypt(self, str): + # block - UChar[] + block = [] + for i in str: block.append(ord(i)) + #print block + block = des_ecb_encrypt(block, self.KeySched, 0) + res = '' + for i in block: res = res + (chr(i)) + return res + + def encrypt(self, str): + # block - UChar[] + block = [] + for i in str: block.append(ord(i)) + block = des_ecb_encrypt(block, self.KeySched, 1) + res = '' + for i in block: res = res + (chr(i)) + return res + + + + + + +#------------------------ +def des_encript(input, ks, encrypt): + # input - U32[] + # output - U32[] + # ks - des_key_shedule - U32[2][16] + # encrypt - int + # l, r, t, u - U32 + # i - int + # s - U32[] + + l = input[0] + r = input[1] + t = U32(0) + u = U32(0) + + r, l, t = PERM_OP((r, l, t), 4, U32(0x0f0f0f0fL)) + l, r, t = PERM_OP((l, r, t), 16, U32(0x0000ffffL)) + r, l, t = PERM_OP((r, l, t), 2, U32(0x33333333L)) + l, r, t = PERM_OP((l, r, t), 8, U32(0x00ff00ffL)) + r, l, t = PERM_OP((r, l, t), 1, U32(0x55555555L)) + + t = (r << 1)|(r >> 31) + r = (l << 1)|(l >> 31) + l = t + + s = ks # ??????????????? + #print l, r + if(encrypt): + for i in range(0, 32, 4): + rtup, u, t, s = D_ENCRYPT((l, r, i + 0), u, t, s) + l = rtup[0] + r = rtup[1] + rtup, u, t, s = D_ENCRYPT((r, l, i + 2), u, t, s) + r = rtup[0] + l = rtup[1] + else: + for i in range(30, 0, -4): + rtup, u, t, s = D_ENCRYPT((l, r, i - 0), u, t, s) + l = rtup[0] + r = rtup[1] + rtup, u, t, s = D_ENCRYPT((r, l, i - 2), u, t, s) + r = rtup[0] + l = rtup[1] + #print l, r + l = (l >> 1)|(l << 31) + r = (r >> 1)|(r << 31) + + r, l, t = PERM_OP((r, l, t), 1, U32(0x55555555L)) + l, r, t = PERM_OP((l, r, t), 8, U32(0x00ff00ffL)) + r, l, t = PERM_OP((r, l, t), 2, U32(0x33333333L)) + l, r, t = PERM_OP((l, r, t), 16, U32(0x0000ffffL)) + r, l, t = PERM_OP((r, l, t), 4, U32(0x0f0f0f0fL)) + + output = [l] + output.append(r) + l, r, t, u = U32(0), U32(0), U32(0), U32(0) + return output + +def des_ecb_encrypt(input, ks, encrypt): + # input - des_cblock - UChar[8] + # output - des_cblock - UChar[8] + # ks - des_key_shedule - U32[2][16] + # encrypt - int + + #print input + l0 = c2l(input[0:4]) + l1 = c2l(input[4:8]) + ll = [l0] + ll.append(l1) + #print ll + ll = des_encript(ll, ks, encrypt) + #print ll + l0 = ll[0] + l1 = ll[1] + output = l2c(l0) + output = output + l2c(l1) + #print output + l0, l1, ll[0], ll[1] = U32(0), U32(0), U32(0), U32(0) + return output + +def des_set_key(key): + # key - des_cblock - UChar[8] + # schedule - des_key_schedule + + # register unsigned long c,d,t,s; + # register unsigned char *in; + # register unsigned long *k; + # register int i; + + #k = schedule + # in = key + + k = [] + c = c2l(key[0:4]) + d = c2l(key[4:8]) + t = U32(0) + + d, c, t = PERM_OP((d, c, t), 4, U32(0x0f0f0f0fL)) + c, t = HPERM_OP((c, t), -2, U32(0xcccc0000L)) + d, t = HPERM_OP((d, t), -2, U32(0xcccc0000L)) + d, c, t = PERM_OP((d, c, t), 1, U32(0x55555555L)) + c, d, t = PERM_OP((c, d, t), 8, U32(0x00ff00ffL)) + d, c, t = PERM_OP((d, c, t), 1, U32(0x55555555L)) + + d = (((d & U32(0x000000ffL)) << 16)|(d & U32(0x0000ff00L))|((d & U32(0x00ff0000L)) >> 16)|((c & U32(0xf0000000L)) >> 4)) + c = c & U32(0x0fffffffL) + + for i in range(16): + if (shifts2[i]): + c = ((c >> 2)|(c << 26)) + d = ((d >> 2)|(d << 26)) + else: + c = ((c >> 1)|(c << 27)) + d = ((d >> 1)|(d << 27)) + c = c & U32(0x0fffffffL) + d = d & U32(0x0fffffffL) + + s= des_skb[0][int((c ) & U32(0x3f))]|\ + des_skb[1][int(((c>> 6) & U32(0x03))|((c>> 7) & U32(0x3c)))]|\ + des_skb[2][int(((c>>13) & U32(0x0f))|((c>>14) & U32(0x30)))]|\ + des_skb[3][int(((c>>20) & U32(0x01))|((c>>21) & U32(0x06)) | ((c>>22) & U32(0x38)))] + + t= des_skb[4][int((d ) & U32(0x3f) )]|\ + des_skb[5][int(((d>> 7) & U32(0x03))|((d>> 8) & U32(0x3c)))]|\ + des_skb[6][int((d>>15) & U32(0x3f) )]|\ + des_skb[7][int(((d>>21) & U32(0x0f))|((d>>22) & U32(0x30)))] + #print s, t + + k.append(((t << 16)|(s & U32(0x0000ffffL))) & U32(0xffffffffL)) + s = ((s >> 16)|(t & U32(0xffff0000L))) + s = (s << 4)|(s >> 28) + k.append(s & U32(0xffffffffL)) + + schedule = k + + return schedule diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_data.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_data.py new file mode 100644 index 0000000..9867876 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_data.py @@ -0,0 +1,348 @@ +# This file is part of 'NTLM Authorization Proxy Server' http://sourceforge.net/projects/ntlmaps/ +# Copyright 2001 Dmitry A. Rozmanov +# +# This library is free software: you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation, either +# version 3 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see or . + +from U32 import U32 + +# static unsigned long des_SPtrans[8][64]={ + +des_SPtrans =\ +[ +#nibble 0 +[ +U32(0x00820200L), U32(0x00020000L), U32(0x80800000L), U32(0x80820200L), +U32(0x00800000L), U32(0x80020200L), U32(0x80020000L), U32(0x80800000L), +U32(0x80020200L), U32(0x00820200L), U32(0x00820000L), U32(0x80000200L), +U32(0x80800200L), U32(0x00800000L), U32(0x00000000L), U32(0x80020000L), +U32(0x00020000L), U32(0x80000000L), U32(0x00800200L), U32(0x00020200L), +U32(0x80820200L), U32(0x00820000L), U32(0x80000200L), U32(0x00800200L), +U32(0x80000000L), U32(0x00000200L), U32(0x00020200L), U32(0x80820000L), +U32(0x00000200L), U32(0x80800200L), U32(0x80820000L), U32(0x00000000L), +U32(0x00000000L), U32(0x80820200L), U32(0x00800200L), U32(0x80020000L), +U32(0x00820200L), U32(0x00020000L), U32(0x80000200L), U32(0x00800200L), +U32(0x80820000L), U32(0x00000200L), U32(0x00020200L), U32(0x80800000L), +U32(0x80020200L), U32(0x80000000L), U32(0x80800000L), U32(0x00820000L), +U32(0x80820200L), U32(0x00020200L), U32(0x00820000L), U32(0x80800200L), +U32(0x00800000L), U32(0x80000200L), U32(0x80020000L), U32(0x00000000L), +U32(0x00020000L), U32(0x00800000L), U32(0x80800200L), U32(0x00820200L), +U32(0x80000000L), U32(0x80820000L), U32(0x00000200L), U32(0x80020200L), +], + +#nibble 1 +[ +U32(0x10042004L), U32(0x00000000L), U32(0x00042000L), U32(0x10040000L), +U32(0x10000004L), U32(0x00002004L), U32(0x10002000L), U32(0x00042000L), +U32(0x00002000L), U32(0x10040004L), U32(0x00000004L), U32(0x10002000L), +U32(0x00040004L), U32(0x10042000L), U32(0x10040000L), U32(0x00000004L), +U32(0x00040000L), U32(0x10002004L), U32(0x10040004L), U32(0x00002000L), +U32(0x00042004L), U32(0x10000000L), U32(0x00000000L), U32(0x00040004L), +U32(0x10002004L), U32(0x00042004L), U32(0x10042000L), U32(0x10000004L), +U32(0x10000000L), U32(0x00040000L), U32(0x00002004L), U32(0x10042004L), +U32(0x00040004L), U32(0x10042000L), U32(0x10002000L), U32(0x00042004L), +U32(0x10042004L), U32(0x00040004L), U32(0x10000004L), U32(0x00000000L), +U32(0x10000000L), U32(0x00002004L), U32(0x00040000L), U32(0x10040004L), +U32(0x00002000L), U32(0x10000000L), U32(0x00042004L), U32(0x10002004L), +U32(0x10042000L), U32(0x00002000L), U32(0x00000000L), U32(0x10000004L), +U32(0x00000004L), U32(0x10042004L), U32(0x00042000L), U32(0x10040000L), +U32(0x10040004L), U32(0x00040000L), U32(0x00002004L), U32(0x10002000L), +U32(0x10002004L), U32(0x00000004L), U32(0x10040000L), U32(0x00042000L), +], + +#nibble 2 +[ +U32(0x41000000L), U32(0x01010040L), U32(0x00000040L), U32(0x41000040L), +U32(0x40010000L), U32(0x01000000L), U32(0x41000040L), U32(0x00010040L), +U32(0x01000040L), U32(0x00010000L), U32(0x01010000L), U32(0x40000000L), +U32(0x41010040L), U32(0x40000040L), U32(0x40000000L), U32(0x41010000L), +U32(0x00000000L), U32(0x40010000L), U32(0x01010040L), U32(0x00000040L), +U32(0x40000040L), U32(0x41010040L), U32(0x00010000L), U32(0x41000000L), +U32(0x41010000L), U32(0x01000040L), U32(0x40010040L), U32(0x01010000L), +U32(0x00010040L), U32(0x00000000L), U32(0x01000000L), U32(0x40010040L), +U32(0x01010040L), U32(0x00000040L), U32(0x40000000L), U32(0x00010000L), +U32(0x40000040L), U32(0x40010000L), U32(0x01010000L), U32(0x41000040L), +U32(0x00000000L), U32(0x01010040L), U32(0x00010040L), U32(0x41010000L), +U32(0x40010000L), U32(0x01000000L), U32(0x41010040L), U32(0x40000000L), +U32(0x40010040L), U32(0x41000000L), U32(0x01000000L), U32(0x41010040L), +U32(0x00010000L), U32(0x01000040L), U32(0x41000040L), U32(0x00010040L), +U32(0x01000040L), U32(0x00000000L), U32(0x41010000L), U32(0x40000040L), +U32(0x41000000L), U32(0x40010040L), U32(0x00000040L), U32(0x01010000L), +], + +#nibble 3 +[ +U32(0x00100402L), U32(0x04000400L), U32(0x00000002L), U32(0x04100402L), +U32(0x00000000L), U32(0x04100000L), U32(0x04000402L), U32(0x00100002L), +U32(0x04100400L), U32(0x04000002L), U32(0x04000000L), U32(0x00000402L), +U32(0x04000002L), U32(0x00100402L), U32(0x00100000L), U32(0x04000000L), +U32(0x04100002L), U32(0x00100400L), U32(0x00000400L), U32(0x00000002L), +U32(0x00100400L), U32(0x04000402L), U32(0x04100000L), U32(0x00000400L), +U32(0x00000402L), U32(0x00000000L), U32(0x00100002L), U32(0x04100400L), +U32(0x04000400L), U32(0x04100002L), U32(0x04100402L), U32(0x00100000L), +U32(0x04100002L), U32(0x00000402L), U32(0x00100000L), U32(0x04000002L), +U32(0x00100400L), U32(0x04000400L), U32(0x00000002L), U32(0x04100000L), +U32(0x04000402L), U32(0x00000000L), U32(0x00000400L), U32(0x00100002L), +U32(0x00000000L), U32(0x04100002L), U32(0x04100400L), U32(0x00000400L), +U32(0x04000000L), U32(0x04100402L), U32(0x00100402L), U32(0x00100000L), +U32(0x04100402L), U32(0x00000002L), U32(0x04000400L), U32(0x00100402L), +U32(0x00100002L), U32(0x00100400L), U32(0x04100000L), U32(0x04000402L), +U32(0x00000402L), U32(0x04000000L), U32(0x04000002L), U32(0x04100400L), +], + +#nibble 4 +[ +U32(0x02000000L), U32(0x00004000L), U32(0x00000100L), U32(0x02004108L), +U32(0x02004008L), U32(0x02000100L), U32(0x00004108L), U32(0x02004000L), +U32(0x00004000L), U32(0x00000008L), U32(0x02000008L), U32(0x00004100L), +U32(0x02000108L), U32(0x02004008L), U32(0x02004100L), U32(0x00000000L), +U32(0x00004100L), U32(0x02000000L), U32(0x00004008L), U32(0x00000108L), +U32(0x02000100L), U32(0x00004108L), U32(0x00000000L), U32(0x02000008L), +U32(0x00000008L), U32(0x02000108L), U32(0x02004108L), U32(0x00004008L), +U32(0x02004000L), U32(0x00000100L), U32(0x00000108L), U32(0x02004100L), +U32(0x02004100L), U32(0x02000108L), U32(0x00004008L), U32(0x02004000L), +U32(0x00004000L), U32(0x00000008L), U32(0x02000008L), U32(0x02000100L), +U32(0x02000000L), U32(0x00004100L), U32(0x02004108L), U32(0x00000000L), +U32(0x00004108L), U32(0x02000000L), U32(0x00000100L), U32(0x00004008L), +U32(0x02000108L), U32(0x00000100L), U32(0x00000000L), U32(0x02004108L), +U32(0x02004008L), U32(0x02004100L), U32(0x00000108L), U32(0x00004000L), +U32(0x00004100L), U32(0x02004008L), U32(0x02000100L), U32(0x00000108L), +U32(0x00000008L), U32(0x00004108L), U32(0x02004000L), U32(0x02000008L), +], + +#nibble 5 +[ +U32(0x20000010L), U32(0x00080010L), U32(0x00000000L), U32(0x20080800L), +U32(0x00080010L), U32(0x00000800L), U32(0x20000810L), U32(0x00080000L), +U32(0x00000810L), U32(0x20080810L), U32(0x00080800L), U32(0x20000000L), +U32(0x20000800L), U32(0x20000010L), U32(0x20080000L), U32(0x00080810L), +U32(0x00080000L), U32(0x20000810L), U32(0x20080010L), U32(0x00000000L), +U32(0x00000800L), U32(0x00000010L), U32(0x20080800L), U32(0x20080010L), +U32(0x20080810L), U32(0x20080000L), U32(0x20000000L), U32(0x00000810L), +U32(0x00000010L), U32(0x00080800L), U32(0x00080810L), U32(0x20000800L), +U32(0x00000810L), U32(0x20000000L), U32(0x20000800L), U32(0x00080810L), +U32(0x20080800L), U32(0x00080010L), U32(0x00000000L), U32(0x20000800L), +U32(0x20000000L), U32(0x00000800L), U32(0x20080010L), U32(0x00080000L), +U32(0x00080010L), U32(0x20080810L), U32(0x00080800L), U32(0x00000010L), +U32(0x20080810L), U32(0x00080800L), U32(0x00080000L), U32(0x20000810L), +U32(0x20000010L), U32(0x20080000L), U32(0x00080810L), U32(0x00000000L), +U32(0x00000800L), U32(0x20000010L), U32(0x20000810L), U32(0x20080800L), +U32(0x20080000L), U32(0x00000810L), U32(0x00000010L), U32(0x20080010L), +], + +#nibble 6 +[ +U32(0x00001000L), U32(0x00000080L), U32(0x00400080L), U32(0x00400001L), +U32(0x00401081L), U32(0x00001001L), U32(0x00001080L), U32(0x00000000L), +U32(0x00400000L), U32(0x00400081L), U32(0x00000081L), U32(0x00401000L), +U32(0x00000001L), U32(0x00401080L), U32(0x00401000L), U32(0x00000081L), +U32(0x00400081L), U32(0x00001000L), U32(0x00001001L), U32(0x00401081L), +U32(0x00000000L), U32(0x00400080L), U32(0x00400001L), U32(0x00001080L), +U32(0x00401001L), U32(0x00001081L), U32(0x00401080L), U32(0x00000001L), +U32(0x00001081L), U32(0x00401001L), U32(0x00000080L), U32(0x00400000L), +U32(0x00001081L), U32(0x00401000L), U32(0x00401001L), U32(0x00000081L), +U32(0x00001000L), U32(0x00000080L), U32(0x00400000L), U32(0x00401001L), +U32(0x00400081L), U32(0x00001081L), U32(0x00001080L), U32(0x00000000L), +U32(0x00000080L), U32(0x00400001L), U32(0x00000001L), U32(0x00400080L), +U32(0x00000000L), U32(0x00400081L), U32(0x00400080L), U32(0x00001080L), +U32(0x00000081L), U32(0x00001000L), U32(0x00401081L), U32(0x00400000L), +U32(0x00401080L), U32(0x00000001L), U32(0x00001001L), U32(0x00401081L), +U32(0x00400001L), U32(0x00401080L), U32(0x00401000L), U32(0x00001001L), +], + +#nibble 7 +[ +U32(0x08200020L), U32(0x08208000L), U32(0x00008020L), U32(0x00000000L), +U32(0x08008000L), U32(0x00200020L), U32(0x08200000L), U32(0x08208020L), +U32(0x00000020L), U32(0x08000000L), U32(0x00208000L), U32(0x00008020L), +U32(0x00208020L), U32(0x08008020L), U32(0x08000020L), U32(0x08200000L), +U32(0x00008000L), U32(0x00208020L), U32(0x00200020L), U32(0x08008000L), +U32(0x08208020L), U32(0x08000020L), U32(0x00000000L), U32(0x00208000L), +U32(0x08000000L), U32(0x00200000L), U32(0x08008020L), U32(0x08200020L), +U32(0x00200000L), U32(0x00008000L), U32(0x08208000L), U32(0x00000020L), +U32(0x00200000L), U32(0x00008000L), U32(0x08000020L), U32(0x08208020L), +U32(0x00008020L), U32(0x08000000L), U32(0x00000000L), U32(0x00208000L), +U32(0x08200020L), U32(0x08008020L), U32(0x08008000L), U32(0x00200020L), +U32(0x08208000L), U32(0x00000020L), U32(0x00200020L), U32(0x08008000L), +U32(0x08208020L), U32(0x00200000L), U32(0x08200000L), U32(0x08000020L), +U32(0x00208000L), U32(0x00008020L), U32(0x08008020L), U32(0x08200000L), +U32(0x00000020L), U32(0x08208000L), U32(0x00208020L), U32(0x00000000L), +U32(0x08000000L), U32(0x08200020L), U32(0x00008000L), U32(0x00208020L), +], +] + +#static unsigned long des_skb[8][64]={ + +des_skb = \ +[ +#for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 +[ +U32(0x00000000L),U32(0x00000010L),U32(0x20000000L),U32(0x20000010L), +U32(0x00010000L),U32(0x00010010L),U32(0x20010000L),U32(0x20010010L), +U32(0x00000800L),U32(0x00000810L),U32(0x20000800L),U32(0x20000810L), +U32(0x00010800L),U32(0x00010810L),U32(0x20010800L),U32(0x20010810L), +U32(0x00000020L),U32(0x00000030L),U32(0x20000020L),U32(0x20000030L), +U32(0x00010020L),U32(0x00010030L),U32(0x20010020L),U32(0x20010030L), +U32(0x00000820L),U32(0x00000830L),U32(0x20000820L),U32(0x20000830L), +U32(0x00010820L),U32(0x00010830L),U32(0x20010820L),U32(0x20010830L), +U32(0x00080000L),U32(0x00080010L),U32(0x20080000L),U32(0x20080010L), +U32(0x00090000L),U32(0x00090010L),U32(0x20090000L),U32(0x20090010L), +U32(0x00080800L),U32(0x00080810L),U32(0x20080800L),U32(0x20080810L), +U32(0x00090800L),U32(0x00090810L),U32(0x20090800L),U32(0x20090810L), +U32(0x00080020L),U32(0x00080030L),U32(0x20080020L),U32(0x20080030L), +U32(0x00090020L),U32(0x00090030L),U32(0x20090020L),U32(0x20090030L), +U32(0x00080820L),U32(0x00080830L),U32(0x20080820L),U32(0x20080830L), +U32(0x00090820L),U32(0x00090830L),U32(0x20090820L),U32(0x20090830L), +], + +#for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 +[ +U32(0x00000000L),U32(0x02000000L),U32(0x00002000L),U32(0x02002000L), +U32(0x00200000L),U32(0x02200000L),U32(0x00202000L),U32(0x02202000L), +U32(0x00000004L),U32(0x02000004L),U32(0x00002004L),U32(0x02002004L), +U32(0x00200004L),U32(0x02200004L),U32(0x00202004L),U32(0x02202004L), +U32(0x00000400L),U32(0x02000400L),U32(0x00002400L),U32(0x02002400L), +U32(0x00200400L),U32(0x02200400L),U32(0x00202400L),U32(0x02202400L), +U32(0x00000404L),U32(0x02000404L),U32(0x00002404L),U32(0x02002404L), +U32(0x00200404L),U32(0x02200404L),U32(0x00202404L),U32(0x02202404L), +U32(0x10000000L),U32(0x12000000L),U32(0x10002000L),U32(0x12002000L), +U32(0x10200000L),U32(0x12200000L),U32(0x10202000L),U32(0x12202000L), +U32(0x10000004L),U32(0x12000004L),U32(0x10002004L),U32(0x12002004L), +U32(0x10200004L),U32(0x12200004L),U32(0x10202004L),U32(0x12202004L), +U32(0x10000400L),U32(0x12000400L),U32(0x10002400L),U32(0x12002400L), +U32(0x10200400L),U32(0x12200400L),U32(0x10202400L),U32(0x12202400L), +U32(0x10000404L),U32(0x12000404L),U32(0x10002404L),U32(0x12002404L), +U32(0x10200404L),U32(0x12200404L),U32(0x10202404L),U32(0x12202404L), +], + +#for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 +[ +U32(0x00000000L),U32(0x00000001L),U32(0x00040000L),U32(0x00040001L), +U32(0x01000000L),U32(0x01000001L),U32(0x01040000L),U32(0x01040001L), +U32(0x00000002L),U32(0x00000003L),U32(0x00040002L),U32(0x00040003L), +U32(0x01000002L),U32(0x01000003L),U32(0x01040002L),U32(0x01040003L), +U32(0x00000200L),U32(0x00000201L),U32(0x00040200L),U32(0x00040201L), +U32(0x01000200L),U32(0x01000201L),U32(0x01040200L),U32(0x01040201L), +U32(0x00000202L),U32(0x00000203L),U32(0x00040202L),U32(0x00040203L), +U32(0x01000202L),U32(0x01000203L),U32(0x01040202L),U32(0x01040203L), +U32(0x08000000L),U32(0x08000001L),U32(0x08040000L),U32(0x08040001L), +U32(0x09000000L),U32(0x09000001L),U32(0x09040000L),U32(0x09040001L), +U32(0x08000002L),U32(0x08000003L),U32(0x08040002L),U32(0x08040003L), +U32(0x09000002L),U32(0x09000003L),U32(0x09040002L),U32(0x09040003L), +U32(0x08000200L),U32(0x08000201L),U32(0x08040200L),U32(0x08040201L), +U32(0x09000200L),U32(0x09000201L),U32(0x09040200L),U32(0x09040201L), +U32(0x08000202L),U32(0x08000203L),U32(0x08040202L),U32(0x08040203L), +U32(0x09000202L),U32(0x09000203L),U32(0x09040202L),U32(0x09040203L), +], + +#for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 +[ +U32(0x00000000L),U32(0x00100000L),U32(0x00000100L),U32(0x00100100L), +U32(0x00000008L),U32(0x00100008L),U32(0x00000108L),U32(0x00100108L), +U32(0x00001000L),U32(0x00101000L),U32(0x00001100L),U32(0x00101100L), +U32(0x00001008L),U32(0x00101008L),U32(0x00001108L),U32(0x00101108L), +U32(0x04000000L),U32(0x04100000L),U32(0x04000100L),U32(0x04100100L), +U32(0x04000008L),U32(0x04100008L),U32(0x04000108L),U32(0x04100108L), +U32(0x04001000L),U32(0x04101000L),U32(0x04001100L),U32(0x04101100L), +U32(0x04001008L),U32(0x04101008L),U32(0x04001108L),U32(0x04101108L), +U32(0x00020000L),U32(0x00120000L),U32(0x00020100L),U32(0x00120100L), +U32(0x00020008L),U32(0x00120008L),U32(0x00020108L),U32(0x00120108L), +U32(0x00021000L),U32(0x00121000L),U32(0x00021100L),U32(0x00121100L), +U32(0x00021008L),U32(0x00121008L),U32(0x00021108L),U32(0x00121108L), +U32(0x04020000L),U32(0x04120000L),U32(0x04020100L),U32(0x04120100L), +U32(0x04020008L),U32(0x04120008L),U32(0x04020108L),U32(0x04120108L), +U32(0x04021000L),U32(0x04121000L),U32(0x04021100L),U32(0x04121100L), +U32(0x04021008L),U32(0x04121008L),U32(0x04021108L),U32(0x04121108L), +], + +#for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 +[ +U32(0x00000000L),U32(0x10000000L),U32(0x00010000L),U32(0x10010000L), +U32(0x00000004L),U32(0x10000004L),U32(0x00010004L),U32(0x10010004L), +U32(0x20000000L),U32(0x30000000L),U32(0x20010000L),U32(0x30010000L), +U32(0x20000004L),U32(0x30000004L),U32(0x20010004L),U32(0x30010004L), +U32(0x00100000L),U32(0x10100000L),U32(0x00110000L),U32(0x10110000L), +U32(0x00100004L),U32(0x10100004L),U32(0x00110004L),U32(0x10110004L), +U32(0x20100000L),U32(0x30100000L),U32(0x20110000L),U32(0x30110000L), +U32(0x20100004L),U32(0x30100004L),U32(0x20110004L),U32(0x30110004L), +U32(0x00001000L),U32(0x10001000L),U32(0x00011000L),U32(0x10011000L), +U32(0x00001004L),U32(0x10001004L),U32(0x00011004L),U32(0x10011004L), +U32(0x20001000L),U32(0x30001000L),U32(0x20011000L),U32(0x30011000L), +U32(0x20001004L),U32(0x30001004L),U32(0x20011004L),U32(0x30011004L), +U32(0x00101000L),U32(0x10101000L),U32(0x00111000L),U32(0x10111000L), +U32(0x00101004L),U32(0x10101004L),U32(0x00111004L),U32(0x10111004L), +U32(0x20101000L),U32(0x30101000L),U32(0x20111000L),U32(0x30111000L), +U32(0x20101004L),U32(0x30101004L),U32(0x20111004L),U32(0x30111004L), +], + +#for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 +[ +U32(0x00000000L),U32(0x08000000L),U32(0x00000008L),U32(0x08000008L), +U32(0x00000400L),U32(0x08000400L),U32(0x00000408L),U32(0x08000408L), +U32(0x00020000L),U32(0x08020000L),U32(0x00020008L),U32(0x08020008L), +U32(0x00020400L),U32(0x08020400L),U32(0x00020408L),U32(0x08020408L), +U32(0x00000001L),U32(0x08000001L),U32(0x00000009L),U32(0x08000009L), +U32(0x00000401L),U32(0x08000401L),U32(0x00000409L),U32(0x08000409L), +U32(0x00020001L),U32(0x08020001L),U32(0x00020009L),U32(0x08020009L), +U32(0x00020401L),U32(0x08020401L),U32(0x00020409L),U32(0x08020409L), +U32(0x02000000L),U32(0x0A000000L),U32(0x02000008L),U32(0x0A000008L), +U32(0x02000400L),U32(0x0A000400L),U32(0x02000408L),U32(0x0A000408L), +U32(0x02020000L),U32(0x0A020000L),U32(0x02020008L),U32(0x0A020008L), +U32(0x02020400L),U32(0x0A020400L),U32(0x02020408L),U32(0x0A020408L), +U32(0x02000001L),U32(0x0A000001L),U32(0x02000009L),U32(0x0A000009L), +U32(0x02000401L),U32(0x0A000401L),U32(0x02000409L),U32(0x0A000409L), +U32(0x02020001L),U32(0x0A020001L),U32(0x02020009L),U32(0x0A020009L), +U32(0x02020401L),U32(0x0A020401L),U32(0x02020409L),U32(0x0A020409L), +], + +#for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 +[ +U32(0x00000000L),U32(0x00000100L),U32(0x00080000L),U32(0x00080100L), +U32(0x01000000L),U32(0x01000100L),U32(0x01080000L),U32(0x01080100L), +U32(0x00000010L),U32(0x00000110L),U32(0x00080010L),U32(0x00080110L), +U32(0x01000010L),U32(0x01000110L),U32(0x01080010L),U32(0x01080110L), +U32(0x00200000L),U32(0x00200100L),U32(0x00280000L),U32(0x00280100L), +U32(0x01200000L),U32(0x01200100L),U32(0x01280000L),U32(0x01280100L), +U32(0x00200010L),U32(0x00200110L),U32(0x00280010L),U32(0x00280110L), +U32(0x01200010L),U32(0x01200110L),U32(0x01280010L),U32(0x01280110L), +U32(0x00000200L),U32(0x00000300L),U32(0x00080200L),U32(0x00080300L), +U32(0x01000200L),U32(0x01000300L),U32(0x01080200L),U32(0x01080300L), +U32(0x00000210L),U32(0x00000310L),U32(0x00080210L),U32(0x00080310L), +U32(0x01000210L),U32(0x01000310L),U32(0x01080210L),U32(0x01080310L), +U32(0x00200200L),U32(0x00200300L),U32(0x00280200L),U32(0x00280300L), +U32(0x01200200L),U32(0x01200300L),U32(0x01280200L),U32(0x01280300L), +U32(0x00200210L),U32(0x00200310L),U32(0x00280210L),U32(0x00280310L), +U32(0x01200210L),U32(0x01200310L),U32(0x01280210L),U32(0x01280310L), +], + +#for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 +[ +U32(0x00000000L),U32(0x04000000L),U32(0x00040000L),U32(0x04040000L), +U32(0x00000002L),U32(0x04000002L),U32(0x00040002L),U32(0x04040002L), +U32(0x00002000L),U32(0x04002000L),U32(0x00042000L),U32(0x04042000L), +U32(0x00002002L),U32(0x04002002L),U32(0x00042002L),U32(0x04042002L), +U32(0x00000020L),U32(0x04000020L),U32(0x00040020L),U32(0x04040020L), +U32(0x00000022L),U32(0x04000022L),U32(0x00040022L),U32(0x04040022L), +U32(0x00002020L),U32(0x04002020L),U32(0x00042020L),U32(0x04042020L), +U32(0x00002022L),U32(0x04002022L),U32(0x00042022L),U32(0x04042022L), +U32(0x00000800L),U32(0x04000800L),U32(0x00040800L),U32(0x04040800L), +U32(0x00000802L),U32(0x04000802L),U32(0x00040802L),U32(0x04040802L), +U32(0x00002800L),U32(0x04002800L),U32(0x00042800L),U32(0x04042800L), +U32(0x00002802L),U32(0x04002802L),U32(0x00042802L),U32(0x04042802L), +U32(0x00000820L),U32(0x04000820L),U32(0x00040820L),U32(0x04040820L), +U32(0x00000822L),U32(0x04000822L),U32(0x00040822L),U32(0x04040822L), +U32(0x00002820L),U32(0x04002820L),U32(0x00042820L),U32(0x04042820L), +U32(0x00002822L),U32(0x04002822L),U32(0x00042822L),U32(0x04042822L), +] + +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/ntlm.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/ntlm.py new file mode 100644 index 0000000..79d6dfe --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/ntlm.py @@ -0,0 +1,466 @@ +# This library is free software: you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation, either +# version 3 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see or . + +import struct +import base64 +import string +import des +import hashlib +import hmac +import random +from socket import gethostname + +NTLM_NegotiateUnicode = 0x00000001 +NTLM_NegotiateOEM = 0x00000002 +NTLM_RequestTarget = 0x00000004 +NTLM_Unknown9 = 0x00000008 +NTLM_NegotiateSign = 0x00000010 +NTLM_NegotiateSeal = 0x00000020 +NTLM_NegotiateDatagram = 0x00000040 +NTLM_NegotiateLanManagerKey = 0x00000080 +NTLM_Unknown8 = 0x00000100 +NTLM_NegotiateNTLM = 0x00000200 +NTLM_NegotiateNTOnly = 0x00000400 +NTLM_Anonymous = 0x00000800 +NTLM_NegotiateOemDomainSupplied = 0x00001000 +NTLM_NegotiateOemWorkstationSupplied = 0x00002000 +NTLM_Unknown6 = 0x00004000 +NTLM_NegotiateAlwaysSign = 0x00008000 +NTLM_TargetTypeDomain = 0x00010000 +NTLM_TargetTypeServer = 0x00020000 +NTLM_TargetTypeShare = 0x00040000 +NTLM_NegotiateExtendedSecurity = 0x00080000 +NTLM_NegotiateIdentify = 0x00100000 +NTLM_Unknown5 = 0x00200000 +NTLM_RequestNonNTSessionKey = 0x00400000 +NTLM_NegotiateTargetInfo = 0x00800000 +NTLM_Unknown4 = 0x01000000 +NTLM_NegotiateVersion = 0x02000000 +NTLM_Unknown3 = 0x04000000 +NTLM_Unknown2 = 0x08000000 +NTLM_Unknown1 = 0x10000000 +NTLM_Negotiate128 = 0x20000000 +NTLM_NegotiateKeyExchange = 0x40000000 +NTLM_Negotiate56 = 0x80000000 + +# we send these flags with our type 1 message +NTLM_TYPE1_FLAGS = (NTLM_NegotiateUnicode | \ + NTLM_NegotiateOEM | \ + NTLM_RequestTarget | \ + NTLM_NegotiateNTLM | \ + NTLM_NegotiateOemDomainSupplied | \ + NTLM_NegotiateOemWorkstationSupplied | \ + NTLM_NegotiateAlwaysSign | \ + NTLM_NegotiateExtendedSecurity | \ + NTLM_NegotiateVersion | \ + NTLM_Negotiate128 | \ + NTLM_Negotiate56 ) +NTLM_TYPE2_FLAGS = (NTLM_NegotiateUnicode | \ + NTLM_RequestTarget | \ + NTLM_NegotiateNTLM | \ + NTLM_NegotiateAlwaysSign | \ + NTLM_NegotiateExtendedSecurity | \ + NTLM_NegotiateTargetInfo | \ + NTLM_NegotiateVersion | \ + NTLM_Negotiate128 | \ + NTLM_Negotiate56) + +NTLM_MsvAvEOL = 0 # Indicates that this is the last AV_PAIR in the list. AvLen MUST be 0. This type of information MUST be present in the AV pair list. +NTLM_MsvAvNbComputerName = 1 # The server's NetBIOS computer name. The name MUST be in Unicode, and is not null-terminated. This type of information MUST be present in the AV_pair list. +NTLM_MsvAvNbDomainName = 2 # The server's NetBIOS domain name. The name MUST be in Unicode, and is not null-terminated. This type of information MUST be present in the AV_pair list. +NTLM_MsvAvDnsComputerName = 3 # The server's Active Directory DNS computer name. The name MUST be in Unicode, and is not null-terminated. +NTLM_MsvAvDnsDomainName = 4 # The server's Active Directory DNS domain name. The name MUST be in Unicode, and is not null-terminated. +NTLM_MsvAvDnsTreeName = 5 # The server's Active Directory (AD) DNS forest tree name. The name MUST be in Unicode, and is not null-terminated. +NTLM_MsvAvFlags = 6 # A field containing a 32-bit value indicating server or client configuration. 0x00000001: indicates to the client that the account authentication is constrained. 0x00000002: indicates that the client is providing message integrity in the MIC field (section 2.2.1.3) in the AUTHENTICATE_MESSAGE. +NTLM_MsvAvTimestamp = 7 # A FILETIME structure ([MS-DTYP] section 2.3.1) in little-endian byte order that contains the server local time.<12> +NTLM_MsAvRestrictions = 8 #A Restriction_Encoding structure (section 2.2.2.2). The Value field contains a structure representing the integrity level of the security principal, as well as a MachineID created at computer startup to identify the calling machine. <13> + + +""" +utility functions for Microsoft NTLM authentication + +References: +[MS-NLMP]: NT LAN Manager (NTLM) Authentication Protocol Specification +http://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/%5BMS-NLMP%5D.pdf + +[MS-NTHT]: NTLM Over HTTP Protocol Specification +http://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/%5BMS-NTHT%5D.pdf + +Cntlm Authentication Proxy +http://cntlm.awk.cz/ + +NTLM Authorization Proxy Server +http://sourceforge.net/projects/ntlmaps/ + +Optimized Attack for NTLM2 Session Response +http://www.blackhat.com/presentations/bh-asia-04/bh-jp-04-pdfs/bh-jp-04-seki.pdf +""" +def dump_NegotiateFlags(NegotiateFlags): + if NegotiateFlags & NTLM_NegotiateUnicode: + print "NTLM_NegotiateUnicode set" + if NegotiateFlags & NTLM_NegotiateOEM: + print "NTLM_NegotiateOEM set" + if NegotiateFlags & NTLM_RequestTarget: + print "NTLM_RequestTarget set" + if NegotiateFlags & NTLM_Unknown9: + print "NTLM_Unknown9 set" + if NegotiateFlags & NTLM_NegotiateSign: + print "NTLM_NegotiateSign set" + if NegotiateFlags & NTLM_NegotiateSeal: + print "NTLM_NegotiateSeal set" + if NegotiateFlags & NTLM_NegotiateDatagram: + print "NTLM_NegotiateDatagram set" + if NegotiateFlags & NTLM_NegotiateLanManagerKey: + print "NTLM_NegotiateLanManagerKey set" + if NegotiateFlags & NTLM_Unknown8: + print "NTLM_Unknown8 set" + if NegotiateFlags & NTLM_NegotiateNTLM: + print "NTLM_NegotiateNTLM set" + if NegotiateFlags & NTLM_NegotiateNTOnly: + print "NTLM_NegotiateNTOnly set" + if NegotiateFlags & NTLM_Anonymous: + print "NTLM_Anonymous set" + if NegotiateFlags & NTLM_NegotiateOemDomainSupplied: + print "NTLM_NegotiateOemDomainSupplied set" + if NegotiateFlags & NTLM_NegotiateOemWorkstationSupplied: + print "NTLM_NegotiateOemWorkstationSupplied set" + if NegotiateFlags & NTLM_Unknown6: + print "NTLM_Unknown6 set" + if NegotiateFlags & NTLM_NegotiateAlwaysSign: + print "NTLM_NegotiateAlwaysSign set" + if NegotiateFlags & NTLM_TargetTypeDomain: + print "NTLM_TargetTypeDomain set" + if NegotiateFlags & NTLM_TargetTypeServer: + print "NTLM_TargetTypeServer set" + if NegotiateFlags & NTLM_TargetTypeShare: + print "NTLM_TargetTypeShare set" + if NegotiateFlags & NTLM_NegotiateExtendedSecurity: + print "NTLM_NegotiateExtendedSecurity set" + if NegotiateFlags & NTLM_NegotiateIdentify: + print "NTLM_NegotiateIdentify set" + if NegotiateFlags & NTLM_Unknown5: + print "NTLM_Unknown5 set" + if NegotiateFlags & NTLM_RequestNonNTSessionKey: + print "NTLM_RequestNonNTSessionKey set" + if NegotiateFlags & NTLM_NegotiateTargetInfo: + print "NTLM_NegotiateTargetInfo set" + if NegotiateFlags & NTLM_Unknown4: + print "NTLM_Unknown4 set" + if NegotiateFlags & NTLM_NegotiateVersion: + print "NTLM_NegotiateVersion set" + if NegotiateFlags & NTLM_Unknown3: + print "NTLM_Unknown3 set" + if NegotiateFlags & NTLM_Unknown2: + print "NTLM_Unknown2 set" + if NegotiateFlags & NTLM_Unknown1: + print "NTLM_Unknown1 set" + if NegotiateFlags & NTLM_Negotiate128: + print "NTLM_Negotiate128 set" + if NegotiateFlags & NTLM_NegotiateKeyExchange: + print "NTLM_NegotiateKeyExchange set" + if NegotiateFlags & NTLM_Negotiate56: + print "NTLM_Negotiate56 set" + +def create_NTLM_NEGOTIATE_MESSAGE(user, type1_flags=NTLM_TYPE1_FLAGS): + BODY_LENGTH = 40 + Payload_start = BODY_LENGTH # in bytes + protocol = 'NTLMSSP\0' #name + + type = struct.pack(' 40: + TargetInfoLen = struct.unpack(" Package Settings > Package Control > Settings - User and + set the key "submit_usage" to false. + + - Added local tracking of installed packages in + User/Package Control.sublime-settings via the "installed_packages" key. + This allows distributing a settings file that will automatically install + packages. + + - repositories.json schema version was increased to 1.1 and the + "last_modified" key was added. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/messages/1.6.0.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/messages/1.6.0.txt new file mode 100644 index 0000000..0a055a0 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/messages/1.6.0.txt @@ -0,0 +1,95 @@ +Package Control 1.6.0 Changelog: + +Wow! It has been 9 months since the last stable release of Package Control. +Quite a lot has happened since then, including the release of Sublime Text 2 +stable, and hundreds upon hundreds of new packages from the community! + +A quick thank you to Kevin Yank (@sentience) for recently volunteering to help +review packages for inclusion in the default channel, and ninj0x +(https://github.com/ninj0x) for rewriting the Package Control Community +Packages search functionality so it is nice and fast once again! The lists +below include specific thanks for code contributions. + +As Sublime Text has become increasingly more popular, and the number of +packages has increased so rapidly, the bandwidth requirements have also +significantly increased. This month the default channel will very likely serve +over 1TB of JSON data. If you feel so inclined, consider pitching in a small +amount to help cover the cost: +http://wbond.net/sublime_packages/package_control/say_thanks. A big thank you +to all of the users who have already contributed! + + +Enhancements + + + - Added full (custom) proxy authentication support for HTTPS connections + + - Added NTLM authentication for proxies on Windows + + - Proxy authentication information is now set via the new proxy_username and + proxy_password settings. + + - If the https_proxy setting it set to false, it will not inherit from the + http_proxy setting (thanks planardothum!) + + - The time of the last successful run is no longer stored in + Packages/User/Package Control.sublime-settings, but rather in + Packages/User/Package Control.last-run making it easier to ignore via git, + hg, etc. (thanks schlamar!) + + - Packages are now ignored during install and upgrade to help prevents errors + where Sublime Text tries to read a file as it is being extracted + + - Packages that include DLLs for Windows can now be upgraded. In-use + DLLs will be detected and the user prompted to restart. + + - Package version numbers may now include non-numeric components, and semantic + versioning (http://semver.org) is fully supported + + - JSON parsing messages are now printed to the console instead of being shown + in an error popup + + - Added support for changes to the BitBucket API + + - Added support for changes to GitHub URLs + + - Added the debug setting to help track down HTTP connection issues + + - All of the downloaders will now try to use HTTP compression + + - All of the downloaders will now follow redirects + + - Added new install_missing setting to control if Package Control should try + to install any packages that appear to be missing from the current machine. + This defaults to true, and is really only useful if you want to prevent + Package Control from connecting to the internet without explicitly asking + it to. + + - Added lots of code comments as a first step towards making contributions + by other developers easier + + +Bug Fixes + + + - Added support for the new preferences filename (thanks titoBouzout!) + + - If a package is missing from a machine, but not available for that + platform, it is no longer considered an error (thanks schlamar!) + + - Updated CA certs + + - Fixed handling of install and upgrade messages that contain non-ASCII + characters + + - Fixed a unicode error trying to load the CA cert bundle file on Windows when + the install path to Sublime Text contains non-ASCII characters + + - Better handling for edge case HTTP errors (thanks tgecho!) + + - Fixed a number of errors related to non-ASCII error messages being created + by the operating system (thanks quarnster!) + + - GitHub URLs will now automatically be trimmed of trailing .git suffixes + + - Badly formatted messages.json files will no longer break the install process \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/package-metadata.json new file mode 100644 index 0000000..6dbaeb0 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/package-metadata.json @@ -0,0 +1,5 @@ +{ + "version": "1.6.3", + "url": "http://wbond.net/sublime_packages/package_control", + "description": "A full-featured package manager" +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/readme.creole b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/readme.creole new file mode 100644 index 0000000..eb37565 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/readme.creole @@ -0,0 +1,43 @@ += Sublime Package Control + +A Sublime Text 2 (http://www.sublimetext.com/2) package manager for easily +discovering, install, upgrading and removing packages. Also includes an +automatic updater and package creation tool. + +Packages can be installed from GitHub, BitBucket or custom package repositories. +The plugin uses a channel and repository system to allow users to find new +packages over time without any work. It also supports working with packages that +were manually installed. + +Please see http://wbond.net/sublime_packages/package_control for install +instructions, screenshots and documentation. + +== License + +Sublime Package Control (except for the ntlm library) is licensed under the MIT +license. + + Copyright (c) 2011-2012 Will Bond + + Permission 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: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE 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. + +The ntlm library (for Windows) is from the python-ntlm project +(http://code.google.com/p/python-ntlm/) and is licensed under the GNU Lesser +General Public License (LGPL). Details can be found in the source files +located in lib/windows/ntlm/. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Linux).sublime-keymap new file mode 100644 index 0000000..d086f83 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Linux).sublime-keymap @@ -0,0 +1,6 @@ +[ + { + "keys": ["super+k", "super+t"], + "command": "recent_active_files" + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (OSX).sublime-keymap new file mode 100644 index 0000000..d086f83 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (OSX).sublime-keymap @@ -0,0 +1,6 @@ +[ + { + "keys": ["super+k", "super+t"], + "command": "recent_active_files" + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Windows).sublime-keymap new file mode 100644 index 0000000..d086f83 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Windows).sublime-keymap @@ -0,0 +1,6 @@ +[ + { + "keys": ["super+k", "super+t"], + "command": "recent_active_files" + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default.sublime-commands b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default.sublime-commands new file mode 100644 index 0000000..a1cb933 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default.sublime-commands @@ -0,0 +1,6 @@ +[ + { + "caption": "RecentActiveFiles: recent_active_files", + "command": "recent_active_files" + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/README.md new file mode 100644 index 0000000..f6a1aff --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/README.md @@ -0,0 +1,18 @@ +RecentActiveFiles +======== + +Sublime Text 2 plugin that shows and opens recent activated files. + +![Screenshot](http://i.imgur.com/T6kIQ.png) + +The idea was got from here: [GotoRecent](https://github.com/paccator/GotoRecent) + +## Installation + +``` +$ cd ~/Library/Application\ Support/Sublime\ Text\ 2/Packages +$ git clone https://github.com/jugyo/SublimeRecentActiveFiles.git RecentActiveFiles +``` +## Usage + +The `recent_active_files` command is binded to `super+k + super+t`. diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/RecentActiveFiles.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/RecentActiveFiles.py new file mode 100644 index 0000000..e8cc71d --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/RecentActiveFiles.py @@ -0,0 +1,40 @@ +import sublime_plugin +import os + +class RecentActiveFilesEventListener(sublime_plugin.EventListener): + def on_activated(self, view): + if view.file_name(): + view.window().run_command("recent_active_files", { "file_name": view.file_name() }) + +class RecentActiveFilesCommand(sublime_plugin.WindowCommand): + def __init__(self, window): + sublime_plugin.WindowCommand.__init__(self, window) + self.recent_active_files = [] + + def unshift(self, file_name): + if file_name in self.recent_active_files: + self.recent_active_files.remove(file_name) + self.recent_active_files.insert(0, file_name) + + def path_form_project(self, path): + for folder in self.window.folders(): + path = path.replace(folder + '/', '', 1) + return path + + def run(self, file_name=None): + if file_name: + self.unshift(file_name) + else: + if self.window.active_view() is not None: + active_file = self.window.active_view().file_name() + files = filter(lambda f: f != active_file, self.recent_active_files) + else: + files = self.recent_active_files + + items = [[os.path.basename(f), self.path_form_project(f)] for f in files] + + def on_done(index): + if index >= 0: + self.window.open_file(files[index]) + + self.window.show_quick_panel(items, on_done) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/package-metadata.json new file mode 100644 index 0000000..5d0ccb2 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/jugyo/SublimeRecentActiveFiles", "version": "2013.01.17.03.59.02", "description": "Sublime Text 2 plugin that shows and opens recent activated files."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Context.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Context.sublime-menu new file mode 100644 index 0000000..f2a1b5e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Context.sublime-menu @@ -0,0 +1,47 @@ +[ + { + "caption": "Search Anywhere", + "mnemonic": "w", + "id": "searchanywhere", + "children": + [ + { + "command": "search_anywhere_from_selection", + "caption": "Search From Selection" + }, + { + "command": "search_anywhere_from_input", + "caption": "Search From Input" + }, + { + "caption": "-" + }, + { + "caption": "Select Search Engine Then", + "children": + [ + { + "command": "search_anywhere_from_selection_ask", + "caption": "Search From Selection" + }, + { + "command": "search_anywhere_from_input_ask", + "caption": "Search From Input" + } + + ] + }, + { + "caption": "-" + }, + { + "command": "search_anywhere_select_default_search_engine", + "caption": "Set Default Search Engine" + }, + { + "command": "search_anywhere_select_search_engine_for_type", + "caption": "Set Search Engine For File Type" + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Default.sublime-commands b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Default.sublime-commands new file mode 100644 index 0000000..0ea3a93 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Default.sublime-commands @@ -0,0 +1,26 @@ +[ + { + "caption": "Search Anywhere: From Selection", + "command": "search_anywhere_from_selection" + }, + { + "caption": "Search Anywhere: From Input", + "command": "search_anywhere_from_input" + }, + { + "caption": "Search Anywhere: Set Default Search Engine", + "command": "search_anywhere_select_default_search_engine" + }, + { + "caption": "Search Anywhere: Set Search Engine For File Type", + "command": "search_anywhere_select_search_engine_for_type" + }, + { + "caption": "Search Anywhere: From Selection (ask Search Engine)", + "command": "search_anywhere_from_selection_ask" + }, + { + "caption": "Search Anywhere: From Input (ask Search Engine)", + "command": "search_anywhere_from_input_ask" + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Main.sublime-menu new file mode 100644 index 0000000..5e06caf --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Main.sublime-menu @@ -0,0 +1,55 @@ +[ + { + "caption": "Tools", + "mnemonic": "t", + "id": "tools", + "children": + [ + { + "caption": "Search Anywhere", + "mnemonic": "w", + "id": "searchanywhere", + "children": + [ + { + "command": "search_anywhere_from_selection", + "caption": "Search From Selection" + }, + { + "command": "search_anywhere_from_input", + "caption": "Search From Input" + }, + { + "caption": "-" + }, + { + "caption": "Select Search Engine Then", + "children": + [ + { + "command": "search_anywhere_from_selection_ask", + "caption": "Search From Selection" + }, + { + "command": "search_anywhere_from_input_ask", + "caption": "Search From Input" + } + + ] + }, + { + "caption": "-" + }, + { + "command": "search_anywhere_select_default_search_engine", + "caption": "Set Default Search Engine" + }, + { + "command": "search_anywhere_select_search_engine_for_type", + "caption": "Set Search Engine For File Type" + } + ] + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/README.md new file mode 100644 index 0000000..392943b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/README.md @@ -0,0 +1,25 @@ +# Sublime Text 2 Search Anywhere Plugin + +A plugin that allows the user to search the web through multiple search engines. Each file type can have its own search engine. + +## Install + +The preferred method is to use the [Sublime Package Manager](http://wbond.net/sublime_packages/package_control). Alternatively, the files can be obtained on github: + + $ https://github.com/ericmartel/Sublime-Text-2-Search-Anywhere-Plugin + +## Complete Documentation + +A website is currently under construction to explain the usage of the plugin in details. In the meantime, please visit this [Web Site](http://www.ericmartel.com/sublime-text-2-search-anywhere/). + +# License + +All of Sublime Text 2 Search Anywhere Plugin is licensed under the MIT license. + +Copyright (c) 2012 Eric Martel + +Permission 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: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE 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. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages.json new file mode 100644 index 0000000..d04c6d8 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages.json @@ -0,0 +1,3 @@ +{ + "install": "messages/install.txt" +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages/install.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages/install.txt new file mode 100644 index 0000000..9e8ff3c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages/install.txt @@ -0,0 +1,9 @@ +Search Anywhere by Eric Martel (emartel@gmail.com / www.ericmartel.com) + +Thank you for installing Search Anywhere. For detailed instructions please visit http://www.ericmartel.com/sublime-text-2-search-anywhere/. All commands are available through menus, context menus and the command palette. + +Please direct any feedback to emartel@gmail.com or through github at https://github.com/ericmartel/Sublime-Text-2-Search-Anywhere-Plugin. + +Thank you for your support. + +Eric Martel \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/package-metadata.json new file mode 100644 index 0000000..0de4b03 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/package-metadata.json @@ -0,0 +1 @@ +{"url": "http://www.ericmartel.com/sublime-text-2-search-anywhere/", "version": "2012.03.20.16.35.46", "description": "Utility to quickly search on multiple search engines from the current selection or custom input. Default search engine configurable per file type. Search Engines defined through JSON including Google, Yahoo, Bing, Stack Overflow, PHP.net, sitepoint and caniuse.com "} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchanywhere.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchanywhere.py new file mode 100644 index 0000000..2b33061 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchanywhere.py @@ -0,0 +1,160 @@ +# Written by Eric Martel (emartel@gmail.com / www.ericmartel.com) + +import sublime +import sublime_plugin + +import subprocess +import webbrowser +import threading +import os +import json + +searchanywhere_dir = os.getcwdu() + +# Helper functions +def SearchFor(view, text, searchurl): + if not searchurl: + # see if we have an extension match first, then use default + settings = sublime.load_settings(__name__ + '.sublime-settings') + + filename, ext = os.path.splitext(view.file_name()) + typesettings = settings.get('searchanywhere_type_searchengine', []) + + foundsetting = False + for typesetting in typesettings: + if typesetting['extension'] == ext: + foundsetting = True + searchurl = typesetting['searchurl'] + + if not foundsetting: + if settings.has('searchanywhere_searchurl'): + searchurl = settings.get('searchanywhere_searchurl') + else: + sublime.error_message(__name__ + ': No Search Engine selected') + return + else: + # search url is provided by the caller + pass + + url = searchurl.replace('{0}', text.replace(' ','%20')) + webbrowser.open_new_tab(url) + +def ShowSearchEnginesList(window, callback): + searchengines = [] + if os.path.exists(searchanywhere_dir + os.sep + 'searchengines.json'): + f = open(searchanywhere_dir + os.sep + 'searchengines.json') + searchengineslist = json.load(f) + f.close() + + for entry in searchengineslist.get('searchengines'): + formattedentry = [] + formattedentry.append(entry.get('name')) + formattedentry.append(entry.get('baseurl')) + searchengines.append(formattedentry) + + window.show_quick_panel(searchengines, callback) + +def GetSearchEngineEntry(picked): + f = open(searchanywhere_dir + os.sep + 'searchengines.json') + searchengineslist = json.load(f) + entry = searchengineslist.get('searchengines')[picked] + f.close() + return entry + +class SearchAnywhereFromSelectionAskCommand(sublime_plugin.TextCommand): + def run(self, edit): + ShowSearchEnginesList(self.view.window(), self.on_select_done) + + def on_select_done(self, picked): + entry = GetSearchEngineEntry(picked) + + for selection in self.view.sel(): + # if the user didn't select anything, search the currently highlighted word + if selection.empty(): + selection = self.view.word(selection) + + text = self.view.substr(selection) + SearchFor(self.view, text, entry.get('searchurl')) + +class SearchAnywhereFromInputAskCommand(sublime_plugin.WindowCommand): + def run(self): + ShowSearchEnginesList(self.window, self.on_select_done) + + def on_select_done(self, picked): + self.entry = GetSearchEngineEntry(picked) + + self.window.show_input_panel('Search on ' + self.entry.get('name') + ' for', '', self.on_done, self.on_change, self.on_cancel) + + def on_done(self, input): + SearchFor(self.window.active_view(), input, self.entry.get('searchurl')) + + def on_change(self, input): + pass + + def on_cancel(self): + pass + + +class SearchAnywhereFromSelectionCommand(sublime_plugin.TextCommand): + def run(self, edit): + for selection in self.view.sel(): + # if the user didn't select anything, search the currently highlighted word + if selection.empty(): + selection = self.view.word(selection) + + text = self.view.substr(selection) + SearchFor(self.view, text, None) + +class SearchAnywhereFromInputCommand(sublime_plugin.WindowCommand): + def run(self): + settings = sublime.load_settings(__name__ + '.sublime-settings') + if settings.has('searchanywhere_searchengine'): + engine = settings.get('searchanywhere_searchengine') + self.window.show_input_panel('Search on ' + engine + ' for', '', self.on_done, self.on_change, self.on_cancel) + else: + sublime.error_message(__name__ + ': No Search Engine selected') + + def on_done(self, input): + SearchFor(self.window.active_view(), input, None) + + def on_change(self, input): + pass + + def on_cancel(self): + pass + +# Sets the default Search Engine to use +class SearchAnywhereSelectDefaultSearchEngineCommand(sublime_plugin.WindowCommand): + def run(self): + ShowSearchEnginesList(self.window, self.on_select_done) + + def on_select_done(self, picked): + entry = GetSearchEngineEntry(picked) + + settings = sublime.load_settings(__name__ + '.sublime-settings') + settings.set('searchanywhere_searchengine', entry.get('name')) + settings.set('searchanywhere_searchurl', entry.get('searchurl')) + sublime.save_settings(__name__ + '.sublime-settings') + +# Sets the default Search Engine to use for files sharing the view's extension +class SearchAnywhereSelectSearchEngineForTypeCommand(sublime_plugin.WindowCommand): + def run(self): + self.filename, self.ext = os.path.splitext(self.window.active_view().file_name()) + ShowSearchEnginesList(self.window, self.on_select_done) + + def on_select_done(self, picked): + entry = GetSearchEngineEntry(picked) + + settings = sublime.load_settings(__name__ + '.sublime-settings') + + typesettings = settings.get('searchanywhere_type_searchengine', []) + + newsetting = {} + newsetting['extension'] = self.ext + newsetting['name'] = entry.get('name') + newsetting['searchurl'] = entry.get('searchurl') + + typesettings.append(newsetting) + + settings.set('searchanywhere_type_searchengine', typesettings) + sublime.save_settings(__name__ + '.sublime-settings') \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchengines.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchengines.json new file mode 100644 index 0000000..6e77d7f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchengines.json @@ -0,0 +1,55 @@ +{ + "schema_version": "1.2", + "searchengines": [ + { + "name": "Google", + "baseurl": "www.google.com", + "searchurl": "http://www.google.com/search?q={0}" + }, + { + "name": "Stack Overflow", + "baseurl": "www.stackoverflow.com", + "searchurl": "http://stackoverflow.com/search?tab=relevance&q={0}" + }, + { + "name": "PHP", + "baseurl": "www.php.net", + "searchurl": "http://ca3.php.net/manual-lookup.php?pattern={0}&scope=quickref" + }, + { + "name": "Bing", + "baseurl": "www.bing.com", + "searchurl": "http://www.bing.com/search?q={0}" + }, + { + "name": "Yahoo", + "baseurl": "www.yahoo.com", + "searchurl": "http://search.yahoo.com/search?p={0}" + }, + { + "name": "sitepoint", + "baseurl": "reference.sitepoint.com", + "searchurl": "http://reference.sitepoint.com/html/{0}" + }, + { + "name": "When can I use...", + "baseurl": "caniuse.com", + "searchurl": "http://caniuse.com/#search={0}" + }, + { + "name": "Mozilla Developer Network", + "baseurl": "developer.mozilla.org", + "searchurl": "https://developer.mozilla.org/en-US/search?q={0}" + }, + { + "name": "Ruby on Rails", + "baseurl": "api.rubyonrails.org", + "searchurl": "http://api.rubyonrails.org/?q={0}" + }, + { + "name": "Ruby Doc", + "baseurl": "www.ruby-doc.org", + "searchurl": "http://www.ruby-doc.org/search.html?cx=011815814100681837392%3Awnccv6st5qk&q={0}&sa=Search&cof=FORID%3A9" + } + ] +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/.gitignore new file mode 100644 index 0000000..a1ba83b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/.gitignore @@ -0,0 +1,3 @@ +*.pyc +*.cache +*.sublime-project \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Commands.sublime-commands b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Commands.sublime-commands new file mode 100644 index 0000000..dd290f6 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Commands.sublime-commands @@ -0,0 +1,84 @@ +[ + { + "caption": "File: New File Relative to Current View", + "command": "side_bar_new_file" + }, + { + "caption": "File: Rename", + "command": "side_bar_rename" + }, + { + "caption": "File: Duplicate", + "command": "side_bar_duplicate" + }, + { + "caption": "File: Reveal", + "command": "side_bar_reveal" + }, + { + "caption": "File: Move", + "command": "side_bar_move" + }, + { + "caption": "File: Delete", + "command": "side_bar_delete" + }, + { + "caption": "Project: Edit", + "command": "side_bar_project_open_file" + }, + { + "caption": "File: Copy Name", + "command": "side_bar_copy_name" + }, + { + "caption": "File: Copy Name Encoded", + "command": "side_bar_copy_name_encoded" + }, + { + "caption": "File: Copy Path", + "command": "side_bar_copy_path" + }, + { + "caption": "File: Copy Path as URI", + "command": "side_bar_copy_path_encoded" + }, + { + "caption": "File: Copy Path From Project", + "command": "side_bar_copy_path_absolute_from_project" + }, + { + "caption": "File: Copy Path From Project Encoded", + "command": "side_bar_copy_path_absolute_from_project_encoded" + }, + { + "caption": "File: Copy as Tag a", + "command": "side_bar_copy_tag_ahref" + }, + { + "caption": "File: Copy as Tag script", + "command": "side_bar_copy_tag_script" + }, + { + "caption": "File: Copy as Tag style", + "command": "side_bar_copy_tag_style" + }, + { + "caption": "File: Copy URL", + "command": "side_bar_copy_url" + }, + { + "caption": "File: Search Files", + "command": "side_bar_find_files_path_containing" + }, + { + "caption": "File: Open In Browser - Testing Server", + "command": "side_bar_open_in_browser", + "args":{"paths":[], "type":"testing"} + }, + { + "caption": "File: Open In Browser - Production Server", + "command": "side_bar_open_in_browser", + "args":{"paths":[], "type":"production"} + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Default.sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Default.sublime-keymap new file mode 100644 index 0000000..a49123e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Default.sublime-keymap @@ -0,0 +1,10 @@ +[ + { "keys": ["f12"], + "command": "side_bar_open_in_browser" , + "args":{"paths":[], "type":"testing"} + }, + { "keys": ["alt+f12"], + "command": "side_bar_open_in_browser", + "args":{"paths":[], "type":"production"} + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Main.sublime-menu new file mode 100644 index 0000000..81896f2 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Main.sublime-menu @@ -0,0 +1,88 @@ +[ + { + "caption": "Preferences", + "mnemonic": "n", + "id": "preferences", + "children": + [ + { + "caption": "Package Settings", + "mnemonic": "P", + "id": "package-settings", + "children": + [ + { + "caption": "Side Bar", + "children": + [ + { + "command": "open_file", "args": + { + "file": "${packages}/SideBarEnhancements/Side Bar.sublime-settings" + }, + "caption": "Settings – Default" + }, + { + "command": "open_file", "args": + { + "file": "${packages}/User/Side Bar.sublime-settings" + }, + "caption": "Settings – User" + }, + { "caption": "-" }, + { + "command": "open_file", + "args": { + "file": "${packages}/SideBarEnhancements/Default (OSX).sublime-keymap", + "platform": "OSX" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/SideBarEnhancements/Default (Linux).sublime-keymap", + "platform": "Linux" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/SideBarEnhancements/Default (Windows).sublime-keymap", + "platform": "Windows" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (OSX).sublime-keymap", + "platform": "OSX" + }, + "caption": "Key Bindings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (Linux).sublime-keymap", + "platform": "Linux" + }, + "caption": "Key Bindings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (Windows).sublime-keymap", + "platform": "Windows" + }, + "caption": "Key Bindings – User" + }, + { "caption": "-" } + ] + } + ] + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-menu new file mode 100644 index 0000000..2670ed9 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-menu @@ -0,0 +1,116 @@ +[ + {"caption":"-", "id":"side-bar-start-separator"}, + { "caption": "New File…", "id": "side-bar-new-file", "command": "side_bar_new_file", "args": {"paths": []} }, + { "caption": "New Folder…", "id": "side-bar-new-directory", "command": "side_bar_new_directory", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-new-separator"}, + + { "caption": "Edit", "id": "side-bar-edit", "command": "side_bar_edit", "args": {"paths": []} }, + { "caption": "Open / Run", "id": "side-bar-open", "command": "side_bar_open", "args": {"paths": []} }, + { "caption": "Open In Browser", "id": "side-bar-open-in-browser", "command": "side_bar_open_in_browser", "args": {"paths": []} }, + { "caption": "Open In New Window", "id": "side-bar-open-in-new-window", "command": "side_bar_open_in_new_window", "args": {"paths": []} }, + { "caption": "Open With Finder", "id": "side-bar-open-with-finde", "command": "side_bar_open_with_finder", "args": {"paths": []} }, + { "caption": "Open With", "id": "side-bar-files-open-with", + + "children": + [ + + { "caption": "-", "id": "side-bar-files-open-with-edit-application-separator"}, + { "caption": "Edit Applications…", "id": "side-bar-files-open-with-edit-applications", "command":"side_bar_files_open_with_edit_applications","args": {"paths": []} }, + { "caption": "-", "id": "side-bar-files-open-with-edit-applications-separator"} + + ] + }, + { "caption": "Reveal", "id": "side-bar-reveal", "command": "side_bar_reveal", "args": {"paths": []} }, + + { "caption": "-", "id": "side-bar-edit-open-separator" }, + + { "caption": "Find & Replace…", "id": "side-bar-find-selected", "command": "side_bar_find_in_selected", "args": {"paths": []} }, + { "caption": "Find In Project…", "id": "side-bar-find-in-project", "command": "side_bar_find_in_project", "args": {"paths": []} }, + { "caption": "Find Advanced", "id": "side-bar-find-advanced", + "children": + [ + { "caption": "In Parent Folder…", "id": "side-bar-find-parent", "command": "side_bar_find_in_parent", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-find-parent-separator"}, + { "caption": "In Project Folder…", "id": "side-bar-find-project-folder", "command": "side_bar_find_in_project_folder", "args": {"paths": []} }, + { "caption": "In Project Folders…", "id": "side-bar-find-project-folders", "command": "side_bar_find_in_project_folders"}, + { "caption": "-", "id": "side-bar-find-project-separator"}, + { "id": "side-bar-find-in-files-with-extension", "command": "side_bar_find_in_files_with_extension", "args": {"paths": []}}, + { "caption": "In Paths Containing…", "id": "side-bar-find-files-path-containing", "command": "side_bar_find_files_path_containing", "args": {"paths": []} } + + ] + }, + { "caption": "-", "id": "side-bar-find-separator"}, + { "caption": "Cut", "id": "side-bar-clip-cut", "command": "side_bar_cut", "args": {"paths": []} }, + { "caption": "Copy", "id": "side-bar-clip-copy", "command": "side_bar_copy", "args": {"paths": []} }, + { "caption": "Copy Name", "id": "side-bar-clip-copy-name", "command": "side_bar_copy_name", "args": {"paths": []} }, + { "caption": "Copy Path", "id": "side-bar-clip-copy-path", "command": "side_bar_copy_path_absolute_from_project_encoded", "args": {"paths": []} }, + { "caption": "Copy Dir Path", "id": "side-bar-clip-copy-dir-path", "command": "side_bar_copy_dir_path", "args": {"paths": []} }, + { "caption": "Copy as Text", "id": "side-bar-clip-copy-as", + "children": + [ + { "caption": "Relative Path From View Encoded", "id": "side-bar-clip-copy-path-relative-from-view-encoded", "command": "side_bar_copy_path_relative_from_view_encoded", "args": {"paths": []} }, + { "caption": "Relative Path From View", "id": "side-bar-clip-copy-path-relative-from-view", "command": "side_bar_copy_path_relative_from_view", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-path-relative-from-view-separator"}, + + { "caption": "Relative Path From Project Encoded", "id": "side-bar-clip-copy-path-relative-from-project-encoded", "command": "side_bar_copy_path_relative_from_project_encoded", "args": {"paths": []} }, + { "caption": "Relative Path From Project", "id": "side-bar-clip-copy-path-relative-from-project", "command": "side_bar_copy_path_relative_from_project", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-path-relative-from-project-separator"}, + + { "caption": "Absolute Path From Project Encoded", "id": "side-bar-clip-copy-path-absolute-from-project-encoded", "command": "side_bar_copy_path_absolute_from_project_encoded", "args": {"paths": []} }, + { "caption": "Absolute Path From Project", "id": "side-bar-clip-copy-path-absolute-from-project", "command": "side_bar_copy_path_absolute_from_project", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-path-absolute-from-project-separator"}, + + { "caption": "Path as URI", "id": "side-bar-clip-copy-path-encoded", "command": "side_bar_copy_path_encoded", "args": {"paths": []} }, + { "caption": "Path", "id": "side-bar-clip-copy-path", "command": "side_bar_copy_path", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-path-separator"}, + + { "caption": "Name Encoded", "id": "side-bar-clip-copy-name-encoded", "command": "side_bar_copy_name_encoded", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-name-encoded-separator"}, + + { "caption": "URL", "id": "side-bar-clip-copy-url", "command": "side_bar_copy_url", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-url-separator"}, + + { "caption": "Tag a", "id": "side-bar-clip-copy-tag-a", "command": "side_bar_copy_tag_ahref", "args": {"paths": []} }, + { "caption": "Tag img", "id": "side-bar-clip-copy-tag-img", "command": "side_bar_copy_tag_img", "args": {"paths": []} }, + { "caption": "Tag script", "id": "side-bar-clip-copy-tag-script", "command": "side_bar_copy_tag_script", "args": {"paths": []} }, + { "caption": "Tag style", "id": "side-bar-clip-copy-tag-style", "command": "side_bar_copy_tag_style", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-tag-separator"}, + { "caption": "Project Folders", "id": "side-bar-clip-copy-project-directories", "command": "side_bar_copy_project_directories", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-project-directories-separator"}, + { "caption": "Content as UTF-8", "id": "side-bar-clip-copy-content-utf8", "command": "side_bar_copy_content_utf8", "args": {"paths": []} }, + { "caption": "Content as Data URI", "id": "side-bar-clip-copy-content-base-64", "command": "side_bar_copy_content_base64", "args": {"paths": []} } + ] + }, + + { "caption": "Paste", "id": "side-bar-clip-paste", "command": "side_bar_paste", "args": {"paths": [], "in_parent":"False"} }, + { "caption": "Paste in Parent", "id": "side-bar-clip-paste-in-parent", "command": "side_bar_paste", "args": {"paths": [], "in_parent":"True"} }, + { "caption": "-", "id": "side-bar-clip-separator" }, + { "caption": "Duplicate…", "id": "side-bar-duplicate", "command": "side_bar_duplicate", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-duplicate-separator" }, + + { "caption": "Rename…", "id": "side-bar-rename", "command": "side_bar_rename", "args": {"paths": []} }, + { "caption": "Move…", "id": "side-bar-move", "command": "side_bar_move", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-rename-move-separator" }, + + { "caption": "Delete", "id": "side-bar-delete", "command": "side_bar_delete", "args": {"paths": []} }, + { "caption": "Empty", "id": "side-bar-emptry", "command": "side_bar_empty", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-delete-separator" }, + + { "caption": "Refresh", "id": "side-bar-refresh", "command": "refresh_folder_list" }, + { "caption": "-", "id": "side-bar-refresh-separator" }, + { "caption": "Project", "id": "side-bar-project", + "children": + [ + { "caption": "Edit Project", "id": "side-bar-project-open-file", "command": "side_bar_project_open_file", "args": {"paths": []} }, + { "caption": "Edit Projects Preview URLs", "id": "side-bar-project-preview-url", "command": "side_bar_project_open_project_preview_urls_file", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-project-open-file-separator" }, + { "caption": "Promote as Project Folder", "id": "side-bar-project-item-add", "command": "side_bar_project_item_add", "args": {"paths": []} }, + { "caption": "Exclude From Project", "id": "side-bar-project-item-exclude", "command": "side_bar_project_item_exclude", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-project-item-separator" }, + { "caption": "Remove Folder from Project", "id": "side-bar-project-item-remove-folder", "command": "side_bar_project_item_remove_folder", "args": { "paths": []} }, + { "command": "prompt_add_folder", "caption": "Add Folder to Project…", "mnemonic": "d" } + + ] + }, + { "caption": "-", "id": "side-bar-end-separator" } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-settings new file mode 100644 index 0000000..a5f7958 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-settings @@ -0,0 +1,32 @@ +{ + "statusbar_modified_time" : false, + "statusbar_modified_time_format" : "%A %b %d %H:%M:%S %Y", + + "statusbar_file_size" : false, + + "close_affected_buffers_when_deleting_even_if_dirty" : false, + + "hide_open_with_entries_when_there_are_no_applicable" : false, + + "confirm_before_deleting" : true, + + "new_files_relative_to_project_root": false, + + "disabled_menuitem_edit": false, + "disabled_menuitem_open_run": false, + "disabled_menuitem_open_in_browser": false, + "disabled_menuitem_open_in_new_window": false, + "disabled_menuitem_find_in_project": false, + "disabled_menuitem_copy_name": false, + "disabled_menuitem_copy_path": false, + "disabled_menuitem_copy_dir_path": true, + "disabled_menuitem_paste_in_parent": false, + "disabled_menuitem_empty": true, + + //if installed in a default location maybe this works. + "default_browser": "chrome", //one of this list: firefox, chrome, chromium, opera, safari + + "portable_browser": "" // for example: C:/Program Files (x86)/Nightly/firefox.exe + + +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar Results.hidden-tmLanguage b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar Results.hidden-tmLanguage new file mode 100644 index 0000000..982444a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar Results.hidden-tmLanguage @@ -0,0 +1,50 @@ + + + + + name + SideBar Results + + patterns + + + match + (Type to search\:).* + captures + + 1 + + name + entity.name.function + + + + + match + ([0-9]+) match.* + captures + + 1 + + name + entity.name.function + + + + + match + ^(.*(\:|/).*)$ + captures + + 1 + + name + entity.name.filename.find-in-files + + + + + scopeName + text.find-in-files + + \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar.py new file mode 100644 index 0000000..c0400dd --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar.py @@ -0,0 +1,1502 @@ +# coding=utf8 +import sublime, sublime_plugin +import os + +import threading, time + +from sidebar.SideBarItem import SideBarItem +from sidebar.SideBarSelection import SideBarSelection +from sidebar.SideBarProject import SideBarProject + +from send2trash import send2trash + +# needed for getting local app data path on windows +if sublime.platform() == 'windows': + import _winreg + +def disable_default(): + default = sublime.packages_path()+'/Default/Side Bar.sublime-menu' + desired = sublime.packages_path()+'/SideBarEnhancements/disable_default/Side Bar.sublime-menu.txt' + if file(default, 'r').read() == file(desired, 'r').read(): + file(default, 'w+').write('[/*'+file(desired, 'r').read()+'*/]') + + default = sublime.packages_path()+'/Default/Side Bar Mount Point.sublime-menu' + desired = sublime.packages_path()+'/SideBarEnhancements/disable_default/Side Bar Mount Point.sublime-menu.txt' + if file(default, 'r').read() == file(desired, 'r').read(): + file(default, 'w+').write('[/*'+file(desired, 'r').read()+'*/]') + +try: + disable_default(); +except: + pass + +def expand_vars(path): + for k, v in os.environ.iteritems(): + # dirty hack, this should be autofixed in python3 + try: + k = unicode(k.encode('utf8')) + v = unicode(v.encode('utf8')) + path = path.replace('%'+k+'%', v).replace('%'+k.lower()+'%', v) + except: + pass + return path +#NOTES +# A "directory" for this plugin is a "directory" +# A "directory" for a user is a "folder" + +s = sublime.load_settings('Side Bar.sublime-settings') + +def check_version(): + version = '11.13.2012.1305.0'; + if s.get('version') != version: + SideBarItem(sublime.packages_path()+'/SideBarEnhancements/messages/'+version+'.txt', False).edit(); + s.set('version', version); + sublime.save_settings('Side Bar.sublime-settings') + +sublime.set_timeout(lambda:check_version(), 3000); + +class SideBarNewFile2Command(sublime_plugin.WindowCommand): + def run(self, paths = [], name = ""): + import functools + self.window.run_command('hide_panel'); + self.window.show_input_panel("File Name:", name, functools.partial(SideBarNewFileCommand(sublime_plugin.WindowCommand).on_done, paths, True), None, None) + +class SideBarNewFileCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], name = ""): + import functools + self.window.run_command('hide_panel'); + self.window.show_input_panel("File Name:", name, functools.partial(self.on_done, paths, False), None, None) + + def on_done(self, paths, relative_to_project, name): + if relative_to_project and s.get('new_files_relative_to_project_root'): + paths = SideBarProject().getDirectories() + if paths: + paths = [SideBarItem(paths[0], False)] + if not paths: + paths = SideBarSelection(paths).getSelectedDirectoriesOrDirnames() + else: + paths = SideBarSelection(paths).getSelectedDirectoriesOrDirnames() + if not paths: + paths = SideBarProject().getDirectories() + if paths: + paths = [SideBarItem(paths[0], False)] + if not paths: + sublime.active_window().new_file() + else: + for item in paths: + item = SideBarItem(item.join(name), False) + if item.exists(): + sublime.error_message("Unable to create file, file or folder exists.") + self.run(paths, name) + return + else: + try: + item.create() + item.edit() + except: + sublime.error_message("Unable to create file:\n\n"+item.path()) + self.run(paths, name) + return + SideBarProject().refresh(); + +class SideBarNewDirectoryCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], name = ""): + import functools + self.window.run_command('hide_panel'); + self.window.show_input_panel("Folder Name:", name, functools.partial(self.on_done, paths), None, None) + + def on_done(self, paths, name): + for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames(): + item = SideBarItem(item.join(name), True) + if item.exists(): + sublime.error_message("Unable to create folder, folder or file exists.") + self.run(paths, name) + return + else: + item.create() + if not item.exists(): + sublime.error_message("Unable to create folder:\n\n"+item.path()) + self.run(paths, name) + return + SideBarProject().refresh(); + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarEditCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + for item in SideBarSelection(paths).getSelectedFiles(): + item.edit() + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFiles() + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_edit') + +class SideBarOpenCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + for item in SideBarSelection(paths).getSelectedFiles(): + item.open() + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFiles() + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_open_run') + +class SideBarFilesOpenWithEditApplicationsCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + item = SideBarItem(os.path.join(sublime.packages_path(), 'User', 'SideBarEnhancements', 'Open With', 'Side Bar.sublime-menu'), False) + if not item.exists(): + item.create() + item.write("""[ + {"id": "side-bar-files-open-with", + "children": + [ + + //application 1 + { + "caption": "Photoshop", + "id": "side-bar-files-open-with-photoshop", + + "command": "side_bar_files_open_with", + "args": { + "paths": [], + "application": "Adobe Photoshop CS5.app", // OSX + "extensions":"psd|png|jpg|jpeg" //any file with these extensions + } + }, + + //separator + {"caption":"-"}, + + //application 2 + { + "caption": "SeaMonkey", + "id": "side-bar-files-open-with-seamonkey", + + "command": "side_bar_files_open_with", + "args": { + "paths": [], + "application": "C:\\\\Archivos de programa\\\\SeaMonkey\\\\seamonkey.exe", // WINNT + "extensions":"" //open all even folders + } + }, + //application n + { + "caption": "Chrome", + "id": "side-bar-files-open-with-chrome", + + "command": "side_bar_files_open_with", + "args": { + "paths": [], + "application": "C:\\\\Documents and Settings\\\\tito\\\\Configuración local\\\\Datos de programa\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe", + "extensions":".*" //any file with extension + } + }, + + {"caption":"-"} + ] + } +]"""); + item.edit() + + def is_enabled(self, paths = []): + return True + +class SideBarFilesOpenWithCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], application = "", extensions = ""): + import sys + application_dir, application_name = os.path.split(application) + application_dir = application_dir.encode(sys.getfilesystemencoding()) + application_name = application_name.encode(sys.getfilesystemencoding()) + application = application.encode(sys.getfilesystemencoding()) + + if extensions == '*': + extensions = '.*' + if extensions == '': + items = SideBarSelection(paths).getSelectedItems() + else: + items = SideBarSelection(paths).getSelectedFilesWithExtension(extensions) + + import subprocess + for item in items: + if sublime.platform() == 'osx': + subprocess.Popen(['open', '-a', application, item.nameSystem()], cwd=item.dirnameSystem()) + elif sublime.platform() == 'windows': + subprocess.Popen([application_name, item.pathSystem()], cwd=expand_vars(application_dir), shell=True) + else: + subprocess.Popen([application_name, item.nameSystem()], cwd=item.dirnameSystem()) + + def is_enabled(self, paths = [], application = "", extensions = ""): + if extensions == '*': + extensions = '.*' + if extensions == '': + return SideBarSelection(paths).len() > 0 + else: + return SideBarSelection(paths).hasFilesWithExtension(extensions) + + def is_visible(self, paths = [], application = "", extensions = ""): + if extensions == '*': + extensions = '.*' + if extensions == '': + return SideBarSelection(paths).len() > 0 + else: + has = SideBarSelection(paths).hasFilesWithExtension(extensions) + return has or (not has and not s.get("hide_open_with_entries_when_there_are_no_applicable")) + +class SideBarFindInSelectedCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItemsWithoutChildItems(): + items.append(item.path()) + self.window.run_command('hide_panel'); + if int(sublime.version()) >= 2134: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":",".join(items) }) + else: + self.window.run_command("show_panel", {"panel": "find_in_files", "location":",".join(items) }) + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarFindInParentCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.dirname()) + items = list(set(items)) + self.window.run_command('hide_panel'); + if int(sublime.version()) >= 2134: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":",".join(items) }) + else: + self.window.run_command("show_panel", {"panel": "find_in_files", "location":",".join(items) }) + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarFindInProjectFoldersCommand(sublime_plugin.WindowCommand): + def run(self): + self.window.run_command('hide_panel'); + if int(sublime.version()) >= 2137: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":""}) + elif int(sublime.version()) >= 2136: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":""}) + elif int(sublime.version()) >= 2134: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":""}) + else: + self.window.run_command("show_panel", {"panel": "find_in_files", "location":""}) + +class SideBarFindInProjectCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + self.window.run_command('hide_panel'); + if int(sublime.version()) >= 2137: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":""}) + elif int(sublime.version()) >= 2136: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":""}) + elif int(sublime.version()) >= 2134: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":""}) + else: + self.window.run_command("show_panel", {"panel": "find_in_files", "location":""}) + + def is_visible(self, paths = []): + return not s.get('disabled_menuitem_find_in_project') + +class SideBarFindInProjectFolderCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItemsWithoutChildItems(): + items.append(SideBarProject().getDirectoryFromPath(item.path())) + items = list(set(items)) + if items: + self.window.run_command('hide_panel'); + self.window.run_command("show_panel", {"panel": "find_in_files", "where":",".join(items)}) + +class SideBarFindInFilesWithExtensionCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append('*'+item.extension()) + items = list(set(items)) + self.window.run_command('hide_panel'); + if int(sublime.version()) >= 2134: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":",".join(items) }) + else: + self.window.run_command("show_panel", {"panel": "find_in_files", "location":",".join(items) }) + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFiles() + + def description(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedFiles(): + items.append('*'+item.extension()) + items = list(set(items)) + if len(items) > 1: + return 'In Files With Extensions '+(",".join(items))+u'…' + elif len(items) > 0: + return 'In Files With Extension '+(",".join(items))+u'…' + else: + return u'In Files With Extension…' + + +sidebar_instant_search = 0 + +class SideBarFindFilesPathContainingCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + global sidebar_instant_search + if paths == [] and SideBarProject().getDirectories(): + paths = SideBarProject().getDirectories() + else: + paths = [item.path() for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames()] + if paths == []: + return + view = self.window.new_file() + view.settings().set('word_wrap', False) + view.set_name('Instant File Search') + view.set_syntax_file('Packages/SideBarEnhancements/SideBar Results.hidden-tmLanguage') + view.set_scratch(True) + edit = view.begin_edit() + view.settings().set('sidebar_instant_search_paths', paths) + view.replace(edit, sublime.Region(0, view.size()), "Type to search: ") + view.end_edit(edit) + view.sel().clear() + view.sel().add(sublime.Region(16)) + sidebar_instant_search += 1 + + def is_enabled(self, paths=[]): + return True + +class SideBarFindResultsViewListener(sublime_plugin.EventListener): + + def on_modified(self, view): + global sidebar_instant_search + if sidebar_instant_search > 0 and view.settings().has('sidebar_instant_search_paths'): + row, col = view.rowcol(view.sel()[0].begin()) + if row != 0 or not view.sel()[0].empty(): + return + paths = view.settings().get('sidebar_instant_search_paths') + searchTerm = view.substr(view.line(0)).replace("Type to search:", "").strip() + start_time = time.time() + view.settings().set('sidebar_search_paths_start_time', start_time) + if searchTerm: + sublime.set_timeout(lambda:SideBarFindFilesPathContainingSearchThread(paths, searchTerm, view, start_time).start(), 300) + + def on_close(self, view): + if view.settings().has('sidebar_instant_search_paths'): + global sidebar_instant_search + sidebar_instant_search -= 1 + +class SideBarFindFilesPathContainingSearchThread(threading.Thread): + def __init__(self, paths, searchTerm, view, start_time): + if view.settings().get('sidebar_search_paths_start_time') != start_time: + self.should_run = False + else: + self.should_run = True + self.view = view + self.searchTerm = searchTerm + self.paths = paths + self.start_time = start_time + threading.Thread.__init__(self) + + def run(self): + if not self.should_run: + return + # print 'run forrest run' + self.total = 0 + self.highlight_from = 0 + self.match_result = u'' + self.match_result += 'Type to search: '+self.searchTerm+'\n' + for item in SideBarSelection(self.paths).getSelectedDirectoriesOrDirnames(): + self.files = [] + self.num_files = 0 + self.find(item.path()) + self.match_result += '\n' + length = len(self.files) + if length > 1: + self.match_result += str(length)+' matches' + elif length > 0: + self.match_result += '1 match' + else: + self.match_result += 'No match' + self.match_result += ' in '+str(self.num_files)+' files for term "'+self.searchTerm+'" under \n"'+item.path()+'"\n\n' + if self.highlight_from == 0: + self.highlight_from = len(self.match_result) + self.match_result += ('\n'.join(self.files)) + self.total = self.total + length + self.match_result += '\n' + sublime.set_timeout(lambda:self.on_done(), 0) + + def on_done(self): + if self.start_time == self.view.settings().get('sidebar_search_paths_start_time'): + view = self.view; + edit = view.begin_edit() + sel = sublime.Region(view.sel()[0].begin(), view.sel()[0].end()) + view.replace(edit, sublime.Region(0, view.size()), self.match_result); + view.end_edit(edit) + view.erase_regions("sidebar_search_instant_highlight") + if self.total < 30000 and len(self.searchTerm) > 1: + regions = [item for item in view.find_all(self.searchTerm, sublime.LITERAL|sublime.IGNORECASE) if item.begin() >= self.highlight_from] + view.add_regions("sidebar_search_instant_highlight", regions, 'string', sublime.DRAW_EMPTY|sublime.DRAW_OUTLINED|sublime.DRAW_EMPTY_AS_OVERWRITE) + view.sel().clear() + view.sel().add(sel) + + def find(self, path): + if os.path.isfile(path) or os.path.islink(path): + self.num_files = self.num_files+1 + if self.match(path): + self.files.append(path) + elif os.path.isdir(path): + for content in os.listdir(path): + file = os.path.join(path, content) + if os.path.isfile(file) or os.path.islink(file): + self.num_files = self.num_files+1 + if self.match(file): + self.files.append(file) + else: + self.find(file) + + def match(self, path): + return False if path.lower().find(self.searchTerm.lower()) == -1 else True + +class SideBarCutCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + s = sublime.load_settings("SideBarEnhancements/Clipboard.sublime-settings") + items = [] + for item in SideBarSelection(paths).getSelectedItemsWithoutChildItems(): + items.append(item.path()) + + if len(items) > 0: + s.set('cut', "\n".join(items)) + s.set('copy', '') + if len(items) > 1 : + sublime.status_message("Items cut") + else : + sublime.status_message("Item cut") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasProjectDirectories() == False + + +class SideBarCopyCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + s = sublime.load_settings("SideBarEnhancements/Clipboard.sublime-settings") + items = [] + for item in SideBarSelection(paths).getSelectedItemsWithoutChildItems(): + items.append(item.path()) + + if len(items) > 0: + s.set('cut', '') + s.set('copy', "\n".join(items)) + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarPasteCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], in_parent = 'False', test = 'True', replace = 'False'): + s = sublime.load_settings("SideBarEnhancements/Clipboard.sublime-settings") + + cut = s.get('cut', '') + copy = s.get('copy', '') + + already_exists_paths = [] + + if SideBarSelection(paths).len() > 0: + if in_parent == 'False': + location = SideBarSelection(paths).getSelectedItems()[0].path() + else: + location = SideBarSelection(paths).getSelectedDirectoriesOrDirnames()[0].dirname() + + if os.path.isdir(location) == False: + location = SideBarItem(os.path.dirname(location), True) + else: + location = SideBarItem(location, True) + + if cut != '': + cut = cut.split("\n") + for path in cut: + path = SideBarItem(path, os.path.isdir(path)) + new = os.path.join(location.path(), path.name()) + if test == 'True' and os.path.exists(new): + already_exists_paths.append(new) + elif test == 'False': + if os.path.exists(new) and replace == 'False': + pass + else: + try: + if not path.move(new, replace == 'True'): + sublime.error_message("Unable to cut and paste, destination exists.") + return + except: + sublime.error_message("Unable to move:\n\n"+path.path()+"\n\nto\n\n"+new) + return + + if copy != '': + copy = copy.split("\n") + for path in copy: + path = SideBarItem(path, os.path.isdir(path)) + new = os.path.join(location.path(), path.name()) + if test == 'True' and os.path.exists(new): + already_exists_paths.append(new) + elif test == 'False': + if os.path.exists(new) and replace == 'False': + pass + else: + try: + if not path.copy(new, replace == 'True'): + sublime.error_message("Unable to copy and paste, destination exists.") + return + except: + sublime.error_message("Unable to copy:\n\n"+path.path()+"\n\nto\n\n"+new) + return + + if test == 'True' and len(already_exists_paths): + self.confirm(paths, in_parent, already_exists_paths) + elif test == 'True' and not len(already_exists_paths): + self.run(paths, in_parent, 'False', 'False') + elif test == 'False': + cut = s.set('cut', '') + SideBarProject().refresh(); + + def confirm(self, paths, in_parent, data): + import functools + window = sublime.active_window() + # window.show_input_panel("BUG!", '', '', None, None) + # window.run_command('hide_panel'); + + yes = [] + yes.append('Yes, Replace the following items:'); + for item in data: + yes.append(SideBarItem(item, os.path.isdir(item)).pathWithoutProject()) + + no = [] + no.append('No'); + no.append('Continue without replacing'); + + window.show_quick_panel([yes, no], functools.partial(self.on_done, paths, in_parent)) + + def on_done(self, paths, in_parent, result): + if result != -1: + if result == 0: + self.run(paths, in_parent, 'False', 'True') + else: + self.run(paths, in_parent, 'False', 'False') + + def is_enabled(self, paths = [], in_parent = False): + s = sublime.load_settings("SideBarEnhancements/Clipboard.sublime-settings") + return s.get('cut', '') + s.get('copy', '') != '' and len(SideBarSelection(paths).getSelectedDirectoriesOrDirnames()) == 1 + + def is_visible(self, paths = [], in_parent = False): + if in_parent == 'True': + return not s.get('disabled_menuitem_paste_in_parent') + else: + return True + +class SideBarCopyNameCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.name()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_copy_name') + +class SideBarCopyNameEncodedCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.nameEncoded()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + + +class SideBarCopyPathCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.path()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarCopyDirPathCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames(): + items.append(item.path()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_copy_dir_path') + +class SideBarCopyPathEncodedCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.uri()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarCopyPathRelativeFromProjectCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.pathRelativeFromProject()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasItemsUnderProject() + + + +class SideBarCopyPathRelativeFromProjectEncodedCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.pathRelativeFromProjectEncoded()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasItemsUnderProject() + +class SideBarCopyPathRelativeFromViewCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.pathRelativeFromView()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarCopyPathRelativeFromViewEncodedCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.pathRelativeFromViewEncoded()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarCopyPathAbsoluteFromProjectCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.pathAbsoluteFromProject()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasItemsUnderProject() + +class SideBarCopyPathAbsoluteFromProjectEncodedCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.pathAbsoluteFromProjectEncoded()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasItemsUnderProject() + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_copy_path') + +class SideBarCopyTagAhrefCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(''+item.namePretty()+'') + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasItemsUnderProject() + +class SideBarCopyTagImgCommand(sublime_plugin.WindowCommand): + + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedImages(): + try: + image_type, width, height = self.getImageInfo(item.contentBinary()) + items.append('') + except: + items.append('') + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + #Project:http://code.google.com/p/bfg-pages/ + #License:http://www.opensource.org/licenses/bsd-license.php + def getImageInfo(self, data): + import StringIO + import struct + data = str(data) + size = len(data) + height = -1 + width = -1 + content_type = '' + + # handle GIFs + if (size >= 10) and data[:6] in ('GIF87a', 'GIF89a'): + # Check to see if content_type is correct + content_type = 'image/gif' + w, h = struct.unpack("= 24) and data.startswith('\211PNG\r\n\032\n') + and (data[12:16] == 'IHDR')): + content_type = 'image/png' + w, h = struct.unpack(">LL", data[16:24]) + width = int(w) + height = int(h) + + # Maybe this is for an older PNG version. + elif (size >= 16) and data.startswith('\211PNG\r\n\032\n'): + # Check to see if we have the right content type + content_type = 'image/png' + w, h = struct.unpack(">LL", data[8:16]) + width = int(w) + height = int(h) + + # handle JPEGs + elif (size >= 2) and data.startswith('\377\330'): + content_type = 'image/jpeg' + jpeg = StringIO.StringIO(data) + jpeg.read(2) + b = jpeg.read(1) + try: + while (b and ord(b) != 0xDA): + while (ord(b) != 0xFF): b = jpeg.read(1) + while (ord(b) == 0xFF): b = jpeg.read(1) + if (ord(b) >= 0xC0 and ord(b) <= 0xC3): + jpeg.read(3) + h, w = struct.unpack(">HH", jpeg.read(4)) + break + else: + jpeg.read(int(struct.unpack(">H", jpeg.read(2))[0])-2) + b = jpeg.read(1) + width = int(w) + height = int(h) + except struct.error: + pass + except ValueError: + pass + return content_type, width, height + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasImages() and SideBarSelection(paths).hasItemsUnderProject() + +class SideBarCopyTagStyleCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedFilesWithExtension('css'): + items.append('') + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFilesWithExtension('css') and SideBarSelection(paths).hasItemsUnderProject() + +class SideBarCopyTagScriptCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedFilesWithExtension('js'): + items.append('') + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFilesWithExtension('js') and SideBarSelection(paths).hasItemsUnderProject() + +class SideBarCopyProjectDirectoriesCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for directory in SideBarProject().getDirectories(): + items.append(directory) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return True + +class SideBarCopyContentUtf8Command(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedFiles(): + items.append(item.contentUTF8()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items content copied") + else : + sublime.status_message("Item content copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFiles() + +class SideBarCopyContentBase64Command(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedFiles(): + items.append(item.contentBase64()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items content copied") + else : + sublime.status_message("Item content copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFiles() + +class SideBarCopyUrlCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + project = SideBarProject() + url = project.getPreference('url_production') + if url: + if url[-1:] != '/': + url = url+'/' + for item in SideBarSelection(paths).getSelectedItems(): + if item.isUnderCurrentProject(): + items.append(url + item.pathRelativeFromProjectEncoded()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items URL copied") + else : + sublime.status_message("Item URL copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasItemsUnderProject() + +class SideBarDuplicateCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], new = False): + import functools + self.window.run_command('hide_panel'); + self.window.show_input_panel("Duplicate As:", new or SideBarSelection(paths).getSelectedItems()[0].path(), functools.partial(self.on_done, SideBarSelection(paths).getSelectedItems()[0].path()), None, None) + + def on_done(self, old, new): + item = SideBarItem(old, os.path.isdir(old)) + try: + if not item.copy(new): + sublime.error_message("Unable to duplicate, destination exists.") + self.run([old], new) + return + except: + sublime.error_message("Unable to copy:\n\n"+old+"\n\nto\n\n"+new) + self.run([old], new) + return + item = SideBarItem(new, os.path.isdir(new)) + if item.isFile(): + item.edit(); + SideBarProject().refresh(); + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() == 1 and SideBarSelection(paths).hasProjectDirectories() == False + +class SideBarRenameCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], newLeaf = False): + import functools + branch, leaf = os.path.split(SideBarSelection(paths).getSelectedItems()[0].path()) + self.window.run_command('hide_panel'); + self.window.show_input_panel("New Name:", newLeaf or leaf, functools.partial(self.on_done, SideBarSelection(paths).getSelectedItems()[0].path(), branch), None, None) + + def on_done(self, old, branch, leaf): + self.window.run_command('hide_panel'); + leaf = leaf.strip(); + new = os.path.join(branch, leaf) + item = SideBarItem(old, os.path.isdir(old)) + try: + if not item.move(new): + sublime.error_message("Unable to rename, destination exists.") + self.run([old], leaf) + return + except: + sublime.error_message("Unable to rename:\n\n"+old+"\n\nto\n\n"+new) + self.run([old], leaf) + raise + return + SideBarProject().refresh(); + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() == 1 and SideBarSelection(paths).hasProjectDirectories() == False + +class SideBarMoveCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], new = False): + import functools + self.window.run_command('hide_panel'); + self.window.show_input_panel("New Location:", new or SideBarSelection(paths).getSelectedItems()[0].path(), functools.partial(self.on_done, SideBarSelection(paths).getSelectedItems()[0].path()), None, None) + + def on_done(self, old, new): + item = SideBarItem(old, os.path.isdir(old)) + try: + if not item.move(new): + sublime.error_message("Unable to move, destination exists.") + self.run([old], new) + return + except: + sublime.error_message("Unable to move:\n\n"+old+"\n\nto\n\n"+new) + self.run([old], new) + return + SideBarProject().refresh(); + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() == 1 and SideBarSelection(paths).hasProjectDirectories() == False + +class SideBarDeleteCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], confirmed = 'False'): + + if confirmed == 'False' and s.get('confirm_before_deleting', True): + if sublime.platform() == 'osx': + if sublime.ok_cancel_dialog('delete the selected items?'): + self.run(paths, 'True') + else: + self.confirm([item.path() for item in SideBarSelection(paths).getSelectedItems()], [item.pathWithoutProject() for item in SideBarSelection(paths).getSelectedItems()]) + else: + try: + for item in SideBarSelection(paths).getSelectedItemsWithoutChildItems(): + if s.get('close_affected_buffers_when_deleting_even_if_dirty', False): + item.close_associated_buffers() + send2trash(item.path()) + SideBarProject().refresh(); + except: + import functools + self.window.show_input_panel("BUG!", '', '', None, None) + self.window.run_command('hide_panel'); + self.window.show_input_panel("Permanently Delete:", SideBarSelection(paths).getSelectedItems()[0].path(), functools.partial(self.on_done, SideBarSelection(paths).getSelectedItems()[0].path()), None, None) + + def confirm(self, paths, display_paths): + import functools + window = sublime.active_window() + window.show_input_panel("BUG!", '', '', None, None) + window.run_command('hide_panel'); + + yes = [] + yes.append('Yes, delete the selected items.'); + for item in display_paths: + yes.append(item); + + no = [] + no.append('No'); + no.append('Cancel the operation.'); + if sublime.platform() == 'osx': + sublime.set_timeout(lambda:window.show_quick_panel([yes, no], functools.partial(self.on_confirm, paths)), 200); + else: + window.show_quick_panel([yes, no], functools.partial(self.on_confirm, paths)) + + def on_confirm(self, paths, result): + if result != -1: + if result == 0: + self.run(paths, 'True') + + def on_done(self, old, new): + if s.get('close_affected_buffers_when_deleting_even_if_dirty', False): + item = SideBarItem(new, os.path.isdir(new)) + item.close_associated_buffers() + self.remove(new) + SideBarProject().refresh(); + + def remove(self, path): + if os.path.isfile(path) or os.path.islink(path): + self.remove_safe_file(path) + else: + for content in os.listdir(path): + file = os.path.join(path, content) + if os.path.isfile(file) or os.path.islink(file): + self.remove_safe_file(file) + else: + self.remove(file) + self.remove_safe_dir(path) + + def remove_safe_file(self, path): + if not SideBarSelection().isNone(path): + try: + os.remove(path) + except: + print "Unable to remove file:\n\n"+path + else: + print 'path is none' + print path + + def remove_safe_dir(self, path): + if not SideBarSelection().isNone(path): + try: + os.rmdir(path) + except: + print "Unable to remove folder:\n\n"+path + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasProjectDirectories() == False + + +class SideBarEmptyCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], confirmed = 'False'): + + if confirmed == 'False' and s.get('confirm_before_deleting', True): + if sublime.platform() == 'osx': + if sublime.ok_cancel_dialog('empty the content of the folder?'): + self.run(paths, 'True') + else: + self.confirm([item.path() for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames()], [item.pathWithoutProject() for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames()]) + else: + try: + for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames(): + for content in os.listdir(item.path()): + file = os.path.join(item.path(), content) + if not SideBarSelection().isNone(file): + send2trash(file) + if s.get('close_affected_buffers_when_deleting_even_if_dirty', False): + item.close_associated_buffers() + except: + pass + SideBarProject().refresh(); + + def confirm(self, paths, display_paths): + import functools + window = sublime.active_window() + window.show_input_panel("BUG!", '', '', None, None) + window.run_command('hide_panel'); + + yes = [] + yes.append('Yes, empty the selected items.'); + for item in display_paths: + yes.append(item); + + no = [] + no.append('No'); + no.append('Cancel the operation.'); + if sublime.platform() == 'osx': + sublime.set_timeout(lambda:window.show_quick_panel([yes, no], functools.partial(self.on_confirm, paths)), 200); + else: + window.show_quick_panel([yes, no], functools.partial(self.on_confirm, paths)) + + def on_confirm(self, paths, result): + if result != -1: + if result == 0: + self.run(paths, 'True') + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_empty') + +class SideBarRevealCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + for item in SideBarSelection(paths).getSelectedItems(): + item.reveal() + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarProjectOpenFileCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + project = SideBarProject() + if project.hasOpenedProject(): + SideBarItem(project.getProjectFile(), False).edit(); + +class SideBarProjectOpenProjectPreviewUrlsFileCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + SideBarItem(sublime.packages_path()+'/../Settings/SideBarEnhancements.json', False).edit(); + +class SideBarProjectItemAddCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + project = SideBarProject() + if project.hasOpenedProject(): + for item in SideBarSelection(paths).getSelectedDirectories(): + project.rootAdd(item.path()) + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasDirectories() + +class SideBarProjectItemExcludeCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + project = SideBarProject() + if project.hasOpenedProject(): + for item in SideBarSelection(paths).getSelectedItems(): + if item.isDirectory(): + project.excludeDirectory(item.path()) + else: + project.excludeFile(item.path()) + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarOpenInBrowserCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], type = False): + + browser = s.get("default_browser") + if browser == '': + browser = 'firefox' + + if type == False or type == 'testing': + type = 'url_testing' + elif type == 'production': + type = 'url_production' + else: + type = 'url_testing' + + for item in SideBarSelection(paths).getSelectedItems(): + if item.projectURL(type): + self.try_open(item.projectURL(type), browser) + else: + self.try_open(item.uri(), browser) + + # def run(self, paths = [], type = False): + # import webbrowser + # try: + # browser = webbrowser.get(s.get("default_browser")) + # except: + # browser = webbrowser + + # if type == False or type == 'testing': + # type = 'url_testing' + # elif type == 'production': + # type = 'url_production' + # else: + # type = 'url_testing' + + # for item in SideBarSelection(paths).getSelectedItems(): + # if item.projectURL(type): + # browser.open_new_tab(item.projectURL(type) + item.pathRelativeFromProjectEncoded()) + # else: + # browser.open_new_tab(item.uri()) + + def try_open(self, url, browser): + import subprocess + + browser = browser.lower().strip(); + items = [] + + if browser == 'chrome': + if sublime.platform() == 'osx': + items.extend(['open']) + commands = ['-a', '/Applications/Google Chrome.app', url] + elif sublime.platform() == 'windows': + # read local app data path from registry + aKey = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders") + reg_value, reg_type = _winreg.QueryValueEx (aKey, "Local AppData") + + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '%HOMEPATH%\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe' + + ,reg_value+'\\Chrome\\Application\\chrome.exe' + ,reg_value+'\\Google\\Chrome\\Application\\chrome.exe' + ,'%HOMEPATH%\\Google\\Chrome\\Application\\chrome.exe' + ,'%PROGRAMFILES%\\Google\\Chrome\\Application\\chrome.exe' + ,'%PROGRAMFILES(X86)%\\Google\\Chrome\\Application\\chrome.exe' + ,'%USERPROFILE%\\Local\ Settings\\Application\ Data\\Google\\Chrome\\chrome.exe' + ,'%HOMEPATH%\\Chromium\\Application\\chrome.exe' + ,'%PROGRAMFILES%\\Chromium\\Application\\chrome.exe' + ,'%PROGRAMFILES(X86)%\\Chromium\\Application\\chrome.exe' + ,'%HOMEPATH%\\Local\ Settings\\Application\ Data\\Google\\Chrome\\Application\\chrome.exe' + ,'%HOMEPATH%\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe' + ,'chrome.exe' + ]) + + + commands = ['-new-tab', url] + else: + + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '/usr/bin/google-chrome' + ,'chrome' + ,'google-chrome' + ]) + commands = ['-new-tab', url] + + elif browser == 'chromium': + if sublime.platform() == 'osx': + items.extend(['open']) + commands = ['-a', '/Applications/Chromium.app', url] + elif sublime.platform() == 'windows': + # read local app data path from registry + aKey = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders") + reg_value, reg_type = _winreg.QueryValueEx (aKey, "Local AppData") + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '%HOMEPATH%\\AppData\\Local\\Google\\Chrome SxS\\Application\\chrome.exe' + + , reg_value+'\\Chromium\\Application\\chromium.exe' + ,'%USERPROFILE%\\Local Settings\\Application Data\\Google\\Chrome\\chromium.exe' + ,'%USERPROFILE%\\Local\ Settings\\Application\ Data\\Google\\Chrome\\chromium.exe' + ,'%HOMEPATH%\\Chromium\\Application\\chromium.exe' + ,'%PROGRAMFILES%\\Chromium\\Application\\chromium.exe' + ,'%PROGRAMFILES(X86)%\\Chromium\\Application\\chromium.exe' + ,'%HOMEPATH%\\Local Settings\\Application\ Data\\Google\\Chrome\\Application\\chromium.exe' + ,'%HOMEPATH%\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chromium.exe' + ,'chromium.exe' + + , reg_value+'\\Chromium\\Application\\chrome.exe' + ,'%USERPROFILE%\\Local Settings\\Application Data\\Google\\Chrome\\chrome.exe' + ,'%USERPROFILE%\\Local\ Settings\\Application\ Data\\Google\\Chrome\\chrome.exe' + ,'%HOMEPATH%\\Chromium\\Application\\chrome.exe' + ,'%PROGRAMFILES%\\Chromium\\Application\\chrome.exe' + ,'%PROGRAMFILES(X86)%\\Chromium\\Application\\chrome.exe' + ,'%HOMEPATH%\\Local\ Settings\\Application\ Data\\Google\\Chrome\\Application\\chrome.exe' + ,'%HOMEPATH%\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe' + ,'chrome.exe' + + ]) + commands = ['-new-tab', url] + else: + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '/usr/bin/chromium' + ,'chromium' + ]) + commands = ['-new-tab', url] + elif browser == 'firefox': + if sublime.platform() == 'osx': + items.extend(['open']) + commands = ['-a', '/Applications/Firefox.app', url] + else: + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '/usr/bin/firefox' + + ,'%PROGRAMFILES%\\Nightly\\firefox.exe' + ,'%PROGRAMFILES(X86)%\\Nightly\\firefox.exe' + + ,'%PROGRAMFILES%\\Mozilla Firefox\\firefox.exe' + ,'%PROGRAMFILES(X86)%\\Mozilla Firefox\\firefox.exe' + + ,'firefox' + ,'firefox.exe' + ]) + commands = ['-new-tab', url] + elif browser == 'opera': + if sublime.platform() == 'osx': + items.extend(['open']) + commands = ['-a', '/Applications/Opera.app', url] + else: + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '/usr/bin/opera' + ,'/usr/bin/opera-next' + ,'/usr/bin/operamobile' + + ,'%PROGRAMFILES%\\Opera\\opera.exe' + ,'%PROGRAMFILES(X86)%\\Opera\\opera.exe' + + ,'%PROGRAMFILES%\\Opera Next\\opera.exe' + ,'%PROGRAMFILES(X86)%\\Opera Next\\opera.exe' + + ,'%PROGRAMFILES%\\Opera Mobile Emulator\\OperaMobileEmu.exe' + ,'%PROGRAMFILES(X86)%\\Opera Mobile Emulator\\OperaMobileEmu.exe' + + ,'opera' + ,'opera.exe' + ]) + commands = ['-newtab', url] + elif browser == 'safari': + if sublime.platform() == 'osx': + items.extend(['open']) + commands = ['-a', 'Safari', url] + else: + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '/usr/bin/safari' + + ,'%PROGRAMFILES%\\Safari\\Safari.exe' + ,'%PROGRAMFILES(X86)%\\Safari\\Safari.exe' + + ,'Safari' + ,'Safari.exe' + ]) + commands = ['-new-tab', '-url', url] + else: + sublime.error_message('Browser "'+browser+'" not found!\nUse any of the following: firefox, chrome, chromium, opera, safari') + return + + for item in items: + try: + command2 = list(commands) + command2.insert(0, expand_vars(item)) + subprocess.Popen(command2) + return + except: + try: + command2 = list(commands) + command2.insert(0, item) + subprocess.Popen(command2) + return + except: + pass + + sublime.error_message('Browser "'+browser+'" not found!\nIs installed? Which location...?') + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_open_in_browser') + +class SideBarOpenInNewWindowCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + import subprocess + for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames(): + if sublime.platform() == 'osx': + try: + subprocess.Popen(['subl', '.'], cwd=item.pathSystem()) + except: + try: + subprocess.Popen(['sublime', '.'], cwd=item.pathSystem()) + except: + subprocess.Popen(['/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl', '.'], cwd=item.pathSystem()) + elif sublime.platform() == 'windows': + try: + subprocess.Popen(['subl', '.'], cwd=item.pathSystem(), shell=True) + except: + try: + subprocess.Popen(['sublime', '.'], cwd=item.pathSystem(), shell=True) + except: + subprocess.Popen(['sublime_text.exe', '.'], cwd=item.pathSystem(), shell=True) + else: + try: + subprocess.Popen(['subl', '.'], cwd=item.pathSystem()) + except: + subprocess.Popen(['sublime', '.'], cwd=item.pathSystem()) + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_open_in_new_window') + +class SideBarOpenWithFinderCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + import subprocess + for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames(): + subprocess.Popen(['open', item.nameSystem()], cwd=item.dirnameSystem()) + + def is_visible(self, paths =[]): + return sublime.platform() == 'osx' + +class SideBarProjectItemRemoveFolderCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + self.window.run_command('remove_folder', {"dirs":paths}) + + def is_enabled(self, paths =[]): + return SideBarSelection(paths).len() == 1 and SideBarSelection(paths).hasProjectDirectories() == True diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarFileSize.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarFileSize.py new file mode 100644 index 0000000..0c0caa7 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarFileSize.py @@ -0,0 +1,24 @@ +import sublime, sublime_plugin +from hurry.filesize import size +from os.path import getsize + +s = sublime.load_settings('Side Bar.sublime-settings') + +class StatusBarFileSize(sublime_plugin.EventListener): + + def on_load(self, v): + if s.get('statusbar_file_size') and v.file_name(): + try: + self.show(v, size(getsize(v.file_name()))) + except: + pass + + def on_post_save(self, v): + if s.get('statusbar_file_size') and v.file_name(): + try: + self.show(v, size(getsize(v.file_name()))) + except: + pass + + def show(self, v, size): + v.set_status('statusbar_file_size', size); \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarModifiedTime.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarModifiedTime.py new file mode 100644 index 0000000..6336365 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarModifiedTime.py @@ -0,0 +1,25 @@ +import sublime, sublime_plugin, time +from os.path import getmtime + +s = sublime.load_settings('Side Bar.sublime-settings') + +class StatusBarModifiedTime(sublime_plugin.EventListener): + + def on_load(self, v): + if s.get('statusbar_modified_time') and v.file_name(): + try: + self.show(v, getmtime(v.file_name())) + except: + pass + + def on_post_save(self, v): + if s.get('statusbar_modified_time') and v.file_name(): + try: + self.show(v, getmtime(v.file_name())) + except: + pass + + def show(self, v, mtime): + v.set_status('statusbar_modified_time', time.strftime(s.get('statusbar_modified_time_format'), time.localtime(mtime))); + + \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar Mount Point.sublime-menu.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar Mount Point.sublime-menu.txt new file mode 100644 index 0000000..3411b67 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar Mount Point.sublime-menu.txt @@ -0,0 +1,4 @@ +[ + { "caption": "-", "id": "folder_commands" }, + { "caption": "Remove Folder from Project", "command": "remove_folder", "args": { "dirs": []} } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar.sublime-menu.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar.sublime-menu.txt new file mode 100644 index 0000000..3d308b9 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar.sublime-menu.txt @@ -0,0 +1,11 @@ +[ + { "caption": "New File", "command": "new_file_at", "args": {"dirs": []} }, + { "caption": "Rename…", "command": "rename_path", "args": {"paths": []} }, + { "caption": "Delete File", "command": "delete_file", "args": {"files": []} }, + { "caption": "Open Containing Folder…", "command": "open_containing_folder", "args": {"files": []} }, + { "caption": "-", "id": "folder_commands" }, + { "caption": "New Folder…", "command": "new_folder", "args": {"dirs": []} }, + { "caption": "Delete Folder", "command": "delete_folder", "args": {"dirs": []} }, + { "caption": "Find in Folder…", "command": "find_in_folder", "args": {"dirs": []} }, + { "caption": "-", "id": "end" } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/PKG-INFO b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/PKG-INFO new file mode 100644 index 0000000..fe3aadb --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/PKG-INFO @@ -0,0 +1,71 @@ +Metadata-Version: 1.0 +Name: hurry.filesize +Version: 0.9 +Summary: A simple Python library for human readable file sizes (or anything sized in bytes). +Home-page: UNKNOWN +Author: Martijn Faassen, Startifact +Author-email: faassen@startifact.com +License: ZPL 2.1 +Description: hurry.filesize + ============== + + hurry.filesize a simple Python library that can take a number of bytes and + returns a human-readable string with the size in it, in kilobytes (K), + megabytes (M), etc. + + The default system it uses is "traditional", where multipliers of 1024 + increase the unit size:: + + >>> from hurry.filesize import size + >>> size(1024) + '1K' + + An alternative, slightly more verbose system:: + + >>> from hurry.filesize import alternative + >>> size(1, system=alternative) + '1 byte' + >>> size(10, system=alternative) + '10 bytes' + >>> size(1024, system=alternative) + '1 KB' + + A verbose system:: + + >>> from hurry.filesize import verbose + >>> size(10, system=verbose) + '10 bytes' + >>> size(1024, system=verbose) + '1 kilobyte' + >>> size(2000, system=verbose) + '1 kilobyte' + >>> size(3000, system=verbose) + '2 kilobytes' + >>> size(1024 * 1024, system=verbose) + '1 megabyte' + >>> size(1024 * 1024 * 3, system=verbose) + '3 megabytes' + + You can also use the SI system, where multipliers of 1000 increase the unit + size:: + + >>> from hurry.filesize import si + >>> size(1000, system=si) + '1K' + + + Changes + ======= + + 0.9 (2009-03-11) + ---------------- + + * Initial public release. + + Download + ======== + +Keywords: file size bytes +Platform: UNKNOWN +Classifier: Programming Language :: Python +Classifier: Topic :: Software Development :: Libraries :: Python Modules diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/README.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/README.txt new file mode 100644 index 0000000..f5aa749 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/README.txt @@ -0,0 +1,47 @@ +hurry.filesize +============== + +hurry.filesize a simple Python library that can take a number of bytes and +returns a human-readable string with the size in it, in kilobytes (K), +megabytes (M), etc. + +The default system it uses is "traditional", where multipliers of 1024 +increase the unit size:: + + >>> from hurry.filesize import size + >>> size(1024) + '1K' + +An alternative, slightly more verbose system:: + + >>> from hurry.filesize import alternative + >>> size(1, system=alternative) + '1 byte' + >>> size(10, system=alternative) + '10 bytes' + >>> size(1024, system=alternative) + '1 KB' + +A verbose system:: + + >>> from hurry.filesize import verbose + >>> size(10, system=verbose) + '10 bytes' + >>> size(1024, system=verbose) + '1 kilobyte' + >>> size(2000, system=verbose) + '1 kilobyte' + >>> size(3000, system=verbose) + '2 kilobytes' + >>> size(1024 * 1024, system=verbose) + '1 megabyte' + >>> size(1024 * 1024 * 3, system=verbose) + '3 megabytes' + +You can also use the SI system, where multipliers of 1000 increase the unit +size:: + + >>> from hurry.filesize import si + >>> size(1000, system=si) + '1K' + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/__init__.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/filesize.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/filesize.py new file mode 100644 index 0000000..32065fe --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/filesize.py @@ -0,0 +1,110 @@ + +traditional = [ + (1024 ** 5, 'P'), + (1024 ** 4, 'T'), + (1024 ** 3, 'G'), + (1024 ** 2, 'M'), + (1024 ** 1, 'K'), + (1024 ** 0, 'B'), + ] + +alternative = [ + (1024 ** 5, ' PB'), + (1024 ** 4, ' TB'), + (1024 ** 3, ' GB'), + (1024 ** 2, ' MB'), + (1024 ** 1, ' KB'), + (1024 ** 0, (' byte', ' bytes')), + ] + +verbose = [ + (1024 ** 5, (' petabyte', ' petabytes')), + (1024 ** 4, (' terabyte', ' terabytes')), + (1024 ** 3, (' gigabyte', ' gigabytes')), + (1024 ** 2, (' megabyte', ' megabytes')), + (1024 ** 1, (' kilobyte', ' kilobytes')), + (1024 ** 0, (' byte', ' bytes')), + ] + +iec = [ + (1024 ** 5, 'Pi'), + (1024 ** 4, 'Ti'), + (1024 ** 3, 'Gi'), + (1024 ** 2, 'Mi'), + (1024 ** 1, 'Ki'), + (1024 ** 0, ''), + ] + +si = [ + (1000 ** 5, 'P'), + (1000 ** 4, 'T'), + (1000 ** 3, 'G'), + (1000 ** 2, 'M'), + (1000 ** 1, 'K'), + (1000 ** 0, 'B'), + ] + + + +def size(bytes, system=traditional): + """Human-readable file size. + + Using the traditional system, where a factor of 1024 is used:: + + >>> size(10) + '10B' + >>> size(100) + '100B' + >>> size(1000) + '1000B' + >>> size(2000) + '1K' + >>> size(10000) + '9K' + >>> size(20000) + '19K' + >>> size(100000) + '97K' + >>> size(200000) + '195K' + >>> size(1000000) + '976K' + >>> size(2000000) + '1M' + + Using the SI system, with a factor 1000:: + + >>> size(10, system=si) + '10B' + >>> size(100, system=si) + '100B' + >>> size(1000, system=si) + '1K' + >>> size(2000, system=si) + '2K' + >>> size(10000, system=si) + '10K' + >>> size(20000, system=si) + '20K' + >>> size(100000, system=si) + '100K' + >>> size(200000, system=si) + '200K' + >>> size(1000000, system=si) + '1M' + >>> size(2000000, system=si) + '2M' + + """ + for factor, suffix in system: + if bytes >= factor: + break + amount = int(bytes/factor) + if isinstance(suffix, tuple): + singular, multiple = suffix + if amount == 1: + suffix = singular + else: + suffix = multiple + return str(amount) + suffix + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/license.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/license.txt new file mode 100644 index 0000000..ed95cfe --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/license.txt @@ -0,0 +1,19 @@ +"None are so hopelessly enslaved as those who falsely believe they are free." + Johann Wolfgang von Goethe + +Copyright (C) 2012 Tito Bouzout + +This license apply to all the files inside this program unless noted +different for some files or portions of code inside these files. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation. http://www.gnu.org/licenses/gpl.html + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see http://www.gnu.org/licenses/gpl.html \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/messages/11.13.2012.1305.0.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/messages/11.13.2012.1305.0.txt new file mode 100644 index 0000000..36d23ff --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/messages/11.13.2012.1305.0.txt @@ -0,0 +1,21 @@ + + +SideBarEnhancements Changelog: + + ## Shorcuts collisioning with Sublime2's built-in shortcuts have been removed. + + If you miss these + + - Go to "Preferences" -> "Browse Packages" -> "User" + - Open or create file "Default.sublime-keymap" + + - Add this content: + + , { "keys": ["ctrl+t"], "command": "side_bar_new_file2" }, + { "keys": ["f2"], "command": "side_bar_rename" }, + { "keys": ["ctrl+alt+f"], "command": "side_bar_find_files_path_containing" } + + + ## If you have problems configuring F12 key + + - https://github.com/titoBouzout/SideBarEnhancements#f12-key \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/package-metadata.json new file mode 100644 index 0000000..28bde61 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/titoBouzout/SideBarEnhancements", "version": "2013.03.24.15.45.28", "description": "Enhancements to Sublime Text sidebar. Files and folders."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/readme.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/readme.md new file mode 100644 index 0000000..90e7f3d --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/readme.md @@ -0,0 +1,193 @@ +# Sublime Text 3 Compatibilty + +Please see: https://github.com/titoBouzout/SideBarEnhancements/tree/st3atyourownrisk + +# Description + + +Provides enhancements to the operations on Side Bar of Files and Folders for Sublime Text 2. See: http://www.sublimetext.com/ + +Notably provides delete as "move to trash", open with.. a and clipboard. Close, move, open and restore buffers affected by a rename/move command. + +Provides the basics: new file/folder, edit, open/run, reveal, find in selected/parent/project, cut, copy, paste, paste in parent, rename, move, delete, refresh.... + +The not so basic: copy paths as URIs, URLs, content as UTF8, content as data:uri base64 ( nice for embedding into CSS! ), copy as tags img/a/script/style, duplicate + + +Preference to control if a buffer should be closed when affected by a deletion operation. + +Allows to display "file modified date" and "file size" on statusbar. + +All commands available for files and folders(when applicable) . + +[img]http://dl.dropbox.com/u/43596449/tito/sublime/SideBar/screenshot.png[/img] + + + +# F12 key + +F12 key allows you to open the current file in browser. +If you want to add a url to that feature: + + * Right click any file on sidebar and select: "Project -> Edit Projects Preview URLs" + * Edit this file, and add your paths and URLs with the following structure: + +``` +{ + "S:/www/domain.tld":{ + "url_testing":"http://testing", + "url_production":"http://domain.tld" + }, + "C:/Users/luna/some/domain2.tld":{ + "url_testing":"http://testing1", + "url_production":"http://productiontld2" + } +} +``` + +```url_testing``` allows you to set the url of your local server, opened via F12 + +```url_production``` allows you to set the url of your production server, opened via ALT+F12 + +# Notes on configuring the `Open With` menu: + +Definitions file: `User/SidebarEnhancements/Open With/Side Bar.sublime-menu` (note the extra subfolder levels). +To open it, right-click on any file in an open project and select `Open With > Edit Applications...` + +- On OSX, the 'application' property simply takes the *name* of an application, to which the file at hand's full path will be passed as if with `open ...`, e.g.: "application": "Google Chrome" +- On OSX, invoking *shell* commands is NOT supported. + +# Todo + + * Use a real clipboard integrated with the OS + +# Installation + +Install this repository via "Package Control" http://wbond.net/sublime_packages/package_control + +# FAQ + +Q: Uninstall? + + * Follow the instructions here: https://github.com/titoBouzout/SideBarEnhancements/issues/18 + +Q: Why the menu is not shown on `Open Files`? + +- It should be mentioned that the package's context menu is only available for files and folders **in a project (section `Folders` in the side bar)**, and _not_ on the open files listed at the top of the side bar, due to a limitation of ST2. + +# Using the External Libraries + + + * "getImageInfo" to get width and height for images from "bfg-pages". See: http://code.google.com/p/bfg-pages/ + * "desktop" to be able to open files with system handlers. See: http://pypi.python.org/pypi/desktop + * "send2trash" to be able to send to the trash instead of deleting for ever!. See: http://pypi.python.org/pypi/Send2Trash + * "hurry.filesize" to be able to format file sizes. See: http://pypi.python.org/pypi/hurry.filesize/ + +# Source-code + + +https://github.com/titoBouzout/SideBarEnhancements + +# Forum Thread + + +http://www.sublimetext.com/forum/viewtopic.php?f=5&t=3331 + +# Contributors: + + - Leif Ringstad + - Sven Axelsson + - Dalibor Simacek + - Stephen Horne + +# Update v1.2: + +* Improved: Feature "find advanced -> in paths containing" or CTRL+ALT+F now provides instant search, contribution by @ryecroft, thanks a lot! +* Fix: When only 1 tab is open and setting "close_windows_when_empty" is true. If the user renames or delete the current file will cause the application to close by itself (it will be perceived as a crash but is not). +* New: Add to the command palette useful commands as duplicate, reveal, move, open project file, open in browser, refresh, rename +* New: added keybindings F12 to open in local server, ALT+F12 to open in production server. +* New: Allows to copy the URL of the selected items. +* Improved: When renaming/moving remember the tab position and syntax. +* small fixes: +- Correct display of commands that are available only for projects +- Be sure to return None if there is no open project +- only display a message when using the clipboard if something was copied. + +# Update v1.1: + +* New: Add boolean preference "confirm_before_deleting" which controls if a the package should ask the user to delete files and folders +* New: When using copy, cut or paste the editor will ask for "replace items" when these items exists. Note: When a folder exists the package will merge the two as in the OS. + +# Update v1.0: + +* New: Add boolean preference "close_affected_buffers_when_deleting_even_if_dirty" which controls if a buffer should be closed when affected by a deletion operation- + +# Update v0.9: + + +* Minor tweaks and fixes. +* Fix: Re-enable move to trash for OSX +* New: Allow to display "file modified time" and "file size" on statusbar via preferences. +* Fix: Disable of built-in function is now automatic. +* On the way: exclude from project, promote as project folder. ( requires restart to apply changes, looks like there is no way to reload project files.) +* Fix: Many appends of same directory to "sys.path" + +# Update v0.8: + + +* Full review for when the user has selection of multiples items. +* New: Added support for bookmarks and marks for when a view is moved. + +# Update v0.7: + + +* New: After a rename of a file or folder, the affected views will update(reload) to reflect the new location keeping intact content, selections, folded regions and scroll position. +* New: File path search + +# Update v0.6: + + +* Fix: Paste was pasting on parent folder (Misinterpretation of boolean) +* Fix: "Open with" works on Linux +* Improved: Allow case change on Windows when renaming a file or folder +* Improved: Update to "find commands" for version 2134 + +# Update v0.5: + + +* Change: Removed "files" prefix from commands. +* New: Ability to copy a path relative to the current view +* New: Ability to "paste in parent" +* New: Ctrl+T will ask for a new file on same folder as current view +* Improved: Context menu open faster + +# Update v0.4: + + +* Fix: "Open / Run" fixed on Linux thanks to project [desktop](http://pypi.python.org/pypi/desktop ) +* Improved: "Paste" command copy permission bits, last access time, last modification time, and flags +* Improved: "Delete" command send files to trash thanks to [Send2Trash](http://pypi.python.org/pypi/Send2Trash ) . NOTE: If "Delete" fails to send to trash it will ask for "Permanently Delete" On confirmation it delete the item forever. + +# Update v0.3: + + +* Fixed: Open should run correctly with some strange characters on paths +* New: "Open with.." is enabled and allows to set custom applications for different file extensions. +* New: "Copy content as Data URI" ( handy for embedding images on CSS files ) +* Improved: Copy img tags now add attributes width and height thanks to project [bfg-pages](http://code.google.com/p/bfg-pages/ ) and suggestion from nobleach. + +# Update v0.2: + + + * Copy paths and names in various formats. + * Removed license to not conflict with sublime + +# Update v0.1: + + + * Tweaks here, tweaks there. + * Renamed repository + * New: "edit" will open the file with sublime text. + * New: "open" will call to the command line with the file path + * New: a disabled "open with" for future use + * Tweaks: ids to all context elements diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/__init__.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/__init__.py new file mode 100644 index 0000000..ea77870 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +import sys + +if sys.platform == 'darwin': + from .plat_osx import send2trash +elif sys.platform == 'win32': + from .plat_win import send2trash +else: + from .plat_other import send2trash \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_osx.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_osx.py new file mode 100644 index 0000000..ba58b6f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_osx.py @@ -0,0 +1,44 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +from ctypes import cdll, byref, Structure, c_char, c_char_p +from ctypes.util import find_library + +Foundation = cdll.LoadLibrary(find_library('Foundation')) +CoreServices = cdll.LoadLibrary(find_library('CoreServices')) + +GetMacOSStatusCommentString = Foundation.GetMacOSStatusCommentString +GetMacOSStatusCommentString.restype = c_char_p +FSPathMakeRefWithOptions = CoreServices.FSPathMakeRefWithOptions +FSMoveObjectToTrashSync = CoreServices.FSMoveObjectToTrashSync + +kFSPathMakeRefDefaultOptions = 0 +kFSPathMakeRefDoNotFollowLeafSymlink = 0x01 + +kFSFileOperationDefaultOptions = 0 +kFSFileOperationOverwrite = 0x01 +kFSFileOperationSkipSourcePermissionErrors = 0x02 +kFSFileOperationDoNotMoveAcrossVolumes = 0x04 +kFSFileOperationSkipPreflight = 0x08 + +class FSRef(Structure): + _fields_ = [('hidden', c_char * 80)] + +def check_op_result(op_result): + if op_result: + msg = GetMacOSStatusCommentString(op_result).decode('utf-8') + raise OSError(msg) + +def send2trash(path): + if not isinstance(path, bytes): + path = path.encode('utf-8') + fp = FSRef() + opts = kFSPathMakeRefDoNotFollowLeafSymlink + op_result = FSPathMakeRefWithOptions(path, opts, byref(fp), None) + check_op_result(op_result) + opts = kFSFileOperationDefaultOptions + op_result = FSMoveObjectToTrashSync(byref(fp), None, opts) + check_op_result(op_result) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_other.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_other.py new file mode 100644 index 0000000..6c9b438 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_other.py @@ -0,0 +1,154 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +# This is a reimplementation of plat_other.py with reference to the +# freedesktop.org trash specification: +# [1] http://www.freedesktop.org/wiki/Specifications/trash-spec +# [2] http://www.ramendik.ru/docs/trashspec.html +# See also: +# [3] http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html +# +# For external volumes this implementation will raise an exception if it can't +# find or create the user's trash directory. + +#import sys +import os +import os.path as op +from datetime import datetime +import stat +from urllib import quote + +FILES_DIR = 'files' +INFO_DIR = 'info' +INFO_SUFFIX = '.trashinfo' + +# Default of ~/.local/share [3] +XDG_DATA_HOME = op.expanduser(os.environ.get('XDG_DATA_HOME', '~/.local/share')) +HOMETRASH = op.join(XDG_DATA_HOME, 'Trash') + +uid = os.getuid() +TOPDIR_TRASH = '.Trash' +TOPDIR_FALLBACK = '.Trash-' + str(uid) + +def is_parent(parent, path): + path = op.realpath(path) # In case it's a symlink + parent = op.realpath(parent) + return path.startswith(parent) + +def format_date(date): + return date.strftime("%Y-%m-%dT%H:%M:%S") + +def info_for(src, topdir): + # ...it MUST not include a ".."" directory, and for files not "under" that + # directory, absolute pathnames must be used. [2] + if topdir is None or not is_parent(topdir, src): + src = op.abspath(src) + else: + src = op.relpath(src, topdir) + + info = "[Trash Info]\n" + info += "Path=" + quote(src) + "\n" + info += "DeletionDate=" + format_date(datetime.now()) + "\n" + return info + +def check_create(dir): + # use 0700 for paths [3] + if not op.exists(dir): + os.makedirs(dir, 0o700) + +def trash_move(src, dst, topdir=None): + filename = op.basename(src) + filespath = op.join(dst, FILES_DIR) + infopath = op.join(dst, INFO_DIR) + base_name, ext = op.splitext(filename) + + counter = 0 + destname = filename + while op.exists(op.join(filespath, destname)) or op.exists(op.join(infopath, destname + INFO_SUFFIX)): + counter += 1 + destname = '%s %s%s' % (base_name, counter, ext) + + check_create(filespath) + check_create(infopath) + + os.rename(src, op.join(filespath, destname)) + f = open(op.join(infopath, destname + INFO_SUFFIX), 'w') + f.write(info_for(src, topdir)) + f.close() + +def find_mount_point(path): + # Even if something's wrong, "/" is a mount point, so the loop will exit. + # Use realpath in case it's a symlink + path = op.realpath(path) # Required to avoid infinite loop + while not op.ismount(path): + path = op.split(path)[0] + return path + +def find_ext_volume_global_trash(volume_root): + # from [2] Trash directories (1) check for a .Trash dir with the right + # permissions set. + trash_dir = op.join(volume_root, TOPDIR_TRASH) + if not op.exists(trash_dir): + return None + + mode = os.lstat(trash_dir).st_mode + # vol/.Trash must be a directory, cannot be a symlink, and must have the + # sticky bit set. + if not op.isdir(trash_dir) or op.islink(trash_dir) or not (mode & stat.S_ISVTX): + return None + + trash_dir = op.join(trash_dir, str(uid)) + try: + check_create(trash_dir) + except OSError: + return None + return trash_dir + +def find_ext_volume_fallback_trash(volume_root): + # from [2] Trash directories (1) create a .Trash-$uid dir. + trash_dir = op.join(volume_root, TOPDIR_FALLBACK) + # Try to make the directory, if we can't the OSError exception will escape + # be thrown out of send2trash. + check_create(trash_dir) + return trash_dir + +def find_ext_volume_trash(volume_root): + trash_dir = find_ext_volume_global_trash(volume_root) + if trash_dir is None: + trash_dir = find_ext_volume_fallback_trash(volume_root) + return trash_dir + +# Pull this out so it's easy to stub (to avoid stubbing lstat itself) +def get_dev(path): + return os.lstat(path).st_dev + +def send2trash(path): + #if not isinstance(path, str): + # path = str(path, sys.getfilesystemencoding()) + #if not op.exists(path): + # raise OSError("File not found: %s" % path) + # ...should check whether the user has the necessary permissions to delete + # it, before starting the trashing operation itself. [2] + #if not os.access(path, os.W_OK): + # raise OSError("Permission denied: %s" % path) + # if the file to be trashed is on the same device as HOMETRASH we + # want to move it there. + path_dev = get_dev(path) + + # If XDG_DATA_HOME or HOMETRASH do not yet exist we need to stat the + # home directory, and these paths will be created further on if needed. + trash_dev = get_dev(op.expanduser('~')) + + if path_dev == trash_dev: + topdir = XDG_DATA_HOME + dest_trash = HOMETRASH + else: + topdir = find_mount_point(path) + trash_dev = get_dev(topdir) + if trash_dev != path_dev: + raise OSError("Couldn't find mount point for %s" % path) + dest_trash = find_ext_volume_trash(topdir) + trash_move(path, dest_trash, topdir) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_win.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_win.py new file mode 100644 index 0000000..8f56817 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_win.py @@ -0,0 +1,56 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +from ctypes import windll, Structure, byref, c_uint +from ctypes.wintypes import HWND, UINT, LPCWSTR, BOOL +#import os.path as op + +shell32 = windll.shell32 +SHFileOperationW = shell32.SHFileOperationW + +class SHFILEOPSTRUCTW(Structure): + _fields_ = [ + ("hwnd", HWND), + ("wFunc", UINT), + ("pFrom", LPCWSTR), + ("pTo", LPCWSTR), + ("fFlags", c_uint), + ("fAnyOperationsAborted", BOOL), + ("hNameMappings", c_uint), + ("lpszProgressTitle", LPCWSTR), + ] + +FO_MOVE = 1 +FO_COPY = 2 +FO_DELETE = 3 +FO_RENAME = 4 + +FOF_MULTIDESTFILES = 1 +FOF_SILENT = 4 +FOF_NOCONFIRMATION = 16 +FOF_ALLOWUNDO = 64 +FOF_NOERRORUI = 1024 + +def send2trash(path): + # + #if not isinstance(path, str): + # path = str(path, 'mbcs') + #if not op.isabs(path): + # path = op.abspath(path) + fileop = SHFILEOPSTRUCTW() + fileop.hwnd = 0 + fileop.wFunc = FO_DELETE + fileop.pFrom = LPCWSTR(path + '\0') + fileop.pTo = None + fileop.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT + fileop.fAnyOperationsAborted = 0 + fileop.hNameMappings = 0 + fileop.lpszProgressTitle = None + result = SHFileOperationW(byref(fileop)) + if result: + msg = "Couldn't perform operation. Error code: %d" % result + raise OSError(msg) + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarItem.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarItem.py new file mode 100644 index 0000000..8b08881 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarItem.py @@ -0,0 +1,480 @@ +# coding=utf8 +import sublime +import os +import re +import shutil + +from SideBarProject import SideBarProject + +try: + import desktop +except: + pass + +class Object(): + pass + +def expand_vars(path): + for k, v in os.environ.iteritems(): + try: + # dirty hack, this should be autofixed in python3 + k = unicode(k.encode('utf8')) + v = unicode(v.encode('utf8')) + path = path.replace(u'%'+k+'%', v).replace(u'%'+k.lower()+'%', v) + except: + pass + return path + +class SideBarItem: + + def __init__(self, path, is_directory): + self._path = path + self._is_directory = is_directory + + def path(self, path = ''): + if path == '': + return self._path + else: + self._path = path + self._is_directory = os.path.isdir(path) + return path + + def pathSystem(self): + import sys + return self.path().encode(sys.getfilesystemencoding()) + + def pathWithoutProject(self): + path = self.path() + for directory in SideBarProject().getDirectories(): + path = path.replace(directory, '', 1) + return path.replace('\\', '/') + + def pathProject(self): + path = self.path() + for directory in SideBarProject().getDirectories(): + path2 = path.replace(directory, '', 1) + if path2 != path: + return directory + return False + + def projectURL(self, type): + filename = os.path.normpath(os.path.join(sublime.packages_path(), '..', 'Settings', 'SideBarEnhancements.json')) + if os.path.lexists(filename): + #try: + import json + data = file(filename, 'r').read() + data = data.replace('\t', ' ').replace('\\', '/').replace('\\', '/').replace('//', '/').replace('//', '/').replace('http:/', 'http://').replace('https:/', 'https://') + data = json.loads(data, strict=False) + + for path in data.keys(): + path2 = expand_vars(path) + print '-------------------------------------------------------' + print 'searching:' + path2 = path2.replace('\\', '/').replace('\\', '/').replace('//', '/').replace('//', '/') + print path2 + print 'in:' + path3 = self.path().replace('\\', '/').replace('\\', '/').replace('//', '/').replace('//', '/') + print path3 + print '-------------------------------------------------------' + path4 = re.sub(re.compile("^"+re.escape(path2), re.IGNORECASE), '', path3); + print path4 + if path4 != path3: + url = data[path][type] + if url: + if url[-1:] != '/': + url = url+'/' + import urllib + return url+(re.sub("^/", '', urllib.quote(path4.encode('utf-8')))); + + #except: + # return False + else: + return False + + def isUnderCurrentProject(self): + path = self.path() + path2 = self.path() + for directory in SideBarProject().getDirectories(): + path2 = path2.replace(directory, '', 1) + return path != path2 + + def pathRelativeFromProject(self): + return re.sub('^/+', '', self.pathWithoutProject()) + + def pathRelativeFromProjectEncoded(self): + import urllib + return urllib.quote(self.pathRelativeFromProject().encode('utf-8')) + + def pathRelativeFromView(self): + return os.path.relpath(self.path(), os.path.dirname(sublime.active_window().active_view().file_name())).replace('\\', '/') + + def pathRelativeFromViewEncoded(self): + import urllib + return urllib.quote(os.path.relpath(self.path(), os.path.dirname(sublime.active_window().active_view().file_name())).replace('\\', '/').encode('utf-8')) + + def pathAbsoluteFromProject(self): + return self.pathWithoutProject() + + def pathAbsoluteFromProjectEncoded(self): + import urllib + return urllib.quote(self.pathAbsoluteFromProject().encode('utf-8')) + + def uri(self): + import urllib + return 'file:'+urllib.pathname2url(self.path().encode('utf-8')); + + def join(self, name): + return os.path.join(self.path(), name) + + def dirname(self): + branch, leaf = os.path.split(self.path()) + return branch; + + def forCwdSystemPath(self): + if self.isDirectory(): + return self.pathSystem() + else: + return self.dirnameSystem() + + def forCwdSystemName(self): + if self.isDirectory(): + return '.' + else: + path = self.pathSystem() + branch = self.dirnameSystem() + leaf = path.replace(branch, '', 1).replace('\\', '').replace('/', '') + return leaf + + def forCwdSystemPathRelativeFrom(self, relativeFrom): + relative = SideBarItem(relativeFrom, os.path.isdir(relativeFrom)) + path = self.pathSystem().replace(relative.pathSystem(), '', 1).replace('\\', '/') + if path == '': + return '.' + else: + return re.sub('^/+', '', path) + + def forCwdSystemPathRelativeFromRecursive(self, relativeFrom): + relative = SideBarItem(relativeFrom, os.path.isdir(relativeFrom)) + path = self.pathSystem().replace(relative.pathSystem(), '', 1).replace('\\', '/') + if path == '': + return '.' + else: + if self.isDirectory(): + return re.sub('^/+', '', path)+'/' + else: + return re.sub('^/+', '', path) + + def dirnameSystem(self): + import sys + return self.dirname().encode(sys.getfilesystemencoding()) + + def dirnameCreate(self): + try: + os.makedirs(self.dirname()) + except: + pass + + def name(self): + branch, leaf = os.path.split(self.path()) + return leaf; + + def nameSystem(self): + import sys + return self.name().encode(sys.getfilesystemencoding()) + + def nameEncoded(self): + import urllib + return urllib.quote(self.name().encode('utf-8')); + + def namePretty(self): + return self.name().replace(self.extension(), '').replace('-', ' ').replace('_', ' ').strip(); + + def open(self): + if sublime.platform() == 'osx': + import subprocess + subprocess.Popen(['open', self.nameSystem()], cwd=self.dirnameSystem()) + elif sublime.platform() == 'windows': + import subprocess + subprocess.Popen([self.nameSystem()], cwd=self.dirnameSystem(), shell=True) + else: + desktop.open(self.path()) + + def edit(self): + return sublime.active_window().open_file(self.path()) + + def isDirectory(self): + return self._is_directory + + def isFile(self): + return self.isDirectory() == False + + def contentUTF8(self): + import codecs + return codecs.open(self.path(), 'r', 'utf-8').read() + + def contentBinary(self): + return file(self.path(), "rb").read() + + def contentBase64(self): + return 'data:'+self.mime()+';base64,'+(file(self.path(), "rb").read().encode("base64").replace('\n', '')) + + def reveal(self): + sublime.active_window().run_command("open_dir", {"dir": self.dirname(), "file": self.name()} ) + + def write(self, content): + file(self.path(), 'w+').write(content) + + def mime(self): + import mimetypes + return mimetypes.guess_type(self.path())[0] or 'application/octet-stream' + + def extension(self): + return os.path.splitext('name'+self.name())[1].lower() + + def exists(self): + return os.path.isdir(self.path()) or os.path.isfile(self.path()) + + def create(self): + if self.isDirectory(): + self.dirnameCreate() + os.makedirs(self.path()) + else: + self.dirnameCreate() + self.write('') + + def copy(self, location, replace = False): + location = SideBarItem(location, os.path.isdir(location)); + if location.exists() and replace == False: + return False + elif location.exists() and location.isFile(): + os.remove(location.path()) + + location.dirnameCreate(); + if self.isDirectory(): + if location.exists(): + self.copy_recursive(self.path(), location.path()) + else: + shutil.copytree(self.path(), location.path()) + else: + shutil.copy2(self.path(), location.path()) + return True + + def copy_recursive(self, _from, _to): + + if os.path.isfile(_from) or os.path.islink(_from): + try: + os.makedirs(os.path.dirname(_to)); + except: + pass + if os.path.exists(_to): + os.remove(_to) + shutil.copy2(_from, _to) + else: + try: + os.makedirs(_to); + except: + pass + for content in os.listdir(_from): + __from = os.path.join(_from, content) + __to = os.path.join(_to, content) + self.copy_recursive(__from, __to) + + def move(self, location, replace = False): + location = SideBarItem(location, os.path.isdir(location)); + if location.exists() and replace == False: + if self.path().lower() == location.path().lower(): + pass + else: + return False + elif location.exists() and location.isFile(): + os.remove(location.path()) + + if self.path().lower() == location.path().lower(): + location.dirnameCreate(); + os.rename(self.path(), location.path()+'.sublime-temp') + os.rename(location.path()+'.sublime-temp', location.path()) + self._move_moveViews(self.path(), location.path()) + else: + location.dirnameCreate(); + if location.exists(): + self.move_recursive(self.path(), location.path()) + else: + os.rename(self.path(), location.path()) + self._move_moveViews(self.path(), location.path()) + return True + + def move_recursive(self, _from, _to): + if os.path.isfile(_from) or os.path.islink(_from): + try: + os.makedirs(os.path.dirname(_to)); + except: + pass + if os.path.exists(_to): + os.remove(_to) + os.rename(_from, _to) + else: + try: + os.makedirs(_to); + except: + pass + for content in os.listdir(_from): + __from = os.path.join(_from, content) + __to = os.path.join(_to, content) + self.move_recursive(__from, __to) + os.rmdir(_from) + + def _move_moveViews(self, old, location): + for window in sublime.windows(): + active_view = window.active_view() + views = [] + for view in window.views(): + if view.file_name(): + views.append(view) + views.reverse(); + for view in views: + if old == view.file_name(): + active_view = self._move_moveView(window, view, location, active_view) + elif view.file_name().find(old+'\\') == 0: + active_view = self._move_moveView(window, view, view.file_name().replace(old+'\\', location+'\\', 1), active_view) + elif view.file_name().find(old+'/') == 0: + active_view = self._move_moveView(window, view, view.file_name().replace(old+'/', location+'/', 1), active_view) + + def _move_moveView(self, window, view, location, active_view): + if active_view == view: + is_active_view = True + else: + is_active_view = False + + options = Object() + + options.scroll = view.viewport_position() + + options.selections = [[item.a, item.b] for item in view.sel()] + + options.marks = [[item.a, item.b] for item in view.get_regions("mark")] + + options.bookmarks = [[item.a, item.b] for item in view.get_regions("bookmarks")] + + if int(sublime.version()) >= 2167: + options.folds = [[item.a, item.b] for item in view.folded_regions()] + else: + options.folds = [[item.a, item.b] for item in view.unfold(sublime.Region(0, view.size()))] + + options.syntax = view.settings().get('syntax') + + try: + _window = window or view.window() or sublime.active_window() + options.position = _window.get_view_index(view) + except: + options.position = False + + window.focus_view(view) + if view.is_dirty(): + options.content = view.substr(sublime.Region(0, view.size())) + view.window().run_command('revert') + else: + options.content = False + + _view = view + view = window.open_file(location) + window.focus_view(_view) + window.run_command('close') + + sublime.set_timeout(lambda: self._move_restoreView(view, options, window), 200) + + if is_active_view: + window.focus_view(view) + return view + else: + window.focus_view(active_view) + return active_view + + def _move_restoreView(self, view, options, window): + if view.is_loading(): + sublime.set_timeout(lambda: self._move_restoreView(view, options, window), 100) + else: + if options.content != False: + edit = view.begin_edit() + view.replace(edit, sublime.Region(0, view.size()), options.content); + view.sel().clear() + view.sel().add(sublime.Region(0)) + view.end_edit(edit) + + if options.position != False: + try: + _window = window or view.window() or sublime.active_window() + group, index = options.position + _window.set_view_index(view, group, index) + except: + pass + + if options.syntax: + view.settings().set('syntax', options.syntax); + + for r in options.folds: + view.fold(sublime.Region(r[0], r[1])) + + view.sel().clear() + for r in options.selections: + view.sel().add(sublime.Region(r[0], r[1])) + + rs = [] + for r in options.marks: + rs.append(sublime.Region(r[0], r[1])) + if len(rs): + view.add_regions("mark", rs, "mark", "dot", sublime.HIDDEN | sublime.PERSISTENT) + + rs = [] + for r in options.bookmarks: + rs.append(sublime.Region(r[0], r[1])) + if len(rs): + view.add_regions("bookmarks", rs, "bookmarks", "bookmark", sublime.HIDDEN | sublime.PERSISTENT) + + view.set_viewport_position(options.scroll, False) + + def close_associated_buffers(self): + path = self.path() + closed_items = [] + for window in sublime.windows(): + active_view = window.active_view() + views = [] + for view in window.views(): + if view.file_name(): + views.append(view) + views.reverse(); + for view in views: + if path == view.file_name(): + if view.window(): + closed_items.append([view.file_name(), view.window(), view.window().get_view_index(view)]) + if len(window.views()) == 1: + window.new_file() + window.focus_view(view) + window.run_command('revert') + window.run_command('close') + elif view.file_name().find(path+'\\') == 0: + if view.window(): + closed_items.append([view.file_name(), view.window(), view.window().get_view_index(view)]) + if len(window.views()) == 1: + window.new_file() + window.focus_view(view) + window.run_command('revert') + window.run_command('close') + elif view.file_name().find(path+'/') == 0: + if view.window(): + closed_items.append([view.file_name(), view.window(), view.window().get_view_index(view)]) + if len(window.views()) == 1: + window.new_file() + window.focus_view(view) + window.run_command('revert') + window.run_command('close') + + # try to repaint + try: + window.focus_view(active_view) + window.focus_view(window.active_view()) + except: + try: + window.focus_view(window.active_view()) + except: + pass + return closed_items diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarProject.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarProject.py new file mode 100644 index 0000000..7ceae07 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarProject.py @@ -0,0 +1,119 @@ +import sublime +import re +import os + +class SideBarProject: + + def getDirectories(self): + return sublime.active_window().folders() + + def hasOpenedProject(self): + return self.getProjectFile() != None + + def getDirectoryFromPath(self, path): + for directory in self.getDirectories(): + maybe_path = path.replace(directory, '', 1) + if maybe_path != path: + return directory + + def getProjectFile(self): + if not self.getDirectories(): + return None + import json + data = file(os.path.normpath(os.path.join(sublime.packages_path(), '..', 'Settings', 'Session.sublime_session')), 'r').read() + data = data.replace('\t', ' ') + data = json.loads(data, strict=False) + projects = data['workspaces']['recent_workspaces'] + + if os.path.lexists(os.path.join(sublime.packages_path(), '..', 'Settings', 'Auto Save Session.sublime_session')): + data = file(os.path.normpath(os.path.join(sublime.packages_path(), '..', 'Settings', 'Auto Save Session.sublime_session')), 'r').read() + data = data.replace('\t', ' ') + data = json.loads(data, strict=False) + if 'workspaces' in data and 'recent_workspaces' in data['workspaces'] and data['workspaces']['recent_workspaces']: + projects += data['workspaces']['recent_workspaces'] + projects = list(set(projects)) + for project_file in projects: + project_file = re.sub(r'^/([^/])/', '\\1:/', project_file); + project_json = json.loads(file(project_file, 'r').read(), strict=False) + if 'folders' in project_json: + folders = project_json['folders'] + found_all = True + for directory in self.getDirectories(): + found = False + for folder in folders: + folder_path = re.sub(r'^/([^/])/', '\\1:/', folder['path']); + if folder_path == directory.replace('\\', '/'): + found = True + break; + if found == False: + found_all = False + break; + if found_all: + return project_file + return None + + def getProjectJson(self): + if not self.hasOpenedProject(): + return None + import json + return json.loads(file(self.getProjectFile(), 'r').read(), strict=False) + + def excludeDirectory(self, path): + import json + project_file = self.getProjectFile(); + project = self.getProjectJson() + + path = re.sub(r'^([^/])\:/', '/\\1/', path.replace('\\', '/')) + + for folder in project['folders']: + if path.find(folder['path']) == 0: + try: + folder['folder_exclude_patterns'].append(re.sub(r'/+$', '', path.replace(folder['path']+'/', '', 1))) + except: + folder['folder_exclude_patterns'] = [re.sub(r'/+$', '', path.replace(folder['path']+'/', '', 1))] + file(project_file, 'w+').write(json.dumps(project, indent=1)) + return + + def excludeFile(self, path): + import json + project_file = self.getProjectFile(); + project = self.getProjectJson() + + path = re.sub(r'^([^/])\:/', '/\\1/', path.replace('\\', '/')) + + for folder in project['folders']: + if path.find(folder['path']) == 0: + try: + folder['file_exclude_patterns'].append(path.replace(folder['path']+'/', '', 1)) + except: + folder['file_exclude_patterns'] = [path.replace(folder['path']+'/', '', 1)] + file(project_file, 'w+').write(json.dumps(project, indent=1)) + return + + def rootAdd(self, path): + import json + project_file = self.getProjectFile(); + project = self.getProjectJson() + + path = re.sub(r'^([^/])\:/', '/\\1/', path.replace('\\', '/')) + project['folders'].append({'path':path}); + + file(project_file, 'w+').write(json.dumps(project, indent=1)) + + def refresh(self): + try: + sublime.set_timeout(lambda:sublime.active_window().run_command('refresh_folder_list'), 200); + sublime.set_timeout(lambda:sublime.active_window().run_command('refresh_folder_list'), 600); + sublime.set_timeout(lambda:sublime.active_window().run_command('refresh_folder_list'), 1300); + sublime.set_timeout(lambda:sublime.active_window().run_command('refresh_folder_list'), 2300); + except: + pass + + def getPreference(self, name): + if not self.hasOpenedProject(): + return None + project = self.getProjectJson() + try: + return project[name] + except: + return None \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarSelection.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarSelection.py new file mode 100644 index 0000000..00748e7 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarSelection.py @@ -0,0 +1,186 @@ +# coding=utf8 +import sublime +import os +import re + +from SideBarProject import SideBarProject +from SideBarItem import SideBarItem + +class SideBarSelection: + + def __init__(self, paths = []): + + if len(paths) < 1: + try: + path = sublime.active_window().active_view().file_name() + if self.isNone(path): + paths = [] + else: + paths = [path] + except: + paths = [] + self._paths = paths + self._paths.sort() + self._obtained_selection_information_basic = False + self._obtained_selection_information_extended = False + + def len(self): + return len(self._paths) + + def hasDirectories(self): + self._obtainSelectionInformationBasic() + return self._has_directories + + def hasFiles(self): + self._obtainSelectionInformationBasic() + return self._has_files + + def hasOnlyDirectories(self): + self._obtainSelectionInformationBasic() + return self._only_directories + + def hasOnlyFiles(self): + self._obtainSelectionInformationBasic() + return self._only_files + + def hasProjectDirectories(self): + if self.hasDirectories(): + project_directories = SideBarProject().getDirectories() + for item in self.getSelectedDirectories(): + if item.path() in project_directories: + return True + return False + else: + return False + + def hasItemsUnderProject(self): + for item in self.getSelectedItems(): + if item.isUnderCurrentProject(): + return True + return False + + def hasImages(self): + return self.hasFilesWithExtension('gif|jpg|jpeg|png') + + def hasFilesWithExtension(self, extensions): + extensions = re.compile('('+extensions+')$', re.I); + for item in self.getSelectedFiles(): + if extensions.search(item.path()): + return True; + return False + + def getSelectedItems(self): + self._obtainSelectionInformationExtended() + return self._files + self._directories; + + def getSelectedItemsWithoutChildItems(self): + self._obtainSelectionInformationExtended() + items = [] + for item in self._items_without_containing_child_items: + items.append(SideBarItem(item, os.path.isdir(item))) + return items + + def getSelectedDirectories(self): + self._obtainSelectionInformationExtended() + return self._directories; + + def getSelectedFiles(self): + self._obtainSelectionInformationExtended() + return self._files; + + def getSelectedDirectoriesOrDirnames(self): + self._obtainSelectionInformationExtended() + return self._directories_or_dirnames; + + def getSelectedImages(self): + return self.getSelectedFilesWithExtension('gif|jpg|jpeg|png') + + def getSelectedFilesWithExtension(self, extensions): + items = [] + extensions = re.compile('('+extensions+')$', re.I); + for item in self.getSelectedFiles(): + if extensions.search(item.path()): + items.append(item) + return items + + def _obtainSelectionInformationBasic(self): + if not self._obtained_selection_information_basic: + self._obtained_selection_information_basic = True + + self._has_directories = False + self._has_files = False + self._only_directories = False + self._only_files = False + + for path in self._paths: + if self._has_directories == False and os.path.isdir(path): + self._has_directories = True + if self._has_files == False and os.path.isdir(path) == False: + self._has_files = True + if self._has_files and self._has_directories: + break + + if self._has_files and self._has_directories: + self._only_directories = False + self._only_files = False + elif self._has_files: + self._only_files = True + elif self._has_directories: + self._only_directories = True + + def _obtainSelectionInformationExtended(self): + if not self._obtained_selection_information_extended: + self._obtained_selection_information_extended = True + + self._directories = [] + self._files = [] + self._directories_or_dirnames = [] + self._items_without_containing_child_items = [] + + _directories = [] + _files = [] + _directories_or_dirnames = [] + _items_without_containing_child_items = [] + + for path in self._paths: + if os.path.isdir(path): + item = SideBarItem(path, True) + if item.path() not in _directories: + _directories.append(item.path()) + self._directories.append(item) + if item.path() not in _directories_or_dirnames: + _directories_or_dirnames.append(item.path()) + self._directories_or_dirnames.append(item) + _items_without_containing_child_items = self._itemsWithoutContainingChildItems(_items_without_containing_child_items, item.path()) + else: + item = SideBarItem(path, False) + if item.path() not in _files: + _files.append(item.path()) + self._files.append(item) + _items_without_containing_child_items = self._itemsWithoutContainingChildItems(_items_without_containing_child_items, item.path()) + item = SideBarItem(os.path.dirname(path), True) + if item.path() not in _directories_or_dirnames: + _directories_or_dirnames.append(item.path()) + self._directories_or_dirnames.append(item) + + self._items_without_containing_child_items = _items_without_containing_child_items + + def _itemsWithoutContainingChildItems(self, items, item): + new_list = [] + add = True + for i in items: + if i.find(item+'\\') == 0 or i.find(item+'/') == 0: + continue + else: + new_list.append(i) + if (item+'\\').find(i+'\\') == 0 or (item+'/').find(i+'/') == 0: + add = False + if add: + new_list.append(item) + return new_list + + def isNone(self, path): + if path == None or path == '' or path == '.' or path == '..' or path == './' or path == '/' or path == '//' or path == '\\' or path == '\\\\' or path == '\\\\\\\\': + return True + else: + return False diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/__init__.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/__init__.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/__init__.py new file mode 100644 index 0000000..d8bfcc8 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/__init__.py @@ -0,0 +1,281 @@ +#!/usr/bin/env python + +""" +Simple desktop integration for Python. This module provides desktop environment +detection and resource opening support for a selection of common and +standardised desktop environments. + +Copyright (C) 2005, 2006, 2007, 2008, 2009 Paul Boddie + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. + +You should have received a copy of the GNU Lesser General Public License along +with this program. If not, see . + +-------- + +Desktop Detection +----------------- + +To detect a specific desktop environment, use the get_desktop function. +To detect whether the desktop environment is standardised (according to the +proposed DESKTOP_LAUNCH standard), use the is_standard function. + +Opening URLs +------------ + +To open a URL in the current desktop environment, relying on the automatic +detection of that environment, use the desktop.open function as follows: + +desktop.open("http://www.python.org") + +To override the detected desktop, specify the desktop parameter to the open +function as follows: + +desktop.open("http://www.python.org", "KDE") # Insists on KDE +desktop.open("http://www.python.org", "GNOME") # Insists on GNOME + +Without overriding using the desktop parameter, the open function will attempt +to use the "standard" desktop opening mechanism which is controlled by the +DESKTOP_LAUNCH environment variable as described below. + +The DESKTOP_LAUNCH Environment Variable +--------------------------------------- + +The DESKTOP_LAUNCH environment variable must be shell-quoted where appropriate, +as shown in some of the following examples: + +DESKTOP_LAUNCH="kdialog --msgbox" Should present any opened URLs in + their entirety in a KDE message box. + (Command "kdialog" plus parameter.) +DESKTOP_LAUNCH="my\ opener" Should run the "my opener" program to + open URLs. + (Command "my opener", no parameters.) +DESKTOP_LAUNCH="my\ opener --url" Should run the "my opener" program to + open URLs. + (Command "my opener" plus parameter.) + +Details of the DESKTOP_LAUNCH environment variable convention can be found here: +http://lists.freedesktop.org/archives/xdg/2004-August/004489.html + +Other Modules +------------- + +The desktop.dialog module provides support for opening dialogue boxes. +The desktop.windows module permits the inspection of desktop windows. +""" + +__version__ = "0.4" + +import os +import sys + +# Provide suitable process creation functions. + +try: + import subprocess + def _run(cmd, shell, wait): + opener = subprocess.Popen(cmd, shell=shell) + if wait: opener.wait() + return opener.pid + + def _readfrom(cmd, shell): + opener = subprocess.Popen(cmd, shell=shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE) + opener.stdin.close() + return opener.stdout.read() + + def _status(cmd, shell): + opener = subprocess.Popen(cmd, shell=shell) + opener.wait() + return opener.returncode == 0 + +except ImportError: + import popen2 + def _run(cmd, shell, wait): + opener = popen2.Popen3(cmd) + if wait: opener.wait() + return opener.pid + + def _readfrom(cmd, shell): + opener = popen2.Popen3(cmd) + opener.tochild.close() + opener.childerr.close() + return opener.fromchild.read() + + def _status(cmd, shell): + opener = popen2.Popen3(cmd) + opener.wait() + return opener.poll() == 0 + +import commands + +# Private functions. + +def _get_x11_vars(): + + "Return suitable environment definitions for X11." + + if not os.environ.get("DISPLAY", "").strip(): + return "DISPLAY=:0.0 " + else: + return "" + +def _is_xfce(): + + "Return whether XFCE is in use." + + # XFCE detection involves testing the output of a program. + + try: + return _readfrom(_get_x11_vars() + "xprop -root _DT_SAVE_MODE", shell=1).strip().endswith(' = "xfce4"') + except OSError: + return 0 + +def _is_x11(): + + "Return whether the X Window System is in use." + + return os.environ.has_key("DISPLAY") + +# Introspection functions. + +def get_desktop(): + + """ + Detect the current desktop environment, returning the name of the + environment. If no environment could be detected, None is returned. + """ + + if os.environ.has_key("KDE_FULL_SESSION") or \ + os.environ.has_key("KDE_MULTIHEAD"): + return "KDE" + elif os.environ.has_key("GNOME_DESKTOP_SESSION_ID") or \ + os.environ.has_key("GNOME_KEYRING_SOCKET"): + return "GNOME" + elif sys.platform == "darwin": + return "Mac OS X" + elif hasattr(os, "startfile"): + return "Windows" + elif _is_xfce(): + return "XFCE" + + # KDE, GNOME and XFCE run on X11, so we have to test for X11 last. + + if _is_x11(): + return "X11" + else: + return None + +def use_desktop(desktop): + + """ + Decide which desktop should be used, based on the detected desktop and a + supplied 'desktop' argument (which may be None). Return an identifier + indicating the desktop type as being either "standard" or one of the results + from the 'get_desktop' function. + """ + + # Attempt to detect a desktop environment. + + detected = get_desktop() + + # Start with desktops whose existence can be easily tested. + + if (desktop is None or desktop == "standard") and is_standard(): + return "standard" + elif (desktop is None or desktop == "Windows") and detected == "Windows": + return "Windows" + + # Test for desktops where the overriding is not verified. + + elif (desktop or detected) == "KDE": + return "KDE" + elif (desktop or detected) == "GNOME": + return "GNOME" + elif (desktop or detected) == "XFCE": + return "XFCE" + elif (desktop or detected) == "Mac OS X": + return "Mac OS X" + elif (desktop or detected) == "X11": + return "X11" + else: + return None + +def is_standard(): + + """ + Return whether the current desktop supports standardised application + launching. + """ + + return os.environ.has_key("DESKTOP_LAUNCH") + +# Activity functions. + +def open(url, desktop=None, wait=0): + + """ + Open the 'url' in the current desktop's preferred file browser. If the + optional 'desktop' parameter is specified then attempt to use that + particular desktop environment's mechanisms to open the 'url' instead of + guessing or detecting which environment is being used. + + Suggested values for 'desktop' are "standard", "KDE", "GNOME", "XFCE", + "Mac OS X", "Windows" where "standard" employs a DESKTOP_LAUNCH environment + variable to open the specified 'url'. DESKTOP_LAUNCH should be a command, + possibly followed by arguments, and must have any special characters + shell-escaped. + + The process identifier of the "opener" (ie. viewer, editor, browser or + program) associated with the 'url' is returned by this function. If the + process identifier cannot be determined, None is returned. + + An optional 'wait' parameter is also available for advanced usage and, if + 'wait' is set to a true value, this function will wait for the launching + mechanism to complete before returning (as opposed to immediately returning + as is the default behaviour). + """ + + # Decide on the desktop environment in use. + + desktop_in_use = use_desktop(desktop) + + if desktop_in_use == "standard": + arg = "".join([os.environ["DESKTOP_LAUNCH"], commands.mkarg(url)]) + return _run(arg, 1, wait) + + elif desktop_in_use == "Windows": + # NOTE: This returns None in current implementations. + return os.startfile(url) + + elif desktop_in_use == "KDE": + cmd = ["kfmclient", "exec", url] + + elif desktop_in_use == "GNOME": + cmd = ["gnome-open", url] + + elif desktop_in_use == "XFCE": + cmd = ["exo-open", url] + + elif desktop_in_use == "Mac OS X": + cmd = ["open", url] + + elif desktop_in_use == "X11" and os.environ.has_key("BROWSER"): + cmd = [os.environ["BROWSER"], url] + + # Finish with an error where no suitable desktop was identified. + + else: + raise OSError, "Desktop '%s' not supported (neither DESKTOP_LAUNCH nor os.startfile could be used)" % desktop_in_use + + return _run(cmd, 0, wait) + +# vim: tabstop=4 expandtab shiftwidth=4 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/dialog.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/dialog.py new file mode 100644 index 0000000..9525004 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/dialog.py @@ -0,0 +1,549 @@ +#!/usr/bin/env python + +""" +Simple desktop dialogue box support for Python. + +Copyright (C) 2007, 2009 Paul Boddie + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. + +You should have received a copy of the GNU Lesser General Public License along +with this program. If not, see . + +-------- + +Opening Dialogue Boxes (Dialogs) +-------------------------------- + +To open a dialogue box (dialog) in the current desktop environment, relying on +the automatic detection of that environment, use the appropriate dialogue box +class: + +question = desktop.dialog.Question("Are you sure?") +result = question.open() + +To override the detected desktop, specify the desktop parameter to the open +function as follows: + +question.open("KDE") # Insists on KDE +question.open("GNOME") # Insists on GNOME + +The dialogue box options are documented in each class's docstring. + +Available dialogue box classes are listed in the desktop.dialog.available +attribute. + +Supported desktop environments are listed in the desktop.dialog.supported +attribute. +""" + +from desktop import use_desktop, _run, _readfrom, _status + +class _wrapper: + def __init__(self, handler): + self.handler = handler + +class _readvalue(_wrapper): + def __call__(self, cmd, shell): + return self.handler(cmd, shell).strip() + +class _readinput(_wrapper): + def __call__(self, cmd, shell): + return self.handler(cmd, shell)[:-1] + +class _readvalues_kdialog(_wrapper): + def __call__(self, cmd, shell): + result = self.handler(cmd, shell).strip().strip('"') + if result: + return result.split('" "') + else: + return [] + +class _readvalues_zenity(_wrapper): + def __call__(self, cmd, shell): + result = self.handler(cmd, shell).strip() + if result: + return result.split("|") + else: + return [] + +class _readvalues_Xdialog(_wrapper): + def __call__(self, cmd, shell): + result = self.handler(cmd, shell).strip() + if result: + return result.split("/") + else: + return [] + +# Dialogue parameter classes. + +class String: + + "A generic parameter." + + def __init__(self, name): + self.name = name + + def convert(self, value, program): + return [value or ""] + +class Strings(String): + + "Multiple string parameters." + + def convert(self, value, program): + return value or [] + +class StringPairs(String): + + "Multiple string parameters duplicated to make identifiers." + + def convert(self, value, program): + l = [] + for v in value: + l.append(v) + l.append(v) + return l + +class StringKeyword: + + "A keyword parameter." + + def __init__(self, keyword, name): + self.keyword = keyword + self.name = name + + def convert(self, value, program): + return [self.keyword + "=" + (value or "")] + +class StringKeywords: + + "Multiple keyword parameters." + + def __init__(self, keyword, name): + self.keyword = keyword + self.name = name + + def convert(self, value, program): + l = [] + for v in value or []: + l.append(self.keyword + "=" + v) + return l + +class Integer(String): + + "An integer parameter." + + defaults = { + "width" : 40, + "height" : 15, + "list_height" : 10 + } + scale = 8 + + def __init__(self, name, pixels=0): + String.__init__(self, name) + if pixels: + self.factor = self.scale + else: + self.factor = 1 + + def convert(self, value, program): + if value is None: + value = self.defaults[self.name] + return [str(int(value) * self.factor)] + +class IntegerKeyword(Integer): + + "An integer keyword parameter." + + def __init__(self, keyword, name, pixels=0): + Integer.__init__(self, name, pixels) + self.keyword = keyword + + def convert(self, value, program): + if value is None: + value = self.defaults[self.name] + return [self.keyword + "=" + str(int(value) * self.factor)] + +class Boolean(String): + + "A boolean parameter." + + values = { + "kdialog" : ["off", "on"], + "zenity" : ["FALSE", "TRUE"], + "Xdialog" : ["off", "on"] + } + + def convert(self, value, program): + values = self.values[program] + if value: + return [values[1]] + else: + return [values[0]] + +class MenuItemList(String): + + "A menu item list parameter." + + def convert(self, value, program): + l = [] + for v in value: + l.append(v.value) + l.append(v.text) + return l + +class ListItemList(String): + + "A radiolist/checklist item list parameter." + + def __init__(self, name, status_first=0): + String.__init__(self, name) + self.status_first = status_first + + def convert(self, value, program): + l = [] + for v in value: + boolean = Boolean(None) + status = boolean.convert(v.status, program) + if self.status_first: + l += status + l.append(v.value) + l.append(v.text) + if not self.status_first: + l += status + return l + +# Dialogue argument values. + +class MenuItem: + + "A menu item which can also be used with radiolists and checklists." + + def __init__(self, value, text, status=0): + self.value = value + self.text = text + self.status = status + +# Dialogue classes. + +class Dialogue: + + commands = { + "KDE" : "kdialog", + "GNOME" : "zenity", + "XFCE" : "zenity", # NOTE: Based on observations with Xubuntu. + "X11" : "Xdialog" + } + + def open(self, desktop=None): + + """ + Open a dialogue box (dialog) using a program appropriate to the desktop + environment in use. + + If the optional 'desktop' parameter is specified then attempt to use + that particular desktop environment's mechanisms to open the dialog + instead of guessing or detecting which environment is being used. + + Suggested values for 'desktop' are "standard", "KDE", "GNOME", + "Mac OS X", "Windows". + + The result of the dialogue interaction may be a string indicating user + input (for Input, Password, Menu, Pulldown), a list of strings + indicating selections of one or more items (for RadioList, CheckList), + or a value indicating true or false (for Question, Warning, Message, + Error). + + Where a string value may be expected but no choice is made, an empty + string may be returned. Similarly, where a list of values is expected + but no choice is made, an empty list may be returned. + """ + + # Decide on the desktop environment in use. + + desktop_in_use = use_desktop(desktop) + + # Get the program. + + try: + program = self.commands[desktop_in_use] + except KeyError: + raise OSError, "Desktop '%s' not supported (no known dialogue box command could be suggested)" % desktop_in_use + + # The handler is one of the functions communicating with the subprocess. + # Some handlers return boolean values, others strings. + + handler, options = self.info[program] + + cmd = [program] + for option in options: + if isinstance(option, str): + cmd.append(option) + else: + value = getattr(self, option.name, None) + cmd += option.convert(value, program) + + return handler(cmd, 0) + +class Simple(Dialogue): + def __init__(self, text, width=None, height=None): + self.text = text + self.width = width + self.height = height + +class Question(Simple): + + """ + A dialogue asking a question and showing response buttons. + Options: text, width (in characters), height (in characters) + Response: a boolean value indicating an affirmative response (true) or a + negative response + """ + + name = "question" + info = { + "kdialog" : (_status, ["--yesno", String("text")]), + "zenity" : (_status, ["--question", StringKeyword("--text", "text")]), + "Xdialog" : (_status, ["--stdout", "--yesno", String("text"), Integer("height"), Integer("width")]), + } + +class Warning(Simple): + + """ + A dialogue asking a question and showing response buttons. + Options: text, width (in characters), height (in characters) + Response: a boolean value indicating an affirmative response (true) or a + negative response + """ + + name = "warning" + info = { + "kdialog" : (_status, ["--warningyesno", String("text")]), + "zenity" : (_status, ["--warning", StringKeyword("--text", "text")]), + "Xdialog" : (_status, ["--stdout", "--yesno", String("text"), Integer("height"), Integer("width")]), + } + +class Message(Simple): + + """ + A message dialogue. + Options: text, width (in characters), height (in characters) + Response: a boolean value indicating an affirmative response (true) or a + negative response + """ + + name = "message" + info = { + "kdialog" : (_status, ["--msgbox", String("text")]), + "zenity" : (_status, ["--info", StringKeyword("--text", "text")]), + "Xdialog" : (_status, ["--stdout", "--msgbox", String("text"), Integer("height"), Integer("width")]), + } + +class Error(Simple): + + """ + An error dialogue. + Options: text, width (in characters), height (in characters) + Response: a boolean value indicating an affirmative response (true) or a + negative response + """ + + name = "error" + info = { + "kdialog" : (_status, ["--error", String("text")]), + "zenity" : (_status, ["--error", StringKeyword("--text", "text")]), + "Xdialog" : (_status, ["--stdout", "--msgbox", String("text"), Integer("height"), Integer("width")]), + } + +class Menu(Simple): + + """ + A menu of options, one of which being selectable. + Options: text, width (in characters), height (in characters), + list_height (in items), items (MenuItem objects) + Response: a value corresponding to the chosen item + """ + + name = "menu" + info = { + "kdialog" : (_readvalue(_readfrom), ["--menu", String("text"), MenuItemList("items")]), + "zenity" : (_readvalue(_readfrom), ["--list", StringKeyword("--text", "text"), StringKeywords("--column", "titles"), + MenuItemList("items")] + ), + "Xdialog" : (_readvalue(_readfrom), ["--stdout", "--menubox", + String("text"), Integer("height"), Integer("width"), Integer("list_height"), MenuItemList("items")] + ), + } + item = MenuItem + number_of_titles = 2 + + def __init__(self, text, titles, items=None, width=None, height=None, list_height=None): + + """ + Initialise a menu with the given heading 'text', column 'titles', and + optional 'items' (which may be added later), 'width' (in characters), + 'height' (in characters) and 'list_height' (in items). + """ + + Simple.__init__(self, text, width, height) + self.titles = ([""] * self.number_of_titles + titles)[-self.number_of_titles:] + self.items = items or [] + self.list_height = list_height + + def add(self, *args, **kw): + + """ + Add an item, passing the given arguments to the appropriate item class. + """ + + self.items.append(self.item(*args, **kw)) + +class RadioList(Menu): + + """ + A list of radio buttons, one of which being selectable. + Options: text, width (in characters), height (in characters), + list_height (in items), items (MenuItem objects), titles + Response: a list of values corresponding to chosen items (since some + programs, eg. zenity, appear to support multiple default + selections) + """ + + name = "radiolist" + info = { + "kdialog" : (_readvalues_kdialog(_readfrom), ["--radiolist", String("text"), ListItemList("items")]), + "zenity" : (_readvalues_zenity(_readfrom), + ["--list", "--radiolist", StringKeyword("--text", "text"), StringKeywords("--column", "titles"), + ListItemList("items", 1)] + ), + "Xdialog" : (_readvalues_Xdialog(_readfrom), ["--stdout", "--radiolist", + String("text"), Integer("height"), Integer("width"), Integer("list_height"), ListItemList("items")] + ), + } + number_of_titles = 3 + +class CheckList(Menu): + + """ + A list of checkboxes, many being selectable. + Options: text, width (in characters), height (in characters), + list_height (in items), items (MenuItem objects), titles + Response: a list of values corresponding to chosen items + """ + + name = "checklist" + info = { + "kdialog" : (_readvalues_kdialog(_readfrom), ["--checklist", String("text"), ListItemList("items")]), + "zenity" : (_readvalues_zenity(_readfrom), + ["--list", "--checklist", StringKeyword("--text", "text"), StringKeywords("--column", "titles"), + ListItemList("items", 1)] + ), + "Xdialog" : (_readvalues_Xdialog(_readfrom), ["--stdout", "--checklist", + String("text"), Integer("height"), Integer("width"), Integer("list_height"), ListItemList("items")] + ), + } + number_of_titles = 3 + +class Pulldown(Menu): + + """ + A pull-down menu of options, one of which being selectable. + Options: text, width (in characters), height (in characters), + items (list of values) + Response: a value corresponding to the chosen item + """ + + name = "pulldown" + info = { + "kdialog" : (_readvalue(_readfrom), ["--combobox", String("text"), Strings("items")]), + "zenity" : (_readvalue(_readfrom), + ["--list", "--radiolist", StringKeyword("--text", "text"), StringKeywords("--column", "titles"), + StringPairs("items")] + ), + "Xdialog" : (_readvalue(_readfrom), + ["--stdout", "--combobox", String("text"), Integer("height"), Integer("width"), Strings("items")]), + } + item = unicode + number_of_titles = 2 + +class Input(Simple): + + """ + An input dialogue, consisting of an input field. + Options: text, input, width (in characters), height (in characters) + Response: the text entered into the dialogue by the user + """ + + name = "input" + info = { + "kdialog" : (_readinput(_readfrom), + ["--inputbox", String("text"), String("data")]), + "zenity" : (_readinput(_readfrom), + ["--entry", StringKeyword("--text", "text"), StringKeyword("--entry-text", "data")]), + "Xdialog" : (_readinput(_readfrom), + ["--stdout", "--inputbox", String("text"), Integer("height"), Integer("width"), String("data")]), + } + + def __init__(self, text, data="", width=None, height=None): + Simple.__init__(self, text, width, height) + self.data = data + +class Password(Input): + + """ + A password dialogue, consisting of a password entry field. + Options: text, width (in characters), height (in characters) + Response: the text entered into the dialogue by the user + """ + + name = "password" + info = { + "kdialog" : (_readinput(_readfrom), + ["--password", String("text")]), + "zenity" : (_readinput(_readfrom), + ["--entry", StringKeyword("--text", "text"), "--hide-text"]), + "Xdialog" : (_readinput(_readfrom), + ["--stdout", "--password", "--inputbox", String("text"), Integer("height"), Integer("width")]), + } + +class TextFile(Simple): + + """ + A text file input box. + Options: filename, text, width (in characters), height (in characters) + Response: any text returned by the dialogue program (typically an empty + string) + """ + + name = "textfile" + info = { + "kdialog" : (_readfrom, ["--textbox", String("filename"), Integer("width", pixels=1), Integer("height", pixels=1)]), + "zenity" : (_readfrom, ["--text-info", StringKeyword("--filename", "filename"), IntegerKeyword("--width", "width", pixels=1), + IntegerKeyword("--height", "height", pixels=1)] + ), + "Xdialog" : (_readfrom, ["--stdout", "--textbox", String("filename"), Integer("height"), Integer("width")]), + } + + def __init__(self, filename, text="", width=None, height=None): + Simple.__init__(self, text, width, height) + self.filename = filename + +# Available dialogues. + +available = [Question, Warning, Message, Error, Menu, CheckList, RadioList, Input, Password, Pulldown, TextFile] + +# Supported desktop environments. + +supported = Dialogue.commands.keys() + +# vim: tabstop=4 expandtab shiftwidth=4 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/windows.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/windows.py new file mode 100644 index 0000000..2b19e85 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/windows.py @@ -0,0 +1,273 @@ +#!/usr/bin/env python + +""" +Simple desktop window enumeration for Python. + +Copyright (C) 2007, 2008, 2009 Paul Boddie + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. + +You should have received a copy of the GNU Lesser General Public License along +with this program. If not, see . + +-------- + +Finding Open Windows on the Desktop +----------------------------------- + +To obtain a list of windows, use the desktop.windows.list function as follows: + +windows = desktop.windows.list() + +To obtain the root window, typically the desktop background, use the +desktop.windows.root function as follows: + +root = desktop.windows.root() + +Each window object can be inspected through a number of methods. For example: + +name = window.name() +width, height = window.size() +x, y = window.position() +child_windows = window.children() + +See the desktop.windows.Window class for more information. +""" + +from desktop import _is_x11, _get_x11_vars, _readfrom, use_desktop +import re + +# System functions. + +def _xwininfo(identifier, action): + if identifier is None: + args = "-root" + else: + args = "-id " + identifier + + s = _readfrom(_get_x11_vars() + "xwininfo %s -%s" % (args, action), shell=1) + + # Return a mapping of keys to values for the "stats" action. + + if action == "stats": + d = {} + for line in s.split("\n"): + fields = line.split(":") + if len(fields) < 2: + continue + key, value = fields[0].strip(), ":".join(fields[1:]).strip() + d[key] = value + + return d + + # Otherwise, return the raw output. + + else: + return s + +def _get_int_properties(d, properties): + results = [] + for property in properties: + results.append(int(d[property])) + return results + +# Finder functions. + +def find_all(name): + return 1 + +def find_named(name): + return name is not None + +def find_by_name(name): + return lambda n, t=name: n == t + +# Window classes. +# NOTE: X11 is the only supported desktop so far. + +class Window: + + "A window on the desktop." + + _name_pattern = re.compile(r':\s+\(.*?\)\s+[-0-9x+]+\s+[-0-9+]+$') + _absent_names = "(has no name)", "(the root window) (has no name)" + + def __init__(self, identifier): + + "Initialise the window with the given 'identifier'." + + self.identifier = identifier + + # Finder methods (from above). + + self.find_all = find_all + self.find_named = find_named + self.find_by_name = find_by_name + + def __repr__(self): + return "Window(%r)" % self.identifier + + # Methods which deal with the underlying commands. + + def _get_handle_and_name(self, text): + fields = text.strip().split(" ") + handle = fields[0] + + # Get the "" part, stripping off the quotes. + + name = " ".join(fields[1:]) + if len(name) > 1 and name[0] == '"' and name[-1] == '"': + name = name[1:-1] + + if name in self._absent_names: + return handle, None + else: + return handle, name + + def _get_this_handle_and_name(self, line): + fields = line.split(":") + return self._get_handle_and_name(":".join(fields[1:])) + + def _get_descendant_handle_and_name(self, line): + match = self._name_pattern.search(line) + if match: + return self._get_handle_and_name(line[:match.start()].strip()) + else: + raise OSError, "Window information from %r did not contain window details." % line + + def _descendants(self, s, fn): + handles = [] + adding = 0 + for line in s.split("\n"): + if line.endswith("child:") or line.endswith("children:"): + if not adding: + adding = 1 + elif adding and line: + handle, name = self._get_descendant_handle_and_name(line) + if fn(name): + handles.append(handle) + return [Window(handle) for handle in handles] + + # Public methods. + + def children(self, all=0): + + """ + Return a list of windows which are children of this window. If the + optional 'all' parameter is set to a true value, all such windows will + be returned regardless of whether they have any name information. + """ + + s = _xwininfo(self.identifier, "children") + return self._descendants(s, all and self.find_all or self.find_named) + + def descendants(self, all=0): + + """ + Return a list of windows which are descendants of this window. If the + optional 'all' parameter is set to a true value, all such windows will + be returned regardless of whether they have any name information. + """ + + s = _xwininfo(self.identifier, "tree") + return self._descendants(s, all and self.find_all or self.find_named) + + def find(self, callable): + + """ + Return windows using the given 'callable' (returning a true or a false + value when invoked with a window name) for descendants of this window. + """ + + s = _xwininfo(self.identifier, "tree") + return self._descendants(s, callable) + + def name(self): + + "Return the name of the window." + + d = _xwininfo(self.identifier, "stats") + + # Format is 'xwininfo: Window id: "" + + return self._get_this_handle_and_name(d["xwininfo"])[1] + + def size(self): + + "Return a tuple containing the width and height of this window." + + d = _xwininfo(self.identifier, "stats") + return _get_int_properties(d, ["Width", "Height"]) + + def position(self): + + "Return a tuple containing the upper left co-ordinates of this window." + + d = _xwininfo(self.identifier, "stats") + return _get_int_properties(d, ["Absolute upper-left X", "Absolute upper-left Y"]) + + def displayed(self): + + """ + Return whether the window is displayed in some way (but not necessarily + visible on the current screen). + """ + + d = _xwininfo(self.identifier, "stats") + return d["Map State"] != "IsUnviewable" + + def visible(self): + + "Return whether the window is displayed and visible." + + d = _xwininfo(self.identifier, "stats") + return d["Map State"] == "IsViewable" + +def list(desktop=None): + + """ + Return a list of windows for the current desktop. If the optional 'desktop' + parameter is specified then attempt to use that particular desktop + environment's mechanisms to look for windows. + """ + + root_window = root(desktop) + window_list = [window for window in root_window.descendants() if window.displayed()] + window_list.insert(0, root_window) + return window_list + +def root(desktop=None): + + """ + Return the root window for the current desktop. If the optional 'desktop' + parameter is specified then attempt to use that particular desktop + environment's mechanisms to look for windows. + """ + + # NOTE: The desktop parameter is currently ignored and X11 is tested for + # NOTE: directly. + + if _is_x11(): + return Window(None) + else: + raise OSError, "Desktop '%s' not supported" % use_desktop(desktop) + +def find(callable, desktop=None): + + """ + Find and return windows using the given 'callable' for the current desktop. + If the optional 'desktop' parameter is specified then attempt to use that + particular desktop environment's mechanisms to look for windows. + """ + + return root(desktop).find(callable) + +# vim: tabstop=4 expandtab shiftwidth=4 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Linux).sublime-keymap new file mode 100644 index 0000000..f5ba726 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Linux).sublime-keymap @@ -0,0 +1,7 @@ +[ + { + "keys": ["ctrl+super+n"], + "command": "sublime_files", + "args": {"command":"navigate"} + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (OSX).sublime-keymap new file mode 100644 index 0000000..f5ba726 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (OSX).sublime-keymap @@ -0,0 +1,7 @@ +[ + { + "keys": ["ctrl+super+n"], + "command": "sublime_files", + "args": {"command":"navigate"} + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Windows).sublime-keymap new file mode 100644 index 0000000..3e53fd3 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Windows).sublime-keymap @@ -0,0 +1,7 @@ +[ + { + "keys": ["ctrl+alt+n"], + "command": "sublime_files", + "args": {"command":"navigate"} + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default.sublime-commands b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default.sublime-commands new file mode 100644 index 0000000..3b2e67f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default.sublime-commands @@ -0,0 +1,7 @@ +[ + { + "caption": "Sublime Files: Open Navigator", + "command": "sublime_files", + "args": {"command":"navigate"} + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Main.sublime-menu new file mode 100644 index 0000000..d11fdf6 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Main.sublime-menu @@ -0,0 +1,83 @@ +[ + { + "caption": "Preferences", + "mnemonic": "n", + "id": "preferences", + "children": + [ + { + "caption": "Package Settings", + "mnemonic": "P", + "id": "package-settings", + "children": + [ + { + "caption": "SublimeFiles", + "children": + [ + { + "command": "open_file", + "args": {"file": "${packages}/Sublime Files/SublimeFiles.sublime-settings"}, + "caption": "Settings – Default" + }, + { + "command": "open_file", + "args": {"file": "${packages}/User/SublimeFiles.sublime-settings"}, + "caption": "Settings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/Sublime Files/Default (Windows).sublime-keymap", + "platform": "Windows" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/Sublime Files/Default (OSX).sublime-keymap", + "platform": "OSX" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/Sublime Files/Default (Linux).sublime-keymap", + "platform": "Linux" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (Windows).sublime-keymap", + "platform": "Windows" + }, + "caption": "Key Bindings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (OSX).sublime-keymap", + "platform": "OSX" + }, + "caption": "Key Bindings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (Linux).sublime-keymap", + "platform": "Linux" + }, + "caption": "Key Bindings – User" + }, + { "caption": "-" } + ] + } + ] + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/README.md new file mode 100644 index 0000000..bff337f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/README.md @@ -0,0 +1,66 @@ +Sublime Files +------------- + +__A keyboard driven file navigation/opening plugin for Sublime Text 2__ + + +Sublime Files works entirely through the command palette. By running the +Sublime Files Navigator, you can "cd" around directories similar to how +you would on a command line in order to open up files. New files will open up in new tabs. + + +Because Sublime Files actually navigates the file system by changing directories, +the navigator remembers and starts from last visited directory on subsequent uses. +To open the navigator, you can either just invoke the command palette command or +use the keybinding ctrl+super+n + + +Built with Mac OS X, but all the calls have been designed to be platform agnostic and thus should work regardless of system. However, this is untested on Windows. + +---------- + +__Installation__ + +Sublime Files can be installed through Sublime Package Control. + +---------- + +__Usage__ + +Sublime files an be activated with the command palette command: "Sublime Files: Open Navigator", or with the key command ctrl+super+n (or ctrl+alt+n for windows). +The first option will always show the current directory. Selecting another directory will navigate to that directory and selecting a file will open that file. + + +There are a few notable options: + + +- Selecting "Directory actions" will pop up a small list of actions that can be applied onto the current directory. Mainly, a user can create new files, add the directory to the current project, and open a terminal at the directory. + +- Selecting "~/" navigates to the home directory. + +- Selecting "../" navigates to the parent directory. + +- Selecting "To current View" navigates to the directory of the current file being edited. + +---------- +__Ignore file types__ + + +SublimeFiles by default will ignore \*.pyc files and \*.class files. You can modify the list of ignored files by changing the ignore\_list in SublimeFiles.sublime-settings. + + +---------- + +__Open Terminal__ + + +For OS X/Linux systems, Sublime Files can open up a terminal at the current directory navigated to. +In order for this feature to work properly, you will have to modify the term\_command field in the +SublimeFiles.sublime-settings text file +located in the SublimeFiles plugin directory. As a default, it is set to open up Terminal.app for OS X systems. + +For example, Gnome Terminal and iTerm2 users respectively will want to change term\_command in SublimeFiles.sublime-settings to: + + - "term_command": "gnome-terminal --working-directory=" + - "term_command" : "open -a iTerm\ 2 " + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/SublimeFiles.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/SublimeFiles.sublime-settings new file mode 100644 index 0000000..4184c09 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/SublimeFiles.sublime-settings @@ -0,0 +1,10 @@ +{ + //The command to execute to open a terminal. + //Program will append the directory to open to the end of term_command. + "term_command": "open -a Terminal ", + + //list of Unix shell-style wildcard matches for file types to + //ignore when listing files in the navigator. + //By default, ignores *.pyc and *.class files. + "ignore_list": ["*.pyc", "*.class"] +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/messages.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/messages.json new file mode 100644 index 0000000..d7c7b05 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/messages.json @@ -0,0 +1,3 @@ +{ + "install": "README.md" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/package-metadata.json new file mode 100644 index 0000000..2edf95f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/al63/SublimeFiles", "version": "2013.03.29.16.32.31", "description": "Sublime Text 2 plugin for keyboard driven file navigation"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/sublime_files.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/sublime_files.py new file mode 100644 index 0000000..3136215 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/sublime_files.py @@ -0,0 +1,176 @@ +import sublime, sublime_plugin +import os, sys, glob +import shlex +from fnmatch import fnmatch +from subprocess import Popen + + +bullet = u'\u2022' +class SublimeFilesCommand(sublime_plugin.WindowCommand): + def run(self, command): + try: + self.home + except: + # first time starting up. ugly, but works + settings = sublime.load_settings('SublimeFiles.sublime-settings') + if os.name == 'nt': + self.home = 'USERPROFILE' + else: + self.home = 'HOME' + try: + os.chdir(os.path.dirname(sublime.active_window().active_view().file_name())) + except: + os.chdir(os.getenv(self.home)) + self.bookmark = None + self.term_command = settings.get('term_command') + self.ignore_list = settings.get('ignore_list') + self.drives = [] # for windows machines + + if command == 'navigate': + self.open_navigator() + + # function for showing panel for changing directories / opening files + def open_navigator(self): + self.dir_files = ['[' + os.getcwdu() + ']', + bullet + ' Directory actions', '..' + os.sep, '~' + os.sep] + + # annoying way to deal with windows + if sublime.platform() == 'windows': + if len(self.drives) == 0: + for i in range(ord('A'), ord('Z') + 1): + drive = chr(i) + if (os.path.exists(drive + ':\\')): + self.drives.append(drive + ':\\') + self.dir_files += self.drives + + for element in os.listdir(os.getcwdu()): + ignore_element = False + for ignore_pattern in self.ignore_list: + if fnmatch(element, ignore_pattern): + ignore_element = True + break + if not ignore_element: + fullpath = os.path.join(os.getcwdu(), element) + if os.path.isdir(fullpath): + self.dir_files.append(element + os.sep) + else: + self.dir_files.append(element) + + self.dir_files = self.dir_files[:4] + sorted(self.dir_files[4:], key=sort_files) + if self.bookmark: + self.dir_files.insert(2, bullet + ' To bookmark (' + self.bookmark + ')') + if self.window.active_view() and self.window.active_view().file_name(): + self.dir_files.insert(2, bullet + ' To current view') + self.window.show_quick_panel(self.dir_files, self.handle_navigator_option, sublime.MONOSPACE_FONT) + + # handles user's selection from open_navigator + def handle_navigator_option(self, call_value): + if call_value != -1: + option = self.dir_files[call_value] + if call_value == 0: + self.open_navigator() + elif call_value == 1: + self.open_directory_options() + elif option == '~' + os.sep: + os.chdir(os.getenv(self.home)) + elif option == '..' + os.sep: + os.chdir(os.path.pardir) + elif sublime.platform() == 'windows' and option in self.drives: + os.chdir(option) + elif option == bullet + ' To current view': + os.chdir(os.path.dirname(self.window.active_view().file_name())) + elif option.startswith(bullet + ' To bookmark'): + os.chdir(self.bookmark) + else: + fullpath = os.path.join(os.getcwdu(), self.dir_files[call_value]) + if os.path.isdir(fullpath): # navigate to directory + os.chdir(self.dir_files[call_value]) + else: # open file + self.window.open_file(os.path.join(os.getcwdu(), fullpath)) + return + self.open_navigator() + + # options for when a user selects current directory + def open_directory_options(self): + self.directory_options = [bullet + ' Add folder to project', bullet + ' Create new file', + bullet + ' Create new directory', bullet + ' Set bookmark here', bullet + ' Navigate to specific directory', bullet + ' Back'] + # terminal opening. only for osx/linux right now + if os.name == 'posix' and self.term_command: + self.directory_options.insert(0, bullet + ' Open terminal here') + self.window.show_quick_panel(self.directory_options, self.handle_directory_option, sublime.MONOSPACE_FONT) + + # handle choice for when user selects option from current directory + def handle_directory_option(self, call_value): + if call_value != -1: + selection = self.directory_options[call_value] + if selection == bullet + ' Create new file': + self.window.show_input_panel('File name: ', '', self.handle_new_file, None, None) + elif selection == bullet + ' Back': + self.open_navigator() + elif selection == bullet + ' Set bookmark here': + self.bookmark = os.getcwdu() + self.open_navigator() + elif selection == bullet + ' Open terminal here': + command = shlex.split(str(self.term_command)) + command.append(os.getcwdu()) + try: + Popen(command) + except: + sublime.error_message('Unable to open terminal') + elif selection == bullet + ' Add folder to project': + sublime_command_line(['-a', os.getcwdu()]) + elif selection == bullet + ' Create new directory': + self.window.show_input_panel('Directory name: ', '', self.handle_new_directory, None, None) + elif selection == bullet + ' Navigate to specific directory': + self.window.show_input_panel("Navigate to: ", os.getcwdu(), self.handle_cwd, None, None); + + + def handle_new_file(self, file_name): + if os.path.isfile(os.getcwdu() + os.sep + file_name): + sublime.error_message(file_name + ' already exists') + return + if os.path.isdir(os.getcwdu() + os.sep + file_name): + sublime.error_message(file_name + ' is already a directory') + return + FILE = open(os.getcwdu() + os.sep + file_name, 'a') + FILE.close() + self.window.open_file(os.getcwdu() + os.sep + file_name) + + def handle_new_directory(self, dir_name): + if os.path.isfile(os.getcwdu() + os.sep + dir_name): + sublime.error_message(dir_name + ' is already a file') + return + if os.path.isdir(os.getcwdu() + os.sep + dir_name): + sublime.error_message(dir_name + ' already exists') + return + os.makedirs(os.getcwdu() + os.sep + dir_name) + + def handle_cwd(self, new_dir): + try: + if new_dir[0] == "~": + new_dir = os.getenv(self.home) + new_dir[1:] + os.chdir(new_dir) + except: + sublime.error_message(new_dir + " does not exist") + + +def sort_files(filename): + total_weight = 0 + if filename[0] == '.': + total_weight += 2 + if filename[-1] == os.sep: + total_weight += 1 + return total_weight + +# hack to add folders to sidebar (stolen from wbond) +def get_sublime_path(): + if sublime.platform() == 'osx': + return '/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl' + elif sublime.platform() == 'linux': + return open('/proc/self/cmdline').read().split(chr(0))[0] + else: + return sys.executable + +def sublime_command_line(args): + args.insert(0, get_sublime_path()) + return Popen(args) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/README.md new file mode 100644 index 0000000..14f3ae4 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/README.md @@ -0,0 +1,102 @@ +# Soda Theme + +Dark and light custom UI themes for Sublime Text 2. + +Project site: [http://buymeasoda.github.com/soda-theme/](http://buymeasoda.github.com/soda-theme/) + +## Design + +![Soda Light Theme](http://buymeasoda.github.com/soda-theme/images/screenshots/soda-2-light-theme.png?v=4) + +![Soda Dark Theme](http://buymeasoda.github.com/soda-theme/images/screenshots/soda-2-dark-theme.png?v=2) + +## Installation + +Soda theme is designed to work with the latest [development build](http://www.sublimetext.com/dev) of Sublime Text 2. + +### Using Sublime Package Control + +If you are using Will Bond's excellent [Sublime Package Control](http://wbond.net/sublime_packages/package_control), you can easily install Soda Theme via the `Package Control: Install Package` menu item. The Soda Theme package is listed as `Theme - Soda` in the packages list. + +### Using Git + +Alternatively, if you are a git user, you can install the theme and keep up to date by cloning the repo directly into your `Packages` directory in the Sublime Text 2 application settings area. + +You can locate your Sublime Text 2 `Packages` directory by using the menu item `Preferences -> Browse Packages...`. + +While inside the `Packages` directory, clone the theme repository using the command below: + + git clone https://github.com/buymeasoda/soda-theme/ "Theme - Soda" + +### Download Manually + +* Download the files using the GitHub .zip download option +* Unzip the files and rename the folder to `Theme - Soda` +* Copy the folder to your Sublime Text 2 `Packages` directory + +## Activating the theme + +To configure Sublime Text 2 to use the theme: + +* Open your User Settings Preferences file `Sublime Text 2 -> Preferences -> Settings - User` +* Add (or update) your theme entry to be `"theme": "Soda Light.sublime-theme"` or `"theme": "Soda Dark.sublime-theme"` + +### Example User Settings + + { + "theme": "Soda Light.sublime-theme" + } + +## Additional Features + +### Alternate Tab Styles + +Soda Theme ships with two alternate UI tab styles. + +By default, a square tab style is used. If you'd prefer to use the original curved tab style, add the following custom setting to your `Settings - User` file: + + "soda_classic_tabs": true + +![Soda Tab Styles](http://buymeasoda.github.com/soda-theme/images/features/multiple-tab-styles.png) + +### Retina Resolution UI + +Soda Theme has been designed to take advantage of retina resolution (high-dpi) displays. Both Soda Light and Soda Dark support retina displays. + +![Soda Retina](http://buymeasoda.github.com/soda-theme/images/features/soda-retina.png) + +### Theme Customisation + +Sublime Text 2 provides an elegant way to tweak existing themes without having to duplicate or maintain a separate copy of the original theme. If there are aspects of Soda Theme that you would like to adjust, take a look at the [theme customisation](https://github.com/buymeasoda/soda-theme/wiki/Theme-customisation) wiki page. + +## Bonus Options + +### Syntax Highlighting Colour Schemes + +The Soda Light screenshot uses a modified version of Espresso Tutti Colori and the Soda Dark screenshot uses a modified version of Monokai. + +If you'd like to use the syntax highlighting schemes shown in the screenshots: + +* Download [colour-schemes.zip](http://buymeasoda.github.com/soda-theme/extras/colour-schemes.zip) +* Unzip and place the extracted `tmtheme` files in the Sublime Text 2 `Packages/User` folder +* Enable the colour scheme via `Preferences -> Color Scheme -> User` + +### Code Font + +The code font shown in the screenshot is Menlo. + +## Development + +Please note, Sublime Text dev builds move quickly and changes can occur with the theme API between releases, so there may be occasions where the theme doesn't quite work with a brand new dev release. + +While developing the theme, I have documented some [theme challenges and ideas](https://github.com/buymeasoda/soda-theme/wiki/Theme-challenges-and-ideas) encountered along the way. + +## License + +Soda Theme is licensed under the [Creative Commons Attribution-ShareAlike 3.0 License](http://creativecommons.org/licenses/by-sa/3.0/). You are free to share and remix the theme, however please abide by the license terms when doing so. + +The following details apply to the Creative Commons license "author specified" components: + +* Attribution example: Based on Soda Theme by Ian Hill (http://buymeasoda.com/) + +* Naming guidelines: If you create and distribute a derivative theme, please give your theme a unique and original name that does not directly include "Soda Theme" (or a close variant) in the main project title, repo name or Package Control name. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark.sublime-theme b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark.sublime-theme new file mode 100644 index 0000000..6c4a634 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark.sublime-theme @@ -0,0 +1,969 @@ +[ + +// +// TABS (REGULAR) +// + + // Tab set + { + "class": "tabset_control", + "layer0.texture": "Theme - Soda/Soda Dark/tabset-background.png", + "layer0.inner_margin": [1, 7], + "layer0.opacity": 1.0, + "content_margin": [-4, 0, -4, 3], + "tab_overlap": 5, + "tab_width": 180, + "tab_min_width": 45, + "tab_height": 25, + "mouse_wheel_switch": false + }, + { + "class": "tabset_control", + "settings": ["mouse_wheel_switches_tabs"], + "mouse_wheel_switch": true + }, + // Tab element + { + "class": "tab_control", + "content_margin": [12, 3, 12, 3], + "max_margin_trim": 0, + "hit_test_level": 0.0, + "layer0.texture": "Theme - Soda/Soda Dark/tab-inactive.png", + "layer0.inner_margin": [5, 5], + "layer0.opacity": 1.0 + }, + // Tab close state + { + "class": "tab_control", + "settings": ["show_tab_close_buttons"], + "content_margin": [12, 3, 7, 3] + }, + // Tab hover state + { + "class": "tab_control", + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Dark/tab-hover.png" + }, + // Tab active state + { + "class": "tab_control", + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Dark/tab-active.png" + }, + // Tab dirty state (close button hidden) + { + "class": "tab_control", + "settings": ["!show_tab_close_buttons"], + "attributes": ["dirty"], + "content_margin": [12, 3, 7, 3] + }, + +// +// TABS (CLASSIC) +// + + // Tab set + { + "class": "tabset_control", + "settings": ["soda_classic_tabs"], + "content_margin": [3, 4, 3, 3], + "tab_overlap": 24, + "tab_height": 28 + }, + // Tab element + { + "class": "tab_control", + "settings": ["soda_classic_tabs"], + "content_margin": [22, 6, 22, 4], + "hit_test_level": 0.5, + "layer0.texture": "Theme - Soda/Soda Dark/classic/tab-inactive.png", + "layer0.inner_margin": [18, 4] + }, + // Tab close state + { + "class": "tab_control", + "settings": ["soda_classic_tabs", "show_tab_close_buttons"], + "content_margin": [22, 6, 15, 4] + }, + // Tab hover state + { + "class": "tab_control", + "settings": ["soda_classic_tabs"], + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Dark/classic/tab-hover.png" + }, + // Tab active state + { + "class": "tab_control", + "settings": ["soda_classic_tabs"], + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Dark/classic/tab-active.png" + }, + // Tab dirty state (close button hidden) + { + "class": "tab_control", + "settings": ["soda_classic_tabs", "!show_tab_close_buttons"], + "attributes": ["dirty"], + "content_margin": [22, 6, 15, 4] + }, + +// +// TAB BUTTONS +// + + // Tab close button + { + "class": "tab_close_button", + "content_margin": [0, 0], + "layer0.texture": "Theme - Soda/Soda Dark/tab-close-inactive.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": 0 + }, + { + "class": "tab_close_button", + "settings": ["show_tab_close_buttons"], + "content_margin": [8, 8] + }, + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["hover"]}], + "layer0.texture": "Theme - Soda/Soda Dark/tab-close.png", + "layer0.opacity": 1.0 + }, + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/tab-close.png", + "layer0.opacity": 1.0 + }, + // Tab dirty button + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["dirty"]}], + "layer0.texture": "Theme - Soda/Soda Dark/tab-dirty-inactive.png" + }, + { + "class": "tab_close_button", + "settings": ["!show_tab_close_buttons"], + "parents": [{"class": "tab_control", "attributes": ["dirty"]}], + "content_margin": [8, 8] + }, + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["dirty", "hover"]}], + "layer0.opacity": 1.0 + }, + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["dirty", "selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/tab-dirty.png" + }, + // Tab highlight button + { + "class": "tab_close_button", + "settings": ["highlight_modified_tabs"], + "parents": [{"class": "tab_control", "attributes": ["dirty"]}], + "layer0.texture": "Theme - Soda/Soda Dark/tab-highlight-inactive.png" + }, + { + "class": "tab_close_button", + "settings": ["highlight_modified_tabs"], + "parents": [{"class": "tab_control", "attributes": ["dirty", "selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/tab-highlight.png" + }, + // Tab close button hover + { + "class": "tab_close_button", + "settings": ["show_tab_close_buttons"], + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Dark/tab-close-hover.png" + }, + // Tab close button pressed + { + "class": "tab_close_button", + "settings": ["show_tab_close_buttons"], + "attributes": ["pressed"], + "layer0.texture": "Theme - Soda/Soda Dark/tab-close-pressed.png" + }, + +// +// TAB LABELS +// + + { + "class": "tab_label", + "fade": true, + "fg": [170, 170, 170], + "shadow_color": [25, 25, 25], + "shadow_offset": [0, -1] + }, + { + "class": "tab_label", + "parents": [{"class": "tab_control", "attributes": ["hover"]}], + "fg": [200, 200, 200], + "shadow_color": [30, 30, 30] + }, + { + "class": "tab_label", + "parents": [{"class": "tab_control", "attributes": ["selected"]}], + "fg": [230, 230, 230], + "shadow_color": [35, 35, 35] + }, + +// +// FOLD BUTTONS +// + + { + "class": "fold_button_control", + "layer0.texture": "Theme - Soda/Soda Dark/fold-closed.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": 0, + "content_margin": [8, 8] + }, + { + "class": "fold_button_control", + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Dark/fold-closed-hover.png" + }, + { + "class": "fold_button_control", + "attributes": ["expanded"], + "layer0.texture": "Theme - Soda/Soda Dark/fold-open.png" + }, + { + "class": "fold_button_control", + "attributes": ["expanded", "hover"], + "layer0.texture": "Theme - Soda/Soda Dark/fold-open-hover.png" + }, + +// +// STANDARD SCROLLBARS +// + + // Standard vertical scroll bar + { + "class": "scroll_bar_control", + "layer0.texture": "Theme - Soda/Soda Dark/standard-scrollbar-vertical.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [2, 6], + "blur": false + }, + // Standard horizontal scroll bar + { + "class": "scroll_bar_control", + "attributes": ["horizontal"], + "layer0.texture": "Theme - Soda/Soda Dark/standard-scrollbar-horizontal.png", + "layer0.inner_margin": [6, 2], + "blur": false + }, + // Standard scroll bar corner + { + "class": "scroll_corner_control", + "layer0.texture": "Theme - Soda/Soda Dark/standard-scrollbar-corner.png", + "layer0.inner_margin": [2, 2], + "layer0.opacity": 1.0 + }, + // Standard vertical scroll puck + { + "class": "puck_control", + "layer0.texture": "Theme - Soda/Soda Dark/standard-puck-vertical.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [0, 10], + "content_margin": [8, 12], + "blur": false + }, + // Standard horizontal scroll puck + { + "class": "puck_control", + "attributes": ["horizontal"], + "layer0.texture": "Theme - Soda/Soda Dark/standard-puck-horizontal.png", + "layer0.inner_margin": [10, 0], + "content_margin": [12, 8], + "blur": false + }, + +// +// OVERLAY SCROLLBARS +// + + // Overlay toggle scroll bar + { + "class": "scroll_area_control", + "settings": ["overlay_scroll_bars"], + "overlay": true + }, + { + "class": "scroll_area_control", + "settings": ["!overlay_scroll_bars"], + "overlay": false + }, + // Overlay vertical scroll bar + { + "class": "scroll_bar_control", + "settings": ["overlay_scroll_bars"], + "layer0.texture": "Theme - Soda/Soda Dark/overlay-scrollbar-vertical.png", + "layer0.inner_margin": [0, 5], + "blur": true + }, + // Overlay horizontal scroll bar + { + "class": "scroll_bar_control", + "settings": ["overlay_scroll_bars"], + "attributes": ["horizontal"], + "layer0.texture": "Theme - Soda/Soda Dark/overlay-scrollbar-horizontal.png", + "layer0.inner_margin": [5, 0], + "blur": true + }, + // Overlay vertical puck + { + "class": "puck_control", + "settings": ["overlay_scroll_bars"], + "layer0.texture": "Theme - Soda/Soda Dark/overlay-puck-vertical.png", + "layer0.inner_margin": [0, 5], + "content_margin": [5, 20], + "blur": true + }, + // Overlay horizontal puck + { + "class": "puck_control", + "settings": ["overlay_scroll_bars"], + "attributes": ["horizontal"], + "layer0.texture": "Theme - Soda/Soda Dark/overlay-puck-horizontal.png", + "layer0.inner_margin": [5, 0], + "content_margin": [20, 5], + "blur": true + }, + // Overlay light puck (for dark content) + { + "class": "puck_control", + "settings": ["overlay_scroll_bars"], + "attributes": ["dark"], + "layer0.texture": "Theme - Soda/Soda Dark/overlay-dark-puck-vertical.png" + }, + // Overlay light horizontal puck (for dark content) + { + "class": "puck_control", + "settings": ["overlay_scroll_bars"], + "attributes": ["horizontal", "dark"], + "layer0.texture": "Theme - Soda/Soda Dark/overlay-dark-puck-horizontal.png" + }, + +// +// EMPTY WINDOW BACKGROUND +// + + { + "class": "sheet_container_control", + "layer0.tint": [25, 25, 25], + "layer0.opacity": 1.0 + }, + +// +// GRID LAYOUT +// + + { + "class": "grid_layout_control", + "border_size": 1, + "border_color": [70, 70, 70] + }, + +// +// MINI MAP +// + + { + "class": "minimap_control", + "viewport_color": [255, 255, 255, 35] + }, + +// +// LABELS +// + + // General labels + { + "class": "label_control", + "color": [204, 204, 204] + }, + // Text field labels + { + "class": "label_control", + "parents": [{"class": "panel_control"}], + "shadow_color": [50, 50, 50], + "shadow_offset": [0, -1] + }, + // Button labels + { + "class": "label_control", + "parents": [{"class": "button_control"}], + "shadow_color": [55, 55, 55], + "shadow_offset": [0, -1] + }, + +// +// TOOLTIP +// + + // Tooltip container + { + "class": "tool_tip_control", + "layer0.texture": "Theme - Soda/Soda Dark/tooltip.png", + "layer0.inner_margin": [1, 1], + "layer0.opacity": 0.95, + "content_margin": [3, 3] + }, + // Tooltip content + { + "class": "tool_tip_label_control", + "color": [0, 0, 0] + }, + +// +// STATUS BAR +// + + // Status bar container + { + "class": "status_bar", + "layer0.texture": "Theme - Soda/Soda Dark/status-bar-background.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [2, 2], + "content_margin": [8, 4, 8, 4] + }, + // Status bar button + { + "class": "status_button", + "min_size": [100, 0] + }, + // Status bar label + { + "class": "label_control", + "parents": [{"class": "status_bar"}], + "color": [150, 150, 150], + "shadow_color": [25, 25, 25], + "shadow_offset": [0, -1] + }, + +// +// SIDEBAR +// + + // Sidebar container + { + "class": "sidebar_container", + "layer0.texture": "Theme - Soda/Soda Dark/sidebar-bg.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [1, 1, 2, 1], + "content_margin": [0, 0, 1, 0] + }, + // Sidebar tree + { + "class": "sidebar_tree", + "row_padding": [8, 3], + "indent": 15, + "indent_offset": 15, + "indent_top_level": false, + "dark_content": true + }, + // Sidebar rows + { + "class": "tree_row", + "layer0.texture": "Theme - Soda/Soda Dark/sidebar-row-selected.png", + "layer0.opacity": 0.0, + "layer0.inner_margin": [1, 1] + }, + // Sidebar row selected + { + "class": "tree_row", + "attributes": ["selected"], + "layer0.opacity": 1.0 + }, + // Sidebar heading + { + "class": "sidebar_heading", + "color": [210, 210, 210], + "font.bold": true, + "shadow_color": [0, 0, 0], + "shadow_offset": [0, -1] + }, + // Sidebar entry + { + "class": "sidebar_label", + "color": [125, 125, 125], + "shadow_color": [0, 0, 0], + "shadow_offset": [0, -1] + }, + // Sidebar folder entry + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["expandable"]}], + "color": [190, 190, 190] + }, + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["expandable", "hover"]}], + "color": [235, 235, 235] + }, + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["expandable"]}], + "settings": ["bold_folder_labels"], + "font.bold": true + }, + // Sidebar entry selected + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "color": [210, 210, 210], + "shadow_color": [0, 0, 0], + "shadow_offset": [0, 1] + }, + +// +// SIDEBAR - OPEN FILE ICONS +// + + // Sidebar file close + { + "class": "close_button", + "layer0.texture": "Theme - Soda/Soda Dark/file-close.png", + "layer0.opacity": 0.0, + "layer0.inner_margin": 0, + "content_margin": [8, 8] + }, + { + "class": "close_button", + "parents": [{"class": "tree_row", "attributes": ["hover"]}], + "layer0.opacity": 1.0 + }, + // Sidebar file dirty + { + "class": "close_button", + "attributes": ["dirty"], + "layer0.texture": "Theme - Soda/Soda Dark/file-dirty.png", + "layer0.opacity": 1.0 + }, + { + "class": "close_button", + "attributes": ["dirty"], + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/file-dirty-selected.png" + }, + { + "class": "close_button", + "attributes": ["dirty"], + "parents": [{"class": "tree_row", "attributes": ["hover"]}], + "layer0.texture": "Theme - Soda/Soda Dark/file-close.png" + }, + // Sidebar file close hover + { + "class": "close_button", + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Dark/file-close-hover.png" + }, + { + "class": "close_button", + "parents": [{"class": "tree_row", "attributes": ["hover", "selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/file-close-selected.png" + }, + +// +// SIDEBAR - GENERAL FILE ICONS +// + + // Sidebar group closed + { + "class": "disclosure_button_control", + "content_margin": [8, 8], + "layer0.texture": "Theme - Soda/Soda Dark/group-closed.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": 0 + }, + { + "class": "disclosure_button_control", + "parents": [{"class": "tree_row", "attributes": ["hover"]}], + "layer0.texture": "Theme - Soda/Soda Dark/group-closed-hover.png" + }, + { + "class": "disclosure_button_control", + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/group-closed-selected.png" + }, + // Sidebar group open + { + "class": "disclosure_button_control", + "attributes": ["expanded"], + "layer0.texture": "Theme - Soda/Soda Dark/group-open.png" + }, + { + "class": "disclosure_button_control", + "attributes": ["expanded"], + "parents": [{"class": "tree_row", "attributes": ["hover"]}], + "layer0.texture": "Theme - Soda/Soda Dark/group-open-hover.png" + }, + { + "class": "disclosure_button_control", + "attributes": ["expanded"], + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/group-open-selected.png" + }, + +// +// STANDARD TEXT BUTTONS +// + + // Default button state + { + "class": "button_control", + "content_margin": [6, 5, 6, 6], + "min_size": [75, 0], + "layer0.texture": "Theme - Soda/Soda Dark/btn-large.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [6, 6] + }, + // Pressed button state + { + "class": "button_control", + "attributes": ["pressed"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-large-on.png" + }, + +// +// TEXT INPUT FIELD +// + + // Text input field item + { + "class": "text_line_control", + "layer0.texture": "Theme - Soda/Soda Dark/text-field.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [4, 5, 4, 3], + "content_margin": [3, 3] + }, + +// +// PANEL BACKGROUNDS +// + + // Bottom panel background + { + "class": "panel_control", + "layer0.texture": "Theme - Soda/Soda Dark/panel-background.png", + "layer0.inner_margin": [2, 2, 2, 2], + "layer0.opacity": 1.0, + "content_margin": [2, 3, 2, 1] + }, + // Quick panel background + { + "class": "overlay_control", + "settings": ["!soda_retina_fix"], + "layer0.texture": "Theme - Soda/Soda Dark/quick-panel-background.png", + "layer0.inner_margin": [12, 6, 12, 15], + "layer0.opacity": 1.0, + "layer1.texture": "Theme - Soda/Soda Dark/quick-panel-sections.png", + "layer1.inner_margin": [12, 40, 12, 19], + "layer1.opacity": 1.0, + "content_margin": [11, 8, 11, 17] + }, + // Quick panel background (Retina fix) + { + "class": "overlay_control", + "settings": ["soda_retina_fix"], + "layer0.tint": [67, 67, 67], + "layer0.opacity": 1.0, + "content_margin": [6, 8, 6, 6] + }, + +// +// QUICK PANEL +// + + { + "class": "quick_panel", + "row_padding": [5, 2], + "layer0.tint": [33, 33, 33], + "layer0.opacity": 1.0, + "dark_content": true + }, + { + "class": "quick_panel_row", + "layer0.texture": "Theme - Soda/Soda Dark/quick-panel-row.png", + "layer0.inner_margin": [2, 2, 2, 2], + "layer0.opacity": 1.0 + }, + { + "class": "quick_panel_row", + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Dark/quick-panel-row-selected.png" + }, + { + "class": "quick_panel_label", + "fg": [210, 210, 210, 255], + "match_fg": [126, 199, 239, 255], + "selected_fg": [255, 255, 255, 255], + "selected_match_fg": [166, 229, 255, 255] + }, + { + "class": "quick_panel_path_label", + "fg": [130, 130, 130, 255], + "match_fg": [220, 220, 220, 255], + "selected_fg": [175, 175, 175, 255], + "selected_match_fg": [220, 220, 220, 255] + }, + { + "class": "quick_panel_score_label", + "fg": [126, 199, 239, 255], + "selected_fg": [166, 229, 255, 255] + }, + +// +// MINI QUICK PANEL +// + + { + "class": "mini_quick_panel_row", + "layer0.texture": "Theme - Soda/Soda Dark/quick-panel-row.png", + "layer0.inner_margin": [2, 2, 2, 2], + "layer0.opacity": 1.0 + }, + { + "class": "mini_quick_panel_row", + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Dark/quick-panel-row-selected.png" + }, + +// +// CODE COMPLETION DROPDOWN +// + + { + "class": "popup_control", + "content_margin": [2, 2], + "layer0.tint": [30, 30, 30], + "layer0.opacity": 1.0 + }, + { + "class": "auto_complete", + "row_padding": [4, 2] + }, + { + "class": "auto_complete_label", + "fg": [140, 140, 140], + "match_fg": [220, 220, 220], + "selected_fg": [180, 180, 180], + "selected_match_fg": [245, 245, 245] + }, + { + "class": "table_row", + "layer0.texture": "Theme - Soda/Soda Dark/autocomplete-row-selected.png", + "layer0.opacity": 0.0, + "layer0.inner_margin": [3, 1] + }, + { + "class": "table_row", + "attributes": ["selected"], + "layer0.opacity": 1.0 + }, + +// +// BOTTOM PANEL BUTTONS +// + + // Button group middle + { + "class": "icon_button_control", + "layer0.texture": "Theme - Soda/Soda Dark/btn-group-middle.png", + "layer0.inner_margin": [6, 6], + "layer0.opacity": 1.0, + "content_margin": [3, 3] + }, + { + "class": "icon_button_control", + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-group-middle-on.png" + }, + // Button group left + { + "class": "icon_button_control", + "attributes": ["left"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-group-left.png", + "content_margin": [4, 3, 3, 3] + }, + { + "class": "icon_button_control", + "attributes": ["left", "selected"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-group-left-on.png" + }, + // Button group right + { + "class": "icon_button_control", + "attributes": ["right"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-group-right.png", + "content_margin": [3, 3, 4, 3] + }, + { + "class": "icon_button_control", + "attributes": ["right", "selected"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-group-right-on.png" + }, + // Button single + { + "class": "icon_button_control", + "attributes": ["left", "right"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-small.png", + "content_margin": [4, 3] + }, + { + "class": "icon_button_control", + "attributes": ["left", "right", "selected"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-small-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 1 +// + + // Regex search button + { + "class": "icon_regex", + "layer0.texture": "Theme - Soda/Soda Dark/icon-regex-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_regex", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-regex-on.png" + }, + // Case sensitive search button + { + "class": "icon_case", + "layer0.texture": "Theme - Soda/Soda Dark/icon-case-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_case", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-case-on.png" + }, + // Match whole word search button + { + "class": "icon_whole_word", + "layer0.texture": "Theme - Soda/Soda Dark/icon-word-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_whole_word", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-word-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 1 (EXTENDED: FIND IN FILES) +// + + // Show search context button + { + "class": "icon_context", + "layer0.texture": "Theme - Soda/Soda Dark/icon-context-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_context", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-context-on.png" + }, + // Use search buffer + { + "class": "icon_use_buffer", + "layer0.texture": "Theme - Soda/Soda Dark/icon-buffer-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_use_buffer", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-buffer-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 2 +// + + // Reverse search direction button + { + "class": "icon_reverse", + "layer0.texture": "Theme - Soda/Soda Dark/icon-reverse-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_reverse", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-reverse-on.png" + }, + // Search wrap button + { + "class": "icon_wrap", + "layer0.texture": "Theme - Soda/Soda Dark/icon-wrap-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_wrap", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-wrap-on.png" + }, + // Search in selection button + { + "class": "icon_in_selection", + "layer0.texture": "Theme - Soda/Soda Dark/icon-selection-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_in_selection", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-selection-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 3 +// + + // Preserve case button + { + "class": "icon_preserve_case", + "layer0.texture": "Theme - Soda/Soda Dark/icon-preserve-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_preserve_case", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-preserve-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 4 +// + + // Highlight results button + { + "class": "icon_highlight", + "layer0.texture": "Theme - Soda/Soda Dark/icon-highlight-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_highlight", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-highlight-on.png" + } + +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/.gitignore new file mode 100644 index 0000000..f05fcdc --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/.gitignore @@ -0,0 +1 @@ +*.cache \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.stTheme b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.stTheme new file mode 100644 index 0000000..42cbb94 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.stTheme @@ -0,0 +1,30 @@ + + + + + author + Ian Hill + comment + A widget theme for the UI components of the Soda Dark theme. + name + Soda Dark - Widget Theme + settings + + + settings + + background + #383838 + caret + #F8F8F8 + foreground + #F8F8F8 + invisibles + #3B3B3B + selection + #222222 + + + + + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.sublime-settings new file mode 100644 index 0000000..d5787af --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.sublime-settings @@ -0,0 +1,4 @@ +{ + "color_scheme": "Packages/Theme - Soda/Soda Dark/Widget - Soda Dark.stTheme", + "draw_shadows": false +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/autocomplete-row-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/autocomplete-row-selected.png new file mode 100644 index 0000000..336555c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/autocomplete-row-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/autocomplete-row-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/autocomplete-row-selected@2x.png new file mode 100644 index 0000000..2a3d7b4 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/autocomplete-row-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/bookmark.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/bookmark.png new file mode 100644 index 0000000..8d15c63 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/bookmark.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left-on.png new file mode 100644 index 0000000..3a25d0c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left-on@2x.png new file mode 100644 index 0000000..d9ed060 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left.png new file mode 100644 index 0000000..17bd507 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left@2x.png new file mode 100644 index 0000000..34efcdf Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle-on.png new file mode 100644 index 0000000..9b1126f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle-on@2x.png new file mode 100644 index 0000000..268e9f5 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle.png new file mode 100644 index 0000000..046049c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle@2x.png new file mode 100644 index 0000000..2bd8146 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right-on.png new file mode 100644 index 0000000..968db9b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right-on@2x.png new file mode 100644 index 0000000..7c56ad0 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right.png new file mode 100644 index 0000000..60a7aa0 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right@2x.png new file mode 100644 index 0000000..8ad4f40 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large-on.png new file mode 100644 index 0000000..b97be2d Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large-on@2x.png new file mode 100644 index 0000000..f4bddc9 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large.png new file mode 100644 index 0000000..d4042c9 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large@2x.png new file mode 100644 index 0000000..046438a Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small-on.png new file mode 100644 index 0000000..92881b7 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small-on@2x.png new file mode 100644 index 0000000..978b140 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small.png new file mode 100644 index 0000000..d4042c9 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small@2x.png new file mode 100644 index 0000000..046438a Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/circle.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/circle.png new file mode 100644 index 0000000..a007d54 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/circle.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-active.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-active.png new file mode 100644 index 0000000..ef782f9 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-active.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-active@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-active@2x.png new file mode 100644 index 0000000..17d475f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-active@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-hover.png new file mode 100644 index 0000000..c21168c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-hover@2x.png new file mode 100644 index 0000000..85d9832 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-inactive.png new file mode 100644 index 0000000..e078572 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-inactive.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-inactive@2x.png new file mode 100644 index 0000000..b7ceb0c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-inactive@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/dot.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/dot.png new file mode 100644 index 0000000..0216b46 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/dot.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-hover.png new file mode 100644 index 0000000..2905761 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-hover@2x.png new file mode 100644 index 0000000..6dd2b02 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-selected.png new file mode 100644 index 0000000..989c036 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-selected@2x.png new file mode 100644 index 0000000..90e2578 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close.png new file mode 100644 index 0000000..f5b0ed6 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close@2x.png new file mode 100644 index 0000000..5181e70 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty-selected.png new file mode 100644 index 0000000..7513aef Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty-selected@2x.png new file mode 100644 index 0000000..5914886 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty.png new file mode 100644 index 0000000..8edd2e1 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty@2x.png new file mode 100644 index 0000000..3fa444c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed-hover.png new file mode 100644 index 0000000..c2b1772 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed-hover@2x.png new file mode 100644 index 0000000..ffc28bf Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed.png new file mode 100644 index 0000000..4b15636 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed@2x.png new file mode 100644 index 0000000..f9092e7 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open-hover.png new file mode 100644 index 0000000..cfcb481 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open-hover@2x.png new file mode 100644 index 0000000..b3da623 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open.png new file mode 100644 index 0000000..55c3a34 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open@2x.png new file mode 100644 index 0000000..f7d4c89 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold.png new file mode 100644 index 0000000..8008475 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-hover.png new file mode 100644 index 0000000..acc7e62 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-hover@2x.png new file mode 100644 index 0000000..0a20c3f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-selected.png new file mode 100644 index 0000000..fbe4d30 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-selected@2x.png new file mode 100644 index 0000000..5e96a03 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed.png new file mode 100644 index 0000000..a9b08c7 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed@2x.png new file mode 100644 index 0000000..6fc2485 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-hover.png new file mode 100644 index 0000000..996ece4 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-hover@2x.png new file mode 100644 index 0000000..07234e5 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-selected.png new file mode 100644 index 0000000..71446e4 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-selected@2x.png new file mode 100644 index 0000000..0be0189 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open.png new file mode 100644 index 0000000..60e8735 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open@2x.png new file mode 100644 index 0000000..0bdf757 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-off.png new file mode 100644 index 0000000..c766f0b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-off@2x.png new file mode 100644 index 0000000..3f08ebc Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-on.png new file mode 100644 index 0000000..0ea1d87 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-on@2x.png new file mode 100644 index 0000000..8fb36fb Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-off.png new file mode 100644 index 0000000..98cfe0b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-off@2x.png new file mode 100644 index 0000000..1c27119 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-on.png new file mode 100644 index 0000000..84813cd Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-on@2x.png new file mode 100644 index 0000000..05770df Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-off.png new file mode 100644 index 0000000..7db1bc4 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-off@2x.png new file mode 100644 index 0000000..2a0557c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-on.png new file mode 100644 index 0000000..7447f94 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-on@2x.png new file mode 100644 index 0000000..f04193b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-off.png new file mode 100644 index 0000000..a6e5498 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-off@2x.png new file mode 100644 index 0000000..e8d1a84 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-on.png new file mode 100644 index 0000000..42cd598 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-on@2x.png new file mode 100644 index 0000000..28fde6b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-off.png new file mode 100644 index 0000000..1b94814 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-off@2x.png new file mode 100644 index 0000000..e7e60ba Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-on.png new file mode 100644 index 0000000..1202888 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-on@2x.png new file mode 100644 index 0000000..419010c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-off.png new file mode 100644 index 0000000..1669cfc Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-off@2x.png new file mode 100644 index 0000000..ccac8ab Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-on.png new file mode 100644 index 0000000..15a72cf Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-on@2x.png new file mode 100644 index 0000000..4a500a3 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-off.png new file mode 100644 index 0000000..91a13b6 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-off@2x.png new file mode 100644 index 0000000..c0f0af4 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-on.png new file mode 100644 index 0000000..cadfdf7 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-on@2x.png new file mode 100644 index 0000000..b039826 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-off.png new file mode 100644 index 0000000..efc00dc Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-off@2x.png new file mode 100644 index 0000000..ec6f0fa Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-on.png new file mode 100644 index 0000000..c71ae65 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-on@2x.png new file mode 100644 index 0000000..303a33b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-off.png new file mode 100644 index 0000000..bdf69c0 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-off@2x.png new file mode 100644 index 0000000..160f44a Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-on.png new file mode 100644 index 0000000..3c880fd Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-on@2x.png new file mode 100644 index 0000000..52f8b3b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-off.png new file mode 100644 index 0000000..b9facd8 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-off@2x.png new file mode 100644 index 0000000..d8d02dc Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-on.png new file mode 100644 index 0000000..5df3e46 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-on@2x.png new file mode 100644 index 0000000..447dccf Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-horizontal.png new file mode 100644 index 0000000..762e5a7 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-horizontal.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-horizontal@2x.png new file mode 100644 index 0000000..166aba8 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-horizontal@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-vertical.png new file mode 100644 index 0000000..f2c4047 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-vertical.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-vertical@2x.png new file mode 100644 index 0000000..7f22be6 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-vertical@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-horizontal.png new file mode 100644 index 0000000..4b677dc Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-horizontal.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-horizontal@2x.png new file mode 100644 index 0000000..3ee8fee Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-horizontal@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-vertical.png new file mode 100644 index 0000000..1603bad Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-vertical.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-vertical@2x.png new file mode 100644 index 0000000..7aebfa6 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-vertical@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-horizontal.png new file mode 100644 index 0000000..ff2ca6e Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-horizontal.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-horizontal@2x.png new file mode 100644 index 0000000..2b5bb07 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-horizontal@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-vertical.png new file mode 100644 index 0000000..5e981c3 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-vertical.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-vertical@2x.png new file mode 100644 index 0000000..3d3ff15 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-vertical@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/panel-background.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/panel-background.png new file mode 100644 index 0000000..b92b2b9 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/panel-background.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/panel-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/panel-background@2x.png new file mode 100644 index 0000000..e7b5f99 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/panel-background@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background-fix.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background-fix.png new file mode 100644 index 0000000..816fe8e Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background-fix.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background-fix@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background-fix@2x.png new file mode 100644 index 0000000..d7b5ec0 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background-fix@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background.png new file mode 100644 index 0000000..eb38a68 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background@2x.png new file mode 100644 index 0000000..e6cd417 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row-selected.png new file mode 100644 index 0000000..c7ba57b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row-selected@2x.png new file mode 100644 index 0000000..753e68f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row.png new file mode 100644 index 0000000..6caef9d Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row@2x.png new file mode 100644 index 0000000..4d1faff Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections-fix.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections-fix.png new file mode 100644 index 0000000..5f10806 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections-fix.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections-fix@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections-fix@2x.png new file mode 100644 index 0000000..3632e34 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections-fix@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections.png new file mode 100644 index 0000000..70c7838 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections@2x.png new file mode 100644 index 0000000..184c512 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-bg.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-bg.png new file mode 100644 index 0000000..70abafa Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-bg.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-bg@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-bg@2x.png new file mode 100644 index 0000000..68c1315 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-bg@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-row-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-row-selected.png new file mode 100644 index 0000000..53a5a67 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-row-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-row-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-row-selected@2x.png new file mode 100644 index 0000000..4be24fd Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-row-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-horizontal.png new file mode 100644 index 0000000..2bf392d Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-horizontal.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-horizontal@2x.png new file mode 100644 index 0000000..3f4de61 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-horizontal@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-vertical.png new file mode 100644 index 0000000..ee5401e Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-vertical.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-vertical@2x.png new file mode 100644 index 0000000..ede9da9 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-vertical@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-corner.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-corner.png new file mode 100644 index 0000000..9fdedde Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-corner.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-corner@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-corner@2x.png new file mode 100644 index 0000000..919474b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-corner@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-horizontal.png new file mode 100644 index 0000000..a57c13f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-horizontal.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-horizontal@2x.png new file mode 100644 index 0000000..fc9f044 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-horizontal@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-vertical.png new file mode 100644 index 0000000..1c958be Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-vertical.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-vertical@2x.png new file mode 100644 index 0000000..f560c3f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-vertical@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/status-bar-background.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/status-bar-background.png new file mode 100644 index 0000000..4eab5f3 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/status-bar-background.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/status-bar-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/status-bar-background@2x.png new file mode 100644 index 0000000..d8126c8 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/status-bar-background@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-active.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-active.png new file mode 100644 index 0000000..72fd2e9 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-active.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-active@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-active@2x.png new file mode 100644 index 0000000..0f78299 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-active@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-hover.png new file mode 100644 index 0000000..0d37ca3 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-hover@2x.png new file mode 100644 index 0000000..66791d8 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-inactive.png new file mode 100644 index 0000000..865956a Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-inactive.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-inactive@2x.png new file mode 100644 index 0000000..0e71145 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-inactive@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-pressed.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-pressed.png new file mode 100644 index 0000000..2cf0633 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-pressed.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-pressed@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-pressed@2x.png new file mode 100644 index 0000000..dad7a93 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-pressed@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close.png new file mode 100644 index 0000000..865956a Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close@2x.png new file mode 100644 index 0000000..0e71145 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty-inactive.png new file mode 100644 index 0000000..95003f0 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty-inactive.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty-inactive@2x.png new file mode 100644 index 0000000..aed1da1 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty-inactive@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty.png new file mode 100644 index 0000000..9eb7ea1 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty@2x.png new file mode 100644 index 0000000..f388264 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight-inactive.png new file mode 100644 index 0000000..9c715ca Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight-inactive.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight-inactive@2x.png new file mode 100644 index 0000000..028b26f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight-inactive@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight.png new file mode 100644 index 0000000..c9a28b8 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight@2x.png new file mode 100644 index 0000000..2d53da8 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-hover.png new file mode 100644 index 0000000..b5c4c7c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-hover@2x.png new file mode 100644 index 0000000..d7d17f0 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-inactive.png new file mode 100644 index 0000000..3ff4773 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-inactive.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-inactive@2x.png new file mode 100644 index 0000000..92ba53e Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-inactive@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tabset-background.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tabset-background.png new file mode 100644 index 0000000..eaa87b5 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tabset-background.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tabset-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tabset-background@2x.png new file mode 100644 index 0000000..cc6999d Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tabset-background@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/text-field.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/text-field.png new file mode 100644 index 0000000..f2f3ea3 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/text-field.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/text-field@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/text-field@2x.png new file mode 100644 index 0000000..7dbb058 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/text-field@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tooltip.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tooltip.png new file mode 100644 index 0000000..63faab6 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tooltip.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tooltip@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tooltip@2x.png new file mode 100644 index 0000000..1cccaa6 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tooltip@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light.sublime-theme b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light.sublime-theme new file mode 100644 index 0000000..5c1e2ee --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light.sublime-theme @@ -0,0 +1,974 @@ +[ + +// +// TABS (REGULAR) +// + + // Tab set + { + "class": "tabset_control", + "layer0.texture": "Theme - Soda/Soda Light/tabset-background.png", + "layer0.inner_margin": [1, 7], + "layer0.opacity": 1.0, + "content_margin": [-4, 0, -4, 3], + "tab_overlap": 5, + "tab_width": 180, + "tab_min_width": 45, + "tab_height": 25, + "mouse_wheel_switch": false + }, + { + "class": "tabset_control", + "settings": ["mouse_wheel_switches_tabs"], + "mouse_wheel_switch": true + }, + // Tab element + { + "class": "tab_control", + "content_margin": [12, 3, 12, 3], + "max_margin_trim": 0, + "hit_test_level": 0.0, + "layer0.texture": "Theme - Soda/Soda Light/tab-inactive.png", + "layer0.inner_margin": [5, 5], + "layer0.opacity": 1.0 + }, + // Tab close state + { + "class": "tab_control", + "settings": ["show_tab_close_buttons"], + "content_margin": [12, 3, 7, 3] + }, + // Tab hover state + { + "class": "tab_control", + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Light/tab-hover.png" + }, + // Tab active state + { + "class": "tab_control", + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Light/tab-active.png" + }, + // Tab dirty state (close button hidden) + { + "class": "tab_control", + "settings": ["!show_tab_close_buttons"], + "attributes": ["dirty"], + "content_margin": [12, 3, 7, 3] + }, + +// +// TABS (CLASSIC) +// + + // Tab set + { + "class": "tabset_control", + "settings": ["soda_classic_tabs"], + "content_margin": [3, 4, 3, 3], + "tab_overlap": 24, + "tab_height": 28 + }, + // Tab element + { + "class": "tab_control", + "settings": ["soda_classic_tabs"], + "content_margin": [22, 6, 22, 4], + "hit_test_level": 0.5, + "layer0.texture": "Theme - Soda/Soda Light/classic/tab-inactive.png", + "layer0.inner_margin": [18, 4] + }, + // Tab close state + { + "class": "tab_control", + "settings": ["soda_classic_tabs", "show_tab_close_buttons"], + "content_margin": [22, 6, 15, 4] + }, + // Tab hover state + { + "class": "tab_control", + "settings": ["soda_classic_tabs"], + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Light/classic/tab-hover.png" + }, + // Tab active state + { + "class": "tab_control", + "settings": ["soda_classic_tabs"], + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Light/classic/tab-active.png" + }, + // Tab dirty state (close button hidden) + { + "class": "tab_control", + "settings": ["soda_classic_tabs", "!show_tab_close_buttons"], + "attributes": ["dirty"], + "content_margin": [22, 6, 15, 4] + }, + +// +// TAB BUTTONS +// + + // Tab close button + { + "class": "tab_close_button", + "content_margin": [0, 0], + "layer0.texture": "Theme - Soda/Soda Light/tab-close-inactive.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": 0 + }, + { + "class": "tab_close_button", + "settings": ["show_tab_close_buttons"], + "content_margin": [8, 8] + }, + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["hover"]}], + "layer0.texture": "Theme - Soda/Soda Light/tab-close.png", + "layer0.opacity": 0.85 + }, + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/tab-close.png", + "layer0.opacity": 1.0 + }, + // Tab dirty button + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["dirty"]}], + "layer0.texture": "Theme - Soda/Soda Light/tab-dirty-inactive.png" + }, + { + "class": "tab_close_button", + "settings": ["!show_tab_close_buttons"], + "parents": [{"class": "tab_control", "attributes": ["dirty"]}], + "content_margin": [8, 8] + }, + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["dirty", "hover"]}], + "layer0.opacity": 1.0 + }, + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["dirty", "selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/tab-dirty.png" + }, + // Tab highlight button + { + "class": "tab_close_button", + "settings": ["highlight_modified_tabs"], + "parents": [{"class": "tab_control", "attributes": ["dirty"]}], + "layer0.texture": "Theme - Soda/Soda Light/tab-highlight-inactive.png" + }, + { + "class": "tab_close_button", + "settings": ["highlight_modified_tabs"], + "parents": [{"class": "tab_control", "attributes": ["dirty", "selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/tab-highlight.png" + }, + // Tab close button hover + { + "class": "tab_close_button", + "settings": ["show_tab_close_buttons"], + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Light/tab-close-hover.png" + }, + // Tab close button pressed + { + "class": "tab_close_button", + "settings": ["show_tab_close_buttons"], + "attributes": ["pressed"], + "layer0.texture": "Theme - Soda/Soda Light/tab-close-pressed.png" + }, + +// +// TAB LABELS +// + + { + "class": "tab_label", + "fade": true, + "fg": [50, 50, 50], + "shadow_color": [235, 235, 235], + "shadow_offset": [0, 1] + }, + { + "class": "tab_label", + "parents": [{"class": "tab_control", "attributes": ["hover"]}], + "fg": [25, 25, 25], + "shadow_color": [245, 245, 245] + }, + { + "class": "tab_label", + "parents": [{"class": "tab_control", "attributes": ["selected"]}], + "fg": [0, 0, 0], + "shadow_color": [255, 255, 255] + }, + +// +// FOLD BUTTONS +// + + { + "class": "fold_button_control", + "layer0.texture": "Theme - Soda/Soda Light/fold-closed.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": 0, + "content_margin": [8, 8] + }, + { + "class": "fold_button_control", + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Light/fold-closed-hover.png" + }, + { + "class": "fold_button_control", + "attributes": ["expanded"], + "layer0.texture": "Theme - Soda/Soda Light/fold-open.png" + }, + { + "class": "fold_button_control", + "attributes": ["expanded", "hover"], + "layer0.texture": "Theme - Soda/Soda Light/fold-open-hover.png" + }, + +// +// STANDARD SCROLLBARS +// + + // Standard vertical scroll bar + { + "class": "scroll_bar_control", + "layer0.texture": "Theme - Soda/Soda Light/standard-scrollbar-vertical.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [2, 6], + "blur": false + }, + // Standard horizontal scroll bar + { + "class": "scroll_bar_control", + "attributes": ["horizontal"], + "layer0.texture": "Theme - Soda/Soda Light/standard-scrollbar-horizontal.png", + "layer0.inner_margin": [6, 2], + "blur": false + }, + // Standard scroll bar corner + { + "class": "scroll_corner_control", + "layer0.texture": "Theme - Soda/Soda Light/standard-scrollbar-corner.png", + "layer0.inner_margin": [2, 2], + "layer0.opacity": 1.0 + }, + // Standard vertical scroll puck + { + "class": "puck_control", + "layer0.texture": "Theme - Soda/Soda Light/standard-puck-vertical.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [0, 10], + "content_margin": [8, 12], + "blur": false + }, + // Standard horizontal scroll puck + { + "class": "puck_control", + "attributes": ["horizontal"], + "layer0.texture": "Theme - Soda/Soda Light/standard-puck-horizontal.png", + "layer0.inner_margin": [10, 0], + "content_margin": [12, 8], + "blur": false + }, + +// +// OVERLAY SCROLLBARS +// + + // Overlay toggle scroll bar + { + "class": "scroll_area_control", + "settings": ["overlay_scroll_bars"], + "overlay": true + }, + { + "class": "scroll_area_control", + "settings": ["!overlay_scroll_bars"], + "overlay": false + }, + // Overlay vertical scroll bar + { + "class": "scroll_bar_control", + "settings": ["overlay_scroll_bars"], + "layer0.texture": "Theme - Soda/Soda Light/overlay-scrollbar-vertical.png", + "layer0.inner_margin": [0, 5], + "blur": true + }, + // Overlay horizontal scroll bar + { + "class": "scroll_bar_control", + "settings": ["overlay_scroll_bars"], + "attributes": ["horizontal"], + "layer0.texture": "Theme - Soda/Soda Light/overlay-scrollbar-horizontal.png", + "layer0.inner_margin": [5, 0], + "blur": true + }, + // Overlay vertical puck + { + "class": "puck_control", + "settings": ["overlay_scroll_bars"], + "layer0.texture": "Theme - Soda/Soda Light/overlay-puck-vertical.png", + "layer0.inner_margin": [0, 5], + "content_margin": [5, 20], + "blur": true + }, + // Overlay horizontal puck + { + "class": "puck_control", + "settings": ["overlay_scroll_bars"], + "attributes": ["horizontal"], + "layer0.texture": "Theme - Soda/Soda Light/overlay-puck-horizontal.png", + "layer0.inner_margin": [5, 0], + "content_margin": [20, 5], + "blur": true + }, + // Overlay light puck (for dark content) + { + "class": "puck_control", + "settings": ["overlay_scroll_bars"], + "attributes": ["dark"], + "layer0.texture": "Theme - Soda/Soda Light/overlay-dark-puck-vertical.png" + }, + // Overlay light horizontal puck (for dark content) + { + "class": "puck_control", + "settings": ["overlay_scroll_bars"], + "attributes": ["horizontal", "dark"], + "layer0.texture": "Theme - Soda/Soda Light/overlay-dark-puck-horizontal.png" + }, + +// +// EMPTY WINDOW BACKGROUND +// + + { + "class": "sheet_container_control", + "layer0.tint": [255, 255, 255], + "layer0.opacity": 1.0 + }, + +// +// GRID LAYOUT +// + + { + "class": "grid_layout_control", + "border_size": 1, + "border_color": [189, 189, 189] + }, + +// +// MINI MAP +// + + { + "class": "minimap_control", + "viewport_color": [0, 0, 0, 35] + }, + +// +// LABELS +// + + // General labels + { + "class": "label_control", + "color": [0, 0, 0] + }, + // Text field labels + { + "class": "label_control", + "parents": [{"class": "panel_control"}], + "shadow_color": [250, 250, 250], + "shadow_offset": [0, 1] + }, + // Button labels + { + "class": "label_control", + "parents": [{"class": "button_control"}], + "shadow_color": [245, 245, 245], + "shadow_offset": [0, 1] + }, + +// +// TOOLTIP +// + + // Tooltip container + { + "class": "tool_tip_control", + "layer0.texture": "Theme - Soda/Soda Light/tooltip.png", + "layer0.inner_margin": [1, 1], + "layer0.opacity": 0.95, + "content_margin": [3, 3] + }, + // Tooltip content + { + "class": "tool_tip_label_control", + "color": [0, 0, 0] + }, + +// +// STATUS BAR +// + + // Status bar container + { + "class": "status_bar", + "layer0.texture": "Theme - Soda/Soda Light/status-bar-background.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [2, 2], + "content_margin": [8, 4, 8, 4] + }, + // Status bar button + { + "class": "status_button", + "min_size": [100, 0] + }, + // Status bar label + { + "class": "label_control", + "parents": [{"class": "status_bar"}], + "color": [47, 47, 47], + "shadow_color": [220, 220, 220], + "shadow_offset": [0, 1] + }, + +// +// SIDEBAR +// + + // Sidebar container + { + "class": "sidebar_container", + "layer0.texture": "Theme - Soda/Soda Light/sidebar-bg.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [1, 1, 2, 1], + "content_margin": [0, 0, 1, 0] + }, + // Sidebar tree + { + "class": "sidebar_tree", + "row_padding": [8, 3], + "indent": 15, + "indent_offset": 15, + "indent_top_level": false + }, + // Sidebar rows + { + "class": "tree_row", + "layer0.texture": "Theme - Soda/Soda Light/sidebar-row-selected.png", + "layer0.opacity": 0.0, + "layer0.inner_margin": [1, 1] + }, + // Sidebar row selected + { + "class": "tree_row", + "attributes": ["selected"], + "layer0.opacity": 1.0 + }, + // Sidebar heading + { + "class": "sidebar_heading", + "color": [110, 126, 141], + "font.bold": true, + "shadow_color": [249, 250, 252], + "shadow_offset": [0, 1] + }, + // Sidebar entry + { + "class": "sidebar_label", + "color": [0, 0, 0], + "shadow_color": [241, 244, 247], + "shadow_offset": [0, 1] + }, + // Sidebar folder entry + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["expandable"]}], + "color": [70, 86, 102] + }, + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["expandable", "hover"]}], + "color": [45, 56, 68] + }, + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["expandable"]}], + "settings": ["bold_folder_labels"], + "color": [110, 126, 141], + "font.bold": true + }, + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["expandable", "hover"]}], + "settings": ["bold_folder_labels"], + "color": [81, 92, 103] + }, + // Sidebar entry selected + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "color": [255, 255, 255], + "shadow_color": [34, 94, 145], + "shadow_offset": [0, 1] + }, + +// +// SIDEBAR - OPEN FILE ICONS +// + + // Sidebar file close + { + "class": "close_button", + "layer0.texture": "Theme - Soda/Soda Light/file-close.png", + "layer0.opacity": 0.0, + "layer0.inner_margin": 0, + "content_margin": [8, 8] + }, + { + "class": "close_button", + "parents": [{"class": "tree_row", "attributes": ["hover"]}], + "layer0.opacity": 1.0 + }, + // Sidebar file dirty + { + "class": "close_button", + "attributes": ["dirty"], + "layer0.texture": "Theme - Soda/Soda Light/file-dirty.png", + "layer0.opacity": 1.0 + }, + { + "class": "close_button", + "attributes": ["dirty"], + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/file-dirty-selected.png" + }, + { + "class": "close_button", + "attributes": ["dirty"], + "parents": [{"class": "tree_row", "attributes": ["hover"]}], + "layer0.texture": "Theme - Soda/Soda Light/file-close.png" + }, + // Sidebar file close hover + { + "class": "close_button", + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Light/file-close-hover.png" + }, + { + "class": "close_button", + "parents": [{"class": "tree_row", "attributes": ["hover", "selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/file-close-selected.png" + }, + +// +// SIDEBAR - GENERAL FILE ICONS +// + + // Sidebar group closed + { + "class": "disclosure_button_control", + "content_margin": [8, 8], + "layer0.texture": "Theme - Soda/Soda Light/group-closed.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": 0 + }, + { + "class": "disclosure_button_control", + "parents": [{"class": "tree_row", "attributes": ["hover"]}], + "layer0.texture": "Theme - Soda/Soda Light/group-closed-hover.png" + }, + { + "class": "disclosure_button_control", + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/group-closed-selected.png" + }, + // Sidebar group open + { + "class": "disclosure_button_control", + "attributes": ["expanded"], + "layer0.texture": "Theme - Soda/Soda Light/group-open.png" + }, + { + "class": "disclosure_button_control", + "attributes": ["expanded"], + "parents": [{"class": "tree_row", "attributes": ["hover"]}], + "layer0.texture": "Theme - Soda/Soda Light/group-open-hover.png" + }, + { + "class": "disclosure_button_control", + "attributes": ["expanded"], + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/group-open-selected.png" + }, + +// +// STANDARD TEXT BUTTONS +// + + // Default button state + { + "class": "button_control", + "content_margin": [6, 5, 6, 6], + "min_size": [75, 0], + "layer0.texture": "Theme - Soda/Soda Light/btn-large.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [6, 6] + }, + // Pressed button state + { + "class": "button_control", + "attributes": ["pressed"], + "layer0.texture": "Theme - Soda/Soda Light/btn-large-on.png" + }, + +// +// TEXT INPUT FIELD +// + + // Text input field item + { + "class": "text_line_control", + "layer0.texture": "Theme - Soda/Soda Light/text-field.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [4, 5, 4, 3], + "content_margin": [3, 3] + }, + +// +// PANEL BACKGROUNDS +// + + // Bottom panel background + { + "class": "panel_control", + "layer0.texture": "Theme - Soda/Soda Light/panel-background.png", + "layer0.inner_margin": [2, 2, 2, 2], + "layer0.opacity": 1.0, + "content_margin": [2, 3, 2, 1] + }, + // Quick panel background + { + "class": "overlay_control", + "settings": ["!soda_retina_fix"], + "layer0.texture": "Theme - Soda/Soda Light/quick-panel-background.png", + "layer0.inner_margin": [12, 6, 12, 15], + "layer0.opacity": 1.0, + "layer1.texture": "Theme - Soda/Soda Light/quick-panel-sections.png", + "layer1.inner_margin": [12, 40, 12, 19], + "layer1.opacity": 1.0, + "content_margin": [11, 8, 11, 17] + }, + // Quick panel background (Retina fix) + { + "class": "overlay_control", + "settings": ["soda_retina_fix"], + "layer0.tint": [238, 238, 238], + "layer0.opacity": 1.0, + "content_margin": [6, 8, 6, 6] + }, + +// +// QUICK PANEL +// + + { + "class": "quick_panel", + "row_padding": [5, 2], + "layer0.tint": [252, 252, 252], + "layer0.opacity": 1.0 + }, + { + "class": "quick_panel_row", + "layer0.texture": "Theme - Soda/Soda Light/quick-panel-row.png", + "layer0.inner_margin": [2, 2, 2, 2], + "layer0.opacity": 1.0 + }, + { + "class": "quick_panel_row", + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Light/quick-panel-row-selected.png" + }, + { + "class": "quick_panel_label", + "fg": [50, 50, 50, 255], + "match_fg": [0, 0, 0, 255], + "selected_fg": [25, 25, 25, 255], + "selected_match_fg": [0, 0, 0, 255] + }, + { + "class": "quick_panel_path_label", + "fg": [150, 150, 150, 255], + "match_fg": [90, 90, 90, 255], + "selected_fg": [120, 120, 120, 255], + "selected_match_fg": [90, 90, 90, 255] + }, + { + "class": "quick_panel_score_label", + "fg": [72, 139, 211, 255], + "selected_fg": [72, 139, 211, 255] + }, + +// +// MINI QUICK PANEL +// + + { + "class": "mini_quick_panel_row", + "layer0.texture": "Theme - Soda/Soda Light/quick-panel-row.png", + "layer0.inner_margin": [2, 2, 2, 2], + "layer0.opacity": 1.0 + }, + { + "class": "mini_quick_panel_row", + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Light/quick-panel-row-selected.png" + }, + +// +// CODE COMPLETION DROPDOWN +// + + { + "class": "popup_control", + "content_margin": [2, 2], + "layer0.tint": [255, 255, 255], + "layer0.opacity": 1.0 + }, + { + "class": "auto_complete", + "row_padding": [4, 2] + }, + { + "class": "auto_complete_label", + "fg": [51, 51, 51], + "match_fg": [0, 0, 0], + "selected_fg": [205, 226, 243], + "selected_match_fg": [255, 255, 255] + }, + { + "class": "table_row", + "layer0.texture": "Theme - Soda/Soda Light/autocomplete-row-selected.png", + "layer0.opacity": 0.0, + "layer0.inner_margin": [3, 1] + }, + { + "class": "table_row", + "attributes": ["selected"], + "layer0.opacity": 1.0 + }, + +// +// BOTTOM PANEL BUTTONS +// + + // Button group middle + { + "class": "icon_button_control", + "layer0.texture": "Theme - Soda/Soda Light/btn-group-middle.png", + "layer0.inner_margin": [6, 6], + "layer0.opacity": 1.0, + "content_margin": [3, 3] + }, + { + "class": "icon_button_control", + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Light/btn-group-middle-on.png" + }, + // Button group left + { + "class": "icon_button_control", + "attributes": ["left"], + "layer0.texture": "Theme - Soda/Soda Light/btn-group-left.png", + "content_margin": [4, 3, 3, 3] + }, + { + "class": "icon_button_control", + "attributes": ["left", "selected"], + "layer0.texture": "Theme - Soda/Soda Light/btn-group-left-on.png" + }, + // Button group right + { + "class": "icon_button_control", + "attributes": ["right"], + "layer0.texture": "Theme - Soda/Soda Light/btn-group-right.png", + "content_margin": [3, 3, 4, 3] + }, + { + "class": "icon_button_control", + "attributes": ["right", "selected"], + "layer0.texture": "Theme - Soda/Soda Light/btn-group-right-on.png" + }, + // Button single + { + "class": "icon_button_control", + "attributes": ["left", "right"], + "layer0.texture": "Theme - Soda/Soda Light/btn-small.png", + "content_margin": [4, 3] + }, + { + "class": "icon_button_control", + "attributes": ["left", "right", "selected"], + "layer0.texture": "Theme - Soda/Soda Light/btn-small-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 1 +// + + // Regex search button + { + "class": "icon_regex", + "layer0.texture": "Theme - Soda/Soda Light/icon-regex-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_regex", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/icon-regex-on.png" + }, + // Case sensitive search button + { + "class": "icon_case", + "layer0.texture": "Theme - Soda/Soda Light/icon-case-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_case", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/icon-case-on.png" + }, + // Match whole word search button + { + "class": "icon_whole_word", + "layer0.texture": "Theme - Soda/Soda Light/icon-word-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_whole_word", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/icon-word-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 1 (EXTENDED: FIND IN FILES) +// + + // Show search context button + { + "class": "icon_context", + "layer0.texture": "Theme - Soda/Soda Light/icon-context-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_context", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/icon-context-on.png" + }, + // Use search buffer + { + "class": "icon_use_buffer", + "layer0.texture": "Theme - Soda/Soda Light/icon-buffer-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_use_buffer", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/icon-buffer-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 2 +// + + // Reverse search direction button + { + "class": "icon_reverse", + "layer0.texture": "Theme - Soda/Soda Light/icon-reverse-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_reverse", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/icon-reverse-on.png" + }, + // Search wrap button + { + "class": "icon_wrap", + "layer0.texture": "Theme - Soda/Soda Light/icon-wrap-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_wrap", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/icon-wrap-on.png" + }, + // Search in selection button + { + "class": "icon_in_selection", + "layer0.texture": "Theme - Soda/Soda Light/icon-selection-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_in_selection", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/icon-selection-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 3 +// + + // Preserve case button + { + "class": "icon_preserve_case", + "layer0.texture": "Theme - Soda/Soda Light/icon-preserve-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_preserve_case", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/icon-preserve-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 4 +// + + // Highlight results button + { + "class": "icon_highlight", + "layer0.texture": "Theme - Soda/Soda Light/icon-highlight-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_highlight", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Light/icon-highlight-on.png" + } + +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/.gitignore new file mode 100644 index 0000000..c3ed10e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/.gitignore @@ -0,0 +1 @@ +*.cache diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/Widget - Soda Light.stTheme b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/Widget - Soda Light.stTheme new file mode 100644 index 0000000..3c84a2f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/Widget - Soda Light.stTheme @@ -0,0 +1,30 @@ + + + + + author + Ian Hill + comment + A widget theme for the UI components of the Soda Light theme. + name + Soda Light - Widget Theme + settings + + + settings + + background + #FFFFFF + caret + #000000 + foreground + #000000 + invisibles + #E0E0E0 + selection + #b5d5ff + + + + + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/Widget - Soda Light.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/Widget - Soda Light.sublime-settings new file mode 100644 index 0000000..5cf1379 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/Widget - Soda Light.sublime-settings @@ -0,0 +1,4 @@ +{ + "color_scheme": "Packages/Theme - Soda/Soda Light/Widget - Soda Light.stTheme", + "draw_shadows": false +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/autocomplete-row-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/autocomplete-row-selected.png new file mode 100644 index 0000000..f34dcea Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/autocomplete-row-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/autocomplete-row-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/autocomplete-row-selected@2x.png new file mode 100644 index 0000000..65d88cc Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/autocomplete-row-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/bookmark.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/bookmark.png new file mode 100644 index 0000000..8d15c63 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/bookmark.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left-on.png new file mode 100644 index 0000000..9b09ad7 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left-on@2x.png new file mode 100644 index 0000000..942fb8c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left.png new file mode 100644 index 0000000..62eab2f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left@2x.png new file mode 100644 index 0000000..ec5f09a Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle-on.png new file mode 100644 index 0000000..aa6311c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle-on@2x.png new file mode 100644 index 0000000..9fc633c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle.png new file mode 100644 index 0000000..016d334 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle@2x.png new file mode 100644 index 0000000..fa640c4 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right-on.png new file mode 100644 index 0000000..0c6cdc5 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right-on@2x.png new file mode 100644 index 0000000..4a20169 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right.png new file mode 100644 index 0000000..6662bb5 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right@2x.png new file mode 100644 index 0000000..5bdbc40 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large-on.png new file mode 100644 index 0000000..1bc3770 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large-on@2x.png new file mode 100644 index 0000000..921950f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large.png new file mode 100644 index 0000000..acef524 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large@2x.png new file mode 100644 index 0000000..a3ff24b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small-on.png new file mode 100644 index 0000000..395332e Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small-on@2x.png new file mode 100644 index 0000000..0896a6c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small.png new file mode 100644 index 0000000..acef524 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small@2x.png new file mode 100644 index 0000000..a3ff24b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/circle.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/circle.png new file mode 100644 index 0000000..a007d54 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/circle.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-active.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-active.png new file mode 100644 index 0000000..dfa1238 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-active.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-active@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-active@2x.png new file mode 100644 index 0000000..7f01778 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-active@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-hover.png new file mode 100644 index 0000000..9c80775 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-hover@2x.png new file mode 100644 index 0000000..82e931f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-inactive.png new file mode 100644 index 0000000..c24ff88 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-inactive.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-inactive@2x.png new file mode 100644 index 0000000..5e57ee8 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-inactive@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/dot.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/dot.png new file mode 100644 index 0000000..0216b46 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/dot.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-hover.png new file mode 100644 index 0000000..2e0c183 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-hover@2x.png new file mode 100644 index 0000000..e8badf2 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-selected.png new file mode 100644 index 0000000..12032b2 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-selected@2x.png new file mode 100644 index 0000000..672ed1f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close.png new file mode 100644 index 0000000..2ad7f5f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close@2x.png new file mode 100644 index 0000000..357679c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty-selected.png new file mode 100644 index 0000000..d882c1d Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty-selected@2x.png new file mode 100644 index 0000000..39dc46b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty.png new file mode 100644 index 0000000..4d0cc80 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty@2x.png new file mode 100644 index 0000000..d486279 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed-hover.png new file mode 100644 index 0000000..6c6cecf Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed-hover@2x.png new file mode 100644 index 0000000..e49848e Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed.png new file mode 100644 index 0000000..4a69442 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed@2x.png new file mode 100644 index 0000000..4ec7114 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open-hover.png new file mode 100644 index 0000000..75d9596 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open-hover@2x.png new file mode 100644 index 0000000..38b2973 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open.png new file mode 100644 index 0000000..d96748d Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open@2x.png new file mode 100644 index 0000000..778b395 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold.png new file mode 100644 index 0000000..8008475 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-hover.png new file mode 100644 index 0000000..83fc42b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-hover@2x.png new file mode 100644 index 0000000..c0d5cc5 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-selected.png new file mode 100644 index 0000000..7a5a877 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-selected@2x.png new file mode 100644 index 0000000..20e918d Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed.png new file mode 100644 index 0000000..819803d Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed@2x.png new file mode 100644 index 0000000..8a0918e Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-hover.png new file mode 100644 index 0000000..1730a23 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-hover@2x.png new file mode 100644 index 0000000..8734f58 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-selected.png new file mode 100644 index 0000000..f0a0bf4 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-selected@2x.png new file mode 100644 index 0000000..f9650f6 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open.png new file mode 100644 index 0000000..d0f5cd4 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open@2x.png new file mode 100644 index 0000000..211ff8b Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-off.png new file mode 100644 index 0000000..20cc171 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-off@2x.png new file mode 100644 index 0000000..1644a77 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-on.png new file mode 100644 index 0000000..ff80fc9 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-on@2x.png new file mode 100644 index 0000000..c71ee4e Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-off.png new file mode 100644 index 0000000..281ae05 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-off@2x.png new file mode 100644 index 0000000..9a2f176 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-on.png new file mode 100644 index 0000000..e768693 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-on@2x.png new file mode 100644 index 0000000..335ac21 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-off.png new file mode 100644 index 0000000..19d04e2 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-off@2x.png new file mode 100644 index 0000000..b7c5ceb Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-on.png new file mode 100644 index 0000000..6330e23 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-on@2x.png new file mode 100644 index 0000000..c6163e9 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-off.png new file mode 100644 index 0000000..2cedd0a Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-off@2x.png new file mode 100644 index 0000000..243784e Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-on.png new file mode 100644 index 0000000..3472404 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-on@2x.png new file mode 100644 index 0000000..f5610d1 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-off.png new file mode 100644 index 0000000..f0b7616 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-off@2x.png new file mode 100644 index 0000000..9816b42 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-on.png new file mode 100644 index 0000000..3c58245 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-on@2x.png new file mode 100644 index 0000000..b515dcb Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-off.png new file mode 100644 index 0000000..61ff932 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-off@2x.png new file mode 100644 index 0000000..cf88632 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-on.png new file mode 100644 index 0000000..658b0c8 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-on@2x.png new file mode 100644 index 0000000..3b6b7f2 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-off.png new file mode 100644 index 0000000..d6ec595 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-off@2x.png new file mode 100644 index 0000000..503e6bb Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-on.png new file mode 100644 index 0000000..a4ebbb4 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-on@2x.png new file mode 100644 index 0000000..a3cc249 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-off.png new file mode 100644 index 0000000..91378b1 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-off@2x.png new file mode 100644 index 0000000..a0a59e7 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-on.png new file mode 100644 index 0000000..d303c5c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-on@2x.png new file mode 100644 index 0000000..473d626 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-off.png new file mode 100644 index 0000000..b0af0ca Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-off@2x.png new file mode 100644 index 0000000..d0328da Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-on.png new file mode 100644 index 0000000..f3050c8 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-on@2x.png new file mode 100644 index 0000000..deea770 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-off.png new file mode 100644 index 0000000..f9de6d3 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-off.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-off@2x.png new file mode 100644 index 0000000..c05e445 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-off@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-on.png new file mode 100644 index 0000000..09161a2 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-on.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-on@2x.png new file mode 100644 index 0000000..81aa1d4 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-on@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-horizontal.png new file mode 100644 index 0000000..762e5a7 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-horizontal.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-horizontal@2x.png new file mode 100644 index 0000000..166aba8 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-horizontal@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-vertical.png new file mode 100644 index 0000000..f2c4047 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-vertical.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-vertical@2x.png new file mode 100644 index 0000000..7f22be6 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-vertical@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-horizontal.png new file mode 100644 index 0000000..4b677dc Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-horizontal.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-horizontal@2x.png new file mode 100644 index 0000000..3ee8fee Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-horizontal@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-vertical.png new file mode 100644 index 0000000..1603bad Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-vertical.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-vertical@2x.png new file mode 100644 index 0000000..7aebfa6 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-vertical@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-horizontal.png new file mode 100644 index 0000000..ff2ca6e Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-horizontal.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-horizontal@2x.png new file mode 100644 index 0000000..2b5bb07 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-horizontal@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-vertical.png new file mode 100644 index 0000000..5e981c3 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-vertical.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-vertical@2x.png new file mode 100644 index 0000000..3d3ff15 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-vertical@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/panel-background.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/panel-background.png new file mode 100644 index 0000000..33b8009 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/panel-background.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/panel-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/panel-background@2x.png new file mode 100644 index 0000000..c2d47ea Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/panel-background@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background-fix.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background-fix.png new file mode 100644 index 0000000..f874034 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background-fix.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background-fix@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background-fix@2x.png new file mode 100644 index 0000000..1bdd5fb Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background-fix@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background.png new file mode 100644 index 0000000..68b8eb5 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background@2x.png new file mode 100644 index 0000000..57ba0ec Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row-selected.png new file mode 100644 index 0000000..777a621 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row-selected@2x.png new file mode 100644 index 0000000..36aa746 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row.png new file mode 100644 index 0000000..2e0a4a9 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row@2x.png new file mode 100644 index 0000000..ff1ecf5 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections-fix.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections-fix.png new file mode 100644 index 0000000..9c911db Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections-fix.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections-fix@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections-fix@2x.png new file mode 100644 index 0000000..7475d28 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections-fix@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections.png new file mode 100644 index 0000000..8ba8584 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections@2x.png new file mode 100644 index 0000000..4fb59d2 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-bg.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-bg.png new file mode 100644 index 0000000..7906a82 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-bg.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-bg@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-bg@2x.png new file mode 100644 index 0000000..80ff9e3 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-bg@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-row-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-row-selected.png new file mode 100644 index 0000000..02d7e68 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-row-selected.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-row-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-row-selected@2x.png new file mode 100644 index 0000000..3abf3e7 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-row-selected@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-horizontal.png new file mode 100644 index 0000000..826080e Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-horizontal.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-horizontal@2x.png new file mode 100644 index 0000000..41204cb Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-horizontal@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-vertical.png new file mode 100644 index 0000000..e86fe14 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-vertical.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-vertical@2x.png new file mode 100644 index 0000000..f995b67 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-vertical@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-corner.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-corner.png new file mode 100644 index 0000000..6369c9f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-corner.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-corner@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-corner@2x.png new file mode 100644 index 0000000..75ea721 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-corner@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-horizontal.png new file mode 100644 index 0000000..8486fcb Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-horizontal.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-horizontal@2x.png new file mode 100644 index 0000000..b074beb Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-horizontal@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-vertical.png new file mode 100644 index 0000000..1321ccc Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-vertical.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-vertical@2x.png new file mode 100644 index 0000000..cbf5138 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-vertical@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/status-bar-background.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/status-bar-background.png new file mode 100644 index 0000000..d7421ca Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/status-bar-background.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/status-bar-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/status-bar-background@2x.png new file mode 100644 index 0000000..ff8d0ff Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/status-bar-background@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-active.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-active.png new file mode 100644 index 0000000..f9dd09d Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-active.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-active@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-active@2x.png new file mode 100644 index 0000000..b359129 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-active@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-hover.png new file mode 100644 index 0000000..5c0bce1 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-hover@2x.png new file mode 100644 index 0000000..3d9063c Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-inactive.png new file mode 100644 index 0000000..17d53d2 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-inactive.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-inactive@2x.png new file mode 100644 index 0000000..89a063f Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-inactive@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-pressed.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-pressed.png new file mode 100644 index 0000000..1d49426 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-pressed.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-pressed@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-pressed@2x.png new file mode 100644 index 0000000..aa00e3a Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-pressed@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close.png new file mode 100644 index 0000000..0e44300 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close@2x.png new file mode 100644 index 0000000..6af55f6 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty-inactive.png new file mode 100644 index 0000000..c633b56 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty-inactive.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty-inactive@2x.png new file mode 100644 index 0000000..06eaf17 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty-inactive@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty.png new file mode 100644 index 0000000..0cfac0d Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty@2x.png new file mode 100644 index 0000000..4d2a744 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight-inactive.png new file mode 100644 index 0000000..4ca3607 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight-inactive.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight-inactive@2x.png new file mode 100644 index 0000000..1e35e06 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight-inactive@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight.png new file mode 100644 index 0000000..3425d31 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight@2x.png new file mode 100644 index 0000000..1896d71 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-hover.png new file mode 100644 index 0000000..ce9f8ec Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-hover.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-hover@2x.png new file mode 100644 index 0000000..1aa6b28 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-hover@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-inactive.png new file mode 100644 index 0000000..091dee5 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-inactive.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-inactive@2x.png new file mode 100644 index 0000000..df248b1 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-inactive@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tabset-background.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tabset-background.png new file mode 100644 index 0000000..54d9a50 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tabset-background.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tabset-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tabset-background@2x.png new file mode 100644 index 0000000..ea8ae03 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tabset-background@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/text-field.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/text-field.png new file mode 100644 index 0000000..d4e67d3 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/text-field.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/text-field@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/text-field@2x.png new file mode 100644 index 0000000..3b55fda Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/text-field@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tooltip.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tooltip.png new file mode 100644 index 0000000..63faab6 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tooltip.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tooltip@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tooltip@2x.png new file mode 100644 index 0000000..1cccaa6 Binary files /dev/null and b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tooltip@2x.png differ diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/package-metadata.json new file mode 100644 index 0000000..171865a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/package-metadata.json @@ -0,0 +1 @@ +{"url": "http://buymeasoda.github.com/soda-theme/", "version": "2012.12.12.08.37.38", "description": "Dark and light custom UI themes for Sublime Text 2"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Util/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Util/Default (Windows).sublime-keymap new file mode 100644 index 0000000..9e76828 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Util/Default (Windows).sublime-keymap @@ -0,0 +1,56 @@ +[ + //AdvancedNewFile - https://github.com/xobb1t/Sublime-AdvancedNewFile + { "keys": ["ctrl+alt+n"], "command": "advanced_new_file"}, + //{ "keys": ["shift+ctrl+alt+n"], "command": "advanced_new_file", "args": {"is_python": true}}, + { + "keys": ["tab"], + "command": "insert_best_completion", + "args": {"default": "", "exact": false}, + "context": [ + { "key": "advanced_new_file_completion"}, + { "key": "setting.tab_completion", "operator": "equal", "operand": true }, + { "key": "last_command", "operator": "not_equal", "operand": "insert_best_completion" }, + { "key": "auto_complete_visible" , "operator": "equal", "operand": false} + ] + }, + + //Navigation History - https://github.com/timjrobinson/SublimeNavigationHistory + { "keys": ["alt+left"], "command": "navigation_history_back"}, + { "keys": ["alt+right"], "command": "navigation_history_forward"}, + + //Recent Active Files - https://github.com/jugyo/SublimeRecentActiveFiles + { "keys": ["ctrl+alt+shift+t"], "command": "recent_active_files" }, + + //Keymap Manager - https://github.com/welefen/KeymapManager + { "keys": ["ctrl+alt+k"],"command": "keymap_manager" }, + + //MoveTab - https://github.com/SublimeText/MoveTab + { "keys": ["ctrl+shift+end"], "command": "move_tab", "args": { "position": "999" }}, + { "keys": ["ctrl+shift+home"],"command": "move_tab","args": { "position": "0" }}, + { "keys": ["ctrl+shift+pageup"],"command": "move_tab","args": { "position": "-1" }}, + { "keys": ["ctrl+shift+pagedown"],"command": "move_tab","args": { "position": "+1" }}, + + //OpenRecentFiles - https://github.com/spadgos/sublime-OpenRecentFiles + { "keys": ["ctrl+shift+t"], "command": "open_recent_files" }, + + //OpenSearchResult - https://github.com/abrookins/OpenSearchResult + { "keys": ["ctrl+enter"], "command": "open_search_result", "context": + [ + { "key": "selector", "operator": "equal", "operand": "text.find-in-files" } + ] + }, + + //SideBarEnhancements - https://github.com/titoBouzout/SideBarEnhancements/ + { "keys": ["ctrl+t"], "command": "side_bar_new_file" }, + { "keys": ["f12"], "command": "side_bar_open_in_browser" , "args":{"paths":[], "type":"testing" }}, + { "keys": ["alt+f12"], "command": "side_bar_open_in_browser", "args":{"paths":[], "type":"production" }}, + { "keys": ["f2"], "command": "side_bar_rename" }, + { "keys": ["ctrl+alt+f"], "command": "side_bar_find_files_path_containing" }, + { "keys": ["ctrl+shift+r"], "command": "side_bar_move" }, + + //SublimeFiles - https://github.com/al63/SublimeFiles + { "keys": ["shift+ctrl+alt+n"], "command": "sublime_files", "args": {"command":"navigate"}}, + + //Build system keybindings + { "keys": ["f5"], "command": "build" } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Util/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Util/README.md new file mode 100644 index 0000000..946ad8e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Util/README.md @@ -0,0 +1,36 @@ +SublimeKeyMap.Util +================== + +A simple repository used to host / share my customized Sublime Text 2 key bindings for Sublime utility plugins and themes + +Designed to be incorporated into `Package Control.sublime-settings` like: + +```json +{ + "installed_packages": + [ + "AdvancedNewFile", + "ConsoleExec", + "EncodingHelper", + "KeymapManager", + "MoveTab", + "Navigation History", + "Open Recent Files", + "OpenSearchResult", + "Package Control", + "RecentActiveFiles", + "Search Anywhere", + "SideBarEnhancements", + "Sublime Files", + "Theme - Soda" + ], + "package_name_map": { + "SublimeKeyMap.Util": "ZZZ.EthanBrown.SublimeKeyMap.Util" + }, + "repositories": + [ + "https://github.com/abrookins/OpenSearchResult", + "https://github.com/Iristyle/SublimeKeyMap.Util" + ] +} +``` diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Util/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Util/package-metadata.json new file mode 100644 index 0000000..9054c07 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Util/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/Iristyle/SublimeKeyMap.Util", "version": "2013.03.11.16.06.11", "description": "A simple repository used to host / share my customized Sublime Text 2 key bindings for Sublime utility plugins"} \ No newline at end of file