Display piece size in nice IEC units

Display piece size in nice IEC units

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/leighmacdonald/tranny.git/'


bamboozled

bamboozled

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Mikuia/Mikuia.git/'


a bad fix

a bad fix


kvstore test

kvstore test

error: pathspec 'test/files/32_kvstore.iced' did not match any file(s) known to git

--- test/files/32_kvstore.iced
+++ test/files/32_kvstore.iced
@@ -0,0 +1,27 @@
+
+
+stores_klasses = require('../..').kvstore
+
+stores = {}
+
+exports.init = (T,cb) ->
+  for klassname in [ "FlatMemory", "Memory"]
+    klass = stores_klasses[klassname]
+    obj = new klass()
+    stores[klassname] = obj
+    await obj.init {}, defer err
+    T.no_error err
+  cb()
+
+test_store = ({T,store,name},cb) ->
+  tester = new Tester { T, store, name }
+  await tester.test defer()
+  cb()
+
+exports.test_flat_memory = (T,cb) ->
+  await test_store { T, store : stores.FlatMemory, name : "flat_memory" }, defer()
+  cb()
+
+exports.test__memory = (T,cb) ->
+  await test_store { T, store : stores.Memory, name : "memory" }, defer()
+  cb()


add authentication to plugin http endpoint - close #61

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stevelacy/portal.git/'


fix bug: allow has blank in eq filter field.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/myroid/node-odata.git/'


Oops, extra newline.

Oops, extra newline.

--- scripts/mantra.coffee
+++ scripts/mantra.coffee
@@ -17,7 +17,7 @@
 It is by the juice of sapho that thoughts acquire speed,\n
 the lips acquire stains,\n
 the stains become a warning.\n
-It is by will alone I set my mind in motion.\n"
+It is by will alone I set my mind in motion."

 module.exports = (robot) ->
   robot.respond /(mantra)/i, (msg) ->


something weird sneaking in

something weird sneaking in

--- src/ensime-server-update-coursier.coffee
+++ src/ensime-server-update-coursier.coffee
@@ -7,41 +7,19 @@

 # Updates ensime server, invoke callback when done
 updateEnsimeServer = (tempdir, getPidLogger, failureLog) ->
+  log.info('update ensime server, tempdir: ' + tempdir)
+
   (parsedDotEnsime, ensimeServerVersion, classpathFile, whenUpdated = -> ) ->
     scalaVersion = parsedDotEnsime.scalaVersion
-    javaCmd = if(parsedDotEnsime.javaHome)
-      "#{parsedDotEnsime.javaHome}#{path.sep}bin#{path.sep}java"
-    else
-      "java"
-
+
     logPid = getPidLogger()

-    if not fs.existsSync(tempdir)
-      fs.mkdirSync(tempdir)
-
-
-
-    if fs.existsSync(tempdir + path.sep + tempdir)
-      runCoursier()
-    else
-      # """curl -L -o coursier https://git.io/vgvpD && chmod +x coursier"""
-      coursierUrl = 'https://git.io/vgvpD'
-      getCoursier = spawn('curl', ['-L', '-o', 'coursier', coursierUrl], {cwd: tempdir})
-      logPid(getCoursier)
-      getCoursier.on 'close', (exitCode) ->
-        if(exitCode == 0)
-          chmod = spawn('chmod', ['+x', 'coursier'], {cwd: tempdir})
-          logPid(chmod)
-          chmod.on 'close', (chmodExitCode) ->
-            if(chmodExitCode == 0)
-              runCoursier()
-            else
-              failure("Failed to chmod coursier", chmodExitCode)
-        else
-          failure("Failed to get Coursier", exitCode)
-
-
     runCoursier = ->
