rachels 1 year ago
parent
commit
f66e8f6f72
100 changed files with 6324 additions and 0 deletions
  1. 71 0
      Make_isample_mod.bat
  2. 15 0
      isample.qproj
  3. 47 0
      locations/mod_isample.qsrc
  4. 7 0
      locations/mod_isample_city_residential.qsrc
  5. 5 0
      locations/mod_isample_onremove.qsrc
  6. 10 0
      locations/mod_isample_options.qsrc
  7. 7 0
      locations/mod_isample_pav_residential.qsrc
  8. 44 0
      locations/mod_isample_readme.qsrc
  9. 9 0
      locations/mod_isample_saveupdater.qsrc
  10. 35 0
      locations/mod_isample_setup.qsrc
  11. 153 0
      tools/QGen4/keywords.xml
  12. BIN
      tools/QGen4/langs/en/qgen_en.mo
  13. BIN
      tools/QGen4/langs/ru/qgen_ru.mo
  14. 67 0
      tools/QGen4/qgen.cfg
  15. BIN
      tools/QGen4/qgen.exe
  16. 31 0
      tools/check_consistency.py
  17. 36 0
      tools/check_images.py
  18. 39 0
      tools/check_imageso.py
  19. BIN
      tools/qsp-analyser/QSP_Analyser.exe
  20. 26 0
      tools/syntax/NotepadPlusPlus/QSP1.xml
  21. 64 0
      tools/syntax/NotepadPlusPlus/QSP2.xml
  22. 26 0
      tools/syntax/NotepadPlusPlus/QSP4.xml
  23. 65 0
      tools/syntax/NotepadPlusPlus/QSP5.xml
  24. 4 0
      tools/syntax/README.txt
  25. 39 0
      tools/syntax/VSCode/qsrc/CHANGELOG.md
  26. 16 0
      tools/syntax/VSCode/qsrc/README.md
  27. 32 0
      tools/syntax/VSCode/qsrc/language-configuration.json
  28. 26 0
      tools/syntax/VSCode/qsrc/package.json
  29. 219 0
      tools/syntax/VSCode/qsrc/syntaxes/QSP.tmLanguage.json
  30. 27 0
      tools/syntax/VSCode/qsrc/vsc-extension-quickstart.md
  31. 5 0
      tools/syntax/atom/qsp-package/CHANGELOG.md
  32. 20 0
      tools/syntax/atom/qsp-package/LICENSE.md
  33. 3 0
      tools/syntax/atom/qsp-package/README.md
  34. 121 0
      tools/syntax/atom/qsp-package/grammars/qsps.json
  35. 5 0
      tools/syntax/atom/qsp-package/keymaps/qsp.json
  36. 129 0
      tools/syntax/atom/qsp-package/lib/qsp-decoder.coffee
  37. 28 0
      tools/syntax/atom/qsp-package/lib/qsp-files-view.coffee
  38. 47 0
      tools/syntax/atom/qsp-package/lib/qsp.coffee
  39. 26 0
      tools/syntax/atom/qsp-package/menus/qsp.json
  40. 20 0
      tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/LICENSE.md
  41. 219 0
      tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/README.md
  42. 22 0
      tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/lib/main.js
  43. 54 0
      tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/lib/scroll-view.js
  44. 361 0
      tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/lib/select-list-view.js
  45. 67 0
      tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/lib/text-editor-view.js
  46. 114 0
      tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/package.json
  47. 40 0
      tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/stylesheets/select-list.less
  48. 7 0
      tools/syntax/atom/qsp-package/node_modules/d/CHANGES
  49. 19 0
      tools/syntax/atom/qsp-package/node_modules/d/LICENCE
  50. 108 0
      tools/syntax/atom/qsp-package/node_modules/d/README.md
  51. 31 0
      tools/syntax/atom/qsp-package/node_modules/d/auto-bind.js
  52. 63 0
      tools/syntax/atom/qsp-package/node_modules/d/index.js
  53. 111 0
      tools/syntax/atom/qsp-package/node_modules/d/lazy.js
  54. 96 0
      tools/syntax/atom/qsp-package/node_modules/d/package.json
  55. 12 0
      tools/syntax/atom/qsp-package/node_modules/d/test/auto-bind.js
  56. 182 0
      tools/syntax/atom/qsp-package/node_modules/d/test/index.js
  57. 77 0
      tools/syntax/atom/qsp-package/node_modules/d/test/lazy.js
  58. 20 0
      tools/syntax/atom/qsp-package/node_modules/emissary/LICENSE.md
  59. 49 0
      tools/syntax/atom/qsp-package/node_modules/emissary/README.md
  60. 120 0
      tools/syntax/atom/qsp-package/node_modules/emissary/lib/behavior.js
  61. 14 0
      tools/syntax/atom/qsp-package/node_modules/emissary/lib/emissary.js
  62. 384 0
      tools/syntax/atom/qsp-package/node_modules/emissary/lib/emitter.js
  63. 55 0
      tools/syntax/atom/qsp-package/node_modules/emissary/lib/helpers.js
  64. 292 0
      tools/syntax/atom/qsp-package/node_modules/emissary/lib/signal.js
  65. 109 0
      tools/syntax/atom/qsp-package/node_modules/emissary/lib/subscriber.js
  66. 40 0
      tools/syntax/atom/qsp-package/node_modules/emissary/lib/subscription.js
  67. 111 0
      tools/syntax/atom/qsp-package/node_modules/emissary/package.json
  68. 633 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/CHANGES
  69. 19 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/LICENSE
  70. 993 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/README.md
  71. 6 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/@@iterator/implement.js
  72. 4 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/@@iterator/index.js
  73. 16 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/@@iterator/is-implemented.js
  74. 3 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/@@iterator/shim.js
  75. 9 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/_compare-by-length.js
  76. 28 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/binary-search.js
  77. 12 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/clear.js
  78. 9 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/compact.js
  79. 6 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/concat/implement.js
  80. 4 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/concat/index.js
  81. 7 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/concat/is-implemented.js
  82. 39 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/concat/shim.js
  83. 7 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/contains.js
  84. 7 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/copy-within/implement.js
  85. 4 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/copy-within/index.js
  86. 7 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/copy-within/is-implemented.js
  87. 39 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/copy-within/shim.js
  88. 13 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/diff.js
  89. 29 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/e-index-of.js
  90. 29 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/e-last-index-of.js
  91. 6 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/entries/implement.js
  92. 4 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/entries/index.js
  93. 15 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/entries/is-implemented.js
  94. 4 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/entries/shim.js
  95. 27 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/exclusion.js
  96. 6 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/fill/implement.js
  97. 4 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/fill/index.js
  98. 7 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/fill/is-implemented.js
  99. 21 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/fill/shim.js
  100. 6 0
      tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/filter/implement.js

+ 71 - 0
Make_isample_mod.bat