+      javaCmd = if(parsedDotEnsime.javaHome)
+        "#{parsedDotEnsime.javaHome}#{path.sep}bin#{path.sep}java"
+      else
+        "java"
+
       scalaEdition = scalaVersion.substring(0, 4)
       args =
         [
@@ -74,6 +52,32 @@
           fs.writeFile(classpathFile, classpath, whenUpdated)
         else
           failure("Ensime server update failed", exitCode)
+
+
+
+    if not fs.existsSync(tempdir)
+      fs.mkdirSync(tempdir)
+
+    if fs.existsSync(tempdir + path.sep + 'coursier')
+      runCoursier()
+    else
+      # """curl -L -o coursier https://git.io/vgvpD && chmod +x coursier"""
+      coursierUrl = 'https://git.io/vgvpD'
+      getCoursier = spawn('curl', ['-L', '-o', 'coursier', coursierUrl], {cwd: tempdir})
+      logPid(getCoursier)
+      getCoursier.on 'close', (exitCode) ->
+        if(exitCode == 0)
+          chmod = spawn('chmod', ['+x', 'coursier'], {cwd: tempdir})
+          logPid(chmod)
+          chmod.on 'close', (chmodExitCode) ->
+            if(chmodExitCode == 0)
+              runCoursier()
+            else
+              failure("Failed to chmod coursier", chmodExitCode)
+        else
+          failure("Failed to get Coursier", exitCode)
+
+

 module.exports = updateEnsimeServer


Fix to match rails.

Fix to match rails.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mightymoose/generator-acute.git/'


Minor fixes

Minor fixes

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/awanosik/wice_grid.git/'


Ensuring that fs.watch duplication does not occur

--- command.coffee
+++ command.coffee
@@ -174,9 +174,10 @@
 watch = (source, base) ->
   fs.stat source, (err, prevStats)->
     throw err if err
-    fs.watch source, callback = (event) ->
+    watcher = fs.watch source, callback = (event) ->
       if event is 'rename'
-        fs.watch source, callback
+        watcher.close()
+        watcher = fs.watch source, callback
       else if event is 'change'
         fs.stat source, (err, stats) ->
           throw err if err


moving some stuff to use Template.templateName.actions

--- client/game.coffee
+++ client/game.coffee
@@ -275,16 +275,16 @@
 # The "new game" menu
 noughts.NewGameMenu = noughts.Screen.extend
   init: ->
-    $(".nNewGameMenuCloseButton").on "click", =>
-      if noughts.state.hasPreviousState()
-        noughts.state.back(-> setStateFromPath(""))
-      else
-        noughts.state.changeState(noughts.state.INITIAL_PROMO)
-
-    $(".nUrlInviteButton").on("click",
-        _.bind(this.handleUrlInviteButtonClick_, this))
-    $(".nFacebookInviteButton").on("click",
-        _.bind(this.handleFacebookInviteButtonClick_, this))
+    Template.newGameMenu.events
+      "click .nNewGameMenuCloseButton": =>
+        if noughts.state.hasPreviousState()
+          noughts.state.back(-> setStateFromPath(""))
+        else
+          setStateFromPath("")
+      "click .nUrlInviteButton":
+          _.bind(this.handleUrlInviteButtonClick_, this)
+      "click .nFacebookInviteButton":
+          _.bind(this.handleFacebookInviteButtonClick_, this)

   onEnterState: (updateUrl) ->
     updateUrl("/new")
@@ -330,8 +330,9 @@
 # The initial promo for non-players that explains what's going on.
 noughts.InitialPromo = noughts.Screen.extend
   init: ->
-    $(".nNewGameButton").on "click", =>
-      noughts.state.changeState(noughts.state.NEW_GAME_MENU)
+    Template.newGamePromo.events
+      "click .nNewGameButton": =>
+        noughts.state.changeState(noughts.state.NEW_GAME_MENU)

   onEnterState: (updateUrl) ->
     updateUrl("/")
@@ -436,17 +437,18 @@
     noughts.melonDeferred.resolve()
   me.loader.preload(gameResources)

-# Functions to run as soon as possible on startup. Defines the state map
-# and adds a melonjs callback.
+
+noughts.state.stateMap = {
+  PLAY: new noughts.PlayScreen()
+  NEW_GAME_MENU: new noughts.NewGameMenu()
+  INITIAL_PROMO: new noughts.InitialPromo()
+  FACEBOOK_INVITE: new noughts.FacebookInviteMenu()
+  LOADING: new noughts.LoadingScreen()
+}
+
+# Functions to run as soon as possible on startup. Switches to the loading state
+# and sets up some melonjs initialization.
 Meteor.startup ->
-  noughts.state.stateMap = {
-    PLAY: new noughts.PlayScreen()
-    NEW_GAME_MENU: new noughts.NewGameMenu()
-    INITIAL_PROMO: new noughts.InitialPromo()
-    FACEBOOK_INVITE: new noughts.FacebookInviteMenu()
-    LOADING: new noughts.LoadingScreen()
-  }
-
   noughts.state.changeState(noughts.state.LOADING,
       noughts.state.UrlBehavior.PRESERVE_URL)


Dashboard integration testing file

Dashboard integration testing file

error: pathspec 'server/test/integration/dashboard_index.coffee' did not match any file(s) known to git

--- server/test/integration/dashboard_index.coffee
+++ server/test/integration/dashboard_index.coffee
@@ -0,0 +1,10 @@
+assert = require('chai').assert
+helpers = require '../helpers'
+request = require('request')
+async = require('async')
+url = require('url')
+_ = require('underscore')
+
+appurl = (path) ->
+  url.resolve('http://localhost:3001', path)
+


Get calendar events

Get calendar events

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ESWAT/ottawa.git/'


Improve Documentation

Improve Documentation

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -173,7 +173,6 @@
   # The constructor of class `Queue` stores the Redis connection and the name
   # of the queue as instance properties.
   constructor: (@redis, @name) ->
-

   # ### Function to Resolve Key Name


Shares managmenent library.

Shares managmenent library.

error: pathspec 'lib/share.coffee' did not match any file(s) known to git

--- lib/share.coffee
+++ lib/share.coffee
@@ -0,0 +1,101 @@
+machine = require './machine.coffee'
+command = require './command.coffee'
+
+###
+	* Lists folders.
+	*
+	* @param {function(?err, result)} callback
+###
+exports.list_folders = (vm, callback) ->
+	machine.info vm, (err, info) ->
+		return callback err if err
+
+		mappings = {}
+		folders = {}
+
+		for key, val of info
+			match = key.match /SharedFolder(Name|Path)(Machine|Transient)Mapping(\d+)/
+
+			continue if not match
+
+			property = match[1].toLowerCase()
+			type = match[2].toLowerCase()
+			id = match[3]
+			path = "#{type}#{id}"
+
+			folders[type] ?= {}
+
+			switch property
+				when 'name' then mappings[path] = val
+				when 'path' then folders[type][mappings[path]] = val
+
+		return callback null, folders if callback
+
+###
+	* Adds machine folder.
+	*
+	* @param {string} vm
+	* @param {string} name
+	* @param {string} path
+	* @param {boolean} readonly
+	* @param {boolean} automount
+	* @param {function(?err)} callback
+###
+exports.add_machine_folder = (vm, name, path, readonly, automount, callback) ->
+	optionals = []
+
+	optionals.push('--readonly') if readonly
+	optionals.push('--automount') if automount
+
+	command.exec 'sharedfolder', 'add', vm, '--name', name, '--hostpath', path, optionals..., (err, code, output) ->
+		return callback err if err
+		return callback new Error "cannot add machine folder #{name} on #{vm}" if code > 0
+		return do callback if callback
+
+###
+	* Removes machine folder.
+	*
+	* @param {string} vm
+	* @param {string} name
+	* @param {function(?err)} callback
+###
+exports.remove_machine_folder = (vm, name, callback) ->
+	command.exec 'sharedfolder', 'remove', vm, '--name', name, (err, code, output) ->
+		return callback err if err
+		return callback new Error "cannot remove machine folder #{name} on #{vm}" if code > 0
+		return do callback if callback
+
+###
+	* Adds transient folder.
+	*
+	* @param {string} vm
+	* @param {string} name
+	* @param {string} path
+	* @param {boolean} readonly
+	* @param {boolean} automount
+	* @param {function(?err)} callback
+###
+exports.add_transient_folder = (vm, name, path, readonly, automount, callback) ->
+	optionals = []
+
+	optionals.push('--readonly') if readonly
+	optionals.push('--automount') if automount
+
+	command.exec 'sharedfolder', 'add', vm, '--name', name, '--hostpath', path, '--transient', optionals..., (err, code, output) ->
+		return callback err if err
+		return callback new Error "cannot add transient folder #{name} on #{vm}" if code > 0
+		return do callback if callback
+
+###
+	* Removes transient folder.
+	*
+	* @param {string} vm
+	* @param {string} name
+	* @param {function(?err)} callback
+###
+exports.remove_transient_folder = (vm, name, callback) ->
+	command.exec 'sharedfolder', 'remove', vm, '--name', name, '--transient', (err, code, output) ->
+		return callback err if err
+		return callback new Error "cannot remove transient folder #{name} on #{vm}" if code > 0
+		return do callback if callback
+


Some buildSchoolGraph improvements

Some buildSchoolGraph improvements

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bsmr-x-script/codecombat.git/'


Get checks if we haven’t had data for one hour

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Arm1stice/prosu.git/'


:racehorse: Reduce stat calls when building entries

Previously every entry was stated twice to determine if it was a
file/directory and a symbolic link.

Now the second stat call is only made if lstat returns stat details
for a symbolic link.

--- src/directory.coffee
+++ src/directory.coffee
@@ -89,10 +89,10 @@
     directories = []
     files = []
     for entryPath in fs.listSync(@path)
-      if stat = fs.statSyncNoException(entryPath)
-        symlink = fs.isSymbolicLinkSync(entryPath)
-      else
-        continue
+      if stat = fs.lstatSyncNoException(entryPath)
+        symlink = stat.isSymbolicLink()
+        stat = fs.statSyncNoException(entryPath) if symlink
+      continue unless stat
       if stat.isDirectory()
         directories.push(new Directory(entryPath, symlink))
       else if stat.isFile()
@@ -110,16 +110,20 @@

       directories = []
       files = []
+      addEntry = (entryPath, stat, symlink, callback) ->
+        if stat?.isDirectory()
+          directories.push(new Directory(entryPath, symlink))
+        else if stat?.isFile()
+          files.push(new File(entryPath, symlink))
+        callback()
+
       statEntry = (entryPath, callback) ->
-        fs.stat entryPath, (error, stat) ->
-          return callback() if error?
-
-          fs.isSymbolicLink entryPath, (symlink) ->
-            if stat.isDirectory()
-              directories.push(new Directory(entryPath, symlink))
-            else if stat.isFile()
-              files.push(new File(entryPath, symlink))
-            callback()
+        fs.lstat entryPath, (error, stat) ->
+          if stat?.isSymbolicLink()
+            fs.stat entryPath, (error, stat) ->
+              addEntry(entryPath, stat, true, callback)
+          else
+            addEntry(entryPath, stat, false, callback)

       async.eachLimit entries, 1, statEntry, ->
         callback(null, directories.concat(files))


add test, demo implementation for asynchronous circular pipelines

error: pathspec 'src/tests/circular-pipelines.test.coffee' did not match any file(s) known to git

--- src/tests/circular-pipelines.test.coffee
+++ src/tests/circular-pipelines.test.coffee
@@ -0,0 +1,187 @@
+
+############################################################################################################
+CND                       = require 'cnd'
+rpr                       = CND.rpr
+badge                     = 'PIPESTREAMS/TESTS/CIRCULAR-PIPELINES'
+log                       = CND.get_logger 'plain',     badge
+info                      = CND.get_logger 'info',      badge
+whisper                   = CND.get_logger 'whisper',   badge
+alert                     = CND.get_logger 'alert',     badge
+debug                     = CND.get_logger 'debug',     badge
+warn                      = CND.get_logger 'warn',      badge
+help                      = CND.get_logger 'help',      badge
+urge                      = CND.get_logger 'urge',      badge
+echo                      = CND.echo.bind CND
+#...........................................................................................................
+PATH                      = require 'path'
+FS                        = require 'fs'
+OS                        = require 'os'
+test                      = require 'guy-test'
+#...........................................................................................................
+PS                        = require '../..'
+{ $, $async, }            = PS
+assign                    = Object.assign
+after                     = ( dts, f ) -> setTimeout f, dts * 1000
+defer                     = setImmediate
+jr                        = JSON.stringify
+copy                      = ( P... ) -> assign {}, P...
+rprx                      = ( d ) -> "#{d.sigil} #{d.key}:: #{jr d.value ? null} #{jr d.stamped ? false}"
+# echo '{ ' + ( ( name for name of require './recycle' ).sort().join '\n  ' ) + " } = require './recycle'"
+PS2                       = require '../experiments/recycle'
+{ select
+  select_all
+  stamp }                 = PS2
+
+#-----------------------------------------------------------------------------------------------------------
+provide_collatz = ->
+
+  #-----------------------------------------------------------------------------------------------------------
+  @new_number_event = ( value, other... ) ->
+    return PS2.new_single_event 'number', value, other...
+
+  #-----------------------------------------------------------------------------------------------------------
+  @is_one  = ( n ) -> n is 1
+  @is_odd  = ( n ) -> n %% 2 isnt 0
+  @is_even = ( n ) -> n %% 2 is 0
+
+  #-----------------------------------------------------------------------------------------------------------
+  @$odd_numbers = ( S ) ->
+    return $ ( d, send ) =>
+      if ( select d, '!', 'number' ) and ( not @is_one d.value ) and ( @is_odd d.value )
+        ### If data event matches condition, stamp and send it; then, send new data that has been computed
+        from the event: ###
+        send stamp d
+        send PS2.recycling ( @new_number_event ( d.value * 3 + 1 ), from: d.value )
+      else
+        ### If data event doesn't match condition, just send it on; this will implicitly include
+        any `~sync` events: ###
+        send d
+      return null
+
+  #-----------------------------------------------------------------------------------------------------------
+  @$even_numbers = ( S ) ->
+    ### Same as `$odd_numbers()`, just simplified, and with a different condition for data selection: ###
+    return $ ( d, send ) =>
+      return send d unless ( select d, '!', 'number' ) and ( @is_even d.value )
+      send stamp d
+      send PS2.recycling @new_number_event ( d.value / 2 ), from: d.value
+      return null
+
+  #-----------------------------------------------------------------------------------------------------------
+  @$skip_known = ( S ) ->
+    known = new Set()
+    return $ ( d, send ) =>
+      return send d unless select d, '!', 'number'
+      return null if known.has d.value
+      send d
+      known.add d.value
+
+  #-----------------------------------------------------------------------------------------------------------
+  @$terminate = ( S ) ->
+    return $ ( d, send ) =>
+      if ( select_all d, '!', 'number' ) and ( @is_one d.value )
+        send stamp d
+        send PS2.new_end_event()
+      else
+        send d
+      return null
+
+  #-----------------------------------------------------------------------------------------------------------
+  @$throw_on_illegal = -> PS.$watch ( d ) ->
+    if ( select_all d, '!', 'number' ) and ( type = CND.type_of d.value ) isnt 'number'
+      throw new Error "found an illegal #{type} in #{rpr d}"
+    return null
+
+  #-----------------------------------------------------------------------------------------------------------
+  @$main = ( S ) ->
+    pipeline = []
+    pipeline.push COLLATZ.$skip_known           S
+    # pipeline.push PS.$delay 0.1
+    pipeline.push COLLATZ.$even_numbers         S
+    pipeline.push COLLATZ.$odd_numbers          S
+    pipeline.push COLLATZ.$throw_on_illegal     S
+    # pipeline.push COLLATZ.$terminate            S
+    return PS.pull pipeline...
+
+  #-----------------------------------------------------------------------------------------------------------
+  return @
+COLLATZ = provide_collatz.apply {}
+
+#-----------------------------------------------------------------------------------------------------------
+$collect_numbers = ( S, handler ) ->
+  collector = null
+  return $ ( d, send ) ->
+    collector ?= []
+    if select_all d, '~', 'collect'
+      send stamp d
+      send PS2.new_event '!', 'numbers', collector
+      collector = null
+    else if select_all d, '!', 'number'
+      collector.push d.value
+    else
+      send d
+    return null
+
+#-----------------------------------------------------------------------------------------------------------
+$call_back = ( S, handler ) ->
+  collector = null
+  return PS.$watch ( d ) ->
+    if select d, '!', 'numbers'
+      collector ?= []
+      collector.push d.value
+    else if select d, '~', 'call_back'
+      handler null, collector
+      collector = null
+    return null
+
+#-----------------------------------------------------------------------------------------------------------
+new_collatz_pipeline = ( S, handler ) ->
+  S.source    = PS2.new_push_source()
+  pipeline    = []
+  #.........................................................................................................
+  pipeline.push S.source
+  pipeline.push PS2.$unwrap_recycled()
+  # pipeline.push PS.$watch ( d ) -> help '37744-4', jr d
+  # pipeline.push PS.$delay 0.25
+  pipeline.push PS.$defer()
+  pipeline.push COLLATZ.$main S
+  pipeline.push PS2.$recycle S.source.push
+  pipeline.push $collect_numbers  S
+  pipeline.push $call_back        S, handler
+  pipeline.push PS.$drain -> help 'ok'
+  PS.pull pipeline...
+  #.........................................................................................................
+  R       = ( value ) ->
+    if CND.isa_number value then  S.source.push PS2.new_event '!', 'number', value
+    else                          S.source.push value
+  R.end   = -> S.source.end()
+  return R
+
+
+#-----------------------------------------------------------------------------------------------------------
+@[ "collatz-conjecture" ] = ( T, done ) ->
+  S                   = {}
+  probes_and_matchers = [
+    [[2,3,4,5,6,7,8,9,10],[[2,1],[3,10,5,16,8,4],[],[],[6],[7,22,11,34,17,52,26,13,40,20],[],[9,28,14],[]]]
+    ]
+  #.........................................................................................................
+  for [ probe, matcher, ] in probes_and_matchers
+    handler = ( error, result ) ->
+      throw error if error?
+      help jr [ probe, result, ]
+      T.eq result, matcher
+      done()
+    #.......................................................................................................
+    send = new_collatz_pipeline S, handler
+    for n in probe
+      do ( n ) ->
+        send n
+        send PS2.new_system_event 'collect'
+    send PS2.new_system_event 'call_back'
+  #.........................................................................................................
+  return null
+
+############################################################################################################
+unless module.parent?
+  test @, { timeout: 30000, }
+


Revert "Add HubSpot origin to access control allow list"

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Start on porting rehydrate() to CoffeeScript.

error: pathspec 'src/rehydrate.coffee' did not match any file(s) known to git

--- src/rehydrate.coffee
+++ src/rehydrate.coffee
@@ -0,0 +1,96 @@
+###
+Rehydration
+
+This takes static HTML created in normal means for SEO purposes, and looks for
+elements decorated with data- properties indicating which elements should be
+reconstituted as live QuickUI controls.
+###
+
+Control::rehydrate = ->
+  subcontrols = @find("[data-control]").get()
+  if subcontrols.length > 0
+    subcontrols = subcontrols.reverse()
+    $.each subcontrols, (index, element) ->
+      rehydrateControl element
+  $controls = Control()
+  @each (index, element) ->
+    $element = Control(element)
+    $control = (if $element.data("control") then rehydrateControl(element) else $element)
+    $controls = $controls.add($control)
+
+  $controls.cast()
+
+rehydrateControl = (element) ->
+  $element = $(element)
+  className = $element.data("control")
+  return  unless className
+  $element.removeAttr "data-control"
+  controlClass = Control.getClass(className)
+  lowerCaseProperties = $.extend({}, getPropertiesFromAttributes(element), getCompoundPropertiesFromChildren(element))
+  properties = restorePropertyCase(controlClass, lowerCaseProperties)
+  $(element).control controlClass, properties
+getPropertiesFromAttributes = (element) ->
+  properties = {}
+  attributes = element.attributes
+  regexDataProperty = /^data-(.+)/
+  i = 0
+  length = attributes.length
+
+  while i < length
+    attributeName = attributes[i].name
+    match = regexDataProperty.exec(attributeName)
+    if match
+      propertyName = match[1]
+      properties[propertyName] = attributes[i].value  if propertyName isnt "control"
+    i++
+  $element = $(element)
+  for key of properties
+    $element.removeAttr "data-" + key
+  properties
+getCompoundPropertiesFromChildren = (element) ->
+  properties = {}
+  $(element).children().filter("[data-property]").each((index, element) ->
+    $element = Control(element)
+    propertyName = $element.attr("data-property")
+    if propertyName isnt "control"
+      propertyValue = $element.content()
+      properties[propertyName] = propertyValue
+      propertyValue.detach()  if propertyValue instanceof jQuery
+  ).remove()
+  properties
+restorePropertyCase = (controlClass, properties) ->
+  return properties  if $.isEmptyObject(properties)
+  map = classPropertyNameMap(controlClass)
+  result = {}
+  for propertyName of properties
+    mixedCaseName = map[propertyName.toLowerCase()]
+    result[mixedCaseName] = properties[propertyName]  if mixedCaseName
+  result
+classPropertyNameMap = (controlClass) ->
+  className = controlClass.className
+  unless propertyNameMaps[className]
+    map = {}
+    for mixedCaseName of controlClass::
+      lowerCaseName = mixedCaseName.toLowerCase()
+      map[lowerCaseName] = mixedCaseName
+    propertyNameMaps[className] = map
+  propertyNameMaps[className]
+Control.fn.rehydrate = ->
+  subcontrols = @find("[data-control]").get()
+  if subcontrols.length > 0
+    subcontrols = subcontrols.reverse()
+    $.each subcontrols, (index, element) ->
+      rehydrateControl element
+  $controls = Control()
+  @each (index, element) ->
+    $element = Control(element)
+    $control = (if $element.data("control") then rehydrateControl(element) else $element)
+    $controls = $controls.add($control)
+
+  $controls.cast()
+
+propertyNameMaps = {}
+
+jQuery ->
+  $body = Control("body")
+  $body.rehydrate()  if $body.data("create-controls")


Create nationalrail.coffee

Create nationalrail.coffee

error: pathspec 'src/scripts/nationalrail.coffee' did not match any file(s) known to git

--- src/scripts/nationalrail.coffee
+++ src/scripts/nationalrail.coffee
@@ -0,0 +1,39 @@
+# Description:
+#   Get National Rail live departure information
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   HUBOT_DEFAULT_STATION - set the default from station (nearest to your home/office)
+#
+# Commands:
+#   hubot: trains <departure station> to <arrival station>
+#   hubot: trains <arrival station>
+#   hubot: trains <departure station> to  - lists next 5 departures
+#
+# Notes:
+#   Use the station code (https://en.wikipedia.org/wiki/UK_railway_stations)
+#
+# Author:
+#  JamieMagee
+
+module.exports = (robot) ->
+  robot.respond /trains (\w{3})( (to)*(.*))*/i, (msg) ->
+    trainFrom = if !!msg.match[4] then msg.match[1].toUpperCase() else process.env.HUBOT_DEFAULT_STATION
+    trainTo =  if !!msg.match[4] then msg.match[4].toUpperCase() else msg.match[1].toUpperCase()
+    msg.http('http://ojp.nationalrail.co.uk/service/ldb/liveTrainsJson')
+      .query({departing: 'true', liveTrainsFrom: trainFrom, liveTrainsTo: trainTo})
+      .get() (err, res, body) ->
+        stuff = JSON.parse(body)
+        if stuff.trains.length
+          msg.reply "Next trains from: #{trainFrom} to #{trainTo}"
+          for key, value of stuff.trains
+            if key < 5
+              info = "#{value}".split ","
+              if !!info[4]
+                msg.send "The #{info[1]} to #{info[2]} at platform #{info[4]} is #{/[^;]*$/.exec(info[3])[0].trim().toLowerCase()}"
+              else
+                msg.send "The #{info[1]} to #{info[2]} is #{/[^;]*$/.exec(info[3])[0].trim().toLowerCase()}"
+        else
+          msg.send "I couldn't find trains from: #{trainFrom} to #{trainTo}"


Fix regression in go to line number functionality.

--- lib/fuzzy-finder-view.coffee
+++ lib/fuzzy-finder-view.coffee
@@ -65,8 +65,10 @@

   openPath: (filePath, lineNumber, searchAllPanes) ->
     if filePath
-      if not atom.workspace.getActivePane().activateItemForURI(filePath)
-          atom.workspace.open(filePath, searchAllPanes: searchAllPanes ).done => @moveToLine(lineNumber)
+      if atom.workspace.getActivePane().activateItemForURI(filePath)
+        @moveToLine(lineNumber)
+      else
+        atom.workspace.open(filePath, searchAllPanes: searchAllPanes ).done => @moveToLine(lineNumber)

   moveToLine: (lineNumber=-1) ->
     return unless lineNumber >= 0


Add requestId to deploy page title

Add requestId to deploy page title

--- SingularityUI/app/controllers/DeployDetail.coffee
+++ SingularityUI/app/controllers/DeployDetail.coffee
@@ -20,7 +20,7 @@
     healthChecks:       require '../templates/deployDetail/deployHealthChecks'

   initialize: ({@requestId, @deployId}) ->
-    @title @deployId
+    @title "#{ @requestId } deploy #{ @deployId }"

     #
     # Data stuff


clip select view (for remixing clips)

clip select view (for remixing clips)

error: pathspec 'coffee/src/views/clip_select_view.coffee' did not match any file(s) known to git

--- coffee/src/views/clip_select_view.coffee
+++ coffee/src/views/clip_select_view.coffee
@@ -0,0 +1,90 @@
+goog.provide 'acorn.player.ClipSelectView'
+
+goog.require 'acorn.player.TimeRangeInputView'
+
+
+class acorn.player.ClipSelectView extends athena.lib.View
+
+
+  className: @classNameExtend 'clip-select-view'
+
+
+  events: => _.extend super,
+    'click .clip-highlight-view': => @toggleActive true
+
+
+  defaults: => _.extend super,
+    min: 0
+    max: Infinity
+    start: undefined # defaults to min
+    end: undefined # defaults to max
+
+
+  template: _.template '''
+

+    '''
+
+
+  initialize: =>
+    super
+
+    @inputView = new acorn.player.TimeRangeInputView
+      eventhub: @eventhub
+      min: @options.min
+      max: @options.max
+      start: @options.start
+      end: @options.end
+      bounceOffset: 10
+      SliderView: acorn.player.ProgressRangeSliderView
+
+    # proxy inputView events
+    @listenTo @inputView, 'all', => @trigger arguments
+
+
+  # @listenTo @inputView, 'TimeRangeInputView:DidChangeTimes', @_adjustHighlight
+
+  destroy: =>
+    @inputView.destroy()
+    super
+
+
+  render: =>
+    super
+    @$el.empty()
+    @$el.html @template()
+    @$el.append @inputView.render().el
+    @toggleActive false
+
+    @$('.clip-highlight-view').tooltip
+      trigger: 'hover'
+      title: 'Edit Clip'
+
+    @
+
+
+  _activeClass: 'clip-select-active'
+
+
+  # when active, time input show, highlighted section hides
+  toggleActive: (active) =>
+    active ?= !@$el.hasClass @_activeClass
+    @_adjustHighlightSize()
+    if active
+      @$el.addClass @_activeClass
+      @$('.clip-highlight-view').tooltip 'hide'
+    else
+      @$el.removeClass @_activeClass
+
+
+  # use the clip sizes to adjust the highlighted section size
+  _adjustHighlightSize: =>
+    percents = @inputView._percentValues()
+    $highlight = @$('.clip-highlight-view')
+    $highlight.css 'left', percents.start + '%'
+    $highlight.css 'right', (100 - percents.end) + '%'
+    @
+
+
+  # get/setter for start and end times
+  values: =>
+    @inputView.values arguments


fix jquery incompatibility

fix jquery incompatibility

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/prognostikos/uploadcare-widget.git/'


escape regex terms for autocomplete highlight

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/patleb/admineer.git/'


Nicer code

Nicer code

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


getting ready for an improved cache

getting ready for an improved cache

error: pathspec 'src/driver/attributeMeta.coffee' did not match any file(s) known to git

--- src/driver/attributeMeta.coffee
+++ src/driver/attributeMeta.coffee
@@ -0,0 +1,87 @@
+isInterger = (n) ->
+  return n % 1 is 0
+
+repeatString = (string, times) ->
+  return '' unless times > 0
+  return new Array(times + 1).join(string)
+
+class AttributeMeta
+  constructor: ({@type}) ->
+    throw new TypeError("can not call `new AttributeMeta` directly use AttributeMeta.fromSpec instead")
+
+  _ensureType: (attributeMetaType) ->
+    if not @type
+      @type = attributeMetaType # Set the type if it is so far undefined
+      return
+    if @type isnt attributeMetaType
+      throw new TypeError("incorrect attributeMeta `type` '#{@type}' (needs to be: '#{attributeMetaType}')")
+    return
+
+  valueOf: ->
+    return {
+      @type
+    }
+
+
+class RangeAttributeMeta extends AttributeMeta
+  constructor: ({@separator, @rangeSize, @digitsBeforeDecimal, @digitsAfterDecimal}) ->
+    super(arguments[0])
+    @_ensureType('range')
+    @separator or= ';'
+    throw new TypeError('`separator` must be a non-empty string') unless typeof @separator is 'string' and @separator.length
+    throw new TypeError('`rangeSize` must be a number') unless typeof @rangeSize is 'number'
+    if @rangeSize > 1
+      throw new Error("`rangeSize` greater than 1 must be an integer") unless isInterger(@rangeSize)
+    else
+      throw new Error("`rangeSize` less than 1 must divide 1") unless isInterger(1 / @rangeSize)
+    @digitsBeforeDecimal ?= false
+    @digitsAfterDecimal ?= false
+
+  valueOf: ->
+    attributeMetaSpec = super()
+    attributeMetaSpec.separator = @separator unless @separator is ';'
+    attributeMetaSpec.rangeSize = @rangeSize
+    attributeMetaSpec.digitsBeforeDecimal = @digitsBeforeDecimal unless @digitsBeforeDecimal is false
+    attributeMetaSpec.digitsAfterDecimal = @digitsAfterDecimal unless @digitsAfterDecimal is false
+    return attributeMetaSpec
+
+  _valueToDatabase: (value) ->
+    return '' if value is null
+    value = String(value)
+    return value unless @digitsBeforeDecimal? or @digitsAfterDecimal?
+    [before, after] = value.split('.')
+    if @digitsBeforeDecimal?
+      before = repeatString('0', @digitsBeforeDecimal - before.length) + before
+
+    if after and @digitsAfterDecimal?
+      after += repeatString('0', @digitsAfterDecimal - after.length)
+
+    value = before
+    value += ".#{after}" if after
+    return value
+
+  rangeToDatabase: (range) ->
+    return null unless Array.isArray(range) and range.length is 2
+    return @_valueToDatabase(range[0]) + @separator + @_valueToDatabase(range[1])
+
+
+# Make lookup
+attributeMetaConstructorMap = {
+  range: RangeAttributeMeta
+}
+
+AttributeMeta.fromSpec = (attributeMetaSpec) ->
+  if attributeMetaSpec.size # Back compat.
+    attributeMetaSpec.rangeSize = attributeMetaSpec.size
+
+  throw new Error("unrecognizable attributeMeta") unless typeof attributeMetaSpec is 'object'
+  throw new Error("type must be defined") unless attributeMetaSpec.hasOwnProperty('type')
+  throw new Error("type must be a string") unless typeof attributeMetaSpec.type is 'string'
+  FilterConstructor = attributeMetaConstructorMap[attributeMetaSpec.type]
+  throw new Error("unsupported attributeMeta type '#{attributeMetaSpec.type}'") unless FilterConstructor
+  return new FilterConstructor(attributeMetaSpec)
+
+
+# Export!
+exports.AttributeMeta = AttributeMeta
+exports.RangeAttributeMeta = RangeAttributeMeta


Jarvis enhancements

Jarvis enhancements

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/dphaener/suburban-jarvis.git/'


Update example.coffee

Update example.coffee

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/askdkc/cb_slackbot.git/'


first draft go-away

first draft go-away

error: pathspec 'scripts/go-away.coffee' did not match any file(s) known to git

--- scripts/go-away.coffee
+++ scripts/go-away.coffee
@@ -0,0 +1,8 @@
+module.exports = (robot) ->
+  robot.respond /go away/i, (msg) ->
+    room = msg.message.user.room
+    msg.reply "OK. I'll come back later."
+    setTimeout (->
+      robot.joinRoom room
+    ), 30000
+    robot.leaveRoom room


Remove hardcoded student ui game dev play instructions

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/VilkkuV/codecombat.git/'


sneaks in fix to gene client stuck param

--- apps/gene/client.coffee
+++ apps/gene/client.coffee
@@ -99,7 +99,7 @@
   router = new FilterRouter
     params: params
     urlRoot: FILTER_ROOT
-    stuckParam: 'gene'
+    stuckParam: 'gene_id'

   Backbone.history.start pushState: true


adding scripts

adding scripts

error: pathspec 'server/api/scripts/2noddy.coffee' did not match any file(s) known to git

--- server/api/scripts/2noddy.coffee
+++ server/api/scripts/2noddy.coffee
@@ -0,0 +1,94 @@
+
+API.add 'scripts/2noddy/accounts',
+  get:
+    authRequired: 'root'
+    action: () ->
+      # clapi/accounts -> noddy/accounts
+      API.es.reindex 'clapi', 'accounts', API.es._mapping, 'noddy/accounts', false
+
+API.add 'scripts/2noddy/bebejam',
+  get:
+    authRequired: 'root'
+    action: () ->
+      # noddy_dev/bebejam_* (copy the bebejam types to live noddy) (or separate bebejam, lantern, and other services into their own indexes?)
+      for tp in API.es.types 'noddy_dev'
+        if tp.indexOf('bebejam_') isnt -1
+          API.es.reindex 'noddy_dev', tp, API.es._mapping, 'bebejam/' + tp.replace('bebejam_','')
+
+_oab_requests_sherpa = (res) ->
+  res._scripts ?= {}
+  res._scripts.sherpa ?= []
+  processed = {when: Date.now()}
+  if not res.sherpa?.color? and not res.journal and (res.url or res.doi)
+    processed.nocolour = true
+    if not res.doi and res.url and res.url.indexOf('10.') isnt -1
+      processed.nodoibuturl = true
+      chk = '10.' + res.url.split('10.')[1]
+      if chk.indexOf('/') isnt -1
+        chk = chk.replace('/','______').split('/')[0].replace('______','/')
+        if chk.indexOf('10.') is 0 and chk.indexOf('/') isnt -1 and chk.split('/').length > 1 and chk.split('/')[1].length
+          res.doi = chk
+    if res.doi
+      processed.crossref = true
+      try
+        cr = API.use.crossref.works.doi res.doi
+        if cr
+          res.journal = cr['container-title']?[0]
+          res.title ?= cr.title?[0]
+          res.author ?= cr.author
+          res.issn ?= cr.ISSN?[0]
+          res.subject ?= cr.subject
+          res.publisher ?= cr.publisher
+    if not res.journal and not res.doi and res.url
+      processed.scrape = true
+      try
+        meta = API.service.oab.scrape res.url
+        if meta
+          res.journal ?= meta.journal
+          res.keywords ?= meta.keywords
+          res.title ?= meta.title
+          res.doi ?= meta.doi
+          res.email ?= meta.email
+          res.author ?= meta.author
+          res.issn ?= meta.issn
+          res.publisher ?= meta.publisher
+  if res.journal and not res.sherpa?.color?
+    processed.sherpa = true
+    try
+      sherpa = API.use.sherpa.romeo.search {jtitle: res.journal}
+      res.sherpa = {color:sherpa.publishers[0].publisher[0].romeocolour[0]}
+  processed.found = res.sherpa?.color?
+  res._scripts.sherpa.push processed
+  return res
+
+API.add 'scripts/2noddy/oab',
+  get:
+    authRequired: 'root'
+    action: () ->
+      # reprocess oab_request
+      API.es.reindex 'oab', 'request', API.es._mapping, undefined, false, _oab_requests_sherpa
+
+      # oab_support is the same format so does not need reprocessing, but will need reindexing anyway to match new mapping
+      API.es.reindex 'oab', 'support'
+
+      # oab_history should be snapshotted and backed up, then totally wiped
+      # same with oab_availability - just add a note to stats page of how many we had before our update (7243384) (1114919 without gsot.gbv.de) (from 27/10/2016 to 05/03/2018)
+
+      # check file store capability for oabutton author request file upload
+
+      # keep indexes that have other use
+      # phd, postcode, schools, romeo, fact, devopendoar (although may just rebuild opendoar and delete the dev one at some point)
+
+      # snapshot and delete ones where a record may be useful
+      # oab, oabutton (if don't still have a snapshot of this old one)
+
+      # delete unnecessary indexes
+      # leaps, dev, devbebejam, devclapi, devleviathan, devoab, leviathan
+
+      # enable daily off-site backups of critical live indexes
+      # oab/request, oab/support, noddy/accounts, bebejam/event, bebejam/comment, bebejam/searches, lantern?, jobs?
+      # do we need any old lantern / jobs? or can we expect people just to rerun again?
+
+      # combine phd and leviathan industries and leviathan app sites into one. Combine with CL info
+
+


Create method to load locale from private

error: pathspec 'server/methods/loadLocale.coffee' did not match any file(s) known to git

--- server/methods/loadLocale.coffee
+++ server/methods/loadLocale.coffee
@@ -0,0 +1,7 @@
+Meteor.methods
+	loadLocale: (locale) ->
+		console.log "[method] loadLocale: #{locale}".green
+		try
+			return Assets.getText "moment-locales/#{locale.toLowerCase()}.js"
+		catch e
+			console.log e


Add recruiter mode

Add recruiter mode

error: pathspec 'scripts/recruit.coffee' did not match any file(s) known to git

--- scripts/recruit.coffee
+++ scripts/recruit.coffee
@@ -0,0 +1,57 @@
+# Description:
+#   gets random tweet from @erowidrecruiter
+#   based on https://github.com/github/hubot-scripts/blob/master/src/scripts/twitter.coffee
+#
+# Dependencies:
+#   "twit": "1.1.6"
+#   "underscore": "1.4.4"
+#
+# Configuration:
+#   HUBOT_TWITTER_CONSUMER_KEY
+#   HUBOT_TWITTER_CONSUMER_SECRET
+#   HUBOT_TWITTER_ACCESS_TOKEN
+#   HUBOT_TWITTER_ACCESS_TOKEN_SECRET
+#
+# Commands:
+#   hubot recruit [me] - Tries to recruit you
+#
+# Author:
+#   KevinTraver
+#
+
+_ = require "underscore"
+Twit = require "twit"
+config =
+  consumer_key: process.env.TWITTER_CONSUMER_KEY
+  consumer_secret: process.env.TWITTER_CONSUMER_SECRET
+  access_token: process.env.TWITTER_ACCESS_TOKEN_KEY
+  access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET
+
+module.exports = (robot) ->
+  twit = undefined
+
+  robot.respond /recruit( me)?/i, (msg) ->
+    unless config.consumer_key
+      msg.send "Please set the TWITTER_CONSUMER_KEY environment variable."
+      return
+    unless config.consumer_secret
+      msg.send "Please set the TWITTER_CONSUMER_SECRET environment variable."
+      return
+    unless config.access_token
+      msg.send "Please set the TWITTER_ACCESS_TOKEN environment variable."
+      return
+    unless config.access_token_secret
+      msg.send "Please set the TWITTER_ACCESS_TOKEN_SECRET environment variable."
+      return
+
+    unless twit
+      twit = new Twit config
+
+    twit.get "statuses/user_timeline",
+      screen_name: 'erowidrecruiter'
+      count: Math.floor(Math.random() * 150) + 1
+      include_rts: false
+      exclude_replies: true
+    , (err, reply) ->
+      return msg.send "Error" if err
+      return msg.send _.unescape(_.last(reply)['text']) if reply[0]['text']


Now using space and ctrl+space for navigation

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/chapelaria/readerly.git/'


If there's no real articles, do not show the alert


Group: Dashboard: remove group commented out, removed from UI

--- client/Dashboard/views/generalsettingsview.coffee
+++ client/Dashboard/views/generalsettingsview.coffee
@@ -30,22 +30,22 @@
           loader            :
             color           : "#444444"
             diameter        : 12
-        Remove              :
-          cssClass   : "modal-clean-red fr"
-          title      : "Remove this Group"
-          callback   : =>
-            modal = new GroupsDangerModalView
-              action     : 'Remove Group'
-              title      : "Remove '#{data.slug}'"
-              longAction : "remove the '#{data.slug}' group"
-              callback   : (callback)=>
-                data.remove (err)=>
-                  callback()
-                  return KD.showError err  if err
-                  new KDNotificationView title:'Successfully removed!'
-                  modal.destroy()
-                  location.replace('/')
-            , data
+        # Remove              :
+        #   cssClass   : "modal-clean-red fr"
+        #   title      : "Remove this Group"
+        #   callback   : =>
+        #     modal = new GroupsDangerModalView
+        #       action     : 'Remove Group'
+        #       title      : "Remove '#{data.slug}'"
+        #       longAction : "remove the '#{data.slug}' group"
+        #       callback   : (callback)=>
+        #         data.remove (err)=>
+        #           callback()
+        #           return KD.showError err  if err
+        #           new KDNotificationView title:'Successfully removed!'
+        #           modal.destroy()
+        #           location.replace('/')
+        #     , data
       fields:
         Logo                :
           label             : "Logo"


activity: add addmessagereply mixin

activity: add addmessagereply mixin


Add event firing and promise handler for #all().

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JoshuaToenyes/stout-core.git/'


Sync test should never again fail randomly

Signed-off-by: Peter Kröner <4b8373d016f277527198385ba72fda0feb5da015@peterkroener.de>

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/SirPepe/Pik7.git/'


remove hadlers response and responseError

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/nevech/generator-genlys.git/'


Kontrol: commented out trying to reconnect notification logging it to console.

--- client/app/lib/kite/kodingkontrol.coffee
+++ client/app/lib/kite/kodingkontrol.coffee
@@ -248,7 +248,9 @@

     return  unless show

-    @dcNotification = new KDNotificationView
-      title    : 'Trying to reconnect...'
-      type     : 'tray'
-      duration : 999999
+    console.log 'Trying to reconnect...'
+
+    # @dcNotification = new KDNotificationView
+    #   title    : 'Trying to reconnect...'
+    #   type     : 'tray'
+    #   duration : 999999


Uncommented a test

Uncommented a test

--- spec/atom/editor-spec.coffee
+++ spec/atom/editor-spec.coffee
@@ -251,7 +251,7 @@
         expect(editor.lines.find('pre:eq(1)')).toHaveText originalLine[0...6]
         expect(editor.lines.find('pre:eq(2)')).toHaveText originalLine[6..]
         expect(editor.lines.find('pre:eq(3)')).toHaveText lineBelowOriginalLine
-        # expect(editor.getPosition()).toEqual(row: 2, column: 0)
+        expect(editor.getPosition()).toEqual(row: 2, column: 0)

     describe "when the cursor is on the end of a line", ->
       it "inserts an empty line after it", ->


Forgot to add Travis.Location file

Forgot to add Travis.Location file

error: pathspec 'assets/scripts/lib/travis/location.coffee' did not match any file(s) known to git

--- assets/scripts/lib/travis/location.coffee
+++ assets/scripts/lib/travis/location.coffee
@@ -0,0 +1,12 @@
+Travis.Location = Ember.HistoryLocation.extend
+  onUpdateURL: (callback) ->
+    guid = Ember.guidFor(this)
+
+    Ember.$(window).bind 'popstate.ember-location-'+guid, (e) ->
+      callback(location.pathname + location.hash)
+
+  getURL: ->
+    location = @get('location')
+    location.pathname + location.hash
+
+Ember.Location.implementations['travis'] = Travis.Location


atom got fixed after being borked after updating the app

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/hubwub/holman-dotfiles.git/'


add atom github.cson

add atom github.cson

error: pathspec 'atom.symlink/github.cson' did not match any file(s) known to git

--- atom.symlink/github.cson
+++ atom.symlink/github.cson
@@ -0,0 +1 @@
+# Store non-visible GitHub package state.


add keymap

add keymap

error: pathspec 'atom.symlink/keymap.cson' did not match any file(s) known to git

--- atom.symlink/keymap.cson
+++ atom.symlink/keymap.cson
@@ -0,0 +1,2 @@
+'body':
+  'cmd-o v': 'rails-transporter:open-view'


SettingsPane: Remove yourself from settings pane.

--- client/ide/views/chat/settingspane.coffee
+++ client/ide/views/chat/settingspane.coffee
@@ -130,10 +130,11 @@
     @everyone.unsetClass 'loading'
     @everyone.destroySubViews()

+    nickname          = KD.nick()
     participants      = @rtm.getFromModel('participants').asArray()
     @participantViews = {}

-    for participant in participants
+    for participant in participants when participant.nickname isnt nickname
       @createParticipantView participant


Fix for non-Boolean includeFlow.

Fix for non-Boolean includeFlow.

--- app/lib/aether_utils.coffee
+++ app/lib/aether_utils.coffee
@@ -8,7 +8,7 @@
   aetherOptions =
     functionName: options.functionName
     protectAPI: not options.skipProtectAPI
-    includeFlow: options.includeFlow
+    includeFlow: Boolean options.includeFlow
     yieldConditionally: options.functionName is 'plan'
     simpleLoops: true
     globals: ['Vector', '_']


Flowdock client with listen capability

Flowdock client with listen capability

error: pathspec 'src/flowdock.coffee' did not match any file(s) known to git

--- src/flowdock.coffee
+++ src/flowdock.coffee
@@ -0,0 +1,134 @@
+https = require("https")
+querystring = require('querystring')
+events = require("events")
+
+host = ".flowdock.com"
+
+class FlowdockSocket extends process.EventEmitter
+  constructor: (@cookies, @clientId) ->
+    @ack = -1
+    @connect()
+
+  data: () ->
+    "ack": @ack,
+    "mode": "stream2"
+    "last_activity": new Date().getTime(),
+    "client": @clientId
+
+  connect: () ->
+    data = querystring.stringify(@data())
+    options =
+      host: 'www' + host
+      path: '/messages?' + data
+      method: 'GET'
+      headers:
+        'Cookie': @cookies.join("; ")
+
+    https.get options, (res) =>
+      buffer = ""
+      res.on "data", (data) =>
+        chunk = data.toString("utf8")
+        if chunk[chunk.length - 1] != "\n"
+          buffer += chunk
+          return
+
+        (buffer + chunk).split("\n").forEach (json) =>
+          if (json.length > 0)
+            message = JSON.parse(json)
+            @ack = message.id
+            @emit("message", message)
+        buffer = ""
+      res.on "end", =>
+        @connect()
+
+
+
+class Session extends process.EventEmitter
+  constructor: (@email, @password) ->
+    @clientId = (random = (length) ->
+      if length == 0
+        ''
+      else
+        chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"
+        chars.charAt(Math.floor(Math.random() * chars.length)) + random(length - 1)
+    )(16)
+    @cookies = []
+    @flows = []
+    @login(() =>
+      @flows.forEach((flow) =>
+        @subscribe(flow.subdomain, flow.name)
+      )
+    )
+
+  start: () ->
+    @socket = new FlowdockSocket(@cookies, @clientId)
+    @socket.on "message", (message) =>
+      @emit("message", message)
+
+  login: (callback) ->
+    post_data = querystring.stringify(
+      "user_session[email]": @email
+      "user_session[password]": @password
+    )
+
+    options =
+      host: 'www' + host
+      path: '/session'
+      method: 'POST'
+      headers:
+        'Content-Type': 'application/x-www-form-urlencoded',
+        'Content-Length': post_data.length
+
+    req = https.request options, (res) =>
+      @cookies = res.headers["set-cookie"].filter((cookie) ->
+        cookie.indexOf("secure; HttpOnly") > 0
+      ).map((cookie) ->
+        cookie.split(";")[0]
+      )
+      res.on "end", () =>
+        @start()
+        callback()
+
+    req.write(post_data)
+    req.end()
+
+  subscribe: (subdomain, flow) ->
+    @flows.push(
+      subdomain: subdomain
+      name: flow
+    )
+    return if @cookies.length == 0
+
+    if @flows.length == 0
+      @start()
+
+    options =
+      host: subdomain + host
+      path: '/flows/' + flow
+      headers:
+        'Cookie': @cookies.join("; ")
+
+    https.get options, (res) =>
+      res.on "end", () =>
+        post_data = querystring.stringify(
+          channel: '/meta'
+          event: 'join'
+          message: JSON.stringify(
+            channel: '/flows/' + flow
+            client: @clientId
+          )
+        )
+        options =
+          host: subdomain + host
+          path: '/messages'
+          method: 'POST'
+          headers:
+            'Content-Type': 'application/x-www-form-urlencoded',
+            'Content-Length': post_data.length
+            'Cookie': @cookies.join("; ")
+
+        req = https.request(options)
+        req.write(post_data)
+        req.end()
+
+exports.Session = Session


Look for extension specs in src/extension (more specific) and run the second

--- spec/spec-suite.coffee
+++ spec/spec-suite.coffee
@@ -1,12 +1,11 @@
 fs = require 'fs'
 require 'spec-helper'
-
-# Run extension specs
-for extensionPath in fs.listTree(require.resolve("extensions"))
-  for path in fs.listTree(fs.join(extensionPath, "spec")) when /-spec\.coffee$/.test path
-    require path

 # Run core specs
 for path in fs.listTree(require.resolve("spec")) when /-spec\.coffee$/.test path
   require path

+# Run extension specs
+for extensionPath in fs.listTree(require.resolve("src/extensions"))
+  for path in fs.listTree(fs.join(extensionPath, "spec")) when /-spec\.coffee$/.test path
+    require path


added blockwise projection

added blockwise projection

error: pathspec 'src/data/ops/blockproject.coffee' did not match any file(s) known to git

--- src/data/ops/blockproject.coffee
+++ src/data/ops/blockproject.coffee
@@ -0,0 +1,181 @@
+#<< data/table
+
+
+class data.ops.BlockProject extends data.ops.Project
+  # @param mappings list of
+  #    alias: colname | [col, col..]
+  #
+  #         if alias is a list, then f is expected to return a dictionary
+  #         with alias keys, or null if absent
+  #
+  #    f: (row) ->  |  (col, ...) ->
+  #
+  #    type: schema type     (default: schema.object)
+  #
+  #    cols: '*' | [list of col args to f ]
+  #
+  #         '*'  : f accepts row as argument (default)
+  #         [..] : f accepts a list of column values as args
+  #
+  #  for example:
+  #
+  #  1) add 10 to x:
+  #
+  #     { alias: 'x', f: (x) -> x+10, cols: 'x' }
+  #
+  constructor: (@table, @mappings, @extend=yes, @blocksize=15) ->
+    super
+
+  iterator: ->
+    @inferUnknownCols()
+
+    timer = @timer()
+    class BlockIter
+      constructor: (@schema, @table, @mappings, @blocksize) ->
+        @_blocksize = 0
+        @_blockidx = -1
+        @_rows = _.times @blocksize, () => new data.Row @schema
+        @_rowdatas = _.times @blocksize, () => null
+        @idx = -1
+        @iter = @table.iterator()
+
+      reset: ->
+        @_blocksize = 0
+        @_blockidx = -1
+        @idx = -1
+        @iter.reset()
+
+      next: ->
+        throw Error("no more elements") unless @hasNext()
+        @idx += 1
+        row = @_rows[@_blockidx]
+        @_blockidx += 1
+        row
+
+
+      hasNext: ->
+        return yes if @_blockidx != -1 and @_blockidx < @_blocksize
+        return no unless @iter.hasNext()
+
+        @_blocksize = 0
+        @_blockidx = 0
+        while @_blocksize < @_rows.length and @iter.hasNext()
+          @_rowdatas[@_blocksize] = @iter.next()
+          @_blocksize += 1
+
+        timer.start()
+        for idx in [0...@_blocksize]
+          @_rowdatas[idx] = @_rowdatas[idx].shallowClone()
+          @_rows[idx].reset()
+
+        for desc in @mappings
+          if desc.isArray
+            os = desc.blockf @_rowdatas, @_blocksize, @idx
+            for o, idx in os
+              _row = @_rows[idx]
+              for col in desc.alias
+                _row.set col, o[col]
+          else
+            vals = desc.blockf @_rowdatas, @_blocksize, @idx
+            for v, idx in vals
+              @_rows[idx].set desc.alias, v
+
+        timer.stop()
+
+        @_blockidx < @_blocksize
+
+      close: ->
+        @_rows = @_rowdatas = null
+        @iter.close()
+    return new BlockIter @schema, @table, @mappings, @blocksize
+
+
+
+
+  # ensure that the projection description has all attributes:
+  #   cols
+  #   type
+  #   f
+  #
+  # assumes alias exists
+  # Constructs optimized functions to execute projects in blocks of rows
+  # Optimizes for raw column projections (copy value over) and single argument functions
+  @normalizeMapping: (desc, schema) ->
+    if _.isString desc
+      unless schema.has desc
+        throw Error "project: #{desc} not in table w schema #{schema.cols}"
+      desc =
+        alias: desc
+        f: _.identity
+        type: schema.type desc
+        cols: desc
+        isArray: no
+        isRawCol: yes
+
+    unless desc.alias?
+      throw Error("mapping must have alias: #{desc}")
+
+    desc = _.clone desc
+    desc.cols ?= desc.col
+    desc.cols ?= '*'
+    desc.cols = _.flatten [desc.cols] unless desc.cols == '*'
+    desc.isRawCol ?= no
+    desc.type ?= data.Schema.unknown
+
+    if _.isArray desc.alias
+      if _.isArray desc.type
+        unless desc.type.lenghth == desc.alias.length
+          throw Error "alias and type lens don't match: #{desc.alias} != #{desc.type}"
+      else
+        desc.type = _.times desc.alias.length, () -> desc.type
+
+
+    if desc.cols != '*' and _.isArray desc.cols
+      if desc.isRawCol
+        colidx = schema.index desc.cols[0]
+        desc.blockf = ((f, colidx) ->
+          (rows, len, rowidx) ->
+            for idx in [0...len]
+              v = rows[idx].data[colidx]
+              v = null if v == undefined
+              v
+        )(desc.f, colidx)
+
+      else if desc.cols.length == 1
+        colidx = schema.index desc.cols[0]
+        desc.blockf = ((f, colidx) ->
+          (rows, len, rowidx) ->
+            for idx in [0...len]
+              v = rows[idx].data[colidx]
+              v = null if v == undefined
+              f v, rowidx+idx
+        )(desc.f, colidx)
+
+      else
+        colidxs = _.map desc.cols, (col) -> schema.index col
+        desc.blockf = ((f, cols, colidxs) ->
+          (rows, len, rowidx) ->
+            for idx in [0...len]
+              args = for col, colidx in cols
+                v = rows[idx].data[colidxs[colidx]]
+                v = null if v == undefined
+                v
+              args.push rowidx+idx
+              f.apply f, args
+        )(desc.f, desc.cols, colidxs)
+    else
+      desc.cols = _.clone(schema.cols)
+      desc.blockf = ((f) ->
+        (rows, len, rowidx) ->
+          for idx in [0...len]
+            f rows[idx], rowidx+idx
+      )(desc.f)
+
+    desc.isArray = _.isArray desc.alias
+    desc
+
+
+
+
+
+


remember to add fix_slugs to git

remember to add fix_slugs to git

error: pathspec 'scripts/fix_slugs.coffee' did not match any file(s) known to git

--- scripts/fix_slugs.coffee
+++ scripts/fix_slugs.coffee
@@ -0,0 +1,30 @@
+path = require 'path'
+
+_ = require 'underscore'
+Q = require 'q'
+
+{slugify, makeBreadcrumb} = require '../shared/helpers/path_helper'
+{getAlbum, saveAlbum} = require '../server/db'
+
+recursivelyFixSlugs = (album, breadcrumb) ->
+  oldPath = album.path
+  album.path = path.join _.last(breadcrumb)?.path ? '/', slugify(album.title) unless album.path == '/'
+  album.breadcrumb = breadcrumb
+
+  newBreadcrumb = makeBreadcrumb album
+
+  Q.all(album.subalbums.map (subalbum) -> getAlbum(path: subalbum.path)).then (subalbums) ->
+    Q.all(subalbums.map (subalbum) -> recursivelyFixSlugs(subalbum, newBreadcrumb)).then ->
+      album.subalbums = subalbums.map (subalbum) -> _.pick subalbum, 'path', 'title', 'thumbnail'
+      saveAlbum(album)
+
+if require.main is module
+  argv = require('optimist')
+    .options('path', alias: 'p', default: '/')
+    .argv
+
+  getAlbum(path: argv.path).then (album) ->
+    recursivelyFixSlugs album, album.breadcrumb
+  .then ->
+    process.exit()
+  .done()


radial layout

radial layout

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/core-network/client-famous.git/'


Add attempt at keep alive.

Add attempt at keep alive.

error: pathspec 'scripts/keepalive.coffee' did not match any file(s) known to git

--- scripts/keepalive.coffee
+++ scripts/keepalive.coffee
@@ -0,0 +1,27 @@
+# Description:
+#   Utility commands surrounding Hubot uptime.
+#
+# Commands:
+#   hubot stay alive - Try keep hubot alive
+
+stayingalive = false
+
+module.exports = (robot) ->
+  robot.respond /(stay alive$/i, (msg) ->
+    if stayingalive
+      msg.send 'Already staying alive.'
+    else
+      startKeepAlive msg, (text) ->
+        msg.send text
+
+stayingalive = false
+
+startKeepAlive = (msg, text) ->
+  setInterval () ->
+    http = require 'http'
+    http.get 'http://taanzbot.herokuapp.com/'
+    , (err, res, body) ->
+      console.log 'self-ping'
+  , 120000
+  stayingalive = true
+  text 'Turned on the bot-prod.'


Fixed bullet collision bug. Fixed chest timer bug.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/4eek/unknown.git/'


Added non-jQuery-like extend method

Added non-jQuery-like extend method

error: pathspec 'src/core/extend.coffee' did not match any file(s) known to git

--- src/core/extend.coffee
+++ src/core/extend.coffee
@@ -0,0 +1,11 @@
+define 'extend', ->
+
+  ###
+   Extending objects
+  ###
+  extend = (target, objects...) ->
+    for obj in objects
+      for key, value of obj
+        target[key] = value
+
+    target


Added logger stub

Added logger stub

error: pathspec 'src/core/logger.coffee' did not match any file(s) known to git

--- src/core/logger.coffee
+++ src/core/logger.coffee
@@ -0,0 +1,4 @@
+do (window = @, Elyssa = @Elyssa or= {}) ->
+  'use strict'
+
+  Elyssa.Log = {}


have a default task template

have a default task template

error: pathspec 'templates/task.coffee' did not match any file(s) known to git

--- templates/task.coffee
+++ templates/task.coffee
@@ -0,0 +1,4 @@
+module.exports =
+  description: '{{ description }}'
+  initialize: (log, config, env) ->
+    log.info ':)'


Added encounter datatype

Added encounter datatype

error: pathspec 'app/assets/javascripts/datatypes/encounter.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/datatypes/encounter.js.coffee
+++ app/assets/javascripts/datatypes/encounter.js.coffee
@@ -0,0 +1,243 @@
+###
+@namespace scoping into the CQL_QDM namespace
+###
+@CQL_QDM ||= {}
+
+
+###
+Data elements that meet criteria using this datatype should document that an
+encounter indicated by the QDM category and its corresponding value set is in
+progress. Keep in mind that when this datatype is used with timingrelationships,
+the criterion is looking for an encounter that was in progress for the time
+frame indicated by the timing relationships.
+###
+class CQL_QDM.EncounterActive
+  constructor: (@entry) ->
+    @_admissionDatetime = @entry.admitTime
+    @_dischargeDatetime = @entry.dischargeTime
+    @_facilityLocation = @entry.facility.name
+    @_facilityLocationArrivalDatetime = @entry.facility.start_time
+    @_facilityLocationDepartureDatetime =@entry.facility.end_time
+    @_reason = @entry.reason
+
+  ###
+  @returns {Date}
+  ###
+  admissionDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_admissionDatetime, 'X').toDate())
+
+  ###
+  @returns {Date}
+  ###
+  dischargeDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_dischargeDatetime, 'X').toDate())
+
+  ###
+  @returns {Code}
+  ###
+  facilityLocation: ->
+    cql.Code(@_facilityLocation.code, @_facilityLocation.code_system)
+
+  ###
+  @returns {Date}
+  ###
+  facilityLocationArrivalDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_facilityLocationArrivalDatetime, 'X').toDate())
+
+  ###
+  @returns {Date}
+  ###
+  facilityLocationDepartureDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_facilityLocationDepartureDatetime, 'X').toDate())
+
+  ###
+  @returns {Quantity}
+  ###
+  lengthOfStay: ->
+    @_lengthOfStay = @_dischargeDatetime - @admissionDatetime
+    cql.Quantity(@_dischargeDatetime['unit'], @_lengthOfStay)
+
+  ###
+  @returns {Code}
+  ###
+  reason: ->
+    cql.Code(@_reason.code, @_reason.code_system)
+
+
+###
+Data elements that meet criteria using this datatype should document that an
+order for the encounter indicated by the QDM category and its corresponding
+value set has been recommended.
+
+The start and stop datetime of
+Encounter, Order reflects the “author time” of
+the record in QRDA. This corresponds to when
+the order was signed.
+###
+class CQL_QDM.EncounterOrder
+  constructor: (@entry) ->
+    @_facilityLocation = @entry.facility.name
+    @_negationRationale = @entry.negationRationale
+    @_reason = @entry.reason
+    @_startDatetime = @entry.admitTime
+    @_stopDatetime = @entry.dischargeTime
+
+  ###
+  @returns {Code}
+  ###
+  facilityLocation: ->
+    cql.Code(@_facilityLocation.code, @_facilityLocation.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  negationRationale: ->
+    cql.Code(@_negationRationale.code, @_negationRationale.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  reason: ->
+    cql.Code(@_reason.code, @_reason.code_system)
+
+  ###
+  @returns {Date}
+  ###
+  startDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_startDatetime, 'X').toDate())
+
+  ###
+  @returns {Date}
+  ###
+  stopDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_stopDatetime, 'X').toDate())
+
+
+###
+Data elements that meet criteria using this datatype should document that the
+encounter indicated by the QDM category and its corresponding value set has
+been completed.
+###
+class CQL_QDM.EncounterPerformed
+  constructor: (@entry) ->
+    @_admissionDatetime = @entry.admitTime
+    @_diagnosis = @entry.diagnosis
+    @_dischargeDatetime = @entry.dischargeTime
+    @_dischargeStatus = @entry.dischargeDisposition
+    @_facilityLocation = @entry.facility.name
+    @_facilityLocationArrivalDatetime = @entry.facility.start_time
+    @_facilityLocationDepartureDatetime =@entry.facility.end_time
+    @_negationRationale = @entry.negationRationale
+    @_reason = @entry.reason
+    @_principalDiagnosis = @entry.principalDiagnosis
+
+  ###
+  @returns {Date}
+  ###
+  admissionDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_admissionDatetime, 'X').toDate())
+
+  ###
+  @returns {Code}
+  ###
+  diagnosis: ->
+    cql.Code(@_diagnosis.code, @_diagnosis.code_system)
+
+  ###
+  @returns {Date}
+  ###
+  dischargeDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_dischargeDatetime, 'X').toDate())
+
+  ###
+  @returns {Code}
+  ###
+  dischargeStatus: ->
+    cql.Code(@_dischargeStatus.code, @_dischargeStatus.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  facilityLocation: ->
+    cql.Code(@_facilityLocation.code, @_facilityLocation.code_system)
+
+  ###
+  @returns {Date}
+  ###
+  facilityLocationArrivalDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_facilityLocationArrivalDatetime, 'X').toDate())
+
+  ###
+  @returns {Date}
+  ###
+  facilityLocationDepartureDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_facilityLocationDepartureDatetime, 'X').toDate())
+
+  ###
+  @returns {Quantity}
+  ###
+  lengthOfStay: ->
+    @_lengthOfStay = @_dischargeDatetime - @admissionDatetime
+    cql.Quantity(@_dischargeDatetime['unit'], @_lengthOfStay)
+
+  ###
+  @returns {Code}
+  ###
+  negationRationale: ->
+    cql.Code(@_negationRationale.code, @_negationRationale.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  reason: ->
+    cql.Code(@_reason.code, @_reason.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  principalDiagnosis: ->
+    cql.Code(@_principalDiagnosis.code, @_principalDiagnosis.code_system)
+
+
+###
+Data elements that meet criteria using this datatype should document that the
+encounter indicated by the QDM category and its corresponding value set has been
+recommended.
+###
+class CQL_QDM.EncounterRecommended
+  constructor: (@entry) ->
+    @_facilityLocation = @entry.facility.name
+    @_negationRationale = @entry.negationRationale
+    @_reason = @entry.reason
+    @_startDatetime = @entry.admitTime
+    @_stopDatetime = @entry.dischargeTime
+
+  ###
+  @returns {Code}
+  ###
+  facilityLocation: ->
+    cql.Code(@_facilityLocation.code, @_facilityLocation.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  negationRationale: ->
+    cql.Code(@_negationRationale.code, @_negationRationale.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  reason: ->
+    cql.Code(@_reason.code, @_reason.code_system)
+
+  ###
+  @returns {Date}
+  ###
+  startDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_startDatetime, 'X').toDate())
+
+  ###
+  @returns {Date}
+  ###
+  stopDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_stopDatetime, 'X').toDate())


Translating Multiplayer lines

Translating Multiplayer lines

Ok, I tried to translate in italian some lines ;) hope this helps.

--- app/locale/it.coffee
+++ app/locale/it.coffee
@@ -523,19 +523,19 @@
 #    summary_losses: " Losses"
 #    rank_no_code: "No New Code to Rank"
 #    rank_my_game: "Rank My Game!"
-#    rank_submitting: "Submitting..."
-#    rank_submitted: "Submitted for Ranking"
-#    rank_failed: "Failed to Rank"
-#    rank_being_ranked: "Game Being Ranked"
-#    code_being_simulated: "Your new code is being simulated by other players for ranking. This will refresh as new matches come in."
-#    no_ranked_matches_pre: "No ranked matches for the "
-#    no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked."
-#    choose_opponent: "Choose an Opponent"
-#    tutorial_play: "Play Tutorial"
-#    tutorial_recommended: "Recommended if you've never played before"
-#    tutorial_skip: "Skip Tutorial"
-#    tutorial_not_sure: "Not sure what's going on?"
-#    tutorial_play_first: "Play the Tutorial first."
+#    rank_submitting: "Inviando..."
+#    rank_submitted: "Inviato per essere Valutato"
+#    rank_failed: "Impossibile Valutare"
+#    rank_being_ranked: "Il Gioco è stato Valutato"
+#    code_being_simulated: "Il tuo nuovo codice sarà simulato da altri giocatori per essere valutato. Sarà aggiornato ad ogni nuova partita."
+#    no_ranked_matches_pre: "Nessuna partita valutata per "
+#    no_ranked_matches_post: " squadra! Gioca contro altri avversari e poi torna qui affinchè la tua partita venga valutata."
+#    choose_opponent: "Scegli un avversario"
+#    tutorial_play: "Gioca il Tutorial"
+#    tutorial_recommended: "Consigliato se questa è la tua primissima partita"
+#    tutorial_skip: "Salta il Tutorial"
+#    tutorial_not_sure: "Non sei sicuro di quello che sta accadendo?"
+#    tutorial_play_first: "Prima di tutto gioca al Tutorial."
 #    simple_ai: "Simple AI"
 #    warmup: "Warmup"
 #    vs: "VS"