@@ -0,0 +1,71 @@
+@ECHO off
+
+:: Set those lines to fit your setup. 
+:: This is where isample.qsp will be copied. If you don't want to move it just comment (::) the line below.
+:: set CP_TO=..\GL_ECV
+
+:: This is the program used to open the QSPFILE. If you comment this line windows will launch the default app for the ".qsp" extension.
+
+:: The file that will be generated or open
+set QSPFILE=isample.qsp
+
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+:menu
+cls
+echo.
+echo :: QSP Compiler and Launcher
+echo.
+
+if defined QSPFILE (
+	if not exist "%QSPFILE%" ( 
+		echo QSP FILE : [WARNING] - %QSPFILE% not found.
+	) else ( echo QSP FILE : [OK] - "%QSPFILE%")
+) else ( echo QSP FILE : [NOT DEFINED] - ERROR: CAN'T CONTINUE.)
+
+if defined CP_TO (
+	if not exist "%CP_TO%" (
+		echo COPY     : [ERROR] - Destination "%CP_TO%" not found. Copy DISABLED.
+		set CP_TO=
+	) else ( echo COPY     : [OK] - "%CP_TO%")
+) else (  echo COPY     : [DISABLED] )
+
+echo.
+
+if defined NOT_FOUND (
+	echo ERROR: Option '%action%' wasn't recognized. Is it lowercase? 
+	set NOT_FOUND=
+)
+
+echo.
+echo ACTIONS: (B)uild (E)xit
+echo.
+set /p action=Choose an action:
+
+if defined QSPFILE (
+	if %action% == b goto build
+)
+
+if %action% == e goto exit
+
+set NOT_FOUND=1
+goto menu
+
+:build
+echo.
+echo Building ...
+
+@ECHO ON
+python tools\txtmerge.py isample.qproj locations isample.txt
+tools\txt2gam.exe isample.txt %QSPFILE% > nul
+@ECHO OFF
+
+echo.
+if defined CP_TO ( echo Copying %QSPFILE% to "%CP_TO%" ... & copy %QSPFILE% %CP_TO% > nul )
+
+echo.
+echo Done.
+pause
+if %action% == f ( goto run ) else ( goto menu )
+
+:exit

+ 15 - 0
isample.qproj

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<QGen-project version="4.0.0 beta 1">
+  <Structure>
+    <Folder name="setup">
+      <Location name="mod_isample_options"/>
+      <Location name="mod_isample_setup"/>
+      <Location name="mod_isample_readme"/>
+      <Location name="mod_isample"/>
+    </Folder>
+    <Folder name="locations">
+      <Location name="mod_isample_pav_residential"/>
+      <Location name="mod_isample_city_residential"/>
+    </Folder>
+  </Structure>
+</QGen-project>

+ 47 - 0
locations/mod_isample.qsrc

@@ -0,0 +1,47 @@
+# mod_isample
+!input mod entry point here. this will be checked on every location, please keep it clean and brief to avoid game lag
+
+
+!entry point 1: if player is on bed, create a new link to make her sleepy
+if $curloc = 'bed2' and $args[0] = '':
+	if pcs_sleep > 80:
+		'[mod]... But You can make yourself <a href="exec:pcs_sleep=0&gt $curloc">sleepy!</a>'
+	else
+		'[mod]... And you are already sleepy.'
+	end
+end
+
+
+!entry point 2: goto school directly from room
+!Note that location name are case sensetive. you can use lcase() or ucase() to prevent bug
+if lcase($curloc) = 'bedrpar' or ucase($curloc) = 'KORRPAR':
+		act '[mod]<font color = green><b>Go to school</b></font>': minut += 1 & gt 'gschool_grounds', 'main'
+end
+
+
+!entry point 3: replace exit room act in apartment
+
+if $curloc = 'bedrPar':
+	delact 'Exit the room'
+	act 'Exit the room':
+		msg 'Now mod isample will send you to school directly'
+		minut += 1 & gt 'gschool_grounds', 'main'
+	end
+end
+
+!entry point 4: access in-mod location
+if $curloc = 'pav_residential':
+	act '[mod]Chase the rabbit':
+		gt 'mod_isample_pav_residential'
+	end
+end
+
+if $curloc = 'city_residential':
+	act '[mod]Jump into rabit hole':
+		*clr & cla
+		'[mod]Suddenly, everything blank out'
+		gs 'mod_isample_city_residential'
+	end
+end
+--- mod_isample ---------------------------------
+

+ 7 - 0
locations/mod_isample_city_residential.qsrc

@@ -0,0 +1,7 @@
+# mod_isample_city_residential
+!mod event. remember to add a act to exit
+'[mod-isample]'
+'You try to jump into rabbit hole, sadly, this is only a sample mod, so you can not even find a hole to jump.'
+act 'Back to street': gt 'city_residential'
+--- mod_isample_city_residential ---------------------------------
+

+ 5 - 0
locations/mod_isample_onremove.qsrc

@@ -0,0 +1,5 @@
+# mod_isample_onremove
+!! This file is for restoring the system and main games variables when they were changed by the mod.
+
+
+--- mod_isample_onremove ---------------------------------

+ 10 - 0
locations/mod_isample_options.qsrc

@@ -0,0 +1,10 @@
+# mod_isample_options
+
+*clr&cla
+! This is where you place the configuration options for your mod.
+'There are currently no options available for this mod.'
+
+act 'return': gt 'mod_setting'
+
+--- mod_isample_options ---------------------------------
+

+ 7 - 0
locations/mod_isample_pav_residential.qsrc

@@ -0,0 +1,7 @@
+# mod_isample_pav_residential
+!mod event. remember to add a act to exit
+'[mod-isample]'
+'You try to chase the rabbit in town, sadly, this is only a sample mod, so there are no rabbit in sight.'
+act 'Back to town': gt 'pav_residential'
+--- mod_isample_pav_residential ---------------------------------
+

+ 44 - 0
locations/mod_isample_readme.qsrc

@@ -0,0 +1,44 @@
+# mod_isample_readme
+!input your mod detail readme here. you can use msg or detailed structure, just make sure to create act 'return': gt 'mod_setting'
+*clr&cla
+act 'return': gt 'mod_setting'
+
+'<center>Mod <b>isample</b></center>'
+'This is a sample for new mod system, please fill your own mod in this form
+1. Since QSP can not load location with same name, and there are no warning about this during adding new qsp files, please name ALL YOUR LOCATION NAME with <B>mod_name_xxx</B> to avoid duplication bug.
+
+2. please DO NOT use space or non-ascii character in location name. you can use use _ instead. -- this may cause bug on txtsplit function for git
+
+3. The first location MUST be named as "mod_name_setup", this system will call it and load necessary information from it.
+$mod_info[0] = mod name
+$mod_info[1] = mod version
+10203 will be displayed as version 1.2, fix3.
+40500 will be showen as version 4.5
+$mod_info[2] = author name
+$mod_info[3] = short description for this mod
+
+4. please create "mod_name_readme" location for mod detail readme (just like this location)
+  If you really have only one line for this, you can use a simple msg instead a long text.
+  
+5. put all your entry point in location "mod_name"
+You can use lots of condition check there, check this sample file yourself.
+Frequency used condition:'
+'<table>'
+*p "<tr><td>current location"
+"<td>if $curloc = '...'</td></tr>"
+*p "<tr><td>current stage"
+"<td>if $ARGS[0] = '...'</td></tr>"
+*p "<tr><td>variable value"
+"<td>if aaa > 10 </td></tr>"
+'</table>
+Please note that strings are case sensitive, you can use lcase() or ucase() to shft them before check.
+
+
+6. Due to techinque issue, this mod system CAN NOT recognition locations use value in ARGS (luckly, only system functions use this, so you shall not worry about this.)
+for example, gs ''indik'', ''2'', 100
+
+Have a nice day, and Welcome to join this Community!
+
+--- illume, 2018/1/25'
+--- mod_isample_readme ---------------------------------
+

+ 9 - 0
locations/mod_isample_saveupdater.qsrc

@@ -0,0 +1,9 @@
+# mod_isample_saveupdater
+!! This file is for updating save game when one variable have been replaced by another.
+!! The code in this location will be processed by the main game saveupdater routine as a subroutine
+!! First will be processed the code in the main routine and then all the installed mods in the order of their installation
+
+
+--- mod_isample_saveupdater ---------------------------------
+
+

+ 35 - 0
locations/mod_isample_setup.qsrc

@@ -0,0 +1,35 @@
+# mod_isample_setup
+!input basic mod information here. 
+!this location must be the first one
+
+$mod_info[0] = 'isample'
+!0=mod name, saved to $mod_name[i] array 
+
+$mod_info[1] = '10203'
+!1=mod version
+!this will be displayed as version 1.2, fix3.
+!if you input 40500, will be showen as version 4.5
+
+$mod_info[2] = 'illume'
+!2=mod author
+
+$mod_info[3] = 'This is a sample for new mod system, please fill your own mod in this form'
+!3=mod description, input a short brief here.
+
+$mod_info[4] = 'Options'
+!4=mod options/settings link name.
+
+! be aware, the following condition is case sensitive, you can use lcase() or ucase() to shft them before check. 
+if $curloc = 'mod_<<$mod_info[0]>>_setup':
+	usehtml = 1
+	!this will be only showed if you exec mod file. This location should be only called by gs, so this line will not trigger on normal mod playing
+	'<center><h1><font color=red>ACCESS DENIED</font></h1></center>'
+	'<<$mod_info[0]>> is a mod for <b>Girl Life - English Community Version</b>, and can not be played individually.'
+	''
+	'You can find the main game in <a href="https://www.tfgamessite.com/index.php?module=viewgame&id=597">Tfgames site</a> (external link)'
+	''
+	'Our forum: <a href="https://tfgamessite.com/phpbb3/viewforum.php?f=70">Tfgames site</a> (external link)'
+end
+
+--- mod_isample_setup ---------------------------------
+

+ 153 - 0
tools/QGen4/keywords.xml

@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="utf-8"?>
+<QGen-keywords>
+  <Statements>
+    <Keyword name="pl" desc="PL [выражение] / *PL [выражение] - вывод текста в дополнительное / основное окно описания, затем переход на новую строку"/>
+    <Keyword name="clear" desc="CLEAR / *CLEAR - очистка дополнительного / основного окна описания"/>
+    <Keyword name="clr" desc="CLR / *CLR - очистка дополнительного / основного окна описания"/>
+    <Keyword name="p" desc="P [выражение] / *P [выражение] - вывод текста в дополнительное / основное окно описания"/>
+    <Keyword name="nl" desc="NL [выражение] / *NL [выражение] - переход на новую строку, затем вывод текста в дополнительное / основное окно описания"/>
+    <Keyword name="msg" desc="MSG [выражение] - вывод сообщения в информационном окне"/>
+    <Keyword name="wait" desc="WAIT [#выражение] - остановка выполнения программы на заданное количество миллисекунд"/>
+    <Keyword name="act" desc="ACT [$название],[$путь к изображению]:[оператор] &amp; [оператор] &amp; ... - добавление действия"/>
+    <Keyword name="delact" desc="DELACT [$название] / DEL ACT [$название] - удаление действия"/>
+    <Keyword name="cla" desc="CLA - очистка списка действий"/>
+    <Keyword name="cmdclear" desc="CMDCLEAR - очистка строки ввода"/>
+    <Keyword name="cmdclr" desc="CMDCLEAR - очистка строки ввода"/>
+    <Keyword name="cls" desc="CLS - очищает экран, оставляя только список предметов"/>
+    <Keyword name="menu" desc="MENU [$выражение] - показ меню с заданным названием"/>
+    <Keyword name="settimer" desc="SETTIMER [#выражение] - задает интервал таймера для локации-счетчика"/>
+    <Keyword name="dynamic" desc="DYNAMIC [$строка кода],[параметр 1],[параметр 2], ... - динамическое выполнение кода"/>
+    <Keyword name="set" desc="SET [название переменной]=[выражение] - установка значения переменной"/>
+    <Keyword name="let" desc="LET [название переменной]=[выражение] - установка значения переменной"/>
+    <Keyword name="killvar" desc="KILLVAR [$название],[#индекс] - удаление всех переменных / указанной переменной"/>
+    <Keyword name="copyarr" desc="COPYARR [$массив-приемник],[$массив-источник] - копирование содержимого массива в другой массив"/>
+    <Keyword name="addobj" desc="ADDOBJ [$название],[$путь к изображению],[#позиция] / ADD OBJ [$название],[$путь к изображению],[#позиция] - добавление предмета"/>
+    <Keyword name="delobj" desc="DELOBJ [$название] / DEL OBJ [$название] - удаление предмета"/>
+    <Keyword name="killobj" desc="KILLOBJ [#позиция] - удаление всех предметов / предмета в заданной позиции"/>
+    <Keyword name="unselect" desc="UNSELECT - отмена выбора предмета"/>
+    <Keyword name="unsel" desc="UNSEL - отмена выбора предмета"/>
+    <Keyword name="killall" desc="KILLALL - удаление всех переменных и предметов"/>
+    <Keyword name="opengame" desc="OPENGAME [$выражение] - загрузка состояния игры"/>
+    <Keyword name="openqst" desc="OPENQST [$выражение] - открытие и запуск файла игры"/>
+    <Keyword name="addqst" desc="ADDQST [$выражение] - добавление локаций из указанного файла"/>
+    <Keyword name="killqst" desc="KILLQST - удаление всех добавленных через ADDQST локаций"/>
+    <Keyword name="savegame" desc="SAVEGAME [$выражение] - сохранение состояния игры"/>
+    <Keyword name="refint" desc="REFINT - обновление интерфейса"/>
+    <Keyword name="showacts" desc="SHOWACTS [#выражение] - показ / скрытие списка действий"/>
+    <Keyword name="showinput" desc="SHOWINPUT [#выражение] - показ / скрытие строки ввода"/>
+    <Keyword name="showobjs" desc="SHOWOBJS [#выражение] - показ / скрытие списка предметов"/>
+    <Keyword name="showstat" desc="SHOWSTAT [#выражение] - показ / скрытие дополнительного окна описания"/>
+    <Keyword name="if" desc="IF [#выражение]:[оператор1] &amp; [оператор2] &amp; ... ELSE [оператор3] &amp; [оператор4] &amp; ... - условие"/>
+    <Keyword name="else" desc="IF [#выражение]:[оператор1] &amp; [оператор2] &amp; ... ELSE [оператор3] &amp; [оператор4] &amp; ... - условие"/>
+    <Keyword name="elseif" desc="ELSEIF [#выражение]:[оператор1] &amp; [оператор2] &amp; ... - альтернативное условие"/>
+    <Keyword name="exit" desc="EXIT - завершение выполнения текущего кода"/>
+    <Keyword name="end" desc="END - завершение многострочной формы IF / ACT"/>
+    <Keyword name="jump" desc="JUMP [$выражение] - переход на указанную метку"/>
+    <Keyword name="gosub" desc="GOSUB [$выражение],[параметр 1],[параметр 2], ... - обработка указанной локации"/>
+    <Keyword name="gs" desc="GS [$выражение],[параметр 1],[параметр 2], ... - обработка указанной локации"/>
+    <Keyword name="goto" desc="GOTO [$выражение],[параметр 1],[параметр 2], ... - переход на указанную локацию"/>
+    <Keyword name="gt" desc="GT [$выражение],[параметр 1],[параметр 2], ... - переход на указанную локацию"/>
+    <Keyword name="xgoto" desc="XGOTO [$выражение],[параметр 1],[параметр 2], ... - переход на указанную локацию без очистки основного окна описания"/>
+    <Keyword name="xgt" desc="XGT [$выражение],[параметр 1],[параметр 2], ... - переход на указанную локацию без очистки основного окна описания"/>
+    <Keyword name="play" desc="PLAY [$путь к звуковому файлу],[#громкость] - воспроизведение звукового файла с заданной громкостью"/>
+    <Keyword name="close" desc="CLOSE [$путь к звуковому файлу] / CLOSE ALL - остановка проигрывания звукового файла / всех звуковых файлов"/>
+    <Keyword name="view" desc="VIEW [$путь к графическому файлу] - просмотр изображения"/>
+  </Statements>
+  <Expressions>
+    <Keyword name="and" desc="[#выражение 1] AND [#выражение 2] - логическое &quot;и=&quot;"/>
+    <Keyword name="or" desc="[#выражение 1] OR [#выражение 2] - логическое &quot;или&quot;"/>
+    <Keyword name="obj" desc="OBJ [$предмет] - проверка наличия предмета в рюкзаке"/>
+    <Keyword name="loc" desc="LOC [$локация] - проверка существования локации"/>
+    <Keyword name="no" desc="NO [#выражение] - отрицание"/>
+    <Keyword name="mod" desc="[#выражение 1] MOD [#выражение 2] - вычисление остатка от деления"/>
+    <Keyword name="desc" desc="DESC([$выражение]) - возвращает текст базового описания локации"/>
+    <Keyword name="$desc" desc="$DESC([$выражение]) - возвращает текст базового описания локации"/>
+    <Keyword name="iif" desc="IIF([#выражение],[выражение_да],[выражение_нет]) - возвращает одно из выражений по условию"/>
+    <Keyword name="$iif" desc="$IIF([#выражение],[выражение_да],[выражение_нет]) - возвращает одно из выражений по условию"/>
+    <Keyword name="input" desc="INPUT([выражение]) - показывает окно ввода текста и возвращает введенное значение"/>
+    <Keyword name="$input" desc="$INPUT([выражение]) - показывает окно ввода текста и возвращает введенное значение"/>
+    <Keyword name="isplay" desc="ISPLAY([$выражение]) - проверяет, проигрывается ли в текущий момент указанный файл"/>
+    <Keyword name="max" desc="MAX([выражение 1],[выражение 2], ...) - возвращает максимальное из значений аргументов"/>
+    <Keyword name="$max" desc="$MAX([выражение 1],[выражение 2], ...) - возвращает максимальное из значений аргументов"/>
+    <Keyword name="min" desc="MIN([выражение 1],[выражение 2], ...) - возвращает минимальное из значений аргументов"/>
+    <Keyword name="$min" desc="$MIN([выражение 1],[выражение 2], ...) - возвращает минимальное из значений аргументов"/>
+    <Keyword name="rand" desc="RAND([#выражение 1],[#выражение 2]) - возвращает случайное число между заданными"/>
+    <Keyword name="rgb" desc="RGB([#красный],[#зеленый],[#синий]) - возвращает код цвета на основе 3-х составляющих"/>
+    <Keyword name="getobj" desc="GETOBJ([#позиция]) - возвращает название предмета, расположенного в заданной позиции"/>
+    <Keyword name="$getobj" desc="$GETOBJ([#позиция]) - возвращает название предмета, расположенного в заданной позиции"/>
+    <Keyword name="dyneval" desc="DYNEVAL([$выражение],[параметр 1],[параметр 2], ...) - возвращает значение динамически вычисленного выражения"/>
+    <Keyword name="$dyneval" desc="$DYNEVAL([$выражение],[параметр 1],[параметр 2], ...) - возвращает значение динамически вычисленного выражения"/>
+    <Keyword name="func" desc="FUNC([$выражение],[параметр 1],[параметр 2], ...) - обработка указанной локации как функции"/>
+    <Keyword name="$func" desc="$FUNC([$выражение],[параметр 1],[параметр 2], ...) - обработка указанной локации как функции"/>
+    <Keyword name="arrsize" desc="ARRSIZE([$выражение]) - возвращает число элементов в указанном массиве"/>
+    <Keyword name="arrpos" desc="ARRPOS([#начальный индекс],[$имя массива],[значение]) - поиск в массиве элемента с заданным значением"/>
+    <Keyword name="instr" desc="INSTR([#начальная позиция],[$текст],[$искомый текст]) - поиск вхождения текста"/>
+    <Keyword name="isnum" desc="ISNUM([$выражение]) - проверяет, является ли указанная строка числом"/>
+    <Keyword name="trim" desc="TRIM([$выражение]) - удаляет из текста прилегающие пробелы и символы табуляции"/>
+    <Keyword name="$trim" desc="$TRIM([$выражение]) - удаляет из текста прилегающие пробелы и символы табуляции"/>
+    <Keyword name="ucase" desc="UCASE([$выражение]) - преобразует маленькие буквы текста в большие"/>
+    <Keyword name="$ucase" desc="$UCASE([$выражение]) - преобразует маленькие буквы текста в большие"/>
+    <Keyword name="lcase" desc="LCASE([$выражение]) - преобразует большие буквы текста в маленькие"/>
+    <Keyword name="$lcase" desc="$LCASE([$выражение]) - преобразует большие буквы текста в маленькие"/>
+    <Keyword name="len" desc="LEN([$выражение]) - возвращает длину указанной строки"/>
+    <Keyword name="mid" desc="MID([$текст],[#начало],[#длина]) - вырезает из текста строку указанной длины начиная с заданной позиции"/>
+    <Keyword name="$mid" desc="$MID([$текст],[#начало],[#длина]) - вырезает из текста строку указанной длины начиная с заданной позиции"/>
+    <Keyword name="replace" desc="REPLACE([$текст],[$искомый текст],[$текст для замены]) - заменяет в тексте заданную строку"/>
+    <Keyword name="$replace" desc="$REPLACE([$текст],[$искомый текст],[$текст для замены]) - заменяет в тексте заданную строку"/>
+    <Keyword name="str" desc="STR([#выражение]) - переводит число в строку"/>
+    <Keyword name="$str" desc="$STR([#выражение]) - переводит число в строку"/>
+    <Keyword name="val" desc="VAL([$выражение]) - переводит строку в число"/>
+    <Keyword name="arrcomp" desc="ARRCOMP([#начальный индекс],[$имя массива],[$шаблон]) - поиск в массиве элемента, соответствующего регулярному выражению"/>
+    <Keyword name="strcomp" desc="STRCOMP([$выражение],[$шаблон]) - проверяет заданный текст на соответствие регулярному выражению"/>
+    <Keyword name="strfind" desc="STRFIND([$выражение],[$шаблон],[#номер]) - возвращает подстроку, соответствующую группе с номером [#номер] регулярного выражения"/>
+    <Keyword name="$strfind" desc="$STRFIND([$выражение],[$шаблон],[#номер]) - возвращает подстроку, соответствующую группе с номером [#номер] регулярного выражения"/>
+    <Keyword name="strpos" desc="STRPOS([$выражение],[$шаблон],[#номер]) - возвращает позицию подстроки, соответствующей группе с номером [#номер] регулярного выражения"/>
+    <Keyword name="countobj" desc="COUNTOBJ - возвращает текущее число предметов"/>
+    <Keyword name="msecscount" desc="MSECSCOUNT - возвращает количество миллисекунд, прошедших с момента начала игры"/>
+    <Keyword name="rnd" desc="RND - возвращает случайное значение от 1 до 1000"/>
+    <Keyword name="curloc" desc="CURLOC - возвращает название текущей локации"/>
+    <Keyword name="$curloc" desc="$CURLOC - возвращает название текущей локации"/>
+    <Keyword name="qspver" desc="QSPVER - возвращает версию интерпретатора"/>
+    <Keyword name="$qspver" desc="$QSPVER - возвращает версию интерпретатора"/>
+    <Keyword name="selobj" desc="SELOBJ - возвращает название выделенного предмета"/>
+    <Keyword name="$selobj" desc="$SELOBJ - возвращает название выделенного предмета"/>
+    <Keyword name="selact" desc="SELACT - возвращает название выделенного действия"/>
+    <Keyword name="$selact" desc="$SELACT - возвращает название выделенного действия"/>
+    <Keyword name="curacts" desc="CURACTS - возвращает в виде кода все текущие действия"/>
+    <Keyword name="$curacts" desc="$CURACTS - возвращает в виде кода все текущие действия"/>
+    <Keyword name="user_text" desc="USER_TEXT - возвращает текст в строке ввода"/>
+    <Keyword name="$user_text" desc="$USER_TEXT - возвращает текст в строке ввода"/>
+    <Keyword name="usrtxt" desc="USRTXT - возвращает текст в строке ввода"/>
+    <Keyword name="$usrtxt" desc="$USRTXT - возвращает текст в строке ввода"/>
+    <Keyword name="maintxt" desc="MAINTXT - возвращает текст в основном окне описания"/>
+    <Keyword name="$maintxt" desc="$MAINTXT - возвращает текст в основном окне описания"/>
+    <Keyword name="stattxt" desc="STATTXT - возвращает текст в дополнительном окне описания"/>
+    <Keyword name="$stattxt" desc="$STATTXT - возвращает текст в дополнительном окне описания"/>
+  </Expressions>
+  <Variables>
+    <Keyword name="args" desc="ARGS - массив с параметрами процедуры / функции"/>
+    <Keyword name="$args" desc="$ARGS - массив с параметрами процедуры / функции"/>
+    <Keyword name="result" desc="RESULT - переменная содержит результат, возвращаемый текущей функцией"/>
+    <Keyword name="$result" desc="$RESULT - переменная содержит результат, возвращаемый текущей функцией"/>
+    <Keyword name="disablescroll" desc="DISABLESCROLL - если переменная не равна 0, то запрещает автопрокрутку текста при выводе"/>
+    <Keyword name="disablesubex" desc="DISABLESUBEX - если переменная не равна 0, то запрещает использование &quot;подвыражений&quot; в тексте"/>
+    <Keyword name="nosave" desc="NOSAVE - если переменная не равна 0, то сохранение состояния игры пользователем невозможно"/>
+    <Keyword name="debug" desc="DEBUG - если переменная не равна 0, то отключается проверка идентификатора игры при загрузке состояния"/>
+    <Keyword name="$counter" desc="$COUNTER - переменная содержит название локации-счётчика"/>
+    <Keyword name="$ongload" desc="$ONGLOAD - переменная содержит название локации-обработчика загрузки состояния"/>
+    <Keyword name="$ongsave" desc="$ONGSAVE - переменная содержит название локации-обработчика сохранения состояния"/>
+    <Keyword name="$onnewloc" desc="$ONNEWLOC - переменная содержит название локации-обработчика перехода на новую локацию"/>
+    <Keyword name="$onactsel" desc="$ONACTSEL - переменная содержит название локации-обработчика выбора действия"/>
+    <Keyword name="$onobjsel" desc="$ONOBJSEL - переменная содержит название локации-обработчика выбора предмета"/>
+    <Keyword name="$onobjadd" desc="$ONOBJADD - переменная содержит название локации-обработчика добавления предмета"/>
+    <Keyword name="$onobjdel" desc="$ONOBJDEL - переменная содержит название локации-обработчика удаления предмета"/>
+    <Keyword name="$usercom" desc="$USERCOM - переменная содержит название локации-обработчика строки ввода"/>
+    <Keyword name="usehtml" desc="USEHTML - если переменная не равна 0, то включает возможность использования HTML"/>
+    <Keyword name="bcolor" desc="BCOLOR - переменная содержит цвет фона"/>
+    <Keyword name="fcolor" desc="FCOLOR - переменная содержит основной цвет шрифта"/>
+    <Keyword name="lcolor" desc="LCOLOR - переменная содержит основной цвет ссылок"/>
+    <Keyword name="fsize" desc="FSIZE - переменная содержит основной размер шрифта"/>
+    <Keyword name="$fname" desc="$FNAME - переменная содержит название основного шрифта"/>
+    <Keyword name="$backimage" desc="$BACKIMAGE - переменная содержит путь к фоновому изображению"/>
+  </Variables>
+</QGen-keywords>

BIN
tools/QGen4/langs/en/qgen_en.mo


BIN
tools/QGen4/langs/ru/qgen_ru.mo


+ 67 - 0
tools/QGen4/qgen.cfg

@@ -0,0 +1,67 @@
+[Paths]
+Player=P:\\sim\\Games\\Beta images\\girllife-ecv\\tools\\QGen4\\qspgui.exe
+Help=P:\\sim\\Games\\Beta images\\girllife-ecv\\tools\\QGen4\\qsp.chm
+Txt2Gam=P:\\sim\\Games\\Beta images\\girllife-ecv\\tools\\QGen4\\txt2gam.exe
+LastGame=C:\\Users\\sim\\Downloads\\wlife.qsp
+[Pos]
+Left=10
+Top=10
+Width=1836
+Height=989
+Maximize=0
+ShowStatusBar=1
+HeightsCoef=60
+WidthsCoef1=30
+WidthsCoef2=25
+Panels=layout2|name=LocationsNotebook;caption=;state=768;dir=5;layer=0;row=0;pos=0;prop=100000;bestw=1458;besth=885;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|name=Toolbar;caption=;state=2106096;dir=1;layer=10;row=0;pos=0;prop=100000;bestw=540;besth=34;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|name=LocationsList;caption=Locations;state=31459324;dir=4;layer=1;row=0;pos=0;prop=100000;bestw=362;besth=868;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|dock_size(5,0,0)=186|dock_size(4,1,0)=364|dock_size(1,10,0)=36|
+[OptionsDialog]
+Width=420
+Height=320
+[General]
+AutoSave=0
+AutoSaveTimeInterval=5
+ShowShortLocsDescs=0
+LocDescVisible=1
+LocActsVisible=1
+OpenNewLoc=1
+OpenNewAct=1
+OpenLastGame=1
+CreateFirstLoc=0
+FirstLocName=Start
+ShowLocsIcons=1
+TabSize=4
+Language=
+[Editor]
+WrapLines=0
+ShowLinesNums=1
+CollapseCode=0
+[Fonts]
+Statements=0;-13;0;0;0;700;0;0;0;1;0;0;2;32;Courier New
+Functions=0;-13;0;0;0;700;0;0;0;1;0;0;2;32;Courier New
+SysVariables=0;-13;0;0;0;700;0;0;0;1;0;0;2;32;Courier New
+Strings=0;-13;0;0;0;400;0;0;0;1;0;0;2;32;Courier New
+Numbers=0;-13;0;0;0;700;0;0;0;1;0;0;2;32;Courier New
+Operations=0;-13;0;0;0;700;0;0;0;1;0;0;2;32;Courier New
+Labels=0;-13;0;0;0;700;0;0;0;1;0;0;2;32;Courier New
+Comments=0;-13;0;0;0;400;0;0;0;1;0;0;2;32;Courier New
+Base=0;-13;0;0;0;400;0;0;0;1;0;0;2;32;Courier New
+[Colours]
+Statements=rgb(0, 0, 255)
+Functions=rgb(0, 0, 255)
+SysVariables=rgb(0, 0, 255)
+Strings=rgb(0, 120, 25)
+Numbers=rgb(150, 0, 150)
+Operations=rgb(0, 0, 140)
+Labels=rgb(255, 0, 0)
+Comments=rgb(130, 130, 130)
+Base=rgb(0, 0, 0)
+TextBackground=rgb(220, 220, 220)
+BaseBackground=rgb(220, 220, 220)
+[SearchData]
+Search0_Text=emergency
+Search1_Text=gt 'city_apt_building', 'roof'
+Search2_Text=just before your alarm goes off
+Search3_Text=voltrenersex
+Search4_Text=presys2
+Search5_Text=exec
+Search6_Text=mod_cherrypop_referral

BIN
tools/QGen4/qgen.exe


+ 31 - 0
tools/check_consistency.py

@@ -0,0 +1,31 @@
+#!/usr/bin/env python
+# checks to make sure that mod_wlife.qproj is in sync with the location files
+
+import os
+import sys
+import re
+import io
+import xml.etree.ElementTree as ET
+import os.path
+
+# read the project xml file first
+tree = ET.parse('mod_wlife.qproj')
+root = tree.getroot()
+
+
+xml_locations = []
+os_locations = os.listdir("locations")
+
+print "Locations missing from ./locations/:"
+for location in root.iter('Location'):
+    name = location.attrib['name'].replace("$","_")
+    xml_locations.append(name)
+    
+    if name not in os_locations:
+        print name
+
+
+print "Locations missing from .qproj:"
+for name in os_locations:
+    if name not in xml_locations:
+        print name

+ 36 - 0
tools/check_images.py

@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+
+import io
+import os
+import re
+import sys
+
+#path = os.getcwd()
+#print path
+
+startpattern = """mod/public_WC/"""
+imgFormats = ['jpg','jpeg','gif','png','mp4']
+
+images = []
+
+ifile = io.open(
+    "mod_wlife.txt",
+    mode='rt',
+    encoding='utf-16'
+)
+text = ifile.read()
+for match in re.finditer(r"mod/public_WC/.+?[.](gif|jpg|jpeg|png|mp4)", text, flags=re.U):
+    imgfile = match.group().encode("utf-8")
+    randmatch = re.search(r"'\s*[+]\s*rand\s*[(]\s*(\d+)\s*[,]\s*(\d+)\s*[)]\s*[+]\s*'", imgfile)
+    if randmatch != None:
+        for i in range(int(randmatch.group(1)), 1+int(randmatch.group(2))):
+            images.append(re.sub(r"'\s*[+]\s*rand\s*[(].*?[)]\s*[+]\s*'", str(i), imgfile))
+    else:
+        images.append(imgfile)
+        
+ifile.close()
+
+for image in images:
+    if not re.search(r"[<$]", image) and not os.path.isfile(image):
+        print "Image not found:", image
+

+ 39 - 0
tools/check_imageso.py

@@ -0,0 +1,39 @@
+#!/usr/bin/env python
+
+import io
+import os
+import re
+
+#path = os.getcwd()
+#print path
+
+startpattern = """images/"""
+imgFormats = ['jpg','gif']
+
+infile = io.open('mod_wlife.txt',mode='r',encoding='utf-16')
+lines = infile.readlines()
+
+images = []
+
+for name in os.listdir("locations"):
+    ifile = io.open(
+        os.path.join("locations", name),
+        mode='rt',
+        encoding='utf-8'
+    )
+    text = ifile.read()
+    for match in re.finditer(r"images.+?[.](gif|jpg|png)", text, flags=re.U):
+        imgfile = match.group().encode("utf-8")
+        randmatch = re.search(r"'\s*[+]\s*rand\s*[(]\s*(\d+)\s*[,]\s*(\d+)\s*[)]\s*[+]\s*'", imgfile)
+        if randmatch != None:
+            for i in range(int(randmatch.group(1)), 1+int(randmatch.group(2))):
+                images.append(re.sub(r"'\s*[+]\s*rand\s*[(].*?[)]\s*[+]\s*'", str(i), imgfile))
+        else:
+            images.append(imgfile)
+    
+    ifile.close()
+
+
+for image in images:
+    if not re.search(r"[<$]", image) and not os.path.isfile(image):
+        print "Image not found:", image

BIN
tools/qsp-analyser/QSP_Analyser.exe


File diff suppressed because it is too large
+ 26 - 0
tools/syntax/NotepadPlusPlus/QSP1.xml


+ 64 - 0
tools/syntax/NotepadPlusPlus/QSP2.xml

@@ -0,0 +1,64 @@
+<NotepadPlus>
+    <UserLang name="QSP-colour" ext="qsrc" udlVersion="2.1">
+        <Settings>
+            <Global caseIgnored="no" allowFoldOfComments="no" foldCompact="no" forcePureLC="2" decimalSeparator="0" />
+            <Prefix Keywords1="no" Keywords2="no" Keywords3="no" Keywords4="no" Keywords5="no" Keywords6="no" Keywords7="no" Keywords8="no" />
+        </Settings>
+        <KeywordLists>
+            <Keywords name="Comments">00! 01 02 03 04</Keywords>
+            <Keywords name="Numbers, prefix1"></Keywords>
+            <Keywords name="Numbers, prefix2"></Keywords>
+            <Keywords name="Numbers, extras1"></Keywords>
+            <Keywords name="Numbers, extras2"></Keywords>
+            <Keywords name="Numbers, suffix1"></Keywords>
+            <Keywords name="Numbers, suffix2"></Keywords>
+            <Keywords name="Numbers, range"></Keywords>
+            <Keywords name="Operators1">, . * + - / = [ ( ] ) { } : &amp; &lt; &gt; &quot;</Keywords>
+            <Keywords name="Operators2"></Keywords>
+            <Keywords name="Folders in code1, open"></Keywords>
+            <Keywords name="Folders in code1, middle"></Keywords>
+            <Keywords name="Folders in code1, close"></Keywords>
+            <Keywords name="Folders in code2, open"></Keywords>
+            <Keywords name="Folders in code2, middle"></Keywords>
+            <Keywords name="Folders in code2, close"></Keywords>
+            <Keywords name="Folders in comment, open"></Keywords>
+            <Keywords name="Folders in comment, middle"></Keywords>
+            <Keywords name="Folders in comment, close"></Keywords>
+            <Keywords name="Keywords1">$dyneval $user_text $usrtxt $maintxt $stattxt $func $curloc $selobj $selact $curact $getobj $mid $ucase $lcase $trim $replace $str $loc $loc_arg $menu_loc $menu_arg $locM_arg $locM $strfind $ARGS&#x000D;&#x000A;&#x000D;&#x000A;dyneval input user_text usrtxt iif rgb isplay msecscount desc maintxt stattxt qspver func curloc selobj no and mod selact curact arrsize arrpos countobj getobj led mid ucase lcase trim replace instr isnum val str loc or max min rand rnd arrcomp strcomp strpos strfind&#x000D;&#x000A;&#x000D;&#x000A;counter ongload ongsave onnewloc onactsel onobjsel onobjadd onobjdel usercom fname backimage args result&#x000D;&#x000A;&#x000D;&#x000A;act exit killvar cla clr clear gs xgt gt goto gosub xgoto if else elseif end jump amp nl pl&#x000D;&#x000A;&#x000D;&#x000A;nosave disablescroll disablesubex debug usehtml bcolor fcolor lcolor fsize gt lt close dynamic wait</Keywords>
+            <Keywords name="Keywords2"></Keywords>
+            <Keywords name="Keywords3"></Keywords>
+            <Keywords name="Keywords4"></Keywords>
+            <Keywords name="Keywords5"></Keywords>
+            <Keywords name="Keywords6"></Keywords>
+            <Keywords name="Keywords7"></Keywords>
+            <Keywords name="Keywords8"></Keywords>
+            <Keywords name="Delimiters">00&apos; 01&apos;&apos; 02&apos; 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23</Keywords>
+        </KeywordLists>
+        <Styles>
+            <WordsStyle name="DEFAULT" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="COMMENTS" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="LINE COMMENTS" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="NUMBERS" fgColor="800080" bgColor="FFFFFF" fontName="" fontStyle="1" nesting="0" />
+            <WordsStyle name="KEYWORDS1" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" nesting="0" />
+            <WordsStyle name="KEYWORDS2" fgColor="0000A0" bgColor="FFFFFF" fontName="" fontStyle="1" nesting="0" />
+            <WordsStyle name="KEYWORDS3" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="KEYWORDS4" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="KEYWORDS5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="KEYWORDS6" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="KEYWORDS7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="KEYWORDS8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="OPERATORS" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="FOLDER IN CODE1" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="FOLDER IN CODE2" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="FOLDER IN COMMENT" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="DELIMITERS1" fgColor="008040" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="DELIMITERS2" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="DELIMITERS3" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="DELIMITERS4" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="DELIMITERS5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="DELIMITERS6" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="DELIMITERS7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="DELIMITERS8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+        </Styles>
+    </UserLang>
+</NotepadPlus>

File diff suppressed because it is too large
+ 26 - 0
tools/syntax/NotepadPlusPlus/QSP4.xml


+ 65 - 0
tools/syntax/NotepadPlusPlus/QSP5.xml

@@ -0,0 +1,65 @@
+<NotepadPlus>
+    <UserLang name="QSPSyntaxHL" ext="qsrc" udlVersion="2.1">
+        <Settings>
+            <Global caseIgnored="yes" allowFoldOfComments="no" foldCompact="no" forcePureLC="2" decimalSeparator="0" />
+            <Prefix Keywords1="no" Keywords2="yes" Keywords3="yes" Keywords4="no" Keywords5="no" Keywords6="no" Keywords7="no" Keywords8="no" />
+        </Settings>
+        <KeywordLists>
+            <Keywords name="Comments">00!! 00! 01 02 03!{ 03&lt;!-- 04} 04--&gt;</Keywords>
+            <Keywords name="Numbers, prefix1"></Keywords>
+            <Keywords name="Numbers, prefix2"></Keywords>
+            <Keywords name="Numbers, extras1"></Keywords>
+            <Keywords name="Numbers, extras2"></Keywords>
+            <Keywords name="Numbers, suffix1"></Keywords>
+            <Keywords name="Numbers, suffix2"></Keywords>
+            <Keywords name="Numbers, range"></Keywords>
+            <Keywords name="Operators1">= + - * / &gt;= &lt;= =&gt; =&lt; , : ! { } [ ] ( ) &amp; &lt; &gt; &apos; &quot; .</Keywords>
+            <Keywords name="Operators2"></Keywords>
+            <Keywords name="Folders in code1, open"></Keywords>
+            <Keywords name="Folders in code1, middle"></Keywords>
+            <Keywords name="Folders in code1, close"></Keywords>
+            <Keywords name="Folders in code2, open"></Keywords>
+            <Keywords name="Folders in code2, middle"></Keywords>
+            <Keywords name="Folders in code2, close"></Keywords>
+            <Keywords name="Folders in comment, open"></Keywords>
+            <Keywords name="Folders in comment, middle"></Keywords>
+            <Keywords name="Folders in comment, close"></Keywords>
+            <Keywords name="Keywords1">ACT ADDLIB ADDOBJ ADDQST AND ARRCOMP ARRPOS ARRSIZE $BACKIMAGE BCOLOR CLA CLEAR *CLEAR CLOSE CLR *CLR CLS CMDCLEAR CMDCLR COPYARR $COUNTER COUNTOBJ $CURACTS CURLOC DEBUG DELACT DELLIB DELOBJ DESC $DESC DISABLESCROLL DISABLESUBEX DYNAMIC DYNEVAL $DYNEVAL END ELSE ELSEIF EXIT FCOLOR $FNAME FREELIB FSIZE FUNC $FUNC GETOBJ $GETOBJ GOSUB GOTO GS GT IF IIF $IIF INCLIB INPUT $INPUT INSTR ISNUM ISPLAY JUMP KILLALL KILLOBJ KILLQST KILLVAR LCASE $LCASE LCOLOR LEN LET LOC $MAINTXT MAX $MAX MENU MID $MID MIN $MIN MOD MSECSCOUNT MSG NL *NL NO NOSAVE OBJ $ONACTSEL $ONGLOAD $ONGSAVE $ONNEWLOC $ONOBJADD $ONOBJDEL $ONOBJSEL OPENGAME OPENQST OR P *P PL *PL PLAY QSPVER $QSPVER RAND REFINT REPLACE $REPLACE RGB RND SAVEGAME SELACT $SELACT SELOBJ $SELOBJ SET SETTIMER SHOWACTS SHOWINPUT SHOWOBJS SHOWSTAT $STATTXT STR $STR STRCOMP STRFIND $STRFIND STRPOS TRIM $TRIM UCASE $UCASE UNSEL UNSELECT USEHTML $USERCOM USER_TEXT $USER_TEXT USRTXT $USRTXT VAL VIEW WAIT XGOTO XGT</Keywords>
+            <Keywords name="Keywords2">$</Keywords>
+            <Keywords name="Keywords3">#</Keywords>
+            <Keywords name="Keywords4">A ADDRESS AREA B BIG BLOCKQUOTE BR CENTER CITE CODE DD DIV DL DT EM FONT HR H1 H2 H3 H4 H5 H6 I IMG KBD LI MAP OL P PRE SAMP SMALL STRIKE STRONG SUB SUP TABLE TD TH TR TT U UL VIDEO</Keywords>
+            <Keywords name="Keywords5">ABSCENTER ALIGN AUTOPLAY BGCOLOR BORDER BOTTOM CELLPADDING CELLSPACING CENTER CIRCLE CLASS COLOR COLSPAN COORDS FACE HEIGHT HREF LOOP MAROON NAME NAVY NOSHADE NOWRAP POLY ROWSPAN RECT SHAPE SIZE SRC TEXTTOP USEMAP VALIGN WIDTH</Keywords>
+            <Keywords name="Keywords6">exec</Keywords>
+            <Keywords name="Keywords7">JPG JPEG PNG GIF MP4 WAV MP3</Keywords>
+            <Keywords name="Keywords8"></Keywords>
+            <Keywords name="Delimiters">00# 01 02 03&apos; 04 05&apos; 06&lt;&lt; 07 08&gt;&gt; 09&lt; 10 11&gt; 12&quot; 13 14&quot; 15&quot; 16 17&quot; 18&apos;&apos; 19 20&apos;&apos; 21 22 23</Keywords>
+        </KeywordLists>
+        <Styles>
+            <WordsStyle name="DEFAULT" fgColor="FF00FF" bgColor="FFFFFF" fontName="Unifont" fontStyle="0" fontSize="12" nesting="0" />
+            <WordsStyle name="COMMENTS" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="LINE COMMENTS" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="NUMBERS" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="KEYWORDS1" fgColor="004080" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="KEYWORDS2" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="2" nesting="0" />
+            <WordsStyle name="KEYWORDS3" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="KEYWORDS4" fgColor="FF8000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="KEYWORDS5" fgColor="8080C0" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="KEYWORDS6" fgColor="8080FF" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="KEYWORDS7" fgColor="8000FF" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="KEYWORDS8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="OPERATORS" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="FOLDER IN CODE1" fgColor="000000" bgColor="FFFFFF" colorStyle="2" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="FOLDER IN CODE2" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="FOLDER IN COMMENT" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="DELIMITERS1" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="83894054" />
+            <WordsStyle name="DELIMITERS2" fgColor="C0C0C0" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="65548" />
+            <WordsStyle name="DELIMITERS3" fgColor="0080FF" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="83893280" />
+            <WordsStyle name="DELIMITERS4" fgColor="008080" bgColor="FFFFFF" fontName="" fontStyle="1" nesting="16807956" />
+            <WordsStyle name="DELIMITERS5" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="16899140" />
+            <WordsStyle name="DELIMITERS6" fgColor="C0C0C0" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="DELIMITERS7" fgColor="C0C0C0" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="DELIMITERS8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+        </Styles>
+    </UserLang>
+</NotepadPlus>
+

+ 4 - 0
tools/syntax/README.txt

@@ -0,0 +1,4 @@
+Notepad++ user defined language files don't work that well for Quest Navigator
+tends to break on the first pair of quotes but included them for reference.
+The other grammar files are here for the more popular source code editors, doubt
+that anymore would be needed.

+ 39 - 0
tools/syntax/VSCode/qsrc/CHANGELOG.md

@@ -0,0 +1,39 @@
+# Change Log
+All notable changes to the "qsrc" extension will be documented in this file.
+
+## 0.2.0
+- Initial release
+- Ported atom grammars to VS Code
+
+## 0.2.1
+- Added missing file
+- Updated extension to work with newer VS Code.
+
+### 0.2.2
+- Added whitespace matching for !{ and :
+
+### 0.2.3
+- Added more keywords from QGen.
+
+### 0.2.4
+- Fix for "" strings.
+
+### 0.2.5
+- Added indentation rules
+
+### 0.2.6
+- Fixes for indent rules
+
+### 0.2.7
+- Fix for system variables not highlighting '$' also.
+
+### 0.2.8
+- Fix line comments that start with '&!'
+- Reformatted the syntax file to fit with VSCode better.
+- Fixed the '*' not highlighting with clear, clr, cls, nl, pl and p variables.
+- Fixed 'p' variables not highlighting at all.
+- Fixed indentation rules to not apply for single line if statements.
+
+### 0.2.9
+- Added '/' '!' '*' to support functions.
+- Added multiline comments regex from slanon. So "!'" "!{" "}" comments now work.

+ 16 - 0
tools/syntax/VSCode/qsrc/README.md

@@ -0,0 +1,16 @@
+# qsrc README
+
+## Known Issues
+
+Currently block comments only work with "!{" "}!" beginning and end.
+
+## Release Notes
+
+Ported grammars from Atom to VS Code. Syntax highlighting for QSP code including Quest navigator.
+Uses the qsrc file extension.
+
+## Installation
+
+Extract into your .vscode/packages folder. On Linux it's probably in the home folder. On Windows it's usually located in your user folder.
+
+-----------------------------------------------------------------------------------------------------------

+ 32 - 0
tools/syntax/VSCode/qsrc/language-configuration.json

@@ -0,0 +1,32 @@
+{
+    // symbols used as brackets
+    "brackets": [
+        ["{", "}"],
+        ["[", "]"],
+        ["(", ")"]
+    ],
+    // symbols that are auto closed when typing
+    "autoClosingPairs": [
+        {"open": "{", "close": "}"},
+        {"open": "[", "close": "]"},
+        {"open": "(", "close": ")"},
+        {"open": "\"", "close": "\"", "notIn": ["string"]},
+        {"open": "'", "close": "'"}
+    ],
+    // symbols that that can be used to surround a selection
+    "surroundingPairs": [
+        ["{", "}"],
+        ["[", "]"],
+        ["(", ")"],
+        ["\"", "\""],
+        ["'", "'"],
+        ["<<", ">>"]
+    ],
+    // indendation when writing code
+    "indentationRules": {
+		"increaseIndentPattern": "^\\s*(if|else|elseif|act|\\{|\\b.*:)\\s*$",
+        "decreaseIndentPattern": "^\\s*(end|else|elseif|\\})\\b.*$"
+	},
+
+    "wordPattern": "(``((\\w*\\s?)\\s?)*``)|((\\w*')(\\w'?)*)|(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\$\\^\\&\\*\\(\\)\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\\/\\s]+)"
+}

+ 26 - 0
tools/syntax/VSCode/qsrc/package.json

@@ -0,0 +1,26 @@
+{
+    "name": "qsrc",
+    "displayName": "qsrc",
+    "description": "QSP grammar",
+    "version": "0.2.9",
+    "publisher": "Xorgroth",
+    "engines": {
+        "vscode": "^1.50.0"
+    },
+    "categories": [
+        "Programming Languages"
+    ],
+    "contributes": {
+        "languages": [{
+            "id": "qsp",
+            "aliases": ["QSP", "qsp"],
+            "extensions": [".qsrc"],
+            "configuration": "./language-configuration.json"
+        }],
+        "grammars": [{
+            "language": "qsp",
+            "scopeName": "text.qsp.qsrc",
+            "path": "./syntaxes/qsp.tmLanguage.json"
+        }]
+    }
+}

+ 219 - 0
tools/syntax/VSCode/qsrc/syntaxes/QSP.tmLanguage.json

@@ -0,0 +1,219 @@
+{
+	"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
+	"name": "QSP",
+	"scopeName": "text.qsp.qsrc",
+	"patterns": [
+		{
+			"include": "#begin-end"
+		},
+		{
+			"include": "#comments"
+		},
+		{
+			"include": "#keyword-control"
+		},
+		{
+			"include": "#keyword-operators"
+		},
+		{
+			"include": "#marks"
+		},
+		{
+			"include": "#strings"
+		},
+		{
+			"include": "#support-objects"
+		},
+		{
+			"folds": [
+				{
+					"type": "comment"
+				},
+				{
+					"type": "if_statement",
+					"start": {
+						"type": [
+							"elif_clause",
+							"else_clause"
+						]
+					},
+					"end": "end"
+				}
+			]
+		}
+	],
+	"repository": {
+		"begin-end": {
+			"patterns": [
+				{
+					"name": "constant.character.qsp",
+					"match": "^-{1,2}\\S.*?\\S-{1,2}$"
+				},
+				{
+					"name": "constant.character.qsp",
+					"match": "^(#)\\s?.+$"
+				},
+				{
+					"name": "constant.character.qsp",
+					"match": "\\b\\d+\\b"
+				}
+			]
+		},
+		"comments": {
+			"comment": "singe and multiline comments starting with !",
+			"patterns": [
+				{
+					"comment": "comments without possible multiline chars",
+					"match": "(?:^|\\s?[&])\\s*((!!?)[^{'\"]*?$\\n?)",
+					"captures": {
+						"1": {
+							"name": "comment.line.qsp"
+						},
+						"2": {
+							"name": "punctuation.definition.comment.qsp"
+						}
+					}
+				},
+				{
+					"comment": "comments with multiline chars",
+					"begin": "(?:^|\\s?[&])\\s*(!!?)",
+					"beginCaptures": {
+						"0": {
+							"name": "comment.block.qsp"
+						},
+						"1": {
+							"name": "punctuation.definition.comment.qsp"
+						}
+					},
+					"patterns": [
+						{
+							"name": "comment.block.qsp",
+							"match": "\\G",
+							"include": "#comment-block"
+						}
+					]
+				}
+			]
+		},
+		"comment-block": {
+			"patterns": [
+				{
+					"match": "(\\s*[^{'\"]*)(?=$)",
+					"captures": {
+						"1": {
+							"name": "comment.block.text.qsp"
+						}
+					}
+				},
+				{
+					"include": "#comment-block-quote"
+				},
+				{
+					"include": "#comment-block-bracket-curly"
+				},
+				{
+					"match": "(\\s*[^{'\"]*)(?!$)",
+					"captures": {
+						"1": {
+							"name": "comment.block.text.qsp"
+						}
+					}
+				},
+				{
+					"comment": "continue parsing after the comment ends",
+					"begin": "($\\n?)",
+					"pattern": {
+						"match": "\\G"
+					}
+				}
+			]
+		},
+		"comment-block-quote": {
+			"name": "comment.block.quote.qsp",
+			"begin": "('|\")",
+			"end": "(\\1)"
+		},
+		"comment-block-bracket-curly": {
+			"name": "comment.block.bracket.curly.qsp",
+			"begin": "[{]",
+			"patterns": [
+				{
+					"include": "#comment-block-bracket-curly"
+				},
+				{
+					"include": "#comment-block-quote"
+				}
+			],
+			"end": "([}])"
+		},
+		"keyword-control": {
+			"patterns": [
+				{
+					"name": "keyword.control.qsp",
+					"match": "(\\$)(?=(\\b(?i:(counter|ongload|ongsave|onnewloc|onactsel|onobjsel|onobjadd|onobjdel|usercom|fname|backimage|args|result))\\b))"
+				},
+				{
+					"name": "keyword.control.qsp",
+					"match": "\\b(?i:(counter|ongload|ongsave|onnewloc|onactsel|onobjsel|onobjadd|onobjdel|usercom|fname|backimage|args|result|nosave|disablescroll|disablesubex|debug|usehtml|(b|f|l)color|fsize))\\b"
+				}
+			]
+		},
+		"keyword-operators": {
+			"patterns": [
+				{
+					"name": "keyword.operator.qsp",
+					"match": "(\\$)(?=(\\b(?i:(dyneval|input|user_text|usrtxt|maintxt|stattxt|func|curloc|selobj|selact|curacts|getobj|mid|(u|l)case|trim|replace|str|loc|strfind))\\b))"
+				},
+				{
+					"name": "keyword.operator.qsp",
+					"match": "\\b(?i:(dyneval|input|user_text|usrtxt|iif|rgb|isplay|msecscount|desc|maintxt|stattxt|qspver|func|curloc|selobj|no|and|obj|len|mod|selact|curacts|arrsize|arrpos|countobj|getobj|led|mid|(u|l)case|trim|replace|instr|isnum|val|str|loc|or|max|min|r(a)?nd|(arr|str)comp|str(find|pos)))\\b"
+				}
+			]
+		},
+		"marks": {
+			"patterns": [
+				{
+					"name": "entity.other.attribute-name.qsp",
+					"match": "^(:)[^'\"]*$\n?"
+				},
+				{
+					"name": "entity.other.attribute-name.qsp",
+					"match": "^(\\s+:)[^'\"]*$\n?"
+				}
+			]
+		},
+		"strings": {
+			"name": "string.quoted.single.qsp",
+			"begin": "(\"|')",
+			"end": "\\1",
+			"patterns": [
+				{
+					"name": "string.interpolated.qsp",
+					"begin": "<<",
+					"end": ">>",
+					"patterns": [
+						{
+							"include": "$self"
+						}
+					]
+				}
+			]
+		},
+		"support-objects": {
+			"patterns": [
+				{
+					"name": "support.function.qsp",
+					"match": "(\\*)(?=(\\b(?i:(pl?|clear|clr|nl))\\b))"
+				},
+				{
+					"name": "support.function.qsp",
+					"match": "\\b(?i:(nl|pl?|clear|clr|act|exit|killvar|cla|gs|xgt|gt|goto|gosub|\\[|\\]|xgoto|if|else|elseif|end|jump|msg|wait|delact|cmdclear|cmdclr|cls|menu|settimer|dynamic|set|let|play|close|view|copyarr|addobj|delobj|killobj|unselect|unsel|killall|opengame|openqst|addqst|killqst|savegame|refint|showacts|showinput|showobjs|showstat|\\*|&))\\b"
+				},
+				{
+					"name": "support.function.qsp",
+					"match": "(?i:(,|\\[|\\]|\\(|\\)|\\{|\\}|&|\\/|!|\\*|\\+|=|-|(<|>)=?|=?(<|>)))"
+				}
+			]
+		}
+	}
+}

+ 27 - 0
tools/syntax/VSCode/qsrc/vsc-extension-quickstart.md

@@ -0,0 +1,27 @@
+# Welcome to your VS Code Extension
+
+## What's in the folder
+* This folder contains all of the files necessary for your extension.
+* `package.json` - this is the manifest file in which you declare your language support and define
+the location of the grammar file that has been copied into your extension.
+* `syntaxes/QSP.tmLanguage.json` - this is the Text mate grammar file that is used for tokenization.
+* `language-configuration.json` - this the language configuration, defining the tokens that are used for
+comments and brackets.
+
+## Get up and running straight away
+* Make sure the language configuration settings in `language-configuration.json` are accurate.
+* Press `F5` to open a new window with your extension loaded.
+* Create a new file with a file name suffix matching your language.
+* Verify that syntax highlighting works and that the language configuration settings are working.
+
+## Make changes
+* You can relaunch the extension from the debug toolbar after making changes to the files listed above.
+* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes.
+
+## Add more language features
+* To add features such as intellisense, hovers and validators check out the VS Code extenders documentation at
+https://code.visualstudio.com/docs
+
+## Install your extension
+* To start using your extension with Visual Studio Code copy it into the `<user home>/.vscode/extensions` folder and restart Code.
+* To share your extension with the world, read on https://code.visualstudio.com/docs about publishing an extension.

+ 5 - 0
tools/syntax/atom/qsp-package/CHANGELOG.md

@@ -0,0 +1,5 @@
+**0.2.0**
+- Updated grammars to include code folding
+- Ported Sublime Text grammars
+- Updated code comments
+- Everything else was done by Loredan

+ 20 - 0
tools/syntax/atom/qsp-package/LICENSE.md

@@ -0,0 +1,20 @@
+Copyright (c) 2016
+
+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.

+ 3 - 0
tools/syntax/atom/qsp-package/README.md

@@ -0,0 +1,3 @@
+# qsp package
+
+A package for decoding and encoding game files for QSP quest engine

+ 121 - 0
tools/syntax/atom/qsp-package/grammars/qsps.json

@@ -0,0 +1,121 @@
+{
+  "scopeName": "source.qsp",
+  "fileTypes": [
+    "qsrc",
+    "qsp-txt",
+    "txt-qsp"
+  ],
+  "name": "QSP",
+  "patterns": [
+    {
+      "name": "constant.character.LISP",
+      "match": "^(#)\\s?.+$"
+    },
+    {
+      "name": "constant.character.LISP",
+      "match": "\\b\\d+\\b"
+    },
+    {
+      "name": "variable.parameter.url.css",
+      "match": "^-{1,2}\\S.*?\\S-{1,2}$"
+    },
+    {
+      "name": "variable.parameter.url.css",
+      "match": "\\b(?i:([$]dyneval|[$]user_text|[$]usrtxt|[$]maintxt|[$]stattxt|[$]func|[$]curloc|[$]selobj|[$]selact|[$]curact|[$]getobj|[$]mid|[$](u|l)case|[$]trim|[$]replace|[$]str|[$]loc|[$]strfind))\\b"
+    },
+    {
+      "name": "variable.parameter.url.css",
+      "match": "\\b(?i:(dyneval|input|user_text|usrtxt|iif|rgb|isplay|msecscount|desc|maintxt|stattxt|qspver|func|curloc|selobj|no|and|mod|selact|curact|arrsize|arrpos|countobj|getobj|led|mid|(u|l)case|trim|replace|instr|isnum|val|str|loc|or|max|min|r(a)?nd|(arr|str)comp|str(find|pos)))\\b"
+    },
+    {
+      "name": "keyword.control.at-rule.charset.css",
+      "match": "\\b[$](?i:(counter|ongload|ongsave|onnewloc|onactsel|onobjsel|onobjadd|onobjdel|usercom|fname|backimage|args|result))\\b"
+    },
+    {
+      "name": "support.function.LISP",
+      "match": "\\b(?i:(act|exit|killvar|cla|\\*?clr|\\*?clear|gs|xgt|gt|goto|gosub|\\[|\\]|xgoto|if|else|elseif|end|jump|\\*|&|\\*?(n|p)l))\\b"
+    },
+    {
+      "name": "entity.other.attribute-name.class.css",
+      "match": "^(:)[^'\"]*$\n?"
+    },
+    {
+      "name": "keyword.control.at-rule.charset.css",
+      "match": "\\b(?i:(counter|ongload|ongsave|onnewloc|onactsel|onobjsel|onobjadd|onobjdel|usercom|fname|backimage|args|result))\\b"
+    },
+    {
+      "name": "keyword.control.at-rule.charset.css",
+      "match": "\\b(?i:(nosave|disablescroll|disablesubex|debug|usehtml|(b|f|l)color|fsize))\\b"
+    },
+    {
+      "name": "string.quoted.single.qsp",
+      "begin": "'",
+      "end": "'",
+      "patterns": [
+        {
+          "name": "string.interpolated.qsp",
+          "begin": "<<",
+          "end": ">>",
+          "patterns": [
+            {
+              "include": "$self"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "string.quoted.double.qsp",
+      "begin": "\"",
+      "end": "\"",
+      "patterns": [
+        {
+          "name": "string.interpolated.qsp",
+          "begin": "<<",
+          "end": ">>",
+          "patterns": [
+            {
+              "include": "$self"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "folds": [
+        {
+          "type": "comment"
+        },
+        {
+          "type": "if_statement",
+          "start": {
+            "type": [
+              "elif_clause",
+              "else_clause"
+            ]
+          },
+          "end": "end"
+        }
+      ]
+    },
+    {
+      "name": "support.function.LISP",
+      "match": "(?i:(,|\\[|\\]|\\(|\\)|\\{|\\}|&|\\+|=|-|(<|>)=?|=?(<|>)))"
+    },
+    {
+      "name": "comment.block.exclamation.qsp",
+      "begin": "!{",
+      "end": "}!$"
+    },
+    {
+      "name": "comment.line.exclamation.qsp",
+      "begin": "^!.*",
+      "end": "$"
+    },
+    {
+      "name": "comment.line.exclamation.qsp",
+      "begin": "^\\s+!.*",
+      "end": "$"
+    }
+  ]
+}

+ 5 - 0
tools/syntax/atom/qsp-package/keymaps/qsp.json

@@ -0,0 +1,5 @@
+{
+  "atom-workspace": {
+    "ctrl-alt-o": "qsp:toggle"
+  }
+}

+ 129 - 0
tools/syntax/atom/qsp-package/lib/qsp-decoder.coffee

@@ -0,0 +1,129 @@
+{File, Directory} = require 'atom'
+fs = require 'fs'
+
+module.exports =
+class QspDecoder
+    constructor: (@data, @file) ->
+        @decodeFile()
+
+    decodeFile: ->
+        prepare = @prepare()
+        if !prepare
+            return
+        version = @readLine(prepare)
+        console.log @toString(version.line)
+        password = @readLine(version.next)
+        console.log @toString @decode password.line
+        locations = @readLine password.next
+        locationsNumber = (@toString @decode locations.line).valueOf()
+
+        next = locations.next
+        builder = new ProjectBuilder(@config)
+        for i in [0...locationsNumber]
+            location = @readLocation next
+            next = location.next
+            builder.createLocation location
+
+    prepare: ->
+        @config = {}
+        @config.ucs2le = @data[1] == 0
+        @config.crlf = @data[7 * if @config.ucs2le then 2 else 1] == 13
+        @config.encodedPath = @file.getPath()
+        check = @readLine(0, 9)
+
+        if @toString(check.line) == 'QSPGAME'
+            return check.next
+        else
+            return 0
+
+    readLocation: (position) ->
+        name = @readLine position
+        description = @readLine name.next
+        code = @readLine description.next
+        actions = @readLine code.next
+
+        actionsNumber = (@toString @decode actions.line).valueOf()
+        next = actions.next
+        actions = []
+        for i in [0...actionsNumber]
+            action = @readAction next
+            next = action.next
+            actions.push(action)
+
+        name: @toString @decode name.line
+        description: @toString @decode description.line
+        code: @toString @decode code.line
+        actions: actions
+        next: next
+
+    readAction: (position) ->
+        picture = @readLine position
+        name = @readLine picture.next
+        code = @readLine name.next
+
+        picture: @toString @decode picture.line
+        name: @toString @decode name.line
+        code: @toString @decode code.line
+        next: code.next
+
+    readLine: (start, max) ->
+        counter = start
+        line = []
+        that = @
+        check = ->
+            if that.config.crlf
+                return line[line.length - 1] == 10 and line[line.length - 2] == 13
+            else
+                return line[line.length - 1] == 10
+
+        while !check() and counter < @data.length
+            line.push(@readSymbol(counter))
+            counter += if @config.ucs2le then 2 else 1
+            if max and line.length > max
+                break
+
+        line: if line.length > 0 then line[0...if @config.crlf then -2 else -1] else []
+        next: counter
+
+    readSymbol: (position) ->
+        code = @data[position]
+        code += @data[position + 1] * 256 if @config.ucs2le
+        return code
+
+    decode: (line) ->
+        for i in [0...line.length]
+            line[i] += 5
+        return line
+
+    toString: (line) ->
+        result = ""
+        step = 65535
+        for i in [0...line.length] by step
+            result += String.fromCharCode.apply(@, line[i...i + step])
+        return result
+
+class ProjectBuilder
+    constructor: (@config) ->
+        @directoryStack = []
+        @root = new Directory(@config.encodedPath[[email protected]('.')])
+        try
+            fs.mkdirSync(@root.getPath(), 0o755)
+        catch error
+
+    createLocation: (location) ->
+        fs.writeFileSync("#{@root.getPath()}/#{location.name}.qsrc", location.code, {mode: 0o644})
+
+    createDirectoryRecursive: (directory, callback) ->
+        if directory.getParent().exists()
+            that = @
+            directory.create(0o755).then(() ->
+                if that.directoryStack.length > 0
+                    that.createDirectoryRecursive(that.directoryStack.pop(), callback)
+                else
+                    callback()
+            )
+        else
+            @directoryStack.push(directory)
+            createDirectoryRecursive(directory.getParent(), callback)
+
+    write: (path, data) ->

+ 28 - 0
tools/syntax/atom/qsp-package/lib/qsp-files-view.coffee

@@ -0,0 +1,28 @@
+{SelectListView} = require 'atom-space-pen-views'
+
+module.exports =
+class QspFilesView extends SelectListView
+    initialize: (list, callback) ->
+        super
+        @callback = callback
+        @setItems(list)
+        @storeFocusedElement()
+        @panel ?= atom.workspace.addModalPanel(item: this)
+        @panel.show()
+        @focusFilterEditor()
+
+    viewForItem: (item) ->
+        "<li>#{item.getPath()}</li>"
+
+    destroy: ->
+        @cancel()
+
+    confirmed: (item) ->
+        @cancel()
+        @callback?(item)
+
+    cancelled: ->
+        @panel.hide()
+
+    getFilterKey: ->
+        'path'

+ 47 - 0
tools/syntax/atom/qsp-package/lib/qsp.coffee

@@ -0,0 +1,47 @@
+{CompositeDrawable, Directory, File} = require 'atom'
+QspFilesView = require './qsp-files-view'
+fs = require 'fs'
+QspDecoder = require './qsp-decoder'
+
+module.exports =
+    subscriptions: null
+
+    activate: () ->
+        @subscriptions = new CompositeDisposable()
+
+        @subscriptions.add(atom.commands.add('atom-workspace', {
+            'qsp:toggle': () => @toggle(),
+            'qsp:decode': () => @decode(),
+            'qsp:test': () => @test()
+        }))
+
+    deactivate: () -> @subscriptions.dispose()
+
+    toggle: () -> console.log('Qsp was toggled!')
+
+    decode: () ->
+        files = @findQspFiles()
+        view = new QspFilesView()
+        view.initialize(files, @decodeQspFile)
+
+    findQspFiles: (directory) ->
+        found = []
+
+        if !directory
+            for innerDirectory in atom.project.getDirectories()
+                found = found.concat(@findQspFiles(innerDirectory))
+        else
+            for entry in directory.getEntriesSync()
+                if entry instanceof File and entry.getPath().slice((entry.getPath().lastIndexOf('.') - 1 >>> 0) + 2) == 'qsp'
+                    found.push(entry)
+
+                if entry instanceof Directory
+                    found = found.concat(@findQspFiles(entry))
+
+        return found
+
+    decodeQspFile: (file) ->
+        new QspDecoder(fs.readFileSync(file.getPath()), file)
+
+    test: ->
+        console.log atom.workspace.getActivePaneItem()

+ 26 - 0
tools/syntax/atom/qsp-package/menus/qsp.json

@@ -0,0 +1,26 @@
+{
+  "context-menu": {
+    "atom-text-editor": [
+      {
+        "label": "Toggle qsp",
+        "command": "qsp:toggle"
+      }
+    ]
+  },
+  "menu": [
+    {
+      "label": "Packages",
+      "submenu": [
+        {
+          "label": "qsp",
+          "submenu": [
+            {
+              "label": "Toggle",
+              "command": "qsp:toggle"
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

+ 20 - 0
tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/LICENSE.md

@@ -0,0 +1,20 @@
+Copyright (c) 2014 GitHub Inc.
+
+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.

+ 219 - 0
tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/README.md

@@ -0,0 +1,219 @@
+# Atom SpacePen Views [![Build Status](https://travis-ci.org/atom/atom-space-pen-views.svg?branch=master)](https://travis-ci.org/atom/atom-space-pen-views)
+
+This library contains SpacePen views that used to be provided as part of Atom
+Core. `TextEditorView`, `SelectListView`, and `ScrollView` exports from the
+`atom` module are now deprecated will soon be removed, but can still be used in
+packages by depending on this library in your `package.json`.
+
+## TextEditorView
+
+A text editor can now be created in Atom by inserting an `<atom-text-editor>`
+tag in any location you want an editor. However, if you still want to use the
+SpacePen view in order to conveniently convert packages off the deprecated
+export, you can use this class.
+
+### Example
+
+```coffee
+{View} = require 'space-pen'
+{TextEditorView} = require 'atom-space-pen-views'
+
+class MyView extends View
+  @content: ->
+    @div =>
+      @div "Type your answer:"
+      @subview 'answer', new TextEditorView(mini: true)
+```
+
+### Constructor Params
+
+Pass an optional params object to the constructor with the following keys:
+
+* `mini` If `true`, will construct a single-line editor for use as an input
+    field.
+* `placeholderText` A string of placeholder text to appear in the editor when
+    empty
+
+### Methods
+
+#### `::getModel`
+
+Returns the underlying `TextEditor` model instance.
+
+## ScrollView
+
+ Handles several core events to update scroll position:
+
+ * `core:move-up` Scrolls the view up
+ * `core:move-down` Scrolls the view down
+ * `core:page-up` Scrolls the view up by the height of the page
+ * `core:page-down` Scrolls the view down by the height of the page
+ * `core:move-to-top` Scrolls the editor to the top
+ * `core:move-to-bottom` Scroll the editor to the bottom
+
+ Subclasses must call `super` if overriding the `initialize` method.
+
+### Example
+
+ ```coffee
+ {ScrollView} = require 'atom-space-pen-views'
+
+ class MyView extends ScrollView
+   @content: ->
+     @div()
+
+   initialize: ->
+     super
+     @text('super long content that will scroll')
+ ```
+
+## SelectListView
+
+Essential: Provides a view that renders a list of items with an editor that
+filters the items. Used by many packages such as the fuzzy-finder,
+command-palette, symbols-view and autocomplete.
+
+
+### Example
+
+```coffee
+{SelectListView} = require 'atom-space-pen-views'
+
+class MySelectListView extends SelectListView
+ initialize: ->
+   super
+   @addClass('overlay from-top')
+   @setItems(['Hello', 'World'])
+   @panel ?= atom.workspace.addModalPanel(item: this) 
+   @panel.show()
+   @focusFilterEditor()
+
+ viewForItem: (item) ->
+   "<li>#{item}</li>"
+
+ confirmed: (item) ->
+   console.log("#{item} was selected")
+   
+ cancelled: ->
+   console.log("This view was cancelled")
+```
+
+## Methods
+
+### Subclasses Must Implement
+
+#### `::viewForItem`
+
+Create a view for the given model item. This method must be overridden by
+subclasses. Called when the item is about to appended to the list view.
+
+* `item` The model item being rendered. This will always be one of the items
+  previously passed to `::setItems`.
+
+Returns a String of HTML, DOM element, jQuery object, or View. Note the root element must be an `li`.
+
+#### `::confirmed`
+
+Callback function for when an item is selected. This method must
+be overridden by subclasses.
+
+* `item` The selected model item. This will always be one of the items
+  previously passed to `::setItems`.
+
+Returns a DOM element, jQuery object, or {View}.
+
+### Managing the list of items
+
+#### `::setItems`
+
+Set the array of items to display in the list. This should be
+model items, not actual views. `::viewForItem` will be called to render the
+item when it is being appended to the list view.
+
+* `items` The array of model items to display in the list (default: []).
+
+#### `::getSelectedItem`
+
+Get the model item that is currently selected in the list view.
+
+#### `::getFilterKey`
+
+Get the property name to use when filtering items.
+
+This method may be overridden by classes to allow fuzzy filtering based
+on a specific property of the item objects.
+
+For example if the objects you pass to {::setItems} are of the type
+`{"id": 3, "name": "Atom"}` then you would return `"name"` from this method
+to fuzzy filter by that property when text is entered into this view's
+editor.
+
+
+#### `::getFilterQuery`
+
+Get the filter query to use when fuzzy filtering the visible elements.
+
+By default this method returns the text in the mini editor but it can be
+overridden by subclasses if needed.
+
+Returns a {String} to use when fuzzy filtering the elements to display.
+
+
+#### `::setMaxItems`
+
+Set the maximum numbers of items to display in the list.
+
+This should be called before `setItems` is called or else the first time the
+list displays it will include all the items.
+
+* `maxItems` The maximum {Number} of items to display.
+
+#### `::populateList`
+
+Extended: Populate the list view with the model items previously set by calling
+{::setItems}.
+
+Subclasses may override this method but should always call `super`.
+
+### Messages
+
+#### `::setError`
+
+Set the error message to display.
+
+* `message` A string with an error message (default: '').
+
+#### `::setLoading`
+
+Set the loading message to display.
+
+* `message` A string with a loading message (default: '').
+
+#### `::getEmptyMessage`
+
+Get the message to display when there are no items.
+
+Subclasses may override this method to customize the message.
+
+* `itemCount` The {Number} of items in the array specified to {::setItems}
+* `filteredItemCount` The {Number} of items that pass the fuzzy filter test.
+
+Returns a {String} message (default: 'No matches found').
+
+### View Actions
+
+#### `::cancel`
+
+Cancel and close this select list view.
+
+This restores focus to the previously focused element if `::storeFocusedElement`
+was called prior to this view being attached.
+
+#### `::focusFilterEditor`
+
+Focus the fuzzy filter editor view.
+
+#### `::storeFocusedElement`
+
+Store the currently focused element. This element will be given back focus when
+`::cancel` is called.

+ 22 - 0
tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/lib/main.js

@@ -0,0 +1,22 @@
+(function() {
+  var $, $$, $$$, View, jQuery, _ref;
+
+  _ref = require('space-pen'), View = _ref.View, jQuery = _ref.jQuery, $ = _ref.$, $$ = _ref.$$, $$$ = _ref.$$$;
+
+  exports.View = View;
+
+  exports.jQuery = jQuery;
+
+  exports.$ = $;
+
+  exports.$$ = $$;
+
+  exports.$$$ = $$$;
+
+  exports.TextEditorView = require('./text-editor-view');
+
+  exports.SelectListView = require('./select-list-view');
+
+  exports.ScrollView = require('./scroll-view');
+
+}).call(this);

+ 54 - 0
tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/lib/scroll-view.js

@@ -0,0 +1,54 @@
+(function() {
+  var ScrollView, View,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+  View = require('space-pen').View;
+
+  module.exports = ScrollView = (function(_super) {
+    __extends(ScrollView, _super);
+
+    function ScrollView() {
+      return ScrollView.__super__.constructor.apply(this, arguments);
+    }
+
+    ScrollView.prototype.initialize = function() {
+      return atom.commands.add(this.element, {
+        'core:move-up': (function(_this) {
+          return function() {
+            return _this.scrollUp();
+          };
+        })(this),
+        'core:move-down': (function(_this) {
+          return function() {
+            return _this.scrollDown();
+          };
+        })(this),
+        'core:page-up': (function(_this) {
+          return function() {
+            return _this.pageUp();
+          };
+        })(this),
+        'core:page-down': (function(_this) {
+          return function() {
+            return _this.pageDown();
+          };
+        })(this),
+        'core:move-to-top': (function(_this) {
+          return function() {
+            return _this.scrollToTop();
+          };
+        })(this),
+        'core:move-to-bottom': (function(_this) {
+          return function() {
+            return _this.scrollToBottom();
+          };
+        })(this)
+      });
+    };
+
+    return ScrollView;
+
+  })(View);
+
+}).call(this);

+ 361 - 0
tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/lib/select-list-view.js

@@ -0,0 +1,361 @@
+(function() {
+  var $, SelectListView, TextEditorView, View, fuzzyFilter, _ref,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+  _ref = require('space-pen'), $ = _ref.$, View = _ref.View;
+
+  TextEditorView = require('./text-editor-view');
+
+  fuzzyFilter = null;
+
+  atom.themes.requireStylesheet(require.resolve('../stylesheets/select-list.less'));
+
+  module.exports = SelectListView = (function(_super) {
+    __extends(SelectListView, _super);
+
+    function SelectListView() {
+      return SelectListView.__super__.constructor.apply(this, arguments);
+    }
+
+    SelectListView.content = function() {
+      return this.div({
+        "class": 'select-list'
+      }, (function(_this) {
+        return function() {
+          _this.subview('filterEditorView', new TextEditorView({
+            mini: true
+          }));
+          _this.div({
+            "class": 'error-message',
+            outlet: 'error'
+          });
+          _this.div({
+            "class": 'loading',
+            outlet: 'loadingArea'
+          }, function() {
+            _this.span({
+              "class": 'loading-message',
+              outlet: 'loading'
+            });
+            return _this.span({
+              "class": 'badge',
+              outlet: 'loadingBadge'
+            });
+          });
+          return _this.ol({
+            "class": 'list-group',
+            outlet: 'list'
+          });
+        };
+      })(this));
+    };
+
+    SelectListView.prototype.maxItems = Infinity;
+
+    SelectListView.prototype.scheduleTimeout = null;
+
+    SelectListView.prototype.inputThrottle = 50;
+
+    SelectListView.prototype.cancelling = false;
+
+
+    /*
+    Section: Construction
+     */
+
+    SelectListView.prototype.initialize = function() {
+      this.filterEditorView.getModel().getBuffer().onDidChange((function(_this) {
+        return function() {
+          return _this.schedulePopulateList();
+        };
+      })(this));
+      this.filterEditorView.on('blur', (function(_this) {
+        return function(e) {
+          if (!(_this.cancelling || !document.hasFocus())) {
+            return _this.cancel();
+          }
+        };
+      })(this));
+      atom.commands.add(this.element, {
+        'core:move-up': (function(_this) {
+          return function(event) {
+            _this.selectPreviousItemView();
+            return event.stopPropagation();
+          };
+        })(this),
+        'core:move-down': (function(_this) {
+          return function(event) {
+            _this.selectNextItemView();
+            return event.stopPropagation();
+          };
+        })(this),
+        'core:move-to-top': (function(_this) {
+          return function(event) {
+            _this.selectItemView(_this.list.find('li:first'));
+            _this.list.scrollToTop();
+            return event.stopPropagation();
+          };
+        })(this),
+        'core:move-to-bottom': (function(_this) {
+          return function(event) {
+            _this.selectItemView(_this.list.find('li:last'));
+            _this.list.scrollToBottom();
+            return event.stopPropagation();
+          };
+        })(this),
+        'core:confirm': (function(_this) {
+          return function(event) {
+            _this.confirmSelection();
+            return event.stopPropagation();
+          };
+        })(this),
+        'core:cancel': (function(_this) {
+          return function(event) {
+            _this.cancel();
+            return event.stopPropagation();
+          };
+        })(this)
+      });
+      this.list.on('mousedown', (function(_this) {
+        return function(_arg) {
+          var target;
+          target = _arg.target;
+          if (target === _this.list[0]) {
+            return false;
+          }
+        };
+      })(this));
+      this.list.on('mousedown', 'li', (function(_this) {
+        return function(e) {
+          _this.selectItemView($(e.target).closest('li'));
+          e.preventDefault();
+          return false;
+        };
+      })(this));
+      return this.list.on('mouseup', 'li', (function(_this) {
+        return function(e) {
+          if ($(e.target).closest('li').hasClass('selected')) {
+            _this.confirmSelection();
+          }
+          e.preventDefault();
+          return false;
+        };
+      })(this));
+    };
+
+
+    /*
+    Section: Methods that must be overridden
+     */
+
+    SelectListView.prototype.viewForItem = function(item) {
+      throw new Error("Subclass must implement a viewForItem(item) method");
+    };
+
+    SelectListView.prototype.confirmed = function(item) {
+      throw new Error("Subclass must implement a confirmed(item) method");
+    };
+
+
+    /*
+    Section: Managing the list of items
+     */
+
+    SelectListView.prototype.setItems = function(items) {
+      this.items = items != null ? items : [];
+      this.populateList();
+      return this.setLoading();
+    };
+
+    SelectListView.prototype.getSelectedItem = function() {
+      return this.getSelectedItemView().data('select-list-item');
+    };
+
+    SelectListView.prototype.getFilterKey = function() {};
+
+    SelectListView.prototype.getFilterQuery = function() {
+      return this.filterEditorView.getText();
+    };
+
+    SelectListView.prototype.setMaxItems = function(maxItems) {
+      this.maxItems = maxItems;
+    };
+
+    SelectListView.prototype.populateList = function() {
+      var filterQuery, filteredItems, i, item, itemView, _i, _ref1;
+      if (this.items == null) {
+        return;
+      }
+      filterQuery = this.getFilterQuery();
+      if (filterQuery.length) {
+        if (fuzzyFilter == null) {
+          fuzzyFilter = require('fuzzaldrin').filter;
+        }
+        filteredItems = fuzzyFilter(this.items, filterQuery, {
+          key: this.getFilterKey()
+        });
+      } else {
+        filteredItems = this.items;
+      }
+      this.list.empty();
+      if (filteredItems.length) {
+        this.setError(null);
+        for (i = _i = 0, _ref1 = Math.min(filteredItems.length, this.maxItems); 0 <= _ref1 ? _i < _ref1 : _i > _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
+          item = filteredItems[i];
+          itemView = $(this.viewForItem(item));
+          itemView.data('select-list-item', item);
+          this.list.append(itemView);
+        }
+        return this.selectItemView(this.list.find('li:first'));
+      } else {
+        return this.setError(this.getEmptyMessage(this.items.length, filteredItems.length));
+      }
+    };
+
+
+    /*
+    Section: Messages to the user
+     */
+
+    SelectListView.prototype.setError = function(message) {
+      if (message == null) {
+        message = '';
+      }
+      if (message.length === 0) {
+        return this.error.text('').hide();
+      } else {
+        this.setLoading();
+        return this.error.text(message).show();
+      }
+    };
+
+    SelectListView.prototype.setLoading = function(message) {
+      if (message == null) {
+        message = '';
+      }
+      if (message.length === 0) {
+        this.loading.text("");
+        this.loadingBadge.text("");
+        return this.loadingArea.hide();
+      } else {
+        this.setError();
+        this.loading.text(message);
+        return this.loadingArea.show();
+      }
+    };
+
+    SelectListView.prototype.getEmptyMessage = function(itemCount, filteredItemCount) {
+      return 'No matches found';
+    };
+
+
+    /*
+    Section: View Actions
+     */
+
+    SelectListView.prototype.cancel = function() {
+      var filterEditorViewFocused;
+      this.list.empty();
+      this.cancelling = true;
+      filterEditorViewFocused = this.filterEditorView.hasFocus();
+      if (typeof this.cancelled === "function") {
+        this.cancelled();
+      }
+      this.filterEditorView.setText('');
+      if (filterEditorViewFocused) {
+        this.restoreFocus();
+      }
+      this.cancelling = false;
+      return clearTimeout(this.scheduleTimeout);
+    };
+
+    SelectListView.prototype.focusFilterEditor = function() {
+      return this.filterEditorView.focus();
+    };
+
+    SelectListView.prototype.storeFocusedElement = function() {
+      return this.previouslyFocusedElement = $(document.activeElement);
+    };
+
+
+    /*
+    Section: Private
+     */
+
+    SelectListView.prototype.selectPreviousItemView = function() {
+      var view;
+      view = this.getSelectedItemView().prev();
+      if (!view.length) {
+        view = this.list.find('li:last');
+      }
+      return this.selectItemView(view);
+    };
+
+    SelectListView.prototype.selectNextItemView = function() {
+      var view;
+      view = this.getSelectedItemView().next();
+      if (!view.length) {
+        view = this.list.find('li:first');
+      }
+      return this.selectItemView(view);
+    };
+
+    SelectListView.prototype.selectItemView = function(view) {
+      if (!view.length) {
+        return;
+      }
+      this.list.find('.selected').removeClass('selected');
+      view.addClass('selected');
+      return this.scrollToItemView(view);
+    };
+
+    SelectListView.prototype.scrollToItemView = function(view) {
+      var desiredBottom, desiredTop, scrollTop;
+      scrollTop = this.list.scrollTop();
+      desiredTop = view.position().top + scrollTop;
+      desiredBottom = desiredTop + view.outerHeight();
+      if (desiredTop < scrollTop) {
+        return this.list.scrollTop(desiredTop);
+      } else if (desiredBottom > this.list.scrollBottom()) {
+        return this.list.scrollBottom(desiredBottom);
+      }
+    };
+
+    SelectListView.prototype.restoreFocus = function() {
+      var _ref1;
+      return (_ref1 = this.previouslyFocusedElement) != null ? _ref1.focus() : void 0;
+    };
+
+    SelectListView.prototype.getSelectedItemView = function() {
+      return this.list.find('li.selected');
+    };
+
+    SelectListView.prototype.confirmSelection = function() {
+      var item;
+      item = this.getSelectedItem();
+      if (item != null) {
+        return this.confirmed(item);
+      } else {
+        return this.cancel();
+      }
+    };
+
+    SelectListView.prototype.schedulePopulateList = function() {
+      var populateCallback;
+      clearTimeout(this.scheduleTimeout);
+      populateCallback = (function(_this) {
+        return function() {
+          if (_this.isOnDom()) {
+            return _this.populateList();
+          }
+        };
+      })(this);
+      return this.scheduleTimeout = setTimeout(populateCallback, this.inputThrottle);
+    };
+
+    return SelectListView;
+
+  })(View);
+
+}).call(this);

+ 67 - 0
tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/lib/text-editor-view.js

@@ -0,0 +1,67 @@
+(function() {
+  var $, TextEditorView, View, _ref,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+  _ref = require('space-pen'), View = _ref.View, $ = _ref.$;
+
+  module.exports = TextEditorView = (function(_super) {
+    __extends(TextEditorView, _super);
+
+    function TextEditorView(params) {
+      var attributes, editor, mini, name, placeholderText, value;
+      if (params == null) {
+        params = {};
+      }
+      mini = params.mini, placeholderText = params.placeholderText, attributes = params.attributes, editor = params.editor;
+      if (attributes == null) {
+        attributes = {};
+      }
+      if (mini != null) {
+        attributes['mini'] = mini;
+      }
+      if (placeholderText != null) {
+        attributes['placeholder-text'] = placeholderText;
+      }
+      if (editor != null) {
+        this.element = atom.views.getView(editor);
+      } else {
+        this.element = document.createElement('atom-text-editor');
+      }
+      for (name in attributes) {
+        value = attributes[name];
+        this.element.setAttribute(name, value);
+      }
+      if (this.element.__spacePenView != null) {
+        this.element.__spacePenView = this;
+        this.element.__allowViewAccess = true;
+      }
+      TextEditorView.__super__.constructor.apply(this, arguments);
+      this.setModel(this.element.getModel());
+    }
+
+    TextEditorView.prototype.setModel = function(model) {
+      this.model = model;
+    };
+
+    TextEditorView.prototype.getModel = function() {
+      return this.model;
+    };
+
+    TextEditorView.prototype.getText = function() {
+      return this.model.getText();
+    };
+
+    TextEditorView.prototype.setText = function(text) {
+      return this.model.setText(text);
+    };
+
+    TextEditorView.prototype.hasFocus = function() {
+      return this.element.hasFocus();
+    };
+
+    return TextEditorView;
+
+  })(View);
+
+}).call(this);

+ 114 - 0
tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/package.json

@@ -0,0 +1,114 @@
+{
+  "_args": [
+    [
+      {
+        "raw": "atom-space-pen-views@^2.0.0",
+        "scope": null,
+        "escapedName": "atom-space-pen-views",
+        "name": "atom-space-pen-views",
+        "rawSpec": "^2.0.0",
+        "spec": ">=2.0.0 <3.0.0",
+        "type": "range"
+      },
+      "/home/loredan13/projects/atom/qsp"
+    ]
+  ],
+  "_from": "atom-space-pen-views@>=2.0.0 <3.0.0",
+  "_id": "[email protected]",
+  "_inCache": true,
+  "_location": "/atom-space-pen-views",
+  "_nodeVersion": "4.2.6",
+  "_npmOperationalInternal": {
+    "host": "packages-6-west.internal.npmjs.com",
+    "tmp": "tmp/atom-space-pen-views-2.2.0.tgz_1456170559195_0.8350376533344388"
+  },
+  "_npmUser": {
+    "name": "lee-dohm",
+    "email": "[email protected]"
+  },
+  "_npmVersion": "2.14.12",
+  "_phantomChildren": {},
+  "_requested": {
+    "raw": "atom-space-pen-views@^2.0.0",
+    "scope": null,
+    "escapedName": "atom-space-pen-views",
+    "name": "atom-space-pen-views",
+    "rawSpec": "^2.0.0",
+    "spec": ">=2.0.0 <3.0.0",
+    "type": "range"
+  },
+  "_requiredBy": [
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/atom-space-pen-views/-/atom-space-pen-views-2.2.0.tgz",
+  "_shasum": "a65b2c920ed02f724014fa7d3e5c3d78fbf59997",
+  "_shrinkwrap": null,
+  "_spec": "atom-space-pen-views@^2.0.0",
+  "_where": "/home/loredan13/projects/atom/qsp",
+  "bugs": {
+    "url": "https://github.com/atom/atom-space-pen-views/issues"
+  },
+  "dependencies": {
+    "fuzzaldrin": "^2.1.0",
+    "space-pen": "^5.1.2"
+  },
+  "description": "Atom SpacePen views that used to live in core.",
+  "devDependencies": {
+    "coffee-cache": "^0.2.0",
+    "coffee-script": "^1.7.0",
+    "grunt": "^0.4.1",
+    "grunt-cli": "^0.1.8",
+    "grunt-coffeelint": "^0.0.6",
+    "grunt-contrib-coffee": "^0.9.0",
+    "jasmine-focused": "^1.0.4",
+    "rimraf": "^2.2.2",
+    "temp": "^0.6.0"
+  },
+  "directories": {},
+  "dist": {
+    "shasum": "a65b2c920ed02f724014fa7d3e5c3d78fbf59997",
+    "tarball": "https://registry.npmjs.org/atom-space-pen-views/-/atom-space-pen-views-2.2.0.tgz"
+  },
+  "gitHead": "e5412df46fa21eee0d32da318e0dc6e1a57d9a4f",
+  "homepage": "https://github.com/atom/atom-space-pen-views#readme",
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://github.com/atom/atom-space-pen-views/raw/master/LICENSE.md"
+    }
+  ],
+  "main": "./lib/main",
+  "maintainers": [
+    {
+      "name": "benogle",
+      "email": "[email protected]"
+    },
+    {
+      "name": "kevinsawicki",
+      "email": "[email protected]"
+    },
+    {
+      "name": "lee-dohm",
+      "email": "[email protected]"
+    },
+    {
+      "name": "maxbrunsfeld",
+      "email": "[email protected]"
+    },
+    {
+      "name": "nathansobo",
+      "email": "[email protected]"
+    }
+  ],
+  "name": "atom-space-pen-views",
+  "optionalDependencies": {},
+  "readme": "ERROR: No README data found!",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/atom/atom-space-pen-views.git"
+  },
+  "scripts": {
+    "prepublish": "grunt clean lint coffee"
+  },
+  "version": "2.2.0"
+}

+ 40 - 0
tools/syntax/atom/qsp-package/node_modules/atom-space-pen-views/stylesheets/select-list.less

@@ -0,0 +1,40 @@
+@import "ui-variables";
+@import "octicon-mixins";
+
+.select-list {
+  .loading {
+    .loading-message {
+      .octicon(hourglass);
+
+      &:before {
+        font-size: 1.1em;
+        width: 1.1em;
+        height: 1.1em;
+        margin-right: 5px;
+      }
+    }
+
+    .badge {
+      margin-left: 10px;
+    }
+  }
+
+  ol.list-group {
+    position: relative;
+    overflow-y: auto;
+    max-height: 312px;
+    margin: @component-padding 0 0 0;
+    padding: 0;
+
+    li {
+      display: block;
+
+      .primary-line,
+      .secondary-line {
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        overflow: hidden;
+      }
+    }
+  }
+}

+ 7 - 0
tools/syntax/atom/qsp-package/node_modules/d/CHANGES

@@ -0,0 +1,7 @@
+v0.1.1  --  2014.04.24
+- Add `autoBind` and `lazy` utilities
+- Allow to pass other options to be merged onto created descriptor.
+  Useful when used with other custom utilties
+
+v0.1.0  --  2013.06.20
+Initial (derived from es5-ext project)

+ 19 - 0
tools/syntax/atom/qsp-package/node_modules/d/LICENCE

@@ -0,0 +1,19 @@
+Copyright (C) 2013 Mariusz Nowak (www.medikoo.com)
+
+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.

+ 108 - 0
tools/syntax/atom/qsp-package/node_modules/d/README.md

@@ -0,0 +1,108 @@
+# D - Property descriptor factory
+
+_Originally derived from [es5-ext](https://github.com/medikoo/es5-ext) package._
+
+Defining properties with descriptors is very verbose:
+
+```javascript
+var Account = function () {};
+Object.defineProperties(Account.prototype, {
+  deposit: { value: function () {
+      /* ... */
+    }, configurable: true, enumerable: false, writable: true },
+  whithdraw: { value: function () {
+      /* ... */
+    }, configurable: true, enumerable: false, writable: true },
+  balance: { get: function () {
+      /* ... */
+    }, configurable: true, enumerable: false }
+});
+```
+
+D cuts that to:
+
+```javascript
+var d = require('d');
+
+var Account = function () {};
+Object.defineProperties(Account.prototype, {
+  deposit: d(function () {
+    /* ... */
+  }),
+  whithdraw: d(function () {
+    /* ... */
+  }),
+  balance: d.gs(function () {
+    /* ... */
+  })
+});
+```
+
+By default, created descriptor follow characteristics of native ES5 properties, and defines values as:
+
+```javascript
+{ configurable: true, enumerable: false, writable: true }
+```
+
+You can overwrite it by preceding _value_ argument with instruction:
+```javascript
+d('c', value); // { configurable: true, enumerable: false, writable: false }
+d('ce', value); // { configurable: true, enumerable: true, writable: false }
+d('e', value); // { configurable: false, enumerable: true, writable: false }
+
+// Same way for get/set:
+d.gs('e', value); // { configurable: false, enumerable: true }
+```
+
+### Other utilities
+
+#### autoBind(obj, props) _(d/auto-bind)_
+
+Define methods which will be automatically bound to its instances
+
+```javascript
+var d = require('d');
+var autoBind = require('d/auto-bind');
+
+var Foo = function () { this._count = 0; };
+autoBind(Foo.prototype, {
+  increment: d(function () { ++this._count; });
+});
+
+var foo = new Foo();
+
+// Increment foo counter on each domEl click
+domEl.addEventListener('click', foo.increment, false);
+```
+
+#### lazy(obj, props) _(d/lazy)_
+
+Define lazy properties, which will be resolved on first access
+
+```javascript
+var d = require('d');
+var lazy = require('d/lazy');
+
+var Foo = function () {};
+lazy(Foo.prototype, {
+  items: d(function () { return []; })
+});
+
+var foo = new Foo();
+foo.items.push(1, 2); // foo.items array created
+```
+
+## Installation
+### NPM
+
+In your project path:
+
+	$ npm install d
+
+### Browser
+
+You can easily bundle _D_ for browser with [modules-webmake](https://github.com/medikoo/modules-webmake)
+
+## Tests [![Build Status](https://travis-ci.org/medikoo/d.png)](https://travis-ci.org/medikoo/d)
+
+	$ npm test

+ 31 - 0
tools/syntax/atom/qsp-package/node_modules/d/auto-bind.js

@@ -0,0 +1,31 @@
+'use strict';
+
+var copy       = require('es5-ext/object/copy')
+  , map        = require('es5-ext/object/map')
+  , callable   = require('es5-ext/object/valid-callable')
+  , validValue = require('es5-ext/object/valid-value')
+
+  , bind = Function.prototype.bind, defineProperty = Object.defineProperty
+  , hasOwnProperty = Object.prototype.hasOwnProperty
+  , define;
+
+define = function (name, desc, bindTo) {
+	var value = validValue(desc) && callable(desc.value), dgs;
+	dgs = copy(desc);
+	delete dgs.writable;
+	delete dgs.value;
+	dgs.get = function () {
+		if (hasOwnProperty.call(this, name)) return value;
+		desc.value = bind.call(value, (bindTo == null) ? this : this[bindTo]);
+		defineProperty(this, name, desc);
+		return this[name];
+	};
+	return dgs;
+};
+
+module.exports = function (props/*, bindTo*/) {
+	var bindTo = arguments[1];
+	return map(props, function (desc, name) {
+		return define(name, desc, bindTo);
+	});
+};

+ 63 - 0
tools/syntax/atom/qsp-package/node_modules/d/index.js

@@ -0,0 +1,63 @@
+'use strict';
+
+var assign        = require('es5-ext/object/assign')
+  , normalizeOpts = require('es5-ext/object/normalize-options')
+  , isCallable    = require('es5-ext/object/is-callable')
+  , contains      = require('es5-ext/string/#/contains')
+
+  , d;
+
+d = module.exports = function (dscr, value/*, options*/) {
+	var c, e, w, options, desc;
+	if ((arguments.length < 2) || (typeof dscr !== 'string')) {
+		options = value;
+		value = dscr;
+		dscr = null;
+	} else {
+		options = arguments[2];
+	}
+	if (dscr == null) {
+		c = w = true;
+		e = false;
+	} else {
+		c = contains.call(dscr, 'c');
+		e = contains.call(dscr, 'e');
+		w = contains.call(dscr, 'w');
+	}
+
+	desc = { value: value, configurable: c, enumerable: e, writable: w };
+	return !options ? desc : assign(normalizeOpts(options), desc);
+};
+
+d.gs = function (dscr, get, set/*, options*/) {
+	var c, e, options, desc;
+	if (typeof dscr !== 'string') {
+		options = set;
+		set = get;
+		get = dscr;
+		dscr = null;
+	} else {
+		options = arguments[3];
+	}
+	if (get == null) {
+		get = undefined;
+	} else if (!isCallable(get)) {
+		options = get;
+		get = set = undefined;
+	} else if (set == null) {
+		set = undefined;
+	} else if (!isCallable(set)) {
+		options = set;
+		set = undefined;
+	}
+	if (dscr == null) {
+		c = true;
+		e = false;
+	} else {
+		c = contains.call(dscr, 'c');
+		e = contains.call(dscr, 'e');
+	}
+
+	desc = { get: get, set: set, configurable: c, enumerable: e };
+	return !options ? desc : assign(normalizeOpts(options), desc);
+};

+ 111 - 0
tools/syntax/atom/qsp-package/node_modules/d/lazy.js

@@ -0,0 +1,111 @@
+'use strict';
+
+var map        = require('es5-ext/object/map')
+  , isCallable = require('es5-ext/object/is-callable')
+  , validValue = require('es5-ext/object/valid-value')
+  , contains   = require('es5-ext/string/#/contains')
+
+  , call = Function.prototype.call
+  , defineProperty = Object.defineProperty
+  , getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor
+  , getPrototypeOf = Object.getPrototypeOf
+  , hasOwnProperty = Object.prototype.hasOwnProperty
+  , cacheDesc = { configurable: false, enumerable: false, writable: false,
+		value: null }
+  , define;
+
+define = function (name, options) {
+	var value, dgs, cacheName, desc, writable = false, resolvable
+	  , flat;
+	options = Object(validValue(options));
+	cacheName = options.cacheName;
+	flat = options.flat;
+	if (cacheName == null) cacheName = name;
+	delete options.cacheName;
+	value = options.value;
+	resolvable = isCallable(value);
+	delete options.value;
+	dgs = { configurable: Boolean(options.configurable),
+		enumerable: Boolean(options.enumerable) };
+	if (name !== cacheName) {
+		dgs.get = function () {
+			if (hasOwnProperty.call(this, cacheName)) return this[cacheName];
+			cacheDesc.value = resolvable ? call.call(value, this, options) : value;
+			cacheDesc.writable = writable;
+			defineProperty(this, cacheName, cacheDesc);
+			cacheDesc.value = null;
+			if (desc) defineProperty(this, name, desc);
+			return this[cacheName];
+		};
+	} else if (!flat) {
+		dgs.get = function self() {
+			var ownDesc;
+			if (hasOwnProperty.call(this, name)) {
+				ownDesc = getOwnPropertyDescriptor(this, name);
+				// It happens in Safari, that getter is still called after property
+				// was defined with a value, following workarounds that
+				if (ownDesc.hasOwnProperty('value')) return ownDesc.value;
+				if ((typeof ownDesc.get === 'function') && (ownDesc.get !== self)) {
+					return ownDesc.get.call(this);
+				}
+				return value;
+			}
+			desc.value = resolvable ? call.call(value, this, options) : value;
+			defineProperty(this, name, desc);
+			desc.value = null;
+			return this[name];
+		};
+	} else {
+		dgs.get = function self() {
+			var base = this, ownDesc;
+			if (hasOwnProperty.call(this, name)) {
+				// It happens in Safari, that getter is still called after property
+				// was defined with a value, following workarounds that
+				ownDesc = getOwnPropertyDescriptor(this, name);
+				if (ownDesc.hasOwnProperty('value')) return ownDesc.value;
+				if ((typeof ownDesc.get === 'function') && (ownDesc.get !== self)) {
+					return ownDesc.get.call(this);
+				}
+			}
+			while (!hasOwnProperty.call(base, name)) base = getPrototypeOf(base);
+			desc.value = resolvable ? call.call(value, base, options) : value;
+			defineProperty(base, name, desc);
+			desc.value = null;
+			return base[name];
+		};
+	}
+	dgs.set = function (value) {
+		dgs.get.call(this);
+		this[cacheName] = value;
+	};
+	if (options.desc) {
+		desc = {
+			configurable: contains.call(options.desc, 'c'),
+			enumerable: contains.call(options.desc, 'e')
+		};
+		if (cacheName === name) {
+			desc.writable = contains.call(options.desc, 'w');
+			desc.value = null;
+		} else {
+			writable = contains.call(options.desc, 'w');
+			desc.get = dgs.get;
+			desc.set = dgs.set;
+		}
+		delete options.desc;
+	} else if (cacheName === name) {
+		desc = {
+			configurable: Boolean(options.configurable),
+			enumerable: Boolean(options.enumerable),
+			writable: Boolean(options.writable),
+			value: null
+		};
+	}
+	delete options.configurable;
+	delete options.enumerable;
+	delete options.writable;
+	return dgs;
+};
+
+module.exports = function (props) {
+	return map(props, function (desc, name) { return define(name, desc); });
+};

+ 96 - 0
tools/syntax/atom/qsp-package/node_modules/d/package.json

@@ -0,0 +1,96 @@
+{
+  "_args": [
+    [
+      {
+        "raw": "d@~0.1.1",
+        "scope": null,
+        "escapedName": "d",
+        "name": "d",
+        "rawSpec": "~0.1.1",
+        "spec": ">=0.1.1 <0.2.0",
+        "type": "range"
+      },
+      "/home/loredan13/projects/atom/qsp/node_modules/es6-weak-map"
+    ]
+  ],
+  "_from": "d@>=0.1.1 <0.2.0",
+  "_id": "[email protected]",
+  "_inCache": true,
+  "_location": "/d",
+  "_npmUser": {
+    "name": "medikoo",
+    "email": "[email protected]"
+  },
+  "_npmVersion": "1.4.3",
+  "_phantomChildren": {},
+  "_requested": {
+    "raw": "d@~0.1.1",
+    "scope": null,
+    "escapedName": "d",
+    "name": "d",
+    "rawSpec": "~0.1.1",
+    "spec": ">=0.1.1 <0.2.0",
+    "type": "range"
+  },
+  "_requiredBy": [
+    "/es5-ext/es6-iterator",
+    "/es5-ext/es6-symbol",
+    "/es6-iterator",
+    "/es6-symbol",
+    "/es6-weak-map"
+  ],
+  "_resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz",
+  "_shasum": "da184c535d18d8ee7ba2aa229b914009fae11309",
+  "_shrinkwrap": null,
+  "_spec": "d@~0.1.1",
+  "_where": "/home/loredan13/projects/atom/qsp/node_modules/es6-weak-map",
+  "author": {
+    "name": "Mariusz Nowak",
+    "email": "[email protected]",
+    "url": "http://www.medikoo.com/"
+  },
+  "bugs": {
+    "url": "https://github.com/medikoo/d/issues"
+  },
+  "dependencies": {
+    "es5-ext": "~0.10.2"
+  },
+  "description": "Property descriptor factory",
+  "devDependencies": {
+    "tad": "~0.1.21"
+  },
+  "directories": {},
+  "dist": {
+    "shasum": "da184c535d18d8ee7ba2aa229b914009fae11309",
+    "tarball": "https://registry.npmjs.org/d/-/d-0.1.1.tgz"
+  },
+  "homepage": "https://github.com/medikoo/d",
+  "keywords": [
+    "descriptor",
+    "es",
+    "ecmascript",
+    "ecma",
+    "property",
+    "descriptors",
+    "meta",
+    "properties"
+  ],
+  "license": "MIT",
+  "maintainers": [
+    {
+      "name": "medikoo",
+      "email": "[email protected]"
+    }
+  ],
+  "name": "d",
+  "optionalDependencies": {},
+  "readme": "ERROR: No README data found!",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/medikoo/d.git"
+  },
+  "scripts": {
+    "test": "node node_modules/tad/bin/tad"
+  },
+  "version": "0.1.1"
+}

+ 12 - 0
tools/syntax/atom/qsp-package/node_modules/d/test/auto-bind.js

@@ -0,0 +1,12 @@
+'use strict';
+
+var d = require('../');
+
+module.exports = function (t, a) {
+	var o = Object.defineProperties({}, t({
+		bar: d(function () { return this === o; }),
+		bar2: d(function () { return this; })
+	}));
+
+	a.deep([(o.bar)(), (o.bar2)()], [true, o]);
+};

+ 182 - 0
tools/syntax/atom/qsp-package/node_modules/d/test/index.js

@@ -0,0 +1,182 @@
+'use strict';
+
+var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+
+module.exports = function (t, a) {
+	var o, c, cg, cs, ce, ceg, ces, cew, cw, e, eg, es, ew, v, vg, vs, w, df, dfg
+	  , dfs;
+
+	o = Object.create(Object.prototype, {
+		c: t('c', c = {}),
+		cgs: t.gs('c', cg = function () {}, cs = function () {}),
+		ce: t('ce', ce = {}),
+		cegs: t.gs('ce', ceg = function () {}, ces = function () {}),
+		cew: t('cew', cew = {}),
+		cw: t('cw', cw = {}),
+		e: t('e', e = {}),
+		egs: t.gs('e', eg = function () {}, es = function () {}),
+		ew: t('ew', ew = {}),
+		v: t('', v = {}),
+		vgs: t.gs('', vg = function () {}, vs = function () {}),
+		w: t('w', w = {}),
+
+		df: t(df = {}),
+		dfgs: t.gs(dfg = function () {}, dfs = function () {})
+	});
+
+	return {
+		c: function (a) {
+			var d = getOwnPropertyDescriptor(o, 'c');
+			a(d.value, c, "Value");
+			a(d.get, undefined, "Get");
+			a(d.set, undefined, "Set");
+			a(d.configurable, true, "Configurable");
+			a(d.enumerable, false, "Enumerable");
+			a(d.writable, false, "Writable");
+
+			d = getOwnPropertyDescriptor(o, 'cgs');
+			a(d.value, undefined, "GS Value");
+			a(d.get, cg, "GS Get");
+			a(d.set, cs, "GS Set");
+			a(d.configurable, true, "GS Configurable");
+			a(d.enumerable, false, "GS Enumerable");
+			a(d.writable, undefined, "GS Writable");
+		},
+		ce: function (a) {
+			var d = getOwnPropertyDescriptor(o, 'ce');
+			a(d.value, ce, "Value");
+			a(d.get, undefined, "Get");
+			a(d.set, undefined, "Set");
+			a(d.configurable, true, "Configurable");
+			a(d.enumerable, true, "Enumerable");
+			a(d.writable, false, "Writable");
+
+			d = getOwnPropertyDescriptor(o, 'cegs');
+			a(d.value, undefined, "GS Value");
+			a(d.get, ceg, "GS Get");
+			a(d.set, ces, "GS Set");
+			a(d.configurable, true, "GS Configurable");
+			a(d.enumerable, true, "GS Enumerable");
+			a(d.writable, undefined, "GS Writable");
+		},
+		cew: function (a) {
+			var d = getOwnPropertyDescriptor(o, 'cew');
+			a(d.value, cew, "Value");
+			a(d.get, undefined, "Get");
+			a(d.set, undefined, "Set");
+			a(d.configurable, true, "Configurable");
+			a(d.enumerable, true, "Enumerable");
+			a(d.writable, true, "Writable");
+		},
+		cw: function (a) {
+			var d = getOwnPropertyDescriptor(o, 'cw');
+			a(d.value, cw, "Value");
+			a(d.get, undefined, "Get");
+			a(d.set, undefined, "Set");
+			a(d.configurable, true, "Configurable");
+			a(d.enumerable, false, "Enumerable");
+			a(d.writable, true, "Writable");
+		},
+		e: function (a) {
+			var d = getOwnPropertyDescriptor(o, 'e');
+			a(d.value, e, "Value");
+			a(d.get, undefined, "Get");
+			a(d.set, undefined, "Set");
+			a(d.configurable, false, "Configurable");
+			a(d.enumerable, true, "Enumerable");
+			a(d.writable, false, "Writable");
+
+			d = getOwnPropertyDescriptor(o, 'egs');
+			a(d.value, undefined, "GS Value");
+			a(d.get, eg, "GS Get");
+			a(d.set, es, "GS Set");
+			a(d.configurable, false, "GS Configurable");
+			a(d.enumerable, true, "GS Enumerable");
+			a(d.writable, undefined, "GS Writable");
+		},
+		ew: function (a) {
+			var d = getOwnPropertyDescriptor(o, 'ew');
+			a(d.value, ew, "Value");
+			a(d.get, undefined, "Get");
+			a(d.set, undefined, "Set");
+			a(d.configurable, false, "Configurable");
+			a(d.enumerable, true, "Enumerable");
+			a(d.writable, true, "Writable");
+		},
+		v: function (a) {
+			var d = getOwnPropertyDescriptor(o, 'v');
+			a(d.value, v, "Value");
+			a(d.get, undefined, "Get");
+			a(d.set, undefined, "Set");
+			a(d.configurable, false, "Configurable");
+			a(d.enumerable, false, "Enumerable");
+			a(d.writable, false, "Writable");
+
+			d = getOwnPropertyDescriptor(o, 'vgs');
+			a(d.value, undefined, "GS Value");
+			a(d.get, vg, "GS Get");
+			a(d.set, vs, "GS Set");
+			a(d.configurable, false, "GS Configurable");
+			a(d.enumerable, false, "GS Enumerable");
+			a(d.writable, undefined, "GS Writable");
+		},
+		w: function (a) {
+			var d = getOwnPropertyDescriptor(o, 'w');
+			a(d.value, w, "Value");
+			a(d.get, undefined, "Get");
+			a(d.set, undefined, "Set");
+			a(d.configurable, false, "Configurable");
+			a(d.enumerable, false, "Enumerable");
+			a(d.writable, true, "Writable");
+		},
+		d: function (a) {
+			var d = getOwnPropertyDescriptor(o, 'df');
+			a(d.value, df, "Value");
+			a(d.get, undefined, "Get");
+			a(d.set, undefined, "Set");
+			a(d.configurable, true, "Configurable");
+			a(d.enumerable, false, "Enumerable");
+			a(d.writable, true, "Writable");
+
+			d = getOwnPropertyDescriptor(o, 'dfgs');
+			a(d.value, undefined, "GS Value");
+			a(d.get, dfg, "GS Get");
+			a(d.set, dfs, "GS Set");
+			a(d.configurable, true, "GS Configurable");
+			a(d.enumerable, false, "GS Enumerable");
+			a(d.writable, undefined, "GS Writable");
+		},
+		Options: {
+			v: function (a) {
+				var x = {}, d = t(x, { foo: true });
+				a.deep(d, { configurable: true, enumerable: false, writable: true,
+					value: x, foo: true }, "No descriptor");
+				d = t('c', 'foo', { marko: 'elo' });
+				a.deep(d, { configurable: true, enumerable: false, writable: false,
+					value: 'foo', marko: 'elo' }, "Descriptor");
+			},
+			gs: function (a) {
+				var gFn = function () {}, sFn = function () {}, d;
+				d = t.gs(gFn, sFn, { foo: true });
+				a.deep(d, { configurable: true, enumerable: false, get: gFn, set: sFn,
+					foo: true }, "No descriptor");
+				d = t.gs(null, sFn, { foo: true });
+				a.deep(d, { configurable: true, enumerable: false, get: undefined,
+					set: sFn, foo: true }, "No descriptor: Just set");
+				d = t.gs(gFn, { foo: true });
+				a.deep(d, { configurable: true, enumerable: false, get: gFn,
+					set: undefined, foo: true }, "No descriptor: Just get");
+
+				d = t.gs('e', gFn, sFn, { bar: true });
+				a.deep(d, { configurable: false, enumerable: true, get: gFn, set: sFn,
+					bar: true }, "Descriptor");
+				d = t.gs('e', null, sFn, { bar: true });
+				a.deep(d, { configurable: false, enumerable: true, get: undefined,
+					set: sFn, bar: true }, "Descriptor: Just set");
+				d = t.gs('e', gFn, { bar: true });
+				a.deep(d, { configurable: false, enumerable: true, get: gFn,
+					set: undefined, bar: true }, "Descriptor: Just get");
+			}
+		}
+	};
+};

+ 77 - 0
tools/syntax/atom/qsp-package/node_modules/d/test/lazy.js

@@ -0,0 +1,77 @@
+'use strict';
+
+var d = require('../')
+
+  , getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+
+module.exports = function (t, a) {
+	var Foo = function () {}, i = 1, o, o2, desc;
+	Object.defineProperties(Foo.prototype, t({
+		bar: d(function () { return ++i; }),
+		bar2: d(function () { return this.bar + 23; }),
+		bar3: d(function () { return this.bar2 + 34; }, { desc: 'ew' }),
+		bar4: d(function () { return this.bar3 + 12; }, { cacheName: '_bar4_' }),
+		bar5: d(function () { return this.bar4 + 3; },
+			{ cacheName: '_bar5_', desc: 'e' })
+	}));
+
+	desc = getOwnPropertyDescriptor(Foo.prototype, 'bar');
+	a(desc.configurable, true, "Configurable: default");
+	a(desc.enumerable, false, "Enumerable: default");
+
+	o = new Foo();
+	a.deep([o.bar, o.bar2, o.bar3, o.bar4, o.bar5], [2, 25, 59, 71, 74],
+		"Values");
+
+	a.deep(getOwnPropertyDescriptor(o, 'bar3'), { configurable: false,
+		enumerable: true, writable: true, value: 59 }, "Desc");
+	a(o.hasOwnProperty('bar4'), false, "Cache not exposed");
+	desc = getOwnPropertyDescriptor(o, 'bar5');
+	a.deep(desc, { configurable: false,
+		enumerable: true, get: desc.get, set: desc.set }, "Cache & Desc: desc");
+
+	o2 = Object.create(o);
+	o2.bar = 30;
+	o2.bar3 = 100;
+
+	a.deep([o2.bar, o2.bar2, o2.bar3, o2.bar4, o2.bar5], [30, 25, 100, 112, 115],
+		"Extension Values");
+
+	Foo = function () {};
+	Object.defineProperties(Foo.prototype, t({
+		test: d('w', function () { return 'raz'; }),
+		test2: d('', function () { return 'raz'; }, { desc: 'w' }),
+		test3: d('', function () { return 'raz'; },
+			{ cacheName: '__test3__', desc: 'w' }),
+		test4: d('w', 'bar')
+	}));
+
+	o = new Foo();
+	o.test = 'marko';
+	a.deep(getOwnPropertyDescriptor(o, 'test'),
+		{ configurable: false, enumerable: false, writable: true, value: 'marko' },
+		"Set before get");
+	o.test2 = 'marko2';
+	a.deep(getOwnPropertyDescriptor(o, 'test2'),
+		{ configurable: false, enumerable: false, writable: true, value: 'marko2' },
+		"Set before get: Custom desc");
+	o.test3 = 'marko3';
+	a.deep(getOwnPropertyDescriptor(o, '__test3__'),
+		{ configurable: false, enumerable: false, writable: true, value: 'marko3' },
+		"Set before get: Custom cache name");
+	a(o.test4, 'bar', "Resolve by value");
+
+	a.h1("Flat");
+	Object.defineProperties(Foo.prototype, t({
+		flat: d(function () { return 'foo'; }, { flat: true }),
+		flat2: d(function () { return 'bar'; }, { flat: true })
+	}));
+
+	a.h2("Instance");
+	a(o.flat, 'foo', "Value");
+	a(o.hasOwnProperty('flat'), false, "Instance");
+	a(Foo.prototype.flat, 'foo', "Prototype");
+
+	a.h2("Direct");
+	a(Foo.prototype.flat2, 'bar');
+};

+ 20 - 0
tools/syntax/atom/qsp-package/node_modules/emissary/LICENSE.md

@@ -0,0 +1,20 @@
+Copyright (c) 2013 GitHub Inc.
+
+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.

+ 49 - 0
tools/syntax/atom/qsp-package/node_modules/emissary/README.md

@@ -0,0 +1,49 @@
+# Emissary – Mixins for Events [![Build Status](https://travis-ci.org/atom/emissary.svg?branch=master)](https://travis-ci.org/atom/emissary)
+
+**Achtung!** This library is currently used in Atom and various Atom dependencies, but our long-term plan is to transition away from it in favor of the simpler [event-kit](https://github.com/atom/event-kit) library. Don't depend on supporting this library forever.
+
+**Achtung Again!** The Subscriber mixin requires ES6 Harmony WeakMaps. To enable them, run your program with the  `node --harmony_collections` flag. If you're using it in a node framework such as jasmine, run its script with the flag enabled as follows: `node --harmony-collections .bin/jasmine-node specs`.
+
+## Emitter
+
+Emitter is backward-compatible with Node's event emitter, but offers more functionality. You can construct standalone `Emitter` instances or use it as a mixin.
+
+* `Emitter.extend(object)`
+  Turns the given object into an emitter by adding the appropriate methods.
+
+* `Emitter.includeInto(class)`
+  Turns the class into an emitter by extending its prototype.
+
+* `::on(eventNames, handler)`
+  Subscribe to one or more events. Events names are separated by spaces, and can optionally be namespaced with a dot-suffix. E.g. `event1 event2.namespace`.
+
+* `::once(eventName, handler)`
+  Like `::on`, but only fires the handler once before unsubscribing automatically.
+
+* `::off(eventNames[, handler])`
+  Unsubscribe to one or more events. Event names are separated by spaces. Passing a non-namespaced event name unsubscribes from every namespace for that event. Passing only a namespace unsubscribes from that entire namespace. Passing a handler removes only a subscription corresponding to the given event name(s) and that handler.
+
+* `::emit(eventName[, data...])`
+  Emit an event with the given name. If the event name is namespaced, only calls handlers for the event associated with the namespace, otherwise it fires all handlers. Handlers are called with zero or more data arguments provided after the event name.
+
+* `::pauseEvents()`
+  Buffers events instead of emitting them until `::resumeEvents` is called.
+
+* `::resumeEvents()`
+  Emits all events buffered since pausing and resumes normal emitting behavior.
+
+* `::getSubscriptionCount()`
+  Get the total number of handlers registered on the emitter.
+
+## Subscriber
+
+Subscriber works in partnership with an emitter or any object supporting subscription cancellation with `.off`. This includes standard Node event emitters and jQuery objects.
+
+* `::subscribe(object, eventNames, handler)`
+  Subscribe to the given event name(s) on the given object.
+
+* `::subscribeWith(object, methodName, eventNames, handler)`
+  Subscribe to the given object with a method other than `.on`.
+
+* `::unsubscribe([object])`
+  Cancel subscriptions previously registered with `::subscribe`. If an object is given, only unsubscribe from that object. If called without an object, unsubscribe from everything.

+ 120 - 0
tools/syntax/atom/qsp-package/node_modules/emissary/lib/behavior.js

@@ -0,0 +1,120 @@
+(function() {
+  var Behavior, PropertyAccessors, Signal, helpers, isEqual,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+    __slice = [].slice;
+
+  isEqual = require('underscore-plus').isEqual;
+
+  PropertyAccessors = require('property-accessors');
+
+  Signal = require('./signal');
+
+  module.exports = Behavior = (function(_super) {
+    __extends(Behavior, _super);
+
+    PropertyAccessors.includeInto(Behavior);
+
+    function Behavior() {
+      var args, subscribeCallback, _ref;
+      args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
+      if (typeof ((_ref = args[0]) != null ? _ref.call : void 0) !== 'function') {
+        this.value = args.shift();
+      }
+      Behavior.__super__.constructor.call(this, subscribeCallback = args.shift());
+    }
+
+    Behavior.prototype.retained = function() {
+      var _this = this;
+      this.subscribe(this, 'value-internal', function(value) {
+        return _this.value = value;
+      });
+      this.subscribe(this, 'value-subscription-added', function(handler) {
+        return handler(_this.value);
+      });
+      return typeof this.subscribeCallback === "function" ? this.subscribeCallback() : void 0;
+    };
+
+    Behavior.prototype.emit = function() {
+      var args, name;
+      name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+      if (name === 'value') {
+        this.emit.apply(this, ['value-internal'].concat(__slice.call(args)));
+      }
+      return Behavior.__super__.emit.apply(this, arguments);
+    };
+
+    Behavior.prototype.getValue = function() {
+      if (!(this.retainCount > 0)) {
+        throw new Error("Subscribe to or retain this behavior before calling getValue");
+      }
+      return this.value;
+    };
+
+    Behavior.prototype.and = function(right) {
+      return helpers.combine(this, right, (function(leftValue, rightValue) {
+        return leftValue && rightValue;
+      })).distinctUntilChanged();
+    };
+
+    Behavior.prototype.or = function(right) {
+      return helpers.combine(this, right, (function(leftValue, rightValue) {
+        return leftValue || rightValue;
+      })).distinctUntilChanged();
+    };
+
+    Behavior.prototype.toBehavior = function() {
+      return this;
+    };
+
+    Behavior.prototype.lazyAccessor('changes', function() {
+      var source;
+      source = this;
+      return new Signal(function() {
+        var gotFirst,
+          _this = this;
+        gotFirst = false;
+        return this.subscribe(source, 'value', function() {
+          var metadata, value;
+          value = arguments[0], metadata = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+          if (gotFirst) {
+            _this.emitValue.apply(_this, [value].concat(__slice.call(metadata)));
+          }
+          return gotFirst = true;
+        });
+      });
+    });
+
+    Behavior.prototype.becomes = function(predicateOrTargetValue) {
+      var predicate, targetValue;
+      if (typeof predicateOrTargetValue !== 'function') {
+        targetValue = predicateOrTargetValue;
+        return this.becomes(function(value) {
+          return isEqual(value, targetValue);
+        });
+      }
+      predicate = predicateOrTargetValue;
+      return this.map(function(value) {
+        return !!predicate(value);
+      }).distinctUntilChanged().changes;
+    };
+
+    Behavior.prototype.becomesLessThan = function(targetValue) {
+      return this.becomes(function(value) {
+        return value < targetValue;
+      });
+    };
+
+    Behavior.prototype.becomesGreaterThan = function(targetValue) {
+      return this.becomes(function(value) {
+        return value > targetValue;
+      });
+    };
+
+    return Behavior;
+
+  })(Signal);
+
+  helpers = require('./helpers');
+
+}).call(this);

+ 14 - 0
tools/syntax/atom/qsp-package/node_modules/emissary/lib/emissary.js

@@ -0,0 +1,14 @@
+(function() {
+  var combine;
+
+  combine = require('./helpers').combine;
+
+  module.exports = {
+    Emitter: require('./emitter'),
+    Subscriber: require('./subscriber'),
+    Signal: require('./signal'),
+    Behavior: require('./behavior'),
+    combine: combine
+  };
+
+}).call(this);

+ 384 - 0
tools/syntax/atom/qsp-package/node_modules/emissary/lib/emitter.js

@@ -0,0 +1,384 @@
+(function() {
+  var Emitter, Mixin, Signal, Subscription, removeFromArray, subscriptionRemovedPattern, _ref,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+    __slice = [].slice;
+
+  Mixin = require('mixto');
+
+  Signal = null;
+
+  Subscription = null;
+
+  subscriptionRemovedPattern = /^(last-)?.+-subscription-removed$/;
+
+  module.exports = Emitter = (function(_super) {
+    __extends(Emitter, _super);
+
+    function Emitter() {
+      _ref = Emitter.__super__.constructor.apply(this, arguments);
+      return _ref;
+    }
+
+    Emitter.prototype.eventHandlersByEventName = null;
+
+    Emitter.prototype.eventHandlersByNamespace = null;
+
+    Emitter.prototype.subscriptionCounts = null;
+
+    Emitter.prototype.pauseCountsByEventName = null;
+
+    Emitter.prototype.queuedEventsByEventName = null;
+
+    Emitter.prototype.globalPauseCount = null;
+
+    Emitter.prototype.globalQueuedEvents = null;
+
+    Emitter.prototype.signalsByEventName = null;
+
+    Emitter.prototype.on = function(eventNames, handler) {
+      var eventName, namespace, _base, _base1, _base2, _i, _len, _ref1, _ref2;
+      _ref1 = eventNames.split(/\s+/);
+      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
+        eventName = _ref1[_i];
+        if (!(eventName !== '')) {
+          continue;
+        }
+        _ref2 = eventName.split('.'), eventName = _ref2[0], namespace = _ref2[1];
+        this.emit("" + eventName + "-subscription-will-be-added", handler);
+        if (this.incrementSubscriptionCount(eventName) === 1) {
+          this.emit("first-" + eventName + "-subscription-will-be-added", handler);
+        }
+        if (this.eventHandlersByEventName == null) {
+          this.eventHandlersByEventName = {};
+        }
+        if ((_base = this.eventHandlersByEventName)[eventName] == null) {
+          _base[eventName] = [];
+        }
+        this.eventHandlersByEventName[eventName].push(handler);
+        if (namespace) {
+          if (this.eventHandlersByNamespace == null) {
+            this.eventHandlersByNamespace = {};
+          }
+          if ((_base1 = this.eventHandlersByNamespace)[namespace] == null) {
+            _base1[namespace] = {};
+          }
+          if ((_base2 = this.eventHandlersByNamespace[namespace])[eventName] == null) {
+            _base2[eventName] = [];
+          }
+          this.eventHandlersByNamespace[namespace][eventName].push(handler);
+        }
+        this.emit("" + eventName + "-subscription-added", handler);
+      }
+      if (Subscription == null) {
+        Subscription = require('./subscription');
+      }
+      return new Subscription(this, eventNames, handler);
+    };
+
+    Emitter.prototype.once = function(eventName, handler) {
+      var subscription;
+      return subscription = this.on(eventName, function() {
+        var args;
+        args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
+        subscription.off();
+        return handler.apply(null, args);
+      });
+    };
+
+    Emitter.prototype.signal = function(eventName) {
+      var _base;
+      if (Signal == null) {
+        Signal = require('./signal');
+      }
+      if (this.signalsByEventName == null) {
+        this.signalsByEventName = {};
+      }
+      return (_base = this.signalsByEventName)[eventName] != null ? (_base = this.signalsByEventName)[eventName] : _base[eventName] = Signal.fromEmitter(this, eventName);
+    };
+
+    Emitter.prototype.behavior = function(eventName, initialValue) {
+      return this.signal(eventName).toBehavior(initialValue);
+    };
+
+    Emitter.prototype.emit = function(eventName, payload) {
+      var handler, handlers, queuedEvents, _i, _len, _ref1, _ref2, _ref3;
+      if (arguments.length > 2 || /\s|\./.test(eventName)) {
+        return this.emitSlow.apply(this, arguments);
+      } else {
+        if (this.globalQueuedEvents != null) {
+          return this.globalQueuedEvents.push([eventName, payload]);
+        } else {
+          if (queuedEvents = (_ref1 = this.queuedEventsByEventName) != null ? _ref1[eventName] : void 0) {
+            return queuedEvents.push([eventName, payload]);
+          } else if (handlers = (_ref2 = this.eventHandlersByEventName) != null ? _ref2[eventName] : void 0) {
+            _ref3 = handlers.slice();
+            for (_i = 0, _len = _ref3.length; _i < _len; _i++) {
+              handler = _ref3[_i];
+              handler(payload);
+            }
+            return this.emit("after-" + eventName, payload);
+          }
+        }
+      }
+    };
+
+    Emitter.prototype.emitSlow = function() {
+      var args, eventName, handlers, namespace, queuedEvents, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6;
+      eventName = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+      if (this.globalQueuedEvents) {
+        return this.globalQueuedEvents.push([eventName].concat(__slice.call(args)));
+      } else {
+        _ref1 = eventName.split('.'), eventName = _ref1[0], namespace = _ref1[1];
+        if (namespace) {
+          if (queuedEvents = (_ref2 = this.queuedEventsByEventName) != null ? _ref2[eventName] : void 0) {
+            return queuedEvents.push(["" + eventName + "." + namespace].concat(__slice.call(args)));
+          } else if (handlers = (_ref3 = this.eventHandlersByNamespace) != null ? (_ref4 = _ref3[namespace]) != null ? _ref4[eventName] : void 0 : void 0) {
+            (function(func, args, ctor) {
+              ctor.prototype = func.prototype;
+              var child = new ctor, result = func.apply(child, args);
+              return Object(result) === result ? result : child;
+            })(Array, handlers, function(){}).forEach(function(handler) {
+              return handler.apply(null, args);
+            });
+            return this.emit.apply(this, ["after-" + eventName].concat(__slice.call(args)));
+          }
+        } else {
+          if (queuedEvents = (_ref5 = this.queuedEventsByEventName) != null ? _ref5[eventName] : void 0) {
+            return queuedEvents.push([eventName].concat(__slice.call(args)));
+          } else if (handlers = (_ref6 = this.eventHandlersByEventName) != null ? _ref6[eventName] : void 0) {
+            (function(func, args, ctor) {
+              ctor.prototype = func.prototype;
+              var child = new ctor, result = func.apply(child, args);
+              return Object(result) === result ? result : child;
+            })(Array, handlers, function(){}).forEach(function(handler) {
+              return handler.apply(null, args);
+            });
+            return this.emit.apply(this, ["after-" + eventName].concat(__slice.call(args)));
+          }
+        }
+      }
+    };
+
+    Emitter.prototype.off = function(eventNames, handler) {
+      var eventHandlers, eventName, handlers, namespace, namespaceHandlers, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref1, _ref10, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9;
+      if (eventNames) {
+        _ref1 = eventNames.split(/\s+/);
+        for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
+          eventName = _ref1[_i];
+          if (!(eventName !== '')) {
+            continue;
+          }
+          _ref2 = eventName.split('.'), eventName = _ref2[0], namespace = _ref2[1];
+          if (eventName === '') {
+            eventName = void 0;
+          }
+          if (namespace) {
+            if (eventName) {
+              handlers = (_ref3 = (_ref4 = this.eventHandlersByNamespace) != null ? (_ref5 = _ref4[namespace]) != null ? _ref5[eventName] : void 0 : void 0) != null ? _ref3 : [];
+              if (handler != null) {
+                removeFromArray(handlers, handler);
+                this.off(eventName, handler);
+              } else {
+                _ref6 = (function(func, args, ctor) {
+                  ctor.prototype = func.prototype;
+                  var child = new ctor, result = func.apply(child, args);
+                  return Object(result) === result ? result : child;
+                })(Array, handlers, function(){});
+                for (_j = 0, _len1 = _ref6.length; _j < _len1; _j++) {
+                  handler = _ref6[_j];
+                  removeFromArray(handlers, handler);
+                  this.off(eventName, handler);
+                }
+              }
+            } else {
+              namespaceHandlers = (_ref7 = (_ref8 = this.eventHandlersByNamespace) != null ? _ref8[namespace] : void 0) != null ? _ref7 : {};
+              if (handler != null) {
+                for (eventName in namespaceHandlers) {
+                  handlers = namespaceHandlers[eventName];
+                  removeFromArray(handlers, handler);
+                  this.off(eventName, handler);
+                }
+              } else {
+                for (eventName in namespaceHandlers) {
+                  handlers = namespaceHandlers[eventName];
+                  _ref9 = (function(func, args, ctor) {
+                    ctor.prototype = func.prototype;
+                    var child = new ctor, result = func.apply(child, args);
+                    return Object(result) === result ? result : child;
+                  })(Array, handlers, function(){});
+                  for (_k = 0, _len2 = _ref9.length; _k < _len2; _k++) {
+                    handler = _ref9[_k];
+                    removeFromArray(handlers, handler);
+                    this.off(eventName, handler);
+                  }
+                }
+              }
+            }
+          } else {
+            eventHandlers = (_ref10 = this.eventHandlersByEventName) != null ? _ref10[eventName] : void 0;
+            if (eventHandlers == null) {
+              return;
+            }
+            if (handler == null) {
+              for (_l = 0, _len3 = eventHandlers.length; _l < _len3; _l++) {
+                handler = eventHandlers[_l];
+                this.off(eventName, handler);
+              }
+              return;
+            }
+            if (removeFromArray(eventHandlers, handler)) {
+              this.decrementSubscriptionCount(eventName);
+              this.emit("" + eventName + "-subscription-removed", handler);
+              if (this.getSubscriptionCount(eventName) === 0) {
+                this.emit("last-" + eventName + "-subscription-removed", handler);
+                delete this.eventHandlersByEventName[eventName];
+              }
+            }
+          }
+        }
+      } else {
+        for (eventName in this.eventHandlersByEventName) {
+          if (!subscriptionRemovedPattern.test(eventName)) {
+            this.off(eventName);
+          }
+        }
+        for (eventName in this.eventHandlersByEventName) {
+          this.off(eventName);
+        }
+        return this.eventHandlersByNamespace = {};
+      }
+    };
+
+    Emitter.prototype.pauseEvents = function(eventNames) {
+      var eventName, _base, _base1, _i, _len, _ref1, _results;
+      if (eventNames) {
+        _ref1 = eventNames.split(/\s+/);
+        _results = [];
+        for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
+          eventName = _ref1[_i];
+          if (!(eventName !== '')) {
+            continue;
+          }
+          if (this.pauseCountsByEventName == null) {
+            this.pauseCountsByEventName = {};
+          }
+          if (this.queuedEventsByEventName == null) {
+            this.queuedEventsByEventName = {};
+          }
+          if ((_base = this.pauseCountsByEventName)[eventName] == null) {
+            _base[eventName] = 0;
+          }
+          this.pauseCountsByEventName[eventName]++;
+          _results.push((_base1 = this.queuedEventsByEventName)[eventName] != null ? (_base1 = this.queuedEventsByEventName)[eventName] : _base1[eventName] = []);
+        }
+        return _results;
+      } else {
+        if (this.globalPauseCount == null) {
+          this.globalPauseCount = 0;
+        }
+        if (this.globalQueuedEvents == null) {
+          this.globalQueuedEvents = [];
+        }
+        return this.globalPauseCount++;
+      }
+    };
+
+    Emitter.prototype.resumeEvents = function(eventNames) {
+      var event, eventName, queuedEvents, _i, _j, _len, _len1, _ref1, _ref2, _results, _results1;
+      if (eventNames) {
+        _ref1 = eventNames.split(/\s+/);
+        _results = [];
+        for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
+          eventName = _ref1[_i];
+          if (eventName !== '') {
+            if (((_ref2 = this.pauseCountsByEventName) != null ? _ref2[eventName] : void 0) > 0 && --this.pauseCountsByEventName[eventName] === 0) {
+              queuedEvents = this.queuedEventsByEventName[eventName];
+              this.queuedEventsByEventName[eventName] = null;
+              _results.push((function() {
+                var _j, _len1, _results1;
+                _results1 = [];
+                for (_j = 0, _len1 = queuedEvents.length; _j < _len1; _j++) {
+                  event = queuedEvents[_j];
+                  _results1.push(this.emit.apply(this, event));
+                }
+                return _results1;
+              }).call(this));
+            } else {
+              _results.push(void 0);
+            }
+          }
+        }
+        return _results;
+      } else {
+        for (eventName in this.pauseCountsByEventName) {
+          this.resumeEvents(eventName);
+        }
+        if (this.globalPauseCount > 0 && --this.globalPauseCount === 0) {
+          queuedEvents = this.globalQueuedEvents;
+          this.globalQueuedEvents = null;
+          _results1 = [];
+          for (_j = 0, _len1 = queuedEvents.length; _j < _len1; _j++) {
+            event = queuedEvents[_j];
+            _results1.push(this.emit.apply(this, event));
+          }
+          return _results1;
+        }
+      }
+    };
+
+    Emitter.prototype.incrementSubscriptionCount = function(eventName) {
+      var _base;
+      if (this.subscriptionCounts == null) {
+        this.subscriptionCounts = {};
+      }
+      if ((_base = this.subscriptionCounts)[eventName] == null) {
+        _base[eventName] = 0;
+      }
+      return ++this.subscriptionCounts[eventName];
+    };
+
+    Emitter.prototype.decrementSubscriptionCount = function(eventName) {
+      var count;
+      count = --this.subscriptionCounts[eventName];
+      if (count === 0) {
+        delete this.subscriptionCounts[eventName];
+      }
+      return count;
+    };
+
+    Emitter.prototype.getSubscriptionCount = function(eventName) {
+      var count, name, total, _ref1, _ref2, _ref3;
+      if (eventName != null) {
+        return (_ref1 = (_ref2 = this.subscriptionCounts) != null ? _ref2[eventName] : void 0) != null ? _ref1 : 0;
+      } else {
+        total = 0;
+        _ref3 = this.subscriptionCounts;
+        for (name in _ref3) {
+          count = _ref3[name];
+          total += count;
+        }
+        return total;
+      }
+    };
+
+    Emitter.prototype.hasSubscriptions = function(eventName) {
+      return this.getSubscriptionCount(eventName) > 0;
+    };
+
+    return Emitter;
+
+  })(Mixin);
+
+  removeFromArray = function(array, element) {
+    var index;
+    index = array.indexOf(element);
+    if (index > -1) {
+      array.splice(index, 1);
+      return true;
+    } else {
+      return false;
+    }
+  };
+
+}).call(this);

+ 55 - 0
tools/syntax/atom/qsp-package/node_modules/emissary/lib/helpers.js

@@ -0,0 +1,55 @@
+(function() {
+  var Behavior, combineArray, combineWithFunction,
+    __slice = [].slice;
+
+  Behavior = require('./behavior');
+
+  exports.combine = function() {
+    var args;
+    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
+    if (args.length === 1 && Array.isArray(args[0])) {
+      return combineArray(args[0]);
+    } else if (typeof args[args.length - 1] === 'function') {
+      return combineWithFunction(args);
+    } else {
+      throw new Error("Invalid object type");
+    }
+  };
+
+  combineArray = function(array) {
+    var behavior;
+    return behavior = new Behavior(function() {
+      var element, i, outputArray, ready, _i, _len,
+        _this = this;
+      outputArray = array.slice();
+      ready = false;
+      for (i = _i = 0, _len = array.length; _i < _len; i = ++_i) {
+        element = array[i];
+        if (element.constructor.name === 'Behavior') {
+          (function(element, i) {
+            return _this.subscribe(element.onValue(function(value, metadata) {
+              if (ready) {
+                outputArray = outputArray.slice();
+              }
+              outputArray[i] = value;
+              if (ready) {
+                return _this.emitValue(outputArray, metadata);
+              }
+            }));
+          })(element, i);
+        }
+      }
+      ready = true;
+      return this.emitValue(outputArray);
+    });
+  };
+
+  combineWithFunction = function(args) {
+    var fn;
+    fn = args.pop();
+    return combineArray(args).map(function(argsArray) {
+      return fn.apply(null, argsArray);
+    });
+  };
+
+}).call(this);

+ 292 - 0
tools/syntax/atom/qsp-package/node_modules/emissary/lib/signal.js

@@ -0,0 +1,292 @@
+(function() {
+  var Behavior, Emitter, Signal, Subscriber, isEqual,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+    __slice = [].slice;
+
+  isEqual = require('underscore-plus').isEqual;
+
+  Emitter = require('./emitter');
+
+  Subscriber = require('./subscriber');
+
+  Behavior = null;
+
+  module.exports = Signal = (function(_super) {
+    __extends(Signal, _super);
+
+    Subscriber.includeInto(Signal);
+
+    Signal.fromEmitter = function(emitter, eventName) {
+      return new Signal(function() {
+        var _this = this;
+        return this.subscribe(emitter, eventName, function() {
+          var metadata, value;
+          value = arguments[0], metadata = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+          return _this.emitValue.apply(_this, [value].concat(__slice.call(metadata)));
+        });
+      });
+    };
+
+    function Signal(subscribeCallback) {
+      var _this = this;
+      this.subscribeCallback = subscribeCallback;
+      this.retainCount = 0;
+      this.on('value-subscription-will-be-added', function() {
+        return _this.retain();
+      });
+      this.on('value-subscription-removed', function() {
+        return _this.release();
+      });
+    }
+
+    Signal.prototype.isSignal = true;
+
+    Signal.prototype.retained = function() {
+      return typeof this.subscribeCallback === "function" ? this.subscribeCallback() : void 0;
+    };
+
+    Signal.prototype.released = function() {
+      return this.unsubscribe();
+    };
+
+    Signal.prototype.retain = function() {
+      if (++this.retainCount === 1) {
+        if (typeof this.retained === "function") {
+          this.retained();
+        }
+      }
+      return this;
+    };
+
+    Signal.prototype.release = function() {
+      if (--this.retainCount === 0) {
+        if (typeof this.released === "function") {
+          this.released();
+        }
+      }
+      return this;
+    };
+
+    Signal.prototype.onValue = function(handler) {
+      return this.on('value', handler);
+    };
+
+    Signal.prototype.emitValue = function(value, metadata) {
+      if (metadata == null) {
+        metadata = {};
+      }
+      if (metadata.source == null) {
+        metadata.source = this;
+      }
+      return this.emit('value', value, metadata);
+    };
+
+    Signal.prototype.toBehavior = function(initialValue) {
+      var source;
+      source = this;
+      return this.buildBehavior(initialValue, function() {
+        var _this = this;
+        return this.subscribe(source, 'value', function() {
+          var metadata, value;
+          value = arguments[0], metadata = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+          return _this.emitValue.apply(_this, [value].concat(__slice.call(metadata)));
+        });
+      });
+    };
+
+    Signal.prototype.changes = function() {
+      return this;
+    };
+
+    Signal.prototype.injectMetadata = function(fn) {
+      var source;
+      source = this;
+      return new this.constructor(function() {
+        var _this = this;
+        return this.subscribe(source, 'value', function(value, metadata) {
+          var k, newMetadata, v;
+          newMetadata = fn(value, metadata);
+          for (k in newMetadata) {
+            v = newMetadata[k];
+            metadata[k] = v;
+          }
+          return _this.emitValue(value, metadata);
+        });
+      });
+    };
+
+    Signal.prototype.filter = function(predicate) {
+      var source;
+      source = this;
+      return new this.constructor(function() {
+        var _this = this;
+        return this.subscribe(source, 'value', function() {
+          var metadata, value;
+          value = arguments[0], metadata = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+          if (predicate.call(value, value)) {
+            return _this.emitValue.apply(_this, [value].concat(__slice.call(metadata)));
+          }
+        });
+      });
+    };
+
+    Signal.prototype.filterDefined = function() {
+      return this.filter(function(value) {
+        return value != null;
+      });
+    };
+
+    Signal.prototype.map = function(fn) {
+      var property, source;
+      if (typeof fn === 'string') {
+        property = fn;
+        fn = function(value) {
+          return value != null ? value[property] : void 0;
+        };
+      }
+      source = this;
+      return new this.constructor(function() {
+        var _this = this;
+        return this.subscribe(source, 'value', function() {
+          var metadata, value;
+          value = arguments[0], metadata = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+          return _this.emitValue.apply(_this, [fn.call(value, value)].concat(__slice.call(metadata)));
+        });
+      });
+    };
+
+    Signal.prototype["switch"] = function(fn) {
+      var source;
+      source = this.map(fn);
+      return new this.constructor(function() {
+        var currentSignal,
+          _this = this;
+        currentSignal = null;
+        return this.subscribe(source, 'value', function(newSignal, outerMetadata) {
+          if (currentSignal != null) {
+            _this.unsubscribe(currentSignal);
+          }
+          currentSignal = newSignal;
+          if (currentSignal != null) {
+            return _this.subscribe(currentSignal, 'value', function(value, innerMetadata) {
+              return _this.emitValue(value, innerMetadata);
+            });
+          } else {
+            return _this.emitValue(void 0, outerMetadata);
+          }
+        });
+      });
+    };
+
+    Signal.prototype.skipUntil = function(predicateOrTargetValue) {
+      var doneSkipping, predicate, targetValue;
+      if (typeof predicateOrTargetValue !== 'function') {
+        targetValue = predicateOrTargetValue;
+        return this.skipUntil(function(value) {
+          return isEqual(value, targetValue);
+        });
+      }
+      predicate = predicateOrTargetValue;
+      doneSkipping = false;
+      return this.filter(function(value) {
+        if (doneSkipping) {
+          return true;
+        }
+        if (predicate(value)) {
+          return doneSkipping = true;
+        } else {
+          return false;
+        }
+      });
+    };
+
+    Signal.prototype.scan = function(initialValue, fn) {
+      var source;
+      source = this;
+      return this.buildBehavior(initialValue, function() {
+        var oldValue,
+          _this = this;
+        oldValue = initialValue;
+        return this.subscribe(source, 'value', function() {
+          var metadata, newValue;
+          newValue = arguments[0], metadata = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+          return _this.emitValue.apply(_this, [(oldValue = fn(oldValue, newValue))].concat(__slice.call(metadata)));
+        });
+      });
+    };
+
+    Signal.prototype.diff = function(initialValue, fn) {
+      var source;
+      source = this;
+      return this.buildBehavior(function() {
+        var oldValue,
+          _this = this;
+        oldValue = initialValue;
+        return this.subscribe(source, 'value', function() {
+          var fnOldValue, metadata, newValue;
+          newValue = arguments[0], metadata = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+          fnOldValue = oldValue;
+          oldValue = newValue;
+          return _this.emitValue.apply(_this, [fn(fnOldValue, newValue)].concat(__slice.call(metadata)));
+        });
+      });
+    };
+
+    Signal.prototype.distinctUntilChanged = function() {
+      var source;
+      source = this;
+      return new this.constructor(function() {
+        var oldValue, receivedValue,
+          _this = this;
+        receivedValue = false;
+        oldValue = void 0;
+        return this.subscribe(source, 'value', function() {
+          var metadata, newValue;
+          newValue = arguments[0], metadata = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+          if (receivedValue) {
+            if (isEqual(oldValue, newValue)) {
+              return oldValue = newValue;
+            } else {
+              oldValue = newValue;
+              return _this.emitValue.apply(_this, [newValue].concat(__slice.call(metadata)));
+            }
+          } else {
+            receivedValue = true;
+            oldValue = newValue;
+            return _this.emitValue.apply(_this, [newValue].concat(__slice.call(metadata)));
+          }
+        });
+      });
+    };
+
+    Signal.prototype.equals = function(expected) {
+      return this.map(function(actual) {
+        return isEqual(actual, expected);
+      }).distinctUntilChanged();
+    };
+
+    Signal.prototype.isDefined = function() {
+      return this.map(function(value) {
+        return value != null;
+      }).distinctUntilChanged();
+    };
+
+    Signal.prototype.buildBehavior = function() {
+      var args;
+      args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
+      if (Behavior == null) {
+        Behavior = require('./behavior');
+      }
+      return (function(func, args, ctor) {
+        ctor.prototype = func.prototype;
+        var child = new ctor, result = func.apply(child, args);
+        return Object(result) === result ? result : child;
+      })(Behavior, args, function(){});
+    };
+
+    return Signal;
+
+  })(Emitter);
+
+}).call(this);

+ 109 - 0
tools/syntax/atom/qsp-package/node_modules/emissary/lib/subscriber.js

@@ -0,0 +1,109 @@
+(function() {
+  var Mixin, Signal, Subscriber, Subscription, WeakMap, _ref, _ref1,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+    __slice = [].slice;
+
+  Mixin = require('mixto');
+
+  Signal = null;
+
+  WeakMap = (_ref = global.WeakMap) != null ? _ref : require('es6-weak-map');
+
+  Subscription = require('./subscription');
+
+  module.exports = Subscriber = (function(_super) {
+    __extends(Subscriber, _super);
+
+    function Subscriber() {
+      _ref1 = Subscriber.__super__.constructor.apply(this, arguments);
+      return _ref1;
+    }
+
+    Subscriber.prototype.subscribeWith = function(eventEmitter, methodName, args) {
+      var callback, eventNames;
+      if (eventEmitter[methodName] == null) {
+        throw new Error("Object does not have method '" + methodName + "' with which to subscribe");
+      }
+      eventEmitter[methodName].apply(eventEmitter, args);
+      eventNames = args[0];
+      callback = args[args.length - 1];
+      return this.addSubscription(new Subscription(eventEmitter, eventNames, callback));
+    };
+
+    Subscriber.prototype.addSubscription = function(subscription) {
+      var emitter;
+      if (this._subscriptions == null) {
+        this._subscriptions = [];
+      }
+      this._subscriptions.push(subscription);
+      emitter = subscription.emitter;
+      if (emitter != null) {
+        if (this._subscriptionsByObject == null) {
+          this._subscriptionsByObject = new WeakMap;
+        }
+        if (this._subscriptionsByObject.has(emitter)) {
+          this._subscriptionsByObject.get(emitter).push(subscription);
+        } else {
+          this._subscriptionsByObject.set(emitter, [subscription]);
+        }
+      }
+      return subscription;
+    };
+
+    Subscriber.prototype.subscribe = function() {
+      var args, eventEmitterOrSubscription;
+      eventEmitterOrSubscription = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+      if (args.length === 0) {
+        return this.addSubscription(eventEmitterOrSubscription);
+      } else {
+        if (args.length === 1 && eventEmitterOrSubscription.isSignal) {
+          args.unshift('value');
+        }
+        return this.subscribeWith(eventEmitterOrSubscription, 'on', args);
+      }
+    };
+
+    Subscriber.prototype.subscribeToCommand = function() {
+      var args, eventEmitter;
+      eventEmitter = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+      return this.subscribeWith(eventEmitter, 'command', args);
+    };
+
+    Subscriber.prototype.unsubscribe = function(object) {
+      var index, subscription, _i, _j, _len, _len1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7;
+      if (object != null) {
+        _ref4 = (_ref2 = (_ref3 = this._subscriptionsByObject) != null ? _ref3.get(object) : void 0) != null ? _ref2 : [];
+        for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
+          subscription = _ref4[_i];
+          if (typeof subscription.dispose === 'function') {
+            subscription.dispose();
+          } else {
+            subscription.off();
+          }
+          index = this._subscriptions.indexOf(subscription);
+          if (index >= 0) {
+            this._subscriptions.splice(index, 1);
+          }
+        }
+        return (_ref5 = this._subscriptionsByObject) != null ? _ref5["delete"](object) : void 0;
+      } else {
+        _ref7 = (_ref6 = this._subscriptions) != null ? _ref6 : [];
+        for (_j = 0, _len1 = _ref7.length; _j < _len1; _j++) {
+          subscription = _ref7[_j];
+          if (typeof subscription.dispose === 'function') {
+            subscription.dispose();
+          } else {
+            subscription.off();
+          }
+        }
+        this._subscriptions = null;
+        return this._subscriptionsByObject = null;
+      }
+    };
+
+    return Subscriber;
+
+  })(Mixin);
+
+}).call(this);

+ 40 - 0
tools/syntax/atom/qsp-package/node_modules/emissary/lib/subscription.js

@@ -0,0 +1,40 @@
+(function() {
+  var Emitter, Subscription,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+  Emitter = require('./emitter');
+
+  module.exports = Subscription = (function(_super) {
+    __extends(Subscription, _super);
+
+    Subscription.prototype.cancelled = false;
+
+    function Subscription(emitter, eventNames, handler) {
+      this.emitter = emitter;
+      this.eventNames = eventNames;
+      this.handler = handler;
+    }
+
+    Subscription.prototype.off = function() {
+      return this.dispose();
+    };
+
+    Subscription.prototype.dispose = function() {
+      var unsubscribe, _ref;
+      if (this.cancelled) {
+        return;
+      }
+      unsubscribe = (_ref = this.emitter.off) != null ? _ref : this.emitter.removeListener;
+      unsubscribe.call(this.emitter, this.eventNames, this.handler);
+      this.emitter = null;
+      this.handler = null;
+      this.cancelled = true;
+      return this.emit('cancelled');
+    };
+
+    return Subscription;
+
+  })(Emitter);
+
+}).call(this);

+ 111 - 0
tools/syntax/atom/qsp-package/node_modules/emissary/package.json

@@ -0,0 +1,111 @@
+{
+  "_args": [
+    [
+      {
+        "raw": "emissary@^1.2.0",
+        "scope": null,
+        "escapedName": "emissary",
+        "name": "emissary",
+        "rawSpec": "^1.2.0",
+        "spec": ">=1.2.0 <2.0.0",
+        "type": "range"
+      },
+      "/home/loredan13/projects/atom/qsp/node_modules/grim"
+    ]
+  ],
+  "_from": "emissary@>=1.2.0 <2.0.0",
+  "_id": "[email protected]",
+  "_inCache": true,
+  "_location": "/emissary",
+  "_npmUser": {
+    "name": "kevinsawicki",
+    "email": "[email protected]"
+  },
+  "_npmVersion": "1.4.28",
+  "_phantomChildren": {},
+  "_requested": {
+    "raw": "emissary@^1.2.0",
+    "scope": null,
+    "escapedName": "emissary",
+    "name": "emissary",
+    "rawSpec": "^1.2.0",
+    "spec": ">=1.2.0 <2.0.0",
+    "type": "range"
+  },
+  "_requiredBy": [
+    "/grim"
+  ],
+  "_resolved": "https://registry.npmjs.org/emissary/-/emissary-1.3.3.tgz",
+  "_shasum": "a618d92d682b232d31111dc3625a5df661799606",
+  "_shrinkwrap": null,
+  "_spec": "emissary@^1.2.0",
+  "_where": "/home/loredan13/projects/atom/qsp/node_modules/grim",
+  "author": {
+    "name": "Nathan Sobo"
+  },
+  "bugs": {
+    "url": "https://github.com/atom/emissary/issues"
+  },
+  "dependencies": {
+    "es6-weak-map": "^0.1.2",
+    "mixto": "1.x",
+    "property-accessors": "^1.1",
+    "underscore-plus": "1.x"
+  },
+  "description": "Utility mixins for subscribing to and emitting events.",
+  "devDependencies": {
+    "grunt": "~0.4.1",
+    "grunt-cli": "~0.1.8",
+    "grunt-coffeelint": "0.0.6",
+    "grunt-contrib-coffee": "~0.7.0",
+    "grunt-shell": "~0.2.2",
+    "jasmine-focused": "1.x",
+    "rimraf": "~2.2.2"
+  },
+  "directories": {},
+  "dist": {
+    "shasum": "a618d92d682b232d31111dc3625a5df661799606",
+    "tarball": "https://registry.npmjs.org/emissary/-/emissary-1.3.3.tgz"
+  },
+  "gitHead": "13170d3e1f8b1cd4396d6dceb3c3bccf0887dae2",
+  "homepage": "http://atom.github.io/emissary",
+  "keywords": [
+    "event-emitter",
+    "events",
+    "subscribe",
+    "subscriber"
+  ],
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://github.com/atom/emissary/raw/master/LICENSE.md"
+    }
+  ],
+  "main": "lib/emissary.js",
+  "maintainers": [
+    {
+      "name": "nathansobo",
+      "email": "[email protected]"
+    },
+    {
+      "name": "kevinsawicki",
+      "email": "[email protected]"
+    },
+    {
+      "name": "benogle",
+      "email": "[email protected]"
+    }
+  ],
+  "name": "emissary",
+  "optionalDependencies": {},
+  "readme": "ERROR: No README data found!",
+  "repository": {
+    "type": "git",
+    "url": "git+ssh://[email protected]/atom/emissary.git"
+  },
+  "scripts": {
+    "prepublish": "grunt clean lint coffee",
+    "test": "grunt test"
+  },
+  "version": "1.3.3"
+}

+ 633 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/CHANGES

@@ -0,0 +1,633 @@
+v0.10.12  --  2016.07.01
+* Ensure symbols are copied in Object.mixin
+* Prevent RangeError errors in array#flatten
+* Do not validate invalidate dates in validDate
+
+v0.10.11  --  2015.12.18
+* Ensure that check for implementation of RegExp flags doesn't crash in V8 (thanks @mathiasbynens)
+
+v0.10.10  --  2015.12.11
+* Add Object.isNumberValue util
+
+v0.10.9  --  2015.12.01
+* Add Object.ensureNaturalNumber and Object.ensureNaturalNumberValue
+
+v0.10.8  --  2015.10.02
+* Add Number.isNatural
+* Add Object.find and Object.findKey
+* Support arrays in Object.copyDeep
+* Fix iteration issue in forEachRight and someRight
+* Fix detection of native sinh
+* Depend on es6-symbol v3
+
+v0.10.7  --  2015.04.22
+* New utlitities. They're convention differs from v0.10, as they were supposed to land in v1.
+  Still they're non breaking and start the conventions to be used in v1
+  * Object.validateArrayLike
+  * Object.validateArrayLikeObject
+  * Object.validateStringifiable
+  * Object.validateStringifiableValue
+  * Universal utilities for array-like/iterable objects
+    * Iterable.is
+    * Iterable.validate
+    * Iterable.validateObject
+    * Iterable.forEach
+* Fix camelToHyphen resolution, it must be absolutely reversable by hyphenToCamel
+* Fix calculations of large numbers in Math.tanh
+* Fix algorithm of Math.sinh
+* Fix indexes to not use real symbols
+* Fix length of String.fromCodePoint
+* Fix tests of Array#copyWithin
+* Update Travis CI configuration
+
+v0.10.6  --  2015.02.02
+* Fix handling of infinite values in Math.trunc
+* Fix handling of getters in Object.normalizeOptions
+
+v0.10.5  --  2015.01.20
+* Add Function#toStringTokens
+* Add Object.serialize and Object.unserialize
+* Add String.randomUniq
+* Fix Strin#camelToHyphen issue with tokens that end with digit
+* Optimise Number.isInteger logic
+* Improve documentation
+* Configure lint scripts
+* Fix spelling of LICENSE
+
+v0.10.4  --  2014.04.30
+* Assure maximum spec compliance of Array.of and Array.from (thanks @mathiasbynens)
+* Improve documentations
+
+v0.10.3  --  2014.04.29
+Provide accurate iterators handling:
+* Array.from improvements:
+  * Assure right unicode symbols resolution when processing strings in Array.from
+  * Rely on ES6 symbol shim and use native @@iterator Symbol if provided by environment
+* Add methods:
+  * Array.prototype.entries
+  * Array.prototype.keys
+  * Array.prototype.values
+  * Array.prototype[@@iterator]
+  * String.prototype[@@iterator]
+
+Improve documentation
+
+v0.10.2  --  2014.04.24
+- Simplify and deprecate `isCallable`. It seems in ES5 based engines there are
+  no callable objects which are `typeof obj !== 'function'`
+- Update Array.from map callback signature (up to latest resolution of TC39)
+- Improve documentation
+
+v0.10.1  --  2014.04.14
+Bump version for npm
+(Workaround for accidental premature publish & unpublish of v0.10.0 a while ago)
+
+v0.10.0  --  2014.04.13
+Major update:
+- All methods and function specified for ECMAScript 6 are now introduced as
+  shims accompanied with functions through which (optionally) they can be
+  implementend on native objects
+- Filename convention was changed to shorter and strictly lower case names. e.g.
+  `lib/String/prototype/starts-with` became `string/#/starts-with`
+- Generated functions are guaranteed to have expected length
+- Objects with null prototype (created via `Object.create(null)`) are widely
+  supported (older version have crashed due to implied `obj.hasOwnProperty` and
+  related invocations)
+- Support array subclasses
+- When handling lists do not limit its length to Uint32 range
+- Use newly introduced `Object.eq` for strict equality in place of `Object.is`
+- Iteration of Object have been improved so properties that were hidden or
+  removed after iteration started are not iterated.
+
+Additions:
+- `Array.isPlainArray`
+- `Array.validArray`
+- `Array.prototype.concat` (as updated with ES6)
+- `Array.prototype.copyWithin` (as introduced with ES6)
+- `Array.prototype.fill` (as introduced with ES6)
+- `Array.prototype.filter` (as updated with ES6)
+- `Array.prototype.findIndex` (as introduced with ES6)
+- `Array.prototype.map` (as updated with ES6)
+- `Array.prototype.separate`
+- `Array.prototype.slice` (as updated with ES6)
+- `Array.prototype.splice` (as updated with ES6)
+- `Function.prototype.copy`
+- `Math.acosh` (as introduced with ES6)
+- `Math.atanh` (as introduced with ES6)
+- `Math.cbrt` (as introduced with ES6)
+- `Math.clz32` (as introduced with ES6)
+- `Math.cosh` (as introduced with ES6)
+- `Math.expm1` (as introduced with ES6)
+- `Math.fround` (as introduced with ES6)
+- `Math.hypot` (as introduced with ES6)
+- `Math.imul` (as introduced with ES6)
+- `Math.log2` (as introduced with ES6)
+- `Math.log10` (as introduced with ES6)
+- `Math.log1p` (as introduced with ES6)
+- `Math.sinh` (as introduced with ES6)
+- `Math.tanh` (as introduced with ES6)
+- `Math.trunc` (as introduced with ES6)
+- `Number.EPSILON` (as introduced with ES6)
+- `Number.MIN_SAFE_INTEGER` (as introduced with ES6)
+- `Number.MAX_SAFE_INTEGER` (as introduced with ES6)
+- `Number.isFinite` (as introduced with ES6)
+- `Number.isInteger` (as introduced with ES6)
+- `Number.isSafeInteger` (as introduced with ES6)
+- `Object.create` (with fix for V8 issue which disallows prototype turn of
+  objects derived from null
+- `Object.eq` - Less restrictive version of `Object.is` based on SameValueZero
+  algorithm
+- `Object.firstKey`
+- `Object.keys` (as updated with ES6)
+- `Object.mixinPrototypes`
+- `Object.primitiveSet`
+- `Object.setPrototypeOf` (as introduced with ES6)
+- `Object.validObject`
+- `RegExp.escape`
+- `RegExp.prototype.match` (as introduced with ES6)
+- `RegExp.prototype.replace` (as introduced with ES6)
+- `RegExp.prototype.search` (as introduced with ES6)
+- `RegExp.prototype.split` (as introduced with ES6)
+- `RegExp.prototype.sticky` (as introduced with ES6)
+- `RegExp.prototype.unicode` (as introduced with ES6)
+- `String.fromCodePoint` (as introduced with ES6)
+- `String.raw` (as introduced with ES6)
+- `String.prototype.at`
+- `String.prototype.codePointAt` (as introduced with ES6)
+- `String.prototype.normalize` (as introduced with ES6)
+- `String.prototype.plainReplaceAll`
+
+Removals:
+- `reserved` set
+- `Array.prototype.commonLeft`
+- `Function.insert`
+- `Function.remove`
+- `Function.prototype.silent`
+- `Function.prototype.wrap`
+- `Object.descriptor` Move to external `d` project.
+  See: https://github.com/medikoo/d
+- `Object.diff`
+- `Object.extendDeep`
+- `Object.reduce`
+- `Object.values`
+- `String.prototype.trimCommonLeft`
+
+Renames:
+- `Function.i` into `Function.identity`
+- `Function.k` into `Function.constant`
+- `Number.toInt` into `Number.toInteger`
+- `Number.toUint` into `Number.toPosInteger`
+- `Object.extend` into `Object.assign` (as introduced in ES 6)
+- `Object.extendProperties` into `Object.mixin`, with improved internal
+  handling, so it matches temporarily specified `Object.mixin` for ECMAScript 6
+- `Object.isList` into `Object.isArrayLike`
+- `Object.mapToArray` into `Object.toArray` (with fixed function length)
+- `Object.toPlainObject` into `Object.normalizeOptions` (as this is the real
+  use case where we use this function)
+- `Function.prototype.chain` into `Function.prototype.compose`
+- `Function.prototype.match` into `Function.prototype.spread`
+- `String.prototype.format` into `String.formatMethod`
+
+Improvements & Fixes:
+- Remove workaround for primitive values handling in object iterators
+- `Array.from`: Update so it follows ES 6 spec
+- `Array.prototype.compact`: filters just null and undefined values
+  (not all falsies)
+- `Array.prototype.eIndexOf` and `Array.prototype.eLastIndexOf`: fix position
+  handling, improve internals
+- `Array.prototype.find`: return undefined not null, in case of not found
+  (follow ES 6)
+- `Array.prototype.remove` fix function length
+- `Error.custom`: simplify, Custom class case is addressed by outer
+  `error-create` project -> https://github.com/medikoo/error-create
+- `Error.isError` true only for Error instances (remove detection of host
+  Exception objects)
+- `Number.prototype.pad`: Normalize negative pad
+- `Object.clear`: Handle errors same way as in `Object.assign`
+- `Object.compact`: filters just null and undefined values (not all falsies)
+- `Object.compare`: Take into account NaN values
+- `Object.copy`: Split into `Object.copy` and `Object.copyDeep`
+- `Object.isCopy`: Separate into `Object.isCopy` and `Object.isCopyDeep`, where
+  `isCopyDeep` handles nested plain objects and plain arrays only
+- `String.prototype.endsWith`: Adjust up to ES6 specification
+- `String.prototype.repeat`: Adjust up to ES6 specification and improve algorithm
+- `String.prototype.simpleReplace`: Rename into `String.prototype.plainReplace`
+- `String.prototype.startsWith`: Adjust up to ES6 specification
+- Update lint rules, and adjust code to that
+- Update Travis CI configuration
+- Remove Makefile (it's cross-env utility)
+
+v0.9.2  --  2013.03.11
+Added:
+* Array.prototype.isCopy
+* Array.prototype.isUniq
+* Error.CustomError
+* Function.validFunction
+* Object.extendDeep
+* Object.descriptor.binder
+* Object.safeTraverse
+* RegExp.validRegExp
+* String.prototype.capitalize
+* String.prototype.simpleReplace
+
+Fixed:
+* Fix Array.prototype.diff for sparse arrays
+* Accept primitive objects as input values in Object iteration methods and
+  Object.clear, Object.count, Object.diff, Object.extend,
+  Object.getPropertyNames, Object.values
+* Pass expected arguments to callbacks of Object.filter, Object.mapKeys,
+  Object.mapToArray, Object.map
+* Improve callable callback support in Object.mapToArray
+
+v0.9.1  --  2012.09.17
+* Object.reduce - reduce for hash-like collections
+* Accapt any callable object as callback in Object.filter, mapKeys and map
+* Convention cleanup
+
+v0.9.0  --  2012.09.13
+We're getting to real solid API
+
+Removed:
+* Function#memoize - it's grown up to be external package, to be soon published
+  as 'memoizee'
+* String.guid - it doesn't fit es5-ext (extensions) concept, will be provided as
+  external package
+# Function.arguments - obsolete
+# Function.context - obsolete
+# Function#flip - not readable when used, so it was never used
+# Object.clone - obsolete and confusing
+
+Added:
+* String#camelToHyphen - String format convertion
+
+Renamed:
+* String#dashToCamelCase -> String#hyphenToCamel
+
+Fixes:
+* Object.isObject - Quote names in literals that match reserved keywords
+  (older implementations crashed on that)
+* String#repeat - Do not accept negative values (coerce them to 1)
+
+Improvements:
+* Array#remove - Accepts many arguments, we can now remove many values at once
+* Object iterators (forEach, map, some) - Compare function invoked with scope
+  object bound to this
+* Function#curry - Algorithm cleanup
+* Object.isCopy - Support for all types, not just plain objects
+* Object.isPlainObject - Support for cross-frame objects
+* Do not memoize any of the functions, it shouldn't be decided internally
+* Remove Object.freeze calls in reserved, it's not up to convention
+* Improved documentation
+* Better linting (hard-core approach using both JSLint mod and JSHint)
+* Optional arguments are now documented in funtions signature
+
+v0.8.2  --  2012.06.22
+Fix errors in Array's intersection and exclusion methods, related to improper
+usage of contains method
+
+v0.8.1  --  2012.06.13
+Reorganized internal logic of Function.prototype.memoize. So it's more safe now
+and clears cache properly. Additionally preventCache option was provided.
+
+v0.8.0  --  2012.05.28
+Again, major overhaul. Probably last experimental stuff was trashed, all API
+looks more like standard extensions now.
+
+Changes:
+* Turn all Object.prototype extensions into functions and move them to Object
+namespace. We learned that extending Object.prototype is bad idea in any case.
+* Rename Function.prototype.curry into Function.prototype.partial. This function
+  is really doing partial application while currying is slightly different
+  concept.
+* Convert Function.prototype.ncurry to new implementation of
+  Function.prototype.curry, it now serves real curry concept additionaly it
+  covers use cases for aritize and hold, which were removed.
+* Rename Array's peek to last, and provide support for sparse arrays in it
+* Rename Date's monthDaysCount into daysInMonth
+* Simplify object iterators, now order of iteration can be configured with just
+  compareFn argument (no extra byKeys option)
+* Rename Object.isDuplicate to Object.isCopy
+* Rename Object.isEqual to Object.is which is compatible with future 'is'
+  keyword
+* Function.memoize is now Function.prototype.memoize. Additionally clear cache
+  functionality is added, and access to original arguments object.
+* Rename validation functions: assertNotNull to validValue, assertCallable to
+  validCallable. validValue was moved to Object namespace. On success they now
+  return validated value instead of true, it supports better composition.
+  Additionally created Date.validDate and Error.validError
+* All documentation is now held in README.md not in code files.
+* Move guid to String namespace. All guids now start with numbers.
+* Array.generate: fill argument is now optional
+* Object.toArray is now Array.from (as new ES6 specification draft suggests)
+* All methods that rely on indexOf or lastIndexOf, now rely on egal (Object.is)
+  versions of them (eIndexOf, eLastIndexOf)
+* Turn all get* functions that returned methods into actuall methods (get*
+  functionality can still be achieved with help of Function.prototype.partial).
+  So: Date.getFormat is now Date.prototype.format,
+  Number.getPad is now Number.prototype.pad,
+  String.getFormat is now String.prototype.format,
+  String.getIndent is now String.prototype.indent,
+  String.getPad is now String.prototype.pad
+* Refactored Object.descriptor, it is now just two functions, main one and
+  main.gs, main is for describing values, and gs for describing getters and
+  setters. Configuration is passed with first argument as string e.g. 'ce' for
+  configurable and enumerable. If no configuration string is provided then by
+  default it returns configurable and writable but not enumerable for value or
+  configurable but not enumerable for getter/setter
+* Function.prototype.silent now returns prepared function (it was
+  expected to be fixed for 0.7)
+* Reserved keywords map (reserved) is now array not hash.
+* Object.merge is now Object.extend (while former Object.extend was completely
+  removed) - 'extend' implies that we change object, not creating new one (as
+  'merge' may imply). Similarily Object.mergeProperties was renamed to
+  Object.extendProperties
+* Position argument support in Array.prototype.contains and
+  String.prototype.contains (so it follows ES6 specification draft)
+* endPosition argument support in String.prototype.endsWith and fromPosition
+  argument support in String.prototype.startsWith (so it follows ES6
+  specification draft)
+* Better and cleaner String.prototype.indent implementation. No default value
+  for indent string argument, optional nest value (defaults to 1), remove
+  nostart argument
+* Correct length values for most methods (so they reflect length of similar
+  methods in standard)
+* Length argument is now optional in number and string pad methods.
+* Improve arguments validation in general, so it adheres to standard conventions
+* Fixed format of package.json
+
+Removed methods and functions:
+* Object.prototype.slice - Object is not ordered collection, so slice doesn't
+  make sense.
+* Function's rcurry, rncurry, s - too cumbersome for JS, not many use cases for
+  that
+* Function.prototype.aritize and Function.prototype.hold - same functionality
+  can be achieved with new Function.prototype.curry
+* Function.prototype.log - provided more generic Function.prototype.wrap for
+  same use case
+* getNextIdGenerator - no use case for that (String.guid should be used if
+  needed)
+* Object.toObject - Can be now acheived with Object(validValue(x))
+* Array.prototype.someValue - no real use case (personally used once and
+  case was already controversial)
+* Date.prototype.duration - moved to external package
+* Number.getAutoincrement - No real use case
+* Object.prototype.extend, Object.prototype.override,
+  Object.prototype.plainCreate, Object.prototype.plainExtend - It was probably
+  too complex, same should be achieved just with Object.create,
+  Object.descriptor and by saving references to super methods in local scope.
+* Object.getCompareBy - Functions should be created individually for each use
+  case
+* Object.get, Object.getSet, Object.set, Object.unset - Not many use cases and
+  same can be easily achieved with simple inline function
+* String.getPrefixWith - Not real use case for something that can be easily
+  achieved with '+' operator
+* Object.isPrimitive - It's just negation of Object.isObject
+* Number.prototype.isLess, Number.prototype.isLessOrEqual - they shouldn't be in
+  Number namespace and should rather be addressed with simple inline functions.
+* Number.prototype.subtract - Should rather be addressed with simple inline
+  function
+
+New methods and functions:
+* Array.prototype.lastIndex - Returns last declared index in array
+* String.prototype.last - last for strings
+* Function.prototype.wrap - Wrap function with other, it allows to specify
+  before and after behavior transform return value or prevent original function
+  from being called.
+* Math.sign - Returns sign of a number (already in ES6 specification draft)
+* Number.toInt - Converts value to integer (already in ES6 specification draft)
+* Number.isNaN - Returns true if value is NaN (already in ES6 specification
+  draft)
+* Number.toUint - Converts value to unsigned integer
+* Number.toUint32 - Converts value to 32bit unsigned integer
+* Array.prototype.eIndexOf, eLastIndexOf - Egal version (that uses Object.is) of
+  standard methods (all methods that were using native indexOf or lastIndexOf
+  now uses eIndexOf and elastIndexOf respectively)
+* Array.of - as it's specified for ES6
+
+Fixes:
+* Fixed binarySearch so it always returns valid list index
+* Object.isList - it failed on lists that are callable (e.g. NodeList in Nitro
+  engine)
+* Object.map now supports third argument for callback
+
+v0.7.1  --  2012.01.05
+New methods:
+* Array.prototype.firstIndex - returns first valid index of array (for
+	sparse arrays it may not be '0'
+
+Improvements:
+* Array.prototype.first - now returns value for index returned by firstIndex
+* Object.prototype.mapToArray - can be called without callback, then array of
+	key-value pairs is returned
+
+Fixes
+* Array.prototype.forEachRight, object's length read through UInt32 conversion
+
+v0.7.0  --  2011.12.27
+Major update.
+Stepped back from experimental ideas and introduced more standard approach
+taking example from how ES5 methods and functions are designed. One exceptions
+is that, we don’t refrain from declaring methods for Object.prototype - it’s up
+to developer whether how he decides to use it in his context (as function or as
+method).
+
+In general:
+* Removed any method 'functionalization' and functionalize method itself.
+	es5-ext declares plain methods, which can be configured to work as functions
+	with call.bind(method) - see documentation.
+* Removed separation of Object methods for ES5 (with descriptors) and
+	ES3 (plain) - we're following ES5 idea on that, some methods are intended just
+	for enumerable properties and some are for all properties, all are declared
+	for Object.prototype
+* Removed separation of Array generic (collected in List folder) and not generic
+	methods (collected in Array folder). Now all methods are generic and are in
+	Array/prototype folder. This separation also meant, that methods in Array are
+	usually destructive. We don’t do that separation now, there’s generally no use
+	case for destructive iterators, we should be fine with one version of each
+	method, (same as ES5 is fine with  e.g. one, non destructive 'filter' method)
+* Folder structure resembles tree of native ES5 Objects
+* All methods are written with ES5 conventions in mind, it means that most
+	methods are generic and can be run on any object. In more detail:
+	** Array.prototype and Object.prototype methods can be run on any object (any
+		not null or undefined value),
+	** Date.prototype methods should be called only on Date instances.
+	** Function.prototype methods can be called on any callable objects (not
+		necessarily functions)
+	** Number.prototype & String.prototype methods can be called on any value, in
+		case of Number it it’ll be degraded to number, in case of string it’ll be
+		degraded to string.
+* Travis CI support (only for Node v0.6 branch, as v0.4 has buggy V8 version)
+
+Improvements for existing functions and methods:
+* Function.memoize (was Function.cache) is now fully generic, can operate on any
+	type of arguments and it’s NaN safe (all NaN objects are considered equal)
+* Method properties passed to Object.prototype.extend or
+	Object.prototype.override can aside of _super optionally take prototype object
+	via _proto argument
+* Object iterators: forEach, mapToArray and every can now iterate in specified
+	order
+* pluck, invoke and other functions that return reusable functions or methods
+	have now their results memoized.
+
+New methods:
+* Global: assertNotNull, getNextIdGenerator, guid, isEqual, isPrimitive,
+	toObject
+* Array: generate
+* Array.prototype: binarySearch, clear, contains, diff, exclusion, find, first,
+	forEachRight, group, indexesOf, intersection, remove, someRight, someValue
+* Boolean: isBoolean
+* Date: isDate
+* Function: arguments, context, insert, isArguments, remove
+* Function.prototype: not, silent
+* Number: getAutoincrement, isNumber
+* Number.prototype: isLessOrEqual, isLess, subtract
+* Object: assertCallable, descriptor (functions for clean descriptors),
+	getCompareBy, isCallable, isObject
+* Object.prototype: clone (real clone), compact, count, diff, empty,
+	getPropertyNames, get, keyOf, mapKeys, override, plainCreate, plainExtend,
+	slice, some, unset
+* RegExp: isRegExp
+* String: getPrefixWith, isString
+* String.prototype: caseInsensitiveCompare, contains, isNumeric
+
+Renamed methods:
+* Date.clone -> Date.prototype.copy
+* Date.format -> Date.getFormat
+* Date/day/floor -> Date.prototype.floorDay
+* Date/month/floor -> Date.prototype.floorMonth
+* Date/month/year -> Date.prototype.floorYear
+* Function.cache -> Function.memoize
+* Function.getApplyArg -> Function.prototype.match
+* Function.sequence -> Function.prototype.chain
+* List.findSameStartLength -> Array.prototype.commonLeft
+* Number.pad -> Number.getPad
+* Object/plain/clone -> Object.prototype.copy
+* Object/plain/elevate -> Object.prototype.flatten
+* Object/plain/same -> Object.prototype.isDuplicate
+* Object/plain/setValue -> Object.getSet
+* String.format -> String.getFormat
+* String.indent -> String.getIndent
+* String.pad -> String.getPad
+* String.trimLeftStr -> String.prototype.trimCommonLeft
+* Object.merge -> Object.prototype.mergeProperties
+* Object/plain/pluck -> Object.prototype.get
+* Array.clone is now Array.prototype.copy and can be used also on any array-like
+	objects
+* List.isList -> Object.isList
+* List.toArray -> Object.prototype.toArray
+* String/convert/dashToCamelCase -> String.prototype.dashToCamelCase
+
+Removed methods:
+* Array.compact - removed destructive version (that operated on same array), we
+	have now non destructive version as Array.prototype.compact.
+* Function.applyBind -> use apply.bind directly
+* Function.bindBind -> use bind.bind directly
+* Function.callBind -> use call.bind directly
+* Fuction.clone -> no valid use case
+* Function.dscope -> controversial approach, shouldn’t be considered seriously
+* Function.functionalize -> It was experimental but standards are standards
+* List/sort/length -> It can be easy obtained by Object.getCompareBy(‘length’)
+* List.concat -> Concat’s for array-like’s makes no sense, just convert to array
+	first
+* List.every -> Use Array.prototype.every directly
+* List.filter -> Use Array.prototype.filter directly
+* List.forEach -> User Array.prototype.forEach directly
+* List.isListObject -> No valid use case, do: isList(list) && (typeof list ===
+	'object’)
+* List.map -> Use Array.prototype.map directly
+* List.reduce -> Use Array.prototype.reduce directly
+* List.shiftSame -> Use Array.prototype.commonLeft and do slice
+* List.slice -> Use Array.prototype.slice directly
+* List.some -> Use Array.prototype.some directly
+* Object.bindMethods -> it was version that considered descriptors, we have now
+	Object.prototype.bindMethods which operates only on enumerable properties
+* Object.every -> version that considered all properties, we have now
+	Object.prototype.every which iterates only enumerables
+* Object.invoke -> no use case
+* Object.mergeDeep -> no use case
+* Object.pluck -> no use case
+* Object.same -> it considered descriptors, now there’s only Object.isDuplicate
+	which compares only enumerable properties
+* Object.sameType -> no use case
+* Object.toDescriptor and Object.toDescriptors -> replaced by much nicer
+	Object.descriptor functions
+* Object/plain/link -> no use case (it was used internally only by
+	Object/plain/merge)
+* Object/plain/setTrue -> now easily configurable by more universal
+	Object.getSet(true)
+* String.trimRightStr -> Eventually String.prototype.trimCommonRight will be
+	added
+
+v0.6.3  --  2011.12.12
+* Cleared npm warning for misnamed property in package.json
+
+v0.6.2  --  2011.08.12
+* Calling String.indent without scope (global scope then) now treated as calling
+  it with null scope, it allows more direct invocations when using default nest
+  string: indent().call(str, nest)
+
+v0.6.1  --  2011.08.08
+* Added TAD test suite to devDependencies, configured test commands.
+  Tests can be run with 'make test' or 'npm test'
+
+v0.6.0  --  2011.08.07
+New methods:
+* Array: clone, compact (in place)
+* Date: format, duration, clone, monthDaysCount, day.floor, month.floor,
+  year.floor
+* Function: getApplyArg, , ncurry, rncurry, hold, cache, log
+* List: findSameStartLength, shiftSame, peek, isListObject
+* Number: pad
+* Object: sameType, toString, mapToArray, mergeDeep, toDescriptor,
+  toDescriptors, invoke
+* String: startsWith, endsWith, indent, trimLeftStr, trimRightStr, pad, format
+
+Fixed:
+* Object.extend does now prototypal extend as exptected
+* Object.merge now tries to overwrite only configurable properties
+* Function.flip
+
+Improved:
+* Faster List.toArray
+* Better global retrieval
+* Functionalized all Function methods
+* Renamed bindApply and bindCall to applyBind and callBind
+* Removed Function.inherit (as it's unintuitive curry clone)
+* Straightforward logic in Function.k
+* Fixed naming of some tests files (letter case issue)
+* Renamed Function.saturate into Function.lock
+* String.dashToCamelCase digits support
+* Strings now considered as List objects
+* Improved List.compact
+* Concise logic for List.concat
+* Test wit TAD in clean ES5 context
+
+v0.5.1  --  2011.07.11
+* Function's bindBind, bindCall and bindApply now more versatile
+
+v0.5.0  --  2011.07.07
+* Removed Object.is and List.apply
+* Renamed Object.plain.is to Object.plain.isPlainObject (keep naming convention
+  consistent)
+* Improved documentation
+
+v0.4.0  --  2011.07.05
+* Take most functions on Object to Object.plain to keep them away from object
+  descriptors
+* Object functions with ES5 standard in mind (object descriptors)
+
+v0.3.0  --  2011.06.24
+* New functions
+* Consistent file naming (dash instead of camelCase)
+
+v0.2.1  --  2011.05.28
+* Renamed Functions.K and Function.S to to lowercase versions (use consistent
+  naming)
+
+v0.2.0  --  2011.05.28
+* Renamed Array folder to List (as its generic functions for array-like objects)
+* Added Makefile
+* Added various functions
+
+v0.1.0  --  2011.05.24
+* Initial version

+ 19 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/LICENSE

@@ -0,0 +1,19 @@
+Copyright (C) 2011-2015 Mariusz Nowak (www.medikoo.com)
+
+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.

+ 993 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/README.md

@@ -0,0 +1,993 @@
+# es5-ext
+## ECMAScript 5 extensions
+### (with respect to ECMAScript 6 standard)
+
+Shims for upcoming ES6 standard and other goodies implemented strictly with ECMAScript conventions in mind.
+
+It's designed to be used in compliant ECMAScript 5 or ECMAScript 6 environments. Older environments are not supported, although most of the features should work with correct ECMAScript 5 shim on board.
+
+When used in ECMAScript 6 environment, native implementation (if valid) takes precedence over shims.
+
+### Installation
+
+	$ npm install es5-ext
+	
+To port it to Browser or any other (non CJS) environment, use your favorite CJS bundler. No favorite yet? Try: [Browserify](http://browserify.org/), [Webmake](https://github.com/medikoo/modules-webmake) or [Webpack](http://webpack.github.io/)
+
+### Usage
+
+#### ECMAScript 6 features
+
+You can force ES6 features to be implemented in your environment, e.g. following will assign `from` function to `Array` (only if it's not implemented already).
+
+```javascript
+require('es5-ext/array/from/implement');
+Array.from('foo'); // ['f', 'o', 'o']
+```
+
+You can also access shims directly, without fixing native objects. Following will return native `Array.from` if it's available and fallback to shim if it's not.
+
+```javascript
+var aFrom = require('es5-ext/array/from');
+aFrom('foo'); // ['f', 'o', 'o']
+```
+
+If you want to use shim unconditionally (even if native implementation exists) do:
+
+```javascript
+var aFrom = require('es5-ext/array/from/shim');
+aFrom('foo'); // ['f', 'o', 'o']
+```
+
+##### List of ES6 shims
+
+It's about properties introduced with ES6 and those that have been updated in new spec.
+
+- `Array.from` -> `require('es5-ext/array/from')`
+- `Array.of` -> `require('es5-ext/array/of')`
+- `Array.prototype.concat` -> `require('es5-ext/array/#/concat')`
+- `Array.prototype.copyWithin` -> `require('es5-ext/array/#/copy-within')`
+- `Array.prototype.entries` -> `require('es5-ext/array/#/entries')`
+- `Array.prototype.fill` -> `require('es5-ext/array/#/fill')`
+- `Array.prototype.filter` -> `require('es5-ext/array/#/filter')`
+- `Array.prototype.find` -> `require('es5-ext/array/#/find')`
+- `Array.prototype.findIndex` -> `require('es5-ext/array/#/find-index')`
+- `Array.prototype.keys` -> `require('es5-ext/array/#/keys')`
+- `Array.prototype.map` -> `require('es5-ext/array/#/map')`
+- `Array.prototype.slice` -> `require('es5-ext/array/#/slice')`
+- `Array.prototype.splice` -> `require('es5-ext/array/#/splice')`
+- `Array.prototype.values` -> `require('es5-ext/array/#/values')`
+- `Array.prototype[@@iterator]` -> `require('es5-ext/array/#/@@iterator')`
+- `Math.acosh` -> `require('es5-ext/math/acosh')`
+- `Math.asinh` -> `require('es5-ext/math/asinh')`
+- `Math.atanh` -> `require('es5-ext/math/atanh')`
+- `Math.cbrt` -> `require('es5-ext/math/cbrt')`
+- `Math.clz32` -> `require('es5-ext/math/clz32')`
+- `Math.cosh` -> `require('es5-ext/math/cosh')`
+- `Math.exmp1` -> `require('es5-ext/math/expm1')`
+- `Math.fround` -> `require('es5-ext/math/fround')`
+- `Math.hypot` -> `require('es5-ext/math/hypot')`
+- `Math.imul` -> `require('es5-ext/math/imul')`
+- `Math.log1p` -> `require('es5-ext/math/log1p')`
+- `Math.log2` -> `require('es5-ext/math/log2')`
+- `Math.log10` -> `require('es5-ext/math/log10')`
+- `Math.sign` -> `require('es5-ext/math/sign')`
+- `Math.signh` -> `require('es5-ext/math/signh')`
+- `Math.tanh` -> `require('es5-ext/math/tanh')`
+- `Math.trunc` -> `require('es5-ext/math/trunc')`
+- `Number.EPSILON` -> `require('es5-ext/number/epsilon')`
+- `Number.MAX_SAFE_INTEGER` -> `require('es5-ext/number/max-safe-integer')`
+- `Number.MIN_SAFE_INTEGER` -> `require('es5-ext/number/min-safe-integer')`
+- `Number.isFinite` -> `require('es5-ext/number/is-finite')`
+- `Number.isInteger` -> `require('es5-ext/number/is-integer')`
+- `Number.isNaN` -> `require('es5-ext/number/is-nan')`
+- `Number.isSafeInteger` -> `require('es5-ext/number/is-safe-integer')`
+- `Object.assign` -> `require('es5-ext/object/assign')`
+- `Object.keys` -> `require('es5-ext/object/keys')`
+- `Object.setPrototypeOf` -> `require('es5-ext/object/set-prototype-of')`
+- `RegExp.prototype.match` -> `require('es5-ext/reg-exp/#/match')`
+- `RegExp.prototype.replace` -> `require('es5-ext/reg-exp/#/replace')`
+- `RegExp.prototype.search` -> `require('es5-ext/reg-exp/#/search')`
+- `RegExp.prototype.split` -> `require('es5-ext/reg-exp/#/split')`
+- `RegExp.prototype.sticky` -> Implement with `require('es5-ext/reg-exp/#/sticky/implement')`, use as function with `require('es5-ext/reg-exp/#/is-sticky')`
+- `RegExp.prototype.unicode` -> Implement with `require('es5-ext/reg-exp/#/unicode/implement')`, use as function with `require('es5-ext/reg-exp/#/is-unicode')`
+- `String.fromCodePoint` -> `require('es5-ext/string/from-code-point')`
+- `String.raw` -> `require('es5-ext/string/raw')`
+- `String.prototype.codePointAt` -> `require('es5-ext/string/#/code-point-at')`
+- `String.prototype.contains` -> `require('es5-ext/string/#/contains')`
+- `String.prototype.endsWith` -> `require('es5-ext/string/#/ends-with')`
+- `String.prototype.normalize` -> `require('es5-ext/string/#/normalize')`
+- `String.prototype.repeat` -> `require('es5-ext/string/#/repeat')`
+- `String.prototype.startsWith` -> `require('es5-ext/string/#/starts-with')`
+- `String.prototype[@@iterator]` -> `require('es5-ext/string/#/@@iterator')`
+
+#### Non ECMAScript standard features
+
+__es5-ext__ provides also other utils, and implements them as if they were proposed for a standard. It mostly offers methods (not functions) which can directly be assigned to native prototypes:
+
+```javascript
+Object.defineProperty(Function.prototype, 'partial', { value: require('es5-ext/function/#/partial'),
+  configurable: true, enumerable: false, writable: true });
+Object.defineProperty(Array.prototype, 'flatten', { value: require('es5-ext/array/#/flatten'),
+  configurable: true, enumerable: false, writable: true });
+Object.defineProperty(String.prototype, 'capitalize', { value: require('es5-ext/string/#/capitalize'),
+  configurable: true, enumerable: false, writable: true });
+```
+
+See [es5-extend](https://github.com/wookieb/es5-extend#es5-extend), a great utility that automatically will extend natives for you. 
+
+__Important:__ Remember to __not__ extend natives in scope of generic reusable packages (e.g. ones you intend to publish to npm). Extending natives is fine __only__ if you're the _owner_ of the global scope, so e.g. in final project you lead development of.
+
+When you're in situation when native extensions are not good idea, then you should use methods indirectly:
+
+
+```javascript
+var flatten = require('es5-ext/array/#/flatten');
+
+flatten.call([1, [2, [3, 4]]]); // [1, 2, 3, 4]
+```
+
+for better convenience you can turn methods into functions:
+
+
+```javascript
+var call = Function.prototype.call
+var flatten = call.bind(require('es5-ext/array/#/flatten'));
+
+flatten([1, [2, [3, 4]]]); // [1, 2, 3, 4]
+```
+
+You can configure custom toolkit (like [underscorejs](http://underscorejs.org/)), and use it throughout your application
+
+```javascript
+var util = {};
+util.partial = call.bind(require('es5-ext/function/#/partial'));
+util.flatten = call.bind(require('es5-ext/array/#/flatten'));
+util.startsWith = call.bind(require('es5-ext/string/#/starts-with'));
+
+util.flatten([1, [2, [3, 4]]]); // [1, 2, 3, 4]
+```
+
+As with native ones most methods are generic and can be run on any type of object.
+
+## API
+
+### Global extensions
+
+#### global _(es5-ext/global)_
+
+Object that represents global scope
+
+### Array Constructor extensions
+
+#### from(arrayLike[, mapFn[, thisArg]]) _(es5-ext/array/from)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from).  
+Returns array representation of _iterable_ or _arrayLike_. If _arrayLike_ is an instance of array, its copy is returned.
+
+#### generate([length[, …fill]]) _(es5-ext/array/generate)_
+
+Generate an array of pre-given _length_ built of repeated arguments.
+
+#### isPlainArray(x) _(es5-ext/array/is-plain-array)_
+
+Returns true if object is plain array (not instance of one of the Array's extensions).
+
+#### of([…items]) _(es5-ext/array/of)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.of).  
+Create an array from given arguments.
+
+#### toArray(obj) _(es5-ext/array/to-array)_
+
+Returns array representation of `obj`. If `obj` is already an array, `obj` is returned back.
+
+#### validArray(obj) _(es5-ext/array/valid-array)_
+
+Returns `obj` if it's an array, otherwise throws `TypeError`
+
+### Array Prototype extensions
+
+#### arr.binarySearch(compareFn) _(es5-ext/array/#/binary-search)_
+
+In __sorted__ list search for index of item for which _compareFn_ returns value closest to _0_.  
+It's variant of binary search algorithm
+
+#### arr.clear() _(es5-ext/array/#/clear)_
+
+Clears the array
+
+#### arr.compact() _(es5-ext/array/#/compact)_
+
+Returns a copy of the context with all non-values (`null` or `undefined`) removed.
+
+#### arr.concat() _(es5-ext/array/#/concat)_
+
+[_Updated with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.prototype.concat).  
+ES6's version of `concat`. Supports `isConcatSpreadable` symbol, and returns array of same type as the context.
+
+#### arr.contains(searchElement[, position]) _(es5-ext/array/#/contains)_
+
+Whether list contains the given value.
+
+#### arr.copyWithin(target, start[, end]) _(es5-ext/array/#/copy-within)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.copywithin).  
+
+#### arr.diff(other) _(es5-ext/array/#/diff)_
+
+Returns the array of elements that are present in context list but not present in other list.
+
+#### arr.eIndexOf(searchElement[, fromIndex]) _(es5-ext/array/#/e-index-of)_
+
+_egal_ version of `indexOf` method. [_SameValueZero_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) logic is used for comparision
+
+#### arr.eLastIndexOf(searchElement[, fromIndex]) _(es5-ext/array/#/e-last-index-of)_
+
+_egal_ version of `lastIndexOf` method. [_SameValueZero_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) logic is used for comparision
+
+#### arr.entries() _(es5-ext/array/#/entries)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.prototype.entries).  
+Returns iterator object, which traverses the array. Each value is represented with an array, where first value is an index and second is corresponding to index value.
+
+#### arr.exclusion([…lists]]) _(es5-ext/array/#/exclusion)_
+
+Returns the array of elements that are found only in one of the lists (either context list or list provided in arguments).
+
+#### arr.fill(value[, start, end]) _(es5-ext/array/#/fill)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.fill).  
+
+#### arr.filter(callback[, thisArg]) _(es5-ext/array/#/filter)_
+
+[_Updated with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.filter).  
+ES6's version of `filter`, returns array of same type as the context.
+
+#### arr.find(predicate[, thisArg]) _(es5-ext/array/#/find)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.find).  
+Return first element for which given function returns true
+
+#### arr.findIndex(predicate[, thisArg]) _(es5-ext/array/#/find-index)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.findindex).  
+Return first index for which given function returns true
+
+#### arr.first() _(es5-ext/array/#/first)_
+
+Returns value for first defined index
+
+#### arr.firstIndex() _(es5-ext/array/#/first-index)_
+
+Returns first declared index of the array
+
+#### arr.flatten() _(es5-ext/array/#/flatten)_
+
+Returns flattened version of the array
+
+#### arr.forEachRight(cb[, thisArg]) _(es5-ext/array/#/for-each-right)_
+
+`forEach` starting from last element
+
+#### arr.group(cb[, thisArg]) _(es5-ext/array/#/group)_
+
+Group list elements by value returned by _cb_ function
+
+#### arr.indexesOf(searchElement[, fromIndex]) _(es5-ext/array/#/indexes-of)_
+
+Returns array of all indexes of given value
+
+#### arr.intersection([…lists]) _(es5-ext/array/#/intersection)_
+
+Computes the array of values that are the intersection of all lists (context list and lists given in arguments)
+
+#### arr.isCopy(other) _(es5-ext/array/#/is-copy)_
+
+Returns true if both context and _other_ lists have same content
+
+#### arr.isUniq() _(es5-ext/array/#/is-uniq)_
+
+Returns true if all values in array are unique
+
+#### arr.keys() _(es5-ext/array/#/keys)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.prototype.keys).  
+Returns iterator object, which traverses all array indexes.
+
+#### arr.last() _(es5-ext/array/#/last)_
+
+Returns value of last defined index
+
+#### arr.lastIndex() _(es5-ext/array/#/last)_
+
+Returns last defined index of the array
+
+#### arr.map(callback[, thisArg]) _(es5-ext/array/#/map)_
+
+[_Updated with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.map).  
+ES6's version of `map`, returns array of same type as the context.
+
+#### arr.remove(value[, …valuen]) _(es5-ext/array/#/remove)_
+
+Remove values from the array
+
+#### arr.separate(sep) _(es5-ext/array/#/separate)_
+
+Returns array with items separated with `sep` value
+
+#### arr.slice(callback[, thisArg]) _(es5-ext/array/#/slice)_
+
+[_Updated with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.slice).  
+ES6's version of `slice`, returns array of same type as the context.
+
+#### arr.someRight(cb[, thisArg]) _(es5-ext/array/#/someRight)_
+
+`some` starting from last element
+
+#### arr.splice(callback[, thisArg]) _(es5-ext/array/#/splice)_
+
+[_Updated with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.splice).  
+ES6's version of `splice`, returns array of same type as the context.
+
+#### arr.uniq() _(es5-ext/array/#/uniq)_
+
+Returns duplicate-free version of the array
+
+#### arr.values() _(es5-ext/array/#/values)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.prototype.values).  
+Returns iterator object which traverses all array values.
+
+#### arr[@@iterator] _(es5-ext/array/#/@@iterator)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.prototype-@@iterator).  
+Returns iterator object which traverses all array values.
+
+### Boolean Constructor extensions
+
+#### isBoolean(x) _(es5-ext/boolean/is-boolean)_
+
+Whether value is boolean
+
+### Date Constructor extensions
+
+#### isDate(x) _(es5-ext/date/is-date)_
+
+Whether value is date instance
+
+#### validDate(x) _(es5-ext/date/valid-date)_
+
+If given object is not date throw TypeError in other case return it.
+
+### Date Prototype extensions
+
+#### date.copy(date) _(es5-ext/date/#/copy)_
+
+Returns a copy of the date object
+
+#### date.daysInMonth() _(es5-ext/date/#/days-in-month)_
+
+Returns number of days of date's month
+
+#### date.floorDay() _(es5-ext/date/#/floor-day)_
+
+Sets the date time to 00:00:00.000
+
+#### date.floorMonth() _(es5-ext/date/#/floor-month)_
+
+Sets date day to 1 and date time to 00:00:00.000
+
+#### date.floorYear() _(es5-ext/date/#/floor-year)_
+
+Sets date month to 0, day to 1 and date time to 00:00:00.000
+
+#### date.format(pattern) _(es5-ext/date/#/format)_
+
+Formats date up to given string. Supported patterns:
+
+* `%Y` - Year with century, 1999, 2003
+* `%y` - Year without century, 99, 03
+* `%m` - Month, 01..12
+* `%d` - Day of the month 01..31
+* `%H` - Hour (24-hour clock), 00..23
+* `%M` - Minute, 00..59
+* `%S` - Second, 00..59
+* `%L` - Milliseconds, 000..999
+
+### Error Constructor extensions
+
+#### custom(message/*, code, ext*/) _(es5-ext/error/custom)_
+
+Creates custom error object, optinally extended with `code` and other extension properties (provided with `ext` object)  
+
+#### isError(x) _(es5-ext/error/is-error)_
+
+Whether value is an error (instance of `Error`).  
+
+#### validError(x) _(es5-ext/error/valid-error)_
+
+If given object is not error throw TypeError in other case return it.
+
+### Error Prototype extensions
+
+#### err.throw() _(es5-ext/error/#/throw)_
+
+Throws error
+
+### Function Constructor extensions
+
+Some of the functions were inspired by [Functional JavaScript](http://osteele.com/sources/javascript/functional/) project by Olivier Steele
+
+#### constant(x) _(es5-ext/function/constant)_
+
+Returns a constant function that returns pregiven argument
+
+_k(x)(y)  =def  x_
+
+#### identity(x) _(es5-ext/function/identity)_
+
+Identity function. Returns first argument
+
+_i(x)  =def  x_
+
+#### invoke(name[, …args]) _(es5-ext/function/invoke)_
+
+Returns a function that takes an object as an argument, and applies object's
+_name_ method to arguments.  
+_name_ can be name of the method or method itself.
+
+_invoke(name, …args)(object, …args2)  =def  object\[name\]\(…args, …args2\)_
+
+#### isArguments(x) _(es5-ext/function/is-arguments)_
+
+Whether value is arguments object
+
+#### isFunction(arg) _(es5-ext/function/is-function)_
+
+Wether value is instance of function
+
+#### noop() _(es5-ext/function/noop)_
+
+No operation function
+
+#### pluck(name) _(es5-ext/function/pluck)_
+
+Returns a function that takes an object, and returns the value of its _name_
+property
+
+_pluck(name)(obj)  =def  obj[name]_
+
+#### validFunction(arg) _(es5-ext/function/valid-function)_
+
+If given object is not function throw TypeError in other case return it.
+
+### Function Prototype extensions
+
+Some of the methods were inspired by [Functional JavaScript](http://osteele.com/sources/javascript/functional/) project by Olivier Steele
+
+#### fn.compose([…fns]) _(es5-ext/function/#/compose)_
+
+Applies the functions in reverse argument-list order.
+
+_f1.compose(f2, f3, f4)(…args)  =def  f1(f2(f3(f4(…arg))))_
+
+#### fn.copy() _(es5-ext/function/#/copy)_
+
+Produces copy of given function
+
+#### fn.curry([n]) _(es5-ext/function/#/curry)_
+
+Invoking the function returned by this function only _n_ arguments are passed to the underlying function. If the underlying function is not saturated, the result is a function that passes all its arguments to the underlying function.  
+If _n_ is not provided then it defaults to context function length
+
+_f.curry(4)(arg1, arg2)(arg3)(arg4)  =def  f(arg1, args2, arg3, arg4)_
+
+#### fn.lock([…args]) _(es5-ext/function/#/lock)_
+
+Returns a function that applies the underlying function to _args_, and ignores its own arguments.
+
+_f.lock(…args)(…args2)  =def  f(…args)_
+
+_Named after it's counterpart in Google Closure_
+
+#### fn.not() _(es5-ext/function/#/not)_
+
+Returns a function that returns boolean negation of value returned by underlying function.
+
+_f.not()(…args)  =def !f(…args)_
+
+#### fn.partial([…args]) _(es5-ext/function/#/partial)_
+
+Returns a function that when called will behave like context function called with initially passed arguments. If more arguments are suplilied, they are appended to initial args.
+
+_f.partial(…args1)(…args2)  =def  f(…args1, …args2)_
+
+#### fn.spread() _(es5-ext/function/#/spread)_
+
+Returns a function that applies underlying function with first list argument
+
+_f.match()(args)  =def  f.apply(null, args)_
+
+#### fn.toStringTokens() _(es5-ext/function/#/to-string-tokens)_
+
+Serializes function into two (arguments and body) string tokens. Result is plain object with `args` and `body` properties.
+
+### Math extensions
+
+#### acosh(x) _(es5-ext/math/acosh)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.acosh).  
+
+#### asinh(x) _(es5-ext/math/asinh)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.asinh).  
+
+#### atanh(x) _(es5-ext/math/atanh)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.atanh).  
+
+#### cbrt(x) _(es5-ext/math/cbrt)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.cbrt).  
+
+#### clz32(x) _(es5-ext/math/clz32)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.clz32).  
+
+#### cosh(x) _(es5-ext/math/cosh)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.cosh).  
+
+#### expm1(x) _(es5-ext/math/expm1)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.expm1).  
+
+#### fround(x) _(es5-ext/math/fround)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.fround).  
+
+#### hypot([…values]) _(es5-ext/math/hypot)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.hypot).  
+
+#### imul(x, y) _(es5-ext/math/imul)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.imul).  
+
+#### log1p(x) _(es5-ext/math/log1p)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.log1p).  
+
+#### log2(x) _(es5-ext/math/log2)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.log2).  
+
+#### log10(x) _(es5-ext/math/log10)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.log10).  
+
+#### sign(x) _(es5-ext/math/sign)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.sign).  
+
+#### sinh(x) _(es5-ext/math/sinh)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.sinh).  
+
+#### tanh(x) _(es5-ext/math/tanh)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.tanh).  
+
+#### trunc(x) _(es5-ext/math/trunc)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.trunc).  
+
+### Number Constructor extensions
+
+#### EPSILON _(es5-ext/number/epsilon)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.epsilon).  
+
+The difference between 1 and the smallest value greater than 1 that is representable as a Number value, which is approximately 2.2204460492503130808472633361816 x 10-16.
+
+#### isFinite(x) _(es5-ext/number/is-finite)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isfinite).  
+Whether value is finite. Differs from global isNaN that it doesn't do type coercion.
+
+#### isInteger(x) _(es5-ext/number/is-integer)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isinteger).  
+Whether value is integer.
+
+#### isNaN(x) _(es5-ext/number/is-nan)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isnan).  
+Whether value is NaN. Differs from global isNaN that it doesn't do type coercion.
+
+#### isNumber(x) _(es5-ext/number/is-number)_
+
+Whether given value is number
+
+#### isSafeInteger(x) _(es5-ext/number/is-safe-integer)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.issafeinteger).  
+
+#### MAX_SAFE_INTEGER _(es5-ext/number/max-safe-integer)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.maxsafeinteger).  
+The value of Number.MAX_SAFE_INTEGER is 9007199254740991.
+
+#### MIN_SAFE_INTEGER _(es5-ext/number/min-safe-integer)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.minsafeinteger).  
+The value of Number.MIN_SAFE_INTEGER is -9007199254740991 (253-1).
+
+#### toInteger(x) _(es5-ext/number/to-integer)_
+
+Converts value to integer
+
+#### toPosInteger(x) _(es5-ext/number/to-pos-integer)_
+
+Converts value to positive integer. If provided value is less than 0, then 0 is returned
+
+#### toUint32(x) _(es5-ext/number/to-uint32)_
+
+Converts value to unsigned 32 bit integer. This type is used for array lengths.
+See: http://www.2ality.com/2012/02/js-integers.html
+
+### Number Prototype extensions
+
+#### num.pad(length[, precision]) _(es5-ext/number/#/pad)_
+
+Pad given number with zeros. Returns string
+
+### Object Constructor extensions
+
+#### assign(target, source[, …sourcen]) _(es5-ext/object/assign)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign).  
+Extend _target_ by enumerable own properties of other objects. If properties are already set on target object, they will be overwritten.
+
+#### clear(obj) _(es5-ext/object/clear)_
+
+Remove all enumerable own properties of the object
+
+#### compact(obj) _(es5-ext/object/compact)_
+
+Returns copy of the object with all enumerable properties that have no falsy values
+
+#### compare(obj1, obj2) _(es5-ext/object/compare)_
+
+Universal cross-type compare function. To be used for e.g. array sort.
+
+#### copy(obj) _(es5-ext/object/copy)_
+
+Returns copy of the object with all enumerable properties.
+
+#### copyDeep(obj) _(es5-ext/object/copy-deep)_
+
+Returns deep copy of the object with all enumerable properties.
+
+#### count(obj) _(es5-ext/object/count)_
+
+Counts number of enumerable own properties on object
+
+#### create(obj[, properties]) _(es5-ext/object/create)_
+
+`Object.create` alternative that provides workaround for [V8 issue](http://code.google.com/p/v8/issues/detail?id=2804).
+
+When `null` is provided as a prototype, it's substituted with specially prepared object that derives from Object.prototype but has all Object.prototype properties shadowed with undefined.
+
+It's quirky solution that allows us to have plain objects with no truthy properties but with turnable prototype.
+
+Use only for objects that you plan to switch prototypes of and be aware of limitations of this workaround.
+
+#### eq(x, y) _(es5-ext/object/eq)_
+
+Whether two values are equal, using [_SameValueZero_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) algorithm.
+
+#### every(obj, cb[, thisArg[, compareFn]]) _(es5-ext/object/every)_
+
+Analogous to Array.prototype.every. Returns true if every key-value pair in this object satisfies the provided testing function.  
+Optionally _compareFn_ can be provided which assures that keys are tested in given order. If provided _compareFn_ is equal to `true`, then order is alphabetical (by key).
+
+#### filter(obj, cb[, thisArg]) _(es5-ext/object/filter)_
+
+Analogous to Array.prototype.filter. Returns new object with properites for which _cb_ function returned truthy value.
+
+#### firstKey(obj) _(es5-ext/object/first-key)_
+
+Returns first enumerable key of the object, as keys are unordered by specification, it can be any key of an object.
+
+#### flatten(obj) _(es5-ext/object/flatten)_
+
+Returns new object, with flatten properties of input object
+
+_flatten({ a: { b: 1 }, c: { d: 1 } })  =def  { b: 1, d: 1 }_
+
+#### forEach(obj, cb[, thisArg[, compareFn]]) _(es5-ext/object/for-each)_
+
+Analogous to Array.prototype.forEach. Calls a function for each key-value pair found in object
+Optionally _compareFn_ can be provided which assures that properties are iterated in given order. If provided _compareFn_ is equal to `true`, then order is alphabetical (by key).
+
+#### getPropertyNames() _(es5-ext/object/get-property-names)_
+
+Get all (not just own) property names of the object
+
+#### is(x, y) _(es5-ext/object/is)_
+
+Whether two values are equal, using [_SameValue_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) algorithm.
+
+#### isArrayLike(x) _(es5-ext/object/is-array-like)_
+
+Whether object is array-like object
+
+#### isCopy(x, y) _(es5-ext/object/is-copy)_
+
+Two values are considered a copy of same value when all of their own enumerable properties have same values.
+
+#### isCopyDeep(x, y) _(es5-ext/object/is-copy-deep)_
+
+Deep comparision of objects
+
+#### isEmpty(obj) _(es5-ext/object/is-empty)_
+
+True if object doesn't have any own enumerable property
+
+#### isObject(arg) _(es5-ext/object/is-object)_
+
+Whether value is not primitive
+
+#### isPlainObject(arg) _(es5-ext/object/is-plain-object)_
+
+Whether object is plain object, its protototype should be Object.prototype and it cannot be host object.
+
+#### keyOf(obj, searchValue) _(es5-ext/object/key-of)_
+
+Search object for value
+
+#### keys(obj) _(es5-ext/object/keys)_
+
+[_Updated with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.keys).  
+ES6's version of `keys`, doesn't throw on primitive input
+
+#### map(obj, cb[, thisArg]) _(es5-ext/object/map)_
+
+Analogous to Array.prototype.map. Creates a new object with properties which values are results of calling a provided function on every key-value pair in this object.
+
+#### mapKeys(obj, cb[, thisArg]) _(es5-ext/object/map-keys)_
+
+Create new object with same values, but remapped keys
+
+#### mixin(target, source) _(es5-ext/object/mixin)_
+
+Extend _target_ by all own properties of other objects. Properties found in both objects will be overwritten (unless they're not configurable and cannot be overwritten).
+_It was for a moment part of ECMAScript 6 draft._
+
+#### mixinPrototypes(target, …source]) _(es5-ext/object/mixin-prototypes)_
+
+Extends _target_, with all source and source's prototype properties.
+Useful as an alternative for `setPrototypeOf` in environments in which it cannot be shimmed (no `__proto__` support).
+
+#### normalizeOptions(options) _(es5-ext/object/normalize-options)_
+
+Normalizes options object into flat plain object.  
+
+Useful for functions in which we either need to keep options object for future reference or need to modify it for internal use.
+
+- It never returns input `options` object back (always a copy is created)
+- `options` can be undefined in such case empty plain object is returned.
+- Copies all enumerable properties found down prototype chain.
+
+#### primitiveSet([…names]) _(es5-ext/object/primitive-set)_
+
+Creates `null` prototype based plain object, and sets on it all property names provided in arguments to true.
+
+#### safeTraverse(obj[, …names]) _(es5-ext/object/safe-traverse)_
+
+Safe navigation of object properties. See http://wiki.ecmascript.org/doku.php?id=strawman:existential_operator
+
+#### serialize(value) _(es5-ext/object/serialize)_
+
+Serialize value into string. Differs from [JSON.stringify](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) that it serializes also dates, functions and regular expresssions.
+
+#### setPrototypeOf(object, proto) _(es5-ext/object/set-prototype-of)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.setprototypeof).  
+If native version is not provided, it depends on existence of `__proto__` functionality, if it's missing, `null` instead of function is exposed.
+
+#### some(obj, cb[, thisArg[, compareFn]]) _(es5-ext/object/some)_
+
+Analogous to Array.prototype.some Returns true if any key-value pair satisfies the provided
+testing function.  
+Optionally _compareFn_ can be provided which assures that keys are tested in given order. If provided _compareFn_ is equal to `true`, then order is alphabetical (by key).
+
+#### toArray(obj[, cb[, thisArg[, compareFn]]]) _(es5-ext/object/to-array)_
+
+Creates an array of results of calling a provided function on every key-value pair in this object.  
+Optionally _compareFn_ can be provided which assures that results are added in given order. If provided _compareFn_ is equal to `true`, then order is alphabetical (by key).
+
+#### unserialize(str) _(es5-ext/object/unserialize)_
+
+Userializes value previously serialized with [serialize](#serializevalue-es5-extobjectserialize)
+
+#### validCallable(x) _(es5-ext/object/valid-callable)_
+
+If given object is not callable throw TypeError in other case return it.
+
+#### validObject(x) _(es5-ext/object/valid-object)_
+
+Throws error if given value is not an object, otherwise it is returned.
+
+#### validValue(x) _(es5-ext/object/valid-value)_
+
+Throws error if given value is `null` or `undefined`, otherwise returns value.
+
+### RegExp Constructor extensions
+
+#### escape(str) _(es5-ext/reg-exp/escape)_
+
+Escapes string to be used in regular expression
+
+#### isRegExp(x) _(es5-ext/reg-exp/is-reg-exp)_
+
+Whether object is regular expression
+
+#### validRegExp(x) _(es5-ext/reg-exp/valid-reg-exp)_
+
+If object is regular expression it is returned, otherwise TypeError is thrown.
+
+### RegExp Prototype extensions
+
+#### re.isSticky(x) _(es5-ext/reg-exp/#/is-sticky)_
+
+Whether regular expression has `sticky` flag.
+
+It's to be used as counterpart to [regExp.sticky](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-get-regexp.prototype.sticky) if it's not implemented.
+
+#### re.isUnicode(x) _(es5-ext/reg-exp/#/is-unicode)_
+
+Whether regular expression has `unicode` flag.
+
+It's to be used as counterpart to [regExp.unicode](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-get-regexp.prototype.unicode) if it's not implemented.
+
+#### re.match(string) _(es5-ext/reg-exp/#/match)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-regexp.prototype.match).  
+
+#### re.replace(string, replaceValue) _(es5-ext/reg-exp/#/replace)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-regexp.prototype.replace).  
+
+#### re.search(string) _(es5-ext/reg-exp/#/search)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-regexp.prototype.search).  
+
+#### re.split(string) _(es5-ext/reg-exp/#/search)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-regexp.prototype.split).  
+
+#### re.sticky _(es5-ext/reg-exp/#/sticky/implement)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-regexp.prototype.sticky).  
+It's a getter, so only `implement` and `is-implemented` modules are provided.
+
+#### re.unicode _(es5-ext/reg-exp/#/unicode/implement)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-regexp.prototype.unicode).  
+It's a getter, so only `implement` and `is-implemented` modules are provided.
+
+### String Constructor extensions
+
+#### formatMethod(fMap) _(es5-ext/string/format-method)_
+
+Creates format method. It's used e.g. to create `Date.prototype.format` method
+
+#### fromCodePoint([…codePoints]) _(es5-ext/string/from-code-point)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.fromcodepoint)
+
+#### isString(x) _(es5-ext/string/is-string)_
+
+Whether object is string
+
+#### randomUniq() _(es5-ext/string/random-uniq)_
+
+Returns randomly generated id, with guarantee of local uniqueness (no same id will be returned twice)
+
+#### raw(callSite[, …substitutions]) _(es5-ext/string/raw)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.raw)
+
+### String Prototype extensions
+
+#### str.at(pos) _(es5-ext/string/#/at)_
+
+_Proposed for ECMAScript 6/7 standard, but not (yet) in a draft_
+
+Returns a string at given position in Unicode-safe manner.
+Based on [implementation by Mathias Bynens](https://github.com/mathiasbynens/String.prototype.at).
+
+#### str.camelToHyphen() _(es5-ext/string/#/camel-to-hyphen)_
+
+Convert camelCase string to hyphen separated, e.g. one-two-three -> oneTwoThree.
+Useful when converting names from js property convention into filename convention.
+
+#### str.capitalize() _(es5-ext/string/#/capitalize)_
+
+Capitalize first character of a string
+
+#### str.caseInsensitiveCompare(str) _(es5-ext/string/#/case-insensitive-compare)_
+
+Case insensitive compare
+
+#### str.codePointAt(pos) _(es5-ext/string/#/code-point-at)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.prototype.codepointat)
+
+Based on [implementation by Mathias Bynens](https://github.com/mathiasbynens/String.prototype.codePointAt).
+
+#### str.contains(searchString[, position]) _(es5-ext/string/#/contains)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.prototype.contains)
+
+Whether string contains given string.
+
+#### str.endsWith(searchString[, endPosition]) _(es5-ext/string/#/ends-with)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.prototype.endswith).  
+Whether strings ends with given string
+
+#### str.hyphenToCamel() _(es5-ext/string/#/hyphen-to-camel)_
+
+Convert hyphen separated string to camelCase, e.g. one-two-three -> oneTwoThree.
+Useful when converting names from filename convention to js property name convention.
+
+#### str.indent(str[, count]) _(es5-ext/string/#/indent)_
+
+Indents each line with provided _str_ (if _count_ given then _str_ is repeated _count_ times).
+
+#### str.last() _(es5-ext/string/#/last)_
+
+Return last character
+
+#### str.normalize([form]) _(es5-ext/string/#/normalize)_
+
+[_Introduced with ECMAScript 6_](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize).  
+Returns the Unicode Normalization Form of a given string.  
+Based on Matsuza's version. Code used for integrated shim can be found at [github.com/walling/unorm](https://github.com/walling/unorm/blob/master/lib/unorm.js)
+
+#### str.pad(fill[, length]) _(es5-ext/string/#/pad)_
+
+Pad string with _fill_.
+If _length_ si given than _fill_ is reapated _length_ times.
+If _length_ is negative then pad is applied from right.
+
+#### str.repeat(n) _(es5-ext/string/#/repeat)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.prototype.repeat).  
+Repeat given string _n_ times
+
+#### str.plainReplace(search, replace) _(es5-ext/string/#/plain-replace)_
+
+Simple `replace` version. Doesn't support regular expressions. Replaces just first occurrence of search string. Doesn't support insert patterns, therefore it is safe to replace text with text obtained programmatically (there's no need for additional _$_ characters escape in such case).
+
+#### str.plainReplaceAll(search, replace) _(es5-ext/string/#/plain-replace-all)_
+
+Simple `replace` version. Doesn't support regular expressions. Replaces all occurrences of search string. Doesn't support insert patterns, therefore it is safe to replace text with text obtained programmatically (there's no need for additional _$_ characters escape in such case).
+
+#### str.startsWith(searchString[, position]) _(es5-ext/string/#/starts-with)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.prototype.startswith).  
+Whether strings starts with given string
+
+#### str[@@iterator] _(es5-ext/string/#/@@iterator)_
+
+[_Introduced with ECMAScript 6_](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.prototype-@@iterator).  
+Returns iterator object which traverses all string characters (with respect to unicode symbols)
+
+### Tests [![Build Status](https://travis-ci.org/medikoo/es5-ext.png)](https://travis-ci.org/medikoo/es5-ext)
+
+	$ npm test

+ 6 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/@@iterator/implement.js

@@ -0,0 +1,6 @@
+'use strict';
+
+if (!require('./is-implemented')()) {
+	Object.defineProperty(Array.prototype, require('es6-symbol').iterator, { value: require('./shim'),
+		configurable: true, enumerable: false, writable: true });
+}

+ 4 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/@@iterator/index.js

@@ -0,0 +1,4 @@
+'use strict';
+
+module.exports = require('./is-implemented')()
+	? Array.prototype[require('es6-symbol').iterator] : require('./shim');

+ 16 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/@@iterator/is-implemented.js

@@ -0,0 +1,16 @@
+'use strict';
+
+var iteratorSymbol = require('es6-symbol').iterator;
+
+module.exports = function () {
+	var arr = ['foo', 1], iterator, result;
+	if (typeof arr[iteratorSymbol] !== 'function') return false;
+	iterator = arr[iteratorSymbol]();
+	if (!iterator) return false;
+	if (typeof iterator.next !== 'function') return false;
+	result = iterator.next();
+	if (!result) return false;
+	if (result.value !== 'foo') return false;
+	if (result.done !== false) return false;
+	return true;
+};

+ 3 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/@@iterator/shim.js

@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('../values/shim');

+ 9 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/_compare-by-length.js

@@ -0,0 +1,9 @@
+// Used internally to sort array of lists by length
+
+'use strict';
+
+var toPosInt = require('../../number/to-pos-integer');
+
+module.exports = function (a, b) {
+	return toPosInt(a.length) - toPosInt(b.length);
+};

+ 28 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/binary-search.js

@@ -0,0 +1,28 @@
+'use strict';
+
+var toPosInt = require('../../number/to-pos-integer')
+  , callable = require('../../object/valid-callable')
+  , value    = require('../../object/valid-value')
+
+  , floor    = Math.floor;
+
+module.exports = function (compareFn) {
+	var length, low, high, middle;
+
+	value(this);
+	callable(compareFn);
+
+	length = toPosInt(this.length);
+	low = 0;
+	high = length - 1;
+
+	while (low <= high) {
+		middle = floor((low + high) / 2);
+		if (compareFn(this[middle]) < 0) high = middle - 1;
+		else low = middle + 1;
+	}
+
+	if (high < 0) return 0;
+	if (high >= length) return length - 1;
+	return high;
+};

+ 12 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/clear.js

@@ -0,0 +1,12 @@
+// Inspired by Google Closure:
+// http://closure-library.googlecode.com/svn/docs/
+// closure_goog_array_array.js.html#goog.array.clear
+
+'use strict';
+
+var value = require('../../object/valid-value');
+
+module.exports = function () {
+	value(this).length = 0;
+	return this;
+};

+ 9 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/compact.js

@@ -0,0 +1,9 @@
+// Inspired by: http://documentcloud.github.com/underscore/#compact
+
+'use strict';
+
+var filter = Array.prototype.filter;
+
+module.exports = function () {
+	return filter.call(this, function (val) { return val != null; });
+};

+ 6 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/concat/implement.js

@@ -0,0 +1,6 @@
+'use strict';
+
+if (!require('./is-implemented')()) {
+	Object.defineProperty(Array.prototype, 'concat', { value: require('./shim'),
+		configurable: true, enumerable: false, writable: true });
+}

+ 4 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/concat/index.js

@@ -0,0 +1,4 @@
+'use strict';
+
+module.exports = require('./is-implemented')() ?
+		Array.prototype.concat : require('./shim');

+ 7 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/concat/is-implemented.js

@@ -0,0 +1,7 @@
+'use strict';
+
+var SubArray = require('../../_sub-array-dummy-safe');
+
+module.exports = function () {
+	return (new SubArray()).concat('foo') instanceof SubArray;
+};

+ 39 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/concat/shim.js

@@ -0,0 +1,39 @@
+'use strict';
+
+var isPlainArray = require('../../is-plain-array')
+  , toPosInt     = require('../../../number/to-pos-integer')
+  , isObject     = require('../../../object/is-object')
+
+  , isArray = Array.isArray, concat = Array.prototype.concat
+  , forEach = Array.prototype.forEach
+
+  , isSpreadable;
+
+isSpreadable = function (value) {
+	if (!value) return false;
+	if (!isObject(value)) return false;
+	if (value['@@isConcatSpreadable'] !== undefined) {
+		return Boolean(value['@@isConcatSpreadable']);
+	}
+	return isArray(value);
+};
+
+module.exports = function (item/*, …items*/) {
+	var result;
+	if (!this || !isArray(this) || isPlainArray(this)) {
+		return concat.apply(this, arguments);
+	}
+	result = new this.constructor(this.length);
+	forEach.call(this, function (val, i) { result[i] = val; });
+	forEach.call(arguments, function (arg) {
+		var base;
+		if (isSpreadable(arg)) {
+			base = result.length;
+			result.length += toPosInt(arg.length);
+			forEach.call(arg, function (val, i) { result[base + i] = val; });
+			return;
+		}
+		result.push(arg);
+	});
+	return result;
+};

+ 7 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/contains.js

@@ -0,0 +1,7 @@
+'use strict';
+
+var indexOf = require('./e-index-of');
+
+module.exports = function (searchElement/*, position*/) {
+	return indexOf.call(this, searchElement, arguments[1]) > -1;
+};

+ 7 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/copy-within/implement.js

@@ -0,0 +1,7 @@
+'use strict';
+
+if (!require('./is-implemented')()) {
+	Object.defineProperty(Array.prototype, 'copyWithin',
+		{ value: require('./shim'), configurable: true, enumerable: false,
+			writable: true });
+}

+ 4 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/copy-within/index.js

@@ -0,0 +1,4 @@
+'use strict';
+
+module.exports = require('./is-implemented')() ?
+		Array.prototype.copyWithin : require('./shim');

+ 7 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/copy-within/is-implemented.js

@@ -0,0 +1,7 @@
+'use strict';
+
+module.exports = function () {
+	var arr = [1, 2, 3, 4, 5];
+	if (typeof arr.copyWithin !== 'function') return false;
+	return String(arr.copyWithin(1, 3)) === '1,4,5,4,5';
+};

+ 39 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/copy-within/shim.js

@@ -0,0 +1,39 @@
+// Taken from: https://github.com/paulmillr/es6-shim/
+
+'use strict';
+
+var toInteger  = require('../../../number/to-integer')
+  , toPosInt   = require('../../../number/to-pos-integer')
+  , validValue = require('../../../object/valid-value')
+
+  , hasOwnProperty = Object.prototype.hasOwnProperty
+  , max = Math.max, min = Math.min;
+
+module.exports = function (target, start/*, end*/) {
+	var o = validValue(this), end = arguments[2], l = toPosInt(o.length)
+	  , to, from, fin, count, direction;
+
+	target = toInteger(target);
+	start = toInteger(start);
+	end = (end === undefined) ? l : toInteger(end);
+
+	to = target < 0 ? max(l + target, 0) : min(target, l);
+	from = start < 0 ? max(l + start, 0) : min(start, l);
+	fin = end < 0 ? max(l + end, 0) : min(end, l);
+	count = min(fin - from, l - to);
+	direction = 1;
+
+	if ((from < to) && (to < (from + count))) {
+		direction = -1;
+		from += count - 1;
+		to += count - 1;
+	}
+	while (count > 0) {
+		if (hasOwnProperty.call(o, from)) o[to] = o[from];
+		else delete o[from];
+		from += direction;
+		to += direction;
+		count -= 1;
+	}
+	return o;
+};

+ 13 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/diff.js

@@ -0,0 +1,13 @@
+'use strict';
+
+var value    = require('../../object/valid-value')
+  , contains = require('./contains')
+
+  , filter = Array.prototype.filter;
+
+module.exports = function (other) {
+	(value(this) && value(other));
+	return filter.call(this, function (item) {
+		return !contains.call(other, item);
+	});
+};

+ 29 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/e-index-of.js

@@ -0,0 +1,29 @@
+'use strict';
+
+var toPosInt = require('../../number/to-pos-integer')
+  , value    = require('../../object/valid-value')
+
+  , indexOf = Array.prototype.indexOf
+  , hasOwnProperty = Object.prototype.hasOwnProperty
+  , abs = Math.abs, floor = Math.floor;
+
+module.exports = function (searchElement/*, fromIndex*/) {
+	var i, l, fromIndex, val;
+	if (searchElement === searchElement) { //jslint: ignore
+		return indexOf.apply(this, arguments);
+	}
+
+	l = toPosInt(value(this).length);
+	fromIndex = arguments[1];
+	if (isNaN(fromIndex)) fromIndex = 0;
+	else if (fromIndex >= 0) fromIndex = floor(fromIndex);
+	else fromIndex = toPosInt(this.length) - floor(abs(fromIndex));
+
+	for (i = fromIndex; i < l; ++i) {
+		if (hasOwnProperty.call(this, i)) {
+			val = this[i];
+			if (val !== val) return i; //jslint: ignore
+		}
+	}
+	return -1;
+};

+ 29 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/e-last-index-of.js

@@ -0,0 +1,29 @@
+'use strict';
+
+var toPosInt = require('../../number/to-pos-integer')
+  , value    = require('../../object/valid-value')
+
+  , lastIndexOf = Array.prototype.lastIndexOf
+  , hasOwnProperty = Object.prototype.hasOwnProperty
+  , abs = Math.abs, floor = Math.floor;
+
+module.exports = function (searchElement/*, fromIndex*/) {
+	var i, fromIndex, val;
+	if (searchElement === searchElement) { //jslint: ignore
+		return lastIndexOf.apply(this, arguments);
+	}
+
+	value(this);
+	fromIndex = arguments[1];
+	if (isNaN(fromIndex)) fromIndex = (toPosInt(this.length) - 1);
+	else if (fromIndex >= 0) fromIndex = floor(fromIndex);
+	else fromIndex = toPosInt(this.length) - floor(abs(fromIndex));
+
+	for (i = fromIndex; i >= 0; --i) {
+		if (hasOwnProperty.call(this, i)) {
+			val = this[i];
+			if (val !== val) return i; //jslint: ignore
+		}
+	}
+	return -1;
+};

+ 6 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/entries/implement.js

@@ -0,0 +1,6 @@
+'use strict';
+
+if (!require('./is-implemented')()) {
+	Object.defineProperty(Array.prototype, 'entries', { value: require('./shim'),
+		configurable: true, enumerable: false, writable: true });
+}

+ 4 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/entries/index.js

@@ -0,0 +1,4 @@
+'use strict';
+
+module.exports = require('./is-implemented')() ?
+		Array.prototype.entries : require('./shim');

+ 15 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/entries/is-implemented.js

@@ -0,0 +1,15 @@
+'use strict';
+
+module.exports = function () {
+	var arr = [1, 'foo'], iterator, result;
+	if (typeof arr.entries !== 'function') return false;
+	iterator = arr.entries();
+	if (!iterator) return false;
+	if (typeof iterator.next !== 'function') return false;
+	result = iterator.next();
+	if (!result || !result.value) return false;
+	if (result.value[0] !== 0) return false;
+	if (result.value[1] !== 1) return false;
+	if (result.done !== false) return false;
+	return true;
+};

+ 4 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/entries/shim.js

@@ -0,0 +1,4 @@
+'use strict';
+
+var ArrayIterator = require('es6-iterator/array');
+module.exports = function () { return new ArrayIterator(this, 'key+value'); };

+ 27 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/exclusion.js

@@ -0,0 +1,27 @@
+'use strict';
+
+var value    = require('../../object/valid-value')
+  , aFrom    = require('../from')
+  , toArray  = require('../to-array')
+  , contains = require('./contains')
+  , byLength = require('./_compare-by-length')
+
+  , filter = Array.prototype.filter, push = Array.prototype.push;
+
+module.exports = function (/*…lists*/) {
+	var lists, seen, result;
+	if (!arguments.length) return aFrom(this);
+	push.apply(lists = [this], arguments);
+	lists.forEach(value);
+	seen = [];
+	result = [];
+	lists.sort(byLength).forEach(function (list) {
+		result = result.filter(function (item) {
+			return !contains.call(list, item);
+		}).concat(filter.call(list, function (x) {
+			return !contains.call(seen, x);
+		}));
+		push.apply(seen, toArray(list));
+	});
+	return result;
+};

+ 6 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/fill/implement.js

@@ -0,0 +1,6 @@
+'use strict';
+
+if (!require('./is-implemented')()) {
+	Object.defineProperty(Array.prototype, 'fill', { value: require('./shim'),
+		configurable: true, enumerable: false, writable: true });
+}

+ 4 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/fill/index.js

@@ -0,0 +1,4 @@
+'use strict';
+
+module.exports = require('./is-implemented')() ?
+		Array.prototype.fill : require('./shim');

+ 7 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/fill/is-implemented.js

@@ -0,0 +1,7 @@
+'use strict';
+
+module.exports = function () {
+	var arr = [1, 2, 3, 4, 5, 6];
+	if (typeof arr.fill !== 'function') return false;
+	return String(arr.fill(-1, -3)) === '1,2,3,-1,-1,-1';
+};

+ 21 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/fill/shim.js

@@ -0,0 +1,21 @@
+// Taken from: https://github.com/paulmillr/es6-shim/
+
+'use strict';
+
+var toInteger  = require('../../../number/to-integer')
+  , toPosInt   = require('../../../number/to-pos-integer')
+  , validValue = require('../../../object/valid-value')
+
+  , max = Math.max, min = Math.min;
+
+module.exports = function (value/*, start, end*/) {
+	var o = validValue(this), start = arguments[1], end = arguments[2]
+	  , l = toPosInt(o.length), relativeStart, i;
+
+	start = (start === undefined) ? 0 : toInteger(start);
+	end = (end === undefined) ? l : toInteger(end);
+
+	relativeStart = start < 0 ? max(l + start, 0) : min(start, l);
+	for (i = relativeStart; i < l && i < end; ++i) o[i] = value;
+	return o;
+};

+ 6 - 0
tools/syntax/atom/qsp-package/node_modules/es5-ext/array/#/filter/implement.js

@@ -0,0 +1,6 @@
+'use strict';
+
+if (!require('./is-implemented')()) {
+	Object.defineProperty(Array.prototype, 'filter', { value: require('./shim'),
+		configurable: true, enumerable: false, writable: true });
+}

Some files were not shown because too many files changed in this diff