fix bug with editing HTML. The save() method should now return a dictionary, not a string

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bmedx/modulestore.git/'


add context module

add context module

--- apps/home/components/top_rail/view.coffee
+++ apps/home/components/top_rail/view.coffee
@@ -22,6 +22,7 @@
       artworkCollection: @savedArtworks
       model: artwork
       context_page: 'Home page'
+      context_module: 'Home top rail module'

   syncArtworks: ->
     @user?.initializeDefaultArtworkCollection()


Migrate hubu-utils to CoffeeScript

Migrate hubu-utils to CoffeeScript

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/nanoko-project/h-ubu.git/'


fixed globs

fixed globs

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/avishnyak/generator-turnslift-addon.git/'


Added script to list item levels of members of Such Tilt using battle.net WoW API

error: pathspec 'scripts/ilvl.coffee' did not match any file(s) known to git

--- scripts/ilvl.coffee
+++ scripts/ilvl.coffee
@@ -0,0 +1,46 @@
+module.exports = (robot) ->
+  @key     = process.env.HUBOT_WOW_API_KEY
+  @locale  = "en_us"
+  @realm   = "Azuremyst"
+  @guild   = "Such Tilt"
+  @baseURL = "https://us.api.battle.net/wow/"
+
+  robot.respond /(suchtilt)( me)?/i, (msg) ->
+    getRoster(msg)
+
+  # HTTP GET guild roster
+  getRoster = (msg) ->
+    msg
+    .http(baseURL + "guild/" + realm + "/" + guild)
+    .query
+      fields: "members"
+      locale: locale
+      apikey: key
+    .get() (err, res, body) ->
+      resp = ""
+      members = JSON.parse(body).members
+      if members.error
+        members.error.errors.forEach (err) ->
+        resp += err.message
+        return resp
+      else
+        getILvl(msg, member) for member in members
+
+  # HTTP GET item level of a character
+  getILvl = (msg, member) ->
+    msg
+      .http(baseURL + "character/" + realm + "/" + member.character.name)
+      .query
+        fields: "items"
+        locale: locale
+        apikey: key
+      .get() (err, res, body) ->
+        resp = ""
+        ilvl = JSON.parse(body).items.averageItemLevel
+        charData = member.character.name + ": " + ilvl + "\r\n"
+        if ilvl.error
+          ilvl.error.errors.forEach (err) ->
+          resp += err.message
+          return resp
+        else
+          msg.send charData


add recoverhandlerhelper file

add recoverhandlerhelper file

error: pathspec 'servers/testhelper/recoverhandlerhelper.coffee' did not match any file(s) known to git

--- servers/testhelper/recoverhandlerhelper.coffee
+++ servers/testhelper/recoverhandlerhelper.coffee
@@ -0,0 +1,45 @@
+querystring = require 'querystring'
+
+{ generateUrl
+  deepObjectExtend
+  generateRandomEmail
+  generateRandomString
+  generateDefaultRequestParams } = require './index'
+
+
+defaultExpiryPeriod = 5 * 60 * 1000 # 5 minutes
+
+
+generateRecoverRequestBody = (opts = {}) ->
+
+    defaultBodyObject =
+      email : ''
+
+    deepObjectExtend defaultBodyObject, opts
+
+    return defaultBodyObject
+
+
+generateRecoverRequestParams = (opts = {}) ->
+
+  email = opts?.body?.email or generateRandomEmail()
+
+  url  = generateUrl
+    route : "#{encodeURIComponent email}/Recover"
+
+  body = generateRecoverRequestBody()
+
+  params               = { url, body }
+  defaultRequestParams = generateDefaultRequestParams params
+  requestParams        = deepObjectExtend defaultRequestParams, opts
+  # after deep extending object, encodes body param to a query string
+  requestParams.body   = querystring.stringify requestParams.body
+
+  return requestParams
+
+
+module.exports = {
+  defaultExpiryPeriod
+  generateRecoverRequestBody
+  generateRecoverRequestParams
+}


Cleaning up datastream a bit.

Cleaning up datastream a bit.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/damianb/crimson.git/'


Added linked accounts profile feature.

Added linked accounts profile feature.

error: pathspec 'app/assets/javascripts/app/controllers/_profile/linked_accounts.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/app/controllers/_profile/linked_accounts.js.coffee
+++ app/assets/javascripts/app/controllers/_profile/linked_accounts.js.coffee
@@ -0,0 +1,77 @@
+class App.ProfileLinkedAccounts extends App.Controller
+  events:
+    'click [data-type="remove"]': 'remove'
+
+  constructor: ->
+    super
+    return if !@authenticate()
+    @render()
+
+  render: =>
+    auth_provider_all = {
+      facebook: {
+        key:    'facebook'
+        url:    '/auth/facebook',
+        name:   'Facebook',
+        config: 'auth_facebook',
+      },
+      twitter: {
+        key:    'twitter'
+        url:    '/auth/twitter',
+        name:   'Twitter',
+        config: 'auth_twitter',
+      },
+      linkedin: {
+        key:    'linkedin'
+        url:    '/auth/linkedin',
+        name:   'LinkedIn',
+        config: 'auth_linkedin',
+      },
+      google_oauth2: {
+        key:    'google_oauth2'
+        url:    '/auth/google_oauth2',
+        name:   'Google',
+        config: 'auth_google_oauth2',
+      },
+    }
+    auth_providers = []
+    for key, provider of auth_provider_all
+      if @Config.get( provider.config ) is true || @Config.get( provider.config ) is "true"
+        auth_providers.push provider
+
+    @html App.view('profile/linked_accounts')(
+      user:           App.Session.all()
+      auth_providers: auth_providers
+    )
+
+  remove: (e) =>
+    e.preventDefault()
+    provider = $(e.target).data('provider')
+    uid      = $(e.target).data('uid')
+
+    # get data
+    App.Com.ajax(
+      id:   'account'
+      type: 'DELETE'
+      url:  'api/users/account'
+      data: JSON.stringify({ provider: provider, uid: uid })
+      processData: true
+      success: @success
+      error:   @error
+    )
+
+  success: (data, status, xhr) =>
+    App.Auth.loginCheck()
+    @render()
+    @notify(
+      type: 'success'
+      msg:  App.i18n.translateContent( 'Successfully!' )
+    )
+
+  error: (xhr, status, error) =>
+    @render()
+    data = JSON.parse( xhr.responseText )
+    @notify(
+      type: 'error'
+      msg:  App.i18n.translateContent( data.message )
+    )


Basic ssl tester coffee script

Basic ssl tester coffee script

error: pathspec 'src/scripts/ssltester.coffee' did not match any file(s) known to git

--- src/scripts/ssltester.coffee
+++ src/scripts/ssltester.coffee
@@ -0,0 +1,24 @@
+# Description:
+#   Lookup SSL/TLS information for a given website.
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot ssl - Looks up some SSL configuration information.
+#
+# Author:
+#   Matt Johansen (@mattjay)
+
+module.exports = (robot) ->
+  robot.respond /ssl (.*)/i, (msg) ->
+
+    url = msg.match[1].toLowerCase()
+    lookup_url = "https://www.ssllabs.com/ssltest/analyze.html?d=#{encodeURIComponent(url)}&hideResults=on"
+
+    msg.send "SSL Tester: #{lookup_url}"
+
+# TODO: actually send a request and parse out some useful info to dump into the chat. Potentially use Rhodey.


suppress author

suppress author

--- chrome/content/zotero-better-bibtex/cayw.coffee
+++ chrome/content/zotero-better-bibtex/cayw.coffee
@@ -139,7 +139,8 @@
           item.prefix ?= ''
           item.suffix ?= ''
           label = (part for part in [item.item.firstCreator, Zotero.Date.strToDate(item.item.getField('date')).year] when part).join(' ')
-          citation.push("{ #{item.prefix} | #{label} | #{locator} | #{item.suffix} | #{id} }")
+          label = "-#{label}" if item['suppress-author']
+          citation.push("{#{item.prefix}|#{label}|#{locator}|#{item.suffix}|#{id}}")
         citation = citation.join('')

       else


Fixed bug allowing certain states to be accessed without sign-in

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lukehorvat/angular-embryo.git/'


Tab :lipstick:

Tab :lipstick:

--- src/packages/tabs/src/tab.coffee
+++ src/packages/tabs/src/tab.coffee
@@ -8,23 +8,16 @@
       @span class: 'close-icon'

   initialize: (@editSession) ->
+    @buffer = @editSession.buffer
+    @subscribe @buffer, 'path-change', => @updateFileName()
+    @subscribe @buffer, 'contents-modified', => @updateModifiedStatus()
+    @subscribe @buffer, 'after-save', => @updateModifiedStatus()
+    @subscribe @buffer, 'git-status-change', => @updateModifiedStatus()
     @updateFileName()
-    @editSession.on 'buffer-path-change.tab', =>
-      @updateFileName()
-    @subscribeToBuffer()
+    @updateModifiedStatus()

-  updateTab: ->
-    @updateBufferHasModifiedText(@buffer.isModified())
-
-  subscribeToBuffer: ->
-    @buffer = @editSession.buffer
-    @subscribe @buffer, 'contents-modified.tabs', (e) => @updateBufferHasModifiedText(e.differsFromDisk)
-    @subscribe @buffer, 'after-save.tabs', => @updateTab()
-    @subscribe @buffer, 'git-status-change.tabs', => @updateTab()
-    @updateTab()
-
-  updateBufferHasModifiedText: (differsFromDisk) ->
-    if differsFromDisk
+  updateModifiedStatus: ->
+    if @buffer.isModified()
       @toggleClass('file-modified') unless @isModified
       @isModified = true
     else


Use shift in the example rather than explaining the difference

--- dot-atom/keymap.cson
+++ dot-atom/keymap.cson
@@ -13,10 +13,8 @@
 #   'enter': 'editor:newline'
 #
 # '.workspace':
-#   'ctrl-P': 'core:move-up'
+#   'ctrl-shift-p': 'core:move-up'
 #   'ctrl-p': 'core:move-down'
-#
-# In the example above, 'ctrl-P' is equivalent to 'ctrl-shift-p'.
 #
 # You can find more information about keymaps in these guides:
 # * https://atom.io/docs/latest/customizing-atom#customizing-key-bindings


unnecessary code

unnecessary code

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/codesteam/uranium-ui.git/'


Add more config file items to File menu

Add more config file items to File menu

--- menus/win32.cson
+++ menus/win32.cson
@@ -9,6 +9,11 @@
       { label: 'Reopen Last &Item', command: 'pane:reopen-closed-item' }
       { type: 'separator' }
       { label: 'Se&ttings', command: 'application:show-settings' }
+      { label: 'Open Your Config', command: 'application:open-your-config' }
+      { label: 'Open Your Init Script', command: 'application:open-your-init-script' }
+      { label: 'Open Your Keymap', command: 'application:open-your-keymap' }
+      { label: 'Open Your Snippets', command: 'application:open-your-snippets' }
+      { label: 'Open Your Stylesheet', command: 'application:open-your-stylesheet' }
       { type: 'separator' }
       { label: '&Save', command: 'core:save' }
       { label: 'Save &As...', command: 'core:save-as' }


Fallback label for GA

Fallback label for GA

--- lib/analytics.coffee
+++ lib/analytics.coffee
@@ -89,28 +89,35 @@
       # Don't track admins
       return if sd.CURRENT_USER?.type is 'Admin'

-      # Format and Send mixpanel event
+      # Setup options
+      defaults =
+        queryString: window?.location.search
+        page: window?.location.pathname
+        referrer: document?.referrer
+        collector_level: sd.CURRENT_USER?.collector_level
+        user_id: sd.CURRENT_USER?.id
+        lab_features: sd.CURRENT_USER?.lab_features
+
+      _.defaults options, defaults
+
+      # Format and send Mixpanel event
       unless typeof mixpanel is 'undefined'
         options.category = categories[kind] or categories.other

-        _.defaults options,
-          queryString: window?.location.search
-          page: window?.location.pathname
-          referrer: document?.referrer
-          collector_level: sd.CURRENT_USER?.collector_level
-          user_id: sd.CURRENT_USER?.id
-          lab_features: sd.CURRENT_USER?.lab_features
-
         mixpanel.track? description, options

-      # Send google analytics event
-      ga? 'send', {
+      # Format and send Google Analytics event
+      label = options.label or
+        # Stringify any custom options as a fallback label
+        JSON.stringify(_.omit(options, _.flatten([_.keys(defaults), 'category', 'token'])))
+
+      ga? 'send',
         hitType: 'event'
         eventCategory: options.category
         eventAction: description
-        eventLabel: options.label
+        eventLabel: label
         nonInteraction: (if options.category in ['Funnel Progressions', 'Impressions', 'Timing'] then 1 else 0)
-      }
+
     memo
   , {})


:memo: Remove empty deprecated comments

:memo: Remove empty deprecated comments

--- src/text-editor-component.coffee
+++ src/text-editor-component.coffee
@@ -782,12 +782,10 @@
     @rootElement.classList.toggle('mini', @editor.isMini())

 if grim.includeDeprecatedAPIs
-  # Deprecated
   TextEditorComponent::setInvisibles = (invisibles={}) ->
     grim.deprecate "Use config.set('editor.invisibles', invisibles) instead"
     atom.config.set('editor.invisibles', invisibles)

-  # Deprecated
   TextEditorComponent::setShowInvisibles = (showInvisibles) ->
     grim.deprecate "Use config.set('editor.showInvisibles', showInvisibles) instead"
     atom.config.set('editor.showInvisibles', showInvisibles)


[Gutter] Create dedicated `lineNumberGutter` state

--- src/text-editor-presenter.coffee
+++ src/text-editor-presenter.coffee
@@ -216,6 +216,8 @@
     # Shared state that is copied into ``@state.gutters`.
     @sharedGutterStyles = {}
     @customGutterDecorations = {}
+    @lineNumberGutter =
+      lineNumbers: {}

     @updateState()

@@ -416,7 +418,7 @@
     return

   updateLineNumberGutterState: ->
-    @state.gutters.lineNumberGutter.maxLineNumberDigits = @model.getLineCount().toString().length
+    @lineNumberGutter.maxLineNumberDigits = @model.getLineCount().toString().length

   updateCommonGutterState: ->
     @sharedGutterStyles.backgroundColor = if @gutterBackgroundColor isnt "rgba(0, 0, 0, 0)"
@@ -459,6 +461,7 @@
         styles: @sharedGutterStyles
       })
     @state.gutters.customDecorations = @customGutterDecorations # TODO jssln Remove
+    @state.gutters.lineNumberGutter = @lineNumberGutter # TODO jssln Remove

   # Updates the decoration state for the gutter with the given gutterName.
   # @customGutterDecorations is an {Object}, with the form:
@@ -546,7 +549,7 @@
         decorationClasses = @lineNumberDecorationClassesForRow(screenRow)
         foldable = @model.isFoldableAtScreenRow(screenRow)

-        @state.gutters.lineNumberGutter.lineNumbers[id] = {screenRow, bufferRow, softWrapped, top, decorationClasses, foldable}
+        @lineNumberGutter.lineNumbers[id] = {screenRow, bufferRow, softWrapped, top, decorationClasses, foldable}
         visibleLineNumberIds[id] = true

     if @mouseWheelScreenRow?
@@ -556,8 +559,8 @@
       id += '-' + wrapCount if wrapCount > 0
       visibleLineNumberIds[id] = true

-    for id of @state.gutters.lineNumberGutter.lineNumbers
-      delete @state.gutters.lineNumberGutter.lineNumbers[id] unless visibleLineNumberIds[id]
+    for id of @lineNumberGutter.lineNumbers
+      delete @lineNumberGutter.lineNumbers[id] unless visibleLineNumberIds[id]

     return


Remove newline

Remove newline

--- src/text-editor-presenter.coffee
+++ src/text-editor-presenter.coffee
@@ -567,7 +567,6 @@
       @verticalScrollbarWidth = verticalScrollbarWidth
       @updateClientWidth()

-
   lineDecorationClassesForRow: (row) ->
     return null if @model.isMini()


UnCSS ignores

UnCSS ignores

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Drawer/Pluff.git/'


Don't use deprecated atom.config.toggle

Don't use deprecated atom.config.toggle

--- src/workspace-element.coffee
+++ src/workspace-element.coffee
@@ -156,9 +156,9 @@
   'window:focus-pane-on-left': -> @focusPaneViewOnLeft()
   'window:focus-pane-on-right': -> @focusPaneViewOnRight()
   'window:save-all': -> @getModel().saveAll()
-  'window:toggle-invisibles': -> atom.config.toggle("editor.showInvisibles")
+  'window:toggle-invisibles': -> atom.config.set("editor.showInvisibles", !atom.config.get("editor.showInvisibles"))
   'window:log-deprecation-warnings': -> Grim.logDeprecations()
-  'window:toggle-auto-indent': -> atom.config.toggle("editor.autoIndent")
+  'window:toggle-auto-indent': -> atom.config.set("editor.autoIndent", !atom.config.get("editor.autoIndent"))
   'pane:reopen-closed-item': -> @getModel().reopenItem()
   'core:close': -> @getModel().destroyActivePaneItemOrEmptyPane()
   'core:save': -> @getModel().saveActivePaneItem()


make logging more readable

make logging more readable


beginning of a test implementation of the compiled file using zombiejs

error: pathspec 'test/main.coffee' did not match any file(s) known to git

--- test/main.coffee
+++ test/main.coffee
@@ -0,0 +1,74 @@
+zombie = require 'zombie'
+assert = require 'assert'
+fs = require 'fs'
+utils = require './../src/utils' #hook in to this
+modul8 = require './../index.js' #public interface
+dir = __dirname
+
+
+
+makeBranch1 = (num) ->
+  for i in [0...num]
+    l = []
+    l.push "var a = "+ if i is num-1 then "{chain: true}" else "require('./#{i+1}')"+";"
+    l.push "exports.chain = a.chain;"
+    fs.writeFileSync(dir+'/input/app/branch1/'+i+'.js', l.join('\n'))
+
+makeBranch2 = (num) ->
+  for i in [0...num]
+    l = []
+    l.push "var a = "+ if i is num-1 then "{chain: true}" else "require('./#{i+1}')"+";"
+    l.push "var b = "+ if Math.floor(num/2) is i then "require('./../branch1/#{i}.js')" else "{chain: true}" +";"
+    l.push "exports.chain = a.chain && b.chain;"
+    fs.writeFileSync(dir+'/input/app/branch2/'+i+'.js', l.join('\n'))
+
+makeSharedBranches = (num) ->
+  for i in [0...num]
+    l = []
+    l.push "var a = "+ if i is num-1 then "{chain: true}" else "require('./#{i+1}')"+";"
+    l.push "exports.chain = a.chain;"
+    fs.writeFileSync(dir+'/input/shared/'+i+'.js', l.join('\n'))
+
+    j = []
+    j.push "var a = "+ if i is num-1 then "{chain: true}" else "require('./#{i+1}')"+";"
+    j.push "exports.chain = a.chain;"
+    fs.writeFileSync(dir+'/input/shared/branch1/'+i+'.js', l.join('\n')) # to test priority of app domain vs shared domain
+
+createEntry = (num, graph1, graph2) -> # can specify start points in branches
+  l = []
+  l.push "exports.branch1 = require('#{graph1}');"
+  l.push "exports.branch2 = require('#{graph2}');"
+  l.push "exports.shared = require('shared::0')"
+  l.push "exports.sharedbranch1 = require('shared::branch1/0')"
+  fs.writeFileSync(dir+'/input/app/entry.js', l.join('\n'))
+
+
+createExampleApp = (size) ->
+  #overwrite files in the branch directories (overwriting with a different size is fine!)
+  makeBranch1(size)
+  makeBranch2(size)
+  makeSharedBranches(size)
+  createEntry(size, 'branch1/0', 'branch2/0')
+  modul8('entry.js')
+    .set('domloader', (a) -> (a)) # dont test jQuery functionality here
+    .analysis().output(console.log)
+    .domains()
+      .add('app', dir+'/input/app/')
+      .add('shared', dir+'/input/shared/')
+    .compile(dir+'/output/output.js')
+
+
+verifyRequireValidity = (reqType) ->
+  #createInputExample(5)
+  browser = new zombie.Browser(debug: true)
+  browser.visit 'file:///'+dir+"/output/empty.html", (err, browser, status) ->
+    throw err if err
+    console.log("Successfully started a blank zombie visit") #browser.html()
+    code = utils.compile('./output/output.js')
+    evalRes = browser.evaluate(code) # should not return anything if successful
+
+
+
+if module is require.main
+  createExampleApp(5)
+  verifyRequireValidity()


Addition of 3 TinyMCE plugins

Addition of 3 TinyMCE plugins

The following plugins added to toolbar in Edit of Unit:
 - fontselect
 - forecolor
 - image