add shorthand tests

add shorthand tests

error: pathspec 'h2o-web/src/main/steam/tools/shorthand/test.coffee' did not match any file(s) known to git

--- h2o-web/src/main/steam/tools/shorthand/test.coffee
+++ h2o-web/src/main/steam/tools/shorthand/test.coffee
@@ -0,0 +1,310 @@
+test = require 'tape'
+coffee = require 'coffee-script'
+shorthand = require './shorthand.coffee'
+
+symbols =
+  # qualification
+  round: type: 'qualify', object: 'Math'
+  PI: type: 'qualify', object: 'Math'
+  rotate: type: 'qualify', object: 'context'
+  transform: type: 'qualify', object: 'context', property: 'setTransform'
+  fillStyle: type: 'qualify', object: 'context'
+  canvas: type: 'qualify', object: 'context', property: 'domElement'
+  debug: type: 'qualify', object: 'console'
+  rect$0: type: 'qualify', object: 'routines', property: 'drawPixel'
+  rect$1: type: 'qualify', object: 'routines', property: 'drawSquare'
+  rect$2: type: 'qualify', object: 'routines', property: 'drawBox'
+  rect$4: type: 'qualify', object: 'routines', property: 'drawRect'
+  rect: type: 'qualify', object: 'routines', property: 'drawPolygon'
+  # invocation
+  push: type: 'invoke'
+  shift: type: 'invoke'
+  dataOf: type: 'invoke', property: 'toDataURL'
+  contextOf: type: 'invoke', property: 'getContext'
+
+
+diag = (lines) ->
+  for line in lines.split /\n/g
+    console.log '# ' + line
+  return
+
+gold = '''
+require() is variadic
+---
+require 'context', 'console'
+rotate debug
+---
+context.rotate(console.debug);
+===
+
+Does not affect qualified require()
+---
+context = require 'context'
+---
+var context;
+context = require('context');
+===
+
+Processes require() when resolved
+---
+require 'context'
+rotate bar
+---
+context.rotate(bar);
+===
+
+Removes unqualified require() when resolved
+---
+require 'context'
+---
+===
+
+Does not remove unqualified require() when unresolved
+---
+require 'unknown'
+f1 bar
+---
+require('unknown');
+f1(bar);
+===
+
+Does not affect identifiers when unresolved
+---
+rotate bar
+---
+rotate(bar);
+===
+
+Affects functions
+---
+require 'context'
+rotate bar
+---
+context.rotate(bar);
+===
+
+Affects vars
+---
+require 'context'
+fillStyle = bar
+---
+context.fillStyle = bar;
+===
+
+Affects objects
+---
+require 'context'
+canvas.width = bar
+---
+context.domElement.width = bar;
+===
+
+Affects functions in blocks
+---
+require 'context'
+foo -> bar -> rotate bar
+---
+foo(function () {
+    return bar(function () {
+        return context.rotate(bar);
+    });
+});
+===
+
+Affects vars in blocks
+---
+require 'context'
+foo -> bar -> fillStyle = bar
+---
+foo(function () {
+    return bar(function () {
+        return context.fillStyle = bar;
+    });
+});
+===
+
+Affects objects in blocks
+---
+require 'context'
+foo -> bar -> canvas.width = bar
+---
+foo(function () {
+    return bar(function () {
+        return context.domElement.width = bar;
+    });
+});
+===
+
+Affects functions in arguments
+---
+require 'context'
+rotate round PI
+---
+context.rotate(Math.round(Math.PI));
+===
+
+Affects arguments
+---
+require 'context'
+rotate PI
+---
+context.rotate(Math.PI);
+===
+
+Affects objects in arguments
+---
+require 'context'
+rotate canvas.angle
+---
+context.rotate(context.domElement.angle);
+===
+
+Aliases functions
+---
+require 'context'
+rotate foo
+---
+context.rotate(foo);
+===
+
+Aliases vars
+---
+require 'context'
+canvas = bar
+---
+context.domElement = bar;
+===
+
+Aliases objects
+---
+require 'context'
+canvas.width = bar
+---
+context.domElement.width = bar;
+===
+
+Dispatches variadic arguments properly
+---
+require 'routines'
+rect()
+rect a
+rect a, b
+rect a, b, c
+rect a, b, c, d
+rect a, b, c, d, e
+---
+routines.drawPixel();
+routines.drawSquare(a);
+routines.drawBox(a, b);
+routines.drawPolygon(a, b, c);
+routines.drawRect(a, b, c, d);
+routines.drawPolygon(a, b, c, d, e);
+===
+
+Does not affect functions with aliased names
+---
+require 'context'
+setTransform foo
+---
+setTransform(foo);
+===
+
+Does not affect vars with aliased names
+---
+require 'context'
+domElement = bar
+---
+var domElement;
+domElement = bar;
+===
+
+Does not affect object methods
+---
+require 'context'
+foo.rotate bar
+---
+foo.rotate(bar);
+===
+
+Does not affect object properties
+---
+require 'context'
+foo.fillStyle bar
+---
+foo.fillStyle(bar);
+===
+
+Does not affect object chains
+---
+require 'context'
+foo.canvas.foo = bar
+---
+foo.canvas.foo = bar;
+===
+
+Transforms functions to invocations
+---
+shift foo
+push foo, bar
+push foo, bar, baz, qux
+push [], bar, baz, qux
+push (foo), bar, baz, qux
+push ([]), bar, baz, qux
+---
+foo.shift();
+foo.push(bar);
+foo.push(bar, baz, qux);
+[].push(bar, baz, qux);
+foo.push(bar, baz, qux);
+[].push(bar, baz, qux);
+===
+
+Does not transform object properties to invocations
+---
+foo.push bar
+foo.push.apply null, []
+[].push.apply null, []
+---
+foo.push(bar);
+foo.push.apply(null, []);
+[].push.apply(null, []);
+===
+
+Does not transform functions without arguments to invocations
+---
+shift()
+push()
+---
+shift();
+push();
+===
+
+Transforms function aliases into object invocations
+---
+dataOf foo
+dataOf ''
+contextOf foo, bar
+contextOf foo, bar, baz, qux
+contextOf [], bar, baz, qux
+contextOf (foo), bar, baz, qux
+contextOf ([]), bar, baz, qux
+---
+foo.toDataURL();
+''.toDataURL();
+foo.getContext(bar);
+foo.getContext(bar, baz, qux);
+[].getContext(bar, baz, qux);
+foo.getContext(bar, baz, qux);
+[].getContext(bar, baz, qux);
+'''
+
+gold.split(/\={3,}/g).forEach (testCase) ->
+  [ title, input, expected ] = testCase.split /\-{3,}/g
+  if title and input
+    test title.trim(), (t) ->
+      t.plan 1
+      js = coffee.compile input.trim(), bare: yes
+      actual = shorthand symbols, js, implicits: [ 'Math' ]
+      #diag actual
+      t.equal actual.trim(), expected.trim()
+


Migrate .on, .once - Fixed a small error

--- app/lib/auth.coffee
+++ app/lib/auth.coffee
@@ -58,7 +58,7 @@
     storage.save(CURRENT_USER_KEY, me.attributes)

   me.loadGravatarProfile() if me.get('email')
-  @listenTo(me, 'sync', userSynced)
+  Backbone.listenTo(me, 'sync', userSynced)

 userSynced = (user) ->
   Backbone.Mediator.publish('me:synced', {me:user})


Add combined battle for experience updating

--- views/components/main/parts/teitoku-panel.cjsx
+++ views/components/main/parts/teitoku-panel.cjsx
@@ -150,12 +150,7 @@
           material[5] -= 1
         @setState
           material: material
-      when '/kcsapi/api_req_practice/battle_result'
-        @setState
-          level: body.api_member_lv
-          exp: body.api_member_exp
-          nextExp: totalExp[body.api_member_lv] - body.api_member_exp
-      when '/kcsapi/api_req_sortie/battleresult'
+      when '/kcsapi/api_req_practice/battle_result', '/kcsapi/api_req_sortie/battleresult', '/kcsapi/api_req_combined_battle/battleresult'
         @setState
           shipCount: if body.api_get_ship? then @state.shipCount + 1 else @state.shipCount
           level: body.api_member_lv


Initial draft of kd.remote.api.Github

Initial draft of kd.remote.api.Github

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/'


Tests for underscores and numbers in node, port, and component names, fixes #7

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/psichi/chix.git/'


About: scott added to the team

About: scott added to the team

--- client/About/team.coffee
+++ client/About/team.coffee
@@ -60,6 +60,9 @@
       ,
         username  : 'nitin'
         title     : 'Chief Business Officer'
+      ,
+        username  : 'rsbrown'
+        title     : 'VP of Engineering'
       # ,
       #   username  : 'cenk'
       #   title     : 'Software Engineer'


IDE: Tell mainView to select current workspace when its changed.

--- client/ide/routes.coffee
+++ client/ide/routes.coffee
@@ -21,7 +21,9 @@
     return machine or null

-  loadIDE = ({ machine, workspace }) ->
+  loadIDE = (data) ->
+    { machine, workspace } = data
+
     appManager = KD.getSingleton 'appManager'
     ideApps    = appManager.appControllers.IDE
     machineUId = machine.uid
@@ -31,6 +33,7 @@
         app.workspaceData     = workspace

         appManager.tell 'IDE', 'mountMachineByMachineUId', machineUId
+        KD.getSingleton('mainView').emit 'WorkspaceSelected', data

     return fallback()  unless ideApps?.instances

@@ -44,7 +47,11 @@
         if instance.workspaceData?.isDefault
           ideInstance = instance

-    if ideInstance then appManager.showInstance ideInstance else fallback()
+    if ideInstance
+      appManager.showInstance ideInstance
+      KD.getSingleton('mainView').emit 'WorkspaceSelected', data
+    else
+      fallback()

   routeToLastWorkspace = ->


Activity: added conversations modal

Activity: added conversations modal

error: pathspec 'client/Social/Activity/views/conversationsmodal.coffee' did not match any file(s) known to git

--- client/Social/Activity/views/conversationsmodal.coffee
+++ client/Social/Activity/views/conversationsmodal.coffee
@@ -0,0 +1,33 @@
+class ConversationsModal extends KDModalView
+
+  constructor: (options = {}, data) ->
+
+    options.title    or= 'Conversations you follow'
+    options.cssClass or= 'conversations activity-modal'
+    options.content  or= ''
+    options.overlay   ?= yes
+    options.width     ?= 330
+    options.height   or= 'auto'
+
+    super options, data
+
+    {appManager, router} = KD.singletons
+    appManager.tell 'Activity', 'bindModalDestroy', this, router.visitedRoutes.last
+
+
+  viewAppended: ->
+
+    @addSubView new KDInputView
+      placeholder : 'Search conversations...'
+
+    @addSubView new ActivitySideView
+      title      : ''
+      itemClass  : SidebarTopicItem
+      dataPath   : 'followedChannels'
+      delegate   : this
+      headerLink : new KDCustomHTMLView
+      noItemText : "You don't follow anything yet."
+      dataSource : (callback) ->
+        KD.singletons.socialapi.channel.fetchPinnedMessages
+          limit : 10
+        , callback


画像を読み込むクラスを追加

画像を読み込むクラスを追加

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

--- src/coffee/ImageLoader.coffee
+++ src/coffee/ImageLoader.coffee
@@ -0,0 +1,12 @@
+class ImageLoader
+	constructor: () ->
+		return
+
+	load: (images, progressCallback) ->
+		_total = images.length
+		$(images).each() ->
+			$("<img/>")
+			.attr("src", this)
+			.load() ->
+				progressCallback(_total, _total - images.length)
+		return


activity/flux: use message likers store for channel messages


Initial commit

Initial commit

Transcompiles in to JavaScript. | Grunt Task: $ grunt build

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

--- core/coffee/main.coffee
+++ core/coffee/main.coffee
@@ -0,0 +1,26 @@
+###!
+# -------
+# Slappé®
+# -------
+# A smart node module to slap out conventional database system.
+# ___________________________________________________________________________
+#
+# Architecture and Code Handcrafted by Prabhat Kumar.
+# Architectuur en Code handgemaakt door Prabhat Kumar.
+# @author    : Prabhat Kumar [http://prabhatkumar.org/].
+# @copyright : Prabhat Kumar [http://prabhatkumar.org/].
+# @copyright : Sequømics Research [http://research.sequomics.com/].
+# @copyright : Sequømics Corporation [http://sequomics.com/].
+# ___________________________________________________________________________
+#
+# @date      : 21-Dec-2016
+# @license   : MIT
+# @require   : Node.js®
+# @require   : NPM
+# @build     : SEED™ — Skövde
+#              └────── A Sequømics Product — http://seed.sequomics.com/.
+# ___________________________________________________________________________
+#
+# --/The Heart of Data System/-- of "Slappé®".
+# ___________________________________________________________________________
+###


Uses the familiar name for requestor and the assignee.

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/usermindinc/hubot-github-pr-reporter.git/'


Create data.coffee

Create data.coffee

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

--- src/lib/data.coffee
+++ src/lib/data.coffee
@@ -0,0 +1,50 @@
+'use strict'
+
+_      = require 'lodash'
+cradle = require 'cradle'
+
+cradle.setup
+  host: process.env.CLOUDANT_URL.replace 'https://',''
+  cache: true
+  raw: false
+
+db = (new cradle.Connection).database('contractors')
+
+exports.save = (req, res) ->
+  res.header 'Access-Control-Allow-Origin',  'localhost'
+
+  if not req.form.isValid
+    console.log 'Invalid form data received'
+    res.send 400, req.form.errors or 'Invalid form data received'
+  else
+    form = req.form
+    db.view 'contractors/github', (err, docs) ->
+      update = _.find docs, (doc) ->
+        if doc.key is form.github
+          return true
+      if update
+        db.save update.id, _.extend(update.value, form), (err, dbres) ->
+          if err
+            console.log   err
+            console.log   'Database Error'
+            res.send 500, 'Database Error'
+          else
+            console.log   'Submission Saved'
+            res.send 200, 'Submission Saved'
+      else
+        db.save form, (err, dbres) ->
+          if err
+            console.log    err
+            console.log   'Database Error'
+            res.send 500, 'Database Error'
+          else
+            console.log   'Submission Saved'
+            res.send 200, 'Submission Saved'
+
+exports.getContractors = (callback) ->
+  db.view 'contractors/github', (err, docs) ->
+    if err
+      console.log 'Database Error'
+      callback []
+    else
+      callback(_.pluck(docs, 'key'))


omit "can not generate" messages

omit "can not generate" messages

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/demhydraz/cafe.git/'


Added Korean locale

Added Korean locale

error: pathspec 'vendor/assets/javascripts/mercury/locales/ko.local.js.coffee' did not match any file(s) known to git

--- vendor/assets/javascripts/mercury/locales/ko.local.js.coffee
+++ vendor/assets/javascripts/mercury/locales/ko.local.js.coffee
@@ -0,0 +1,206 @@
+Mercury.I18n['ko'] =
+  # ## Javascript Strings
+
+  # ### Default Configuration
+  "Save": "저장하기"
+  "Save this page": "현재 쪽 저장하기"
+  "Preview": "미리보기"
+  "Preview this page": "현재 쪽 미리보기"
+  "Undo": "실행 취소"
+  "Undo your last action": "마지막 작업 실행 취소"
+  "Redo": "다시 실행"
+  "Redo your last action": "마지막 작업 다시 실행"
+  "Link": "링크"
+  "Insert Link": "링크 추가"
+  "Media": "매체"
+  "Insert Media (images and videos)": "매체 추가 (그림과 영상)"
+  "Table": "표"
+  "Insert Table": "표 추가"
+  "Character": "문자"
+  "Special Characters": "특수 문자"
+  "Snippet": "글감"
+  "Snippet Panel": "글감 패널"
+  "History": "최근 편집글"
+  "Page Version History": "최근 편집글의 쪽 버전"
+  "Notes": "주석 목록"
+  "Page Notes": "쪽 주석 목록"
+  "Style": "글맵시"
+  "Block Format": "블록 양식"
+  "Background Color": "배경 색"
+  "Text Color": "글자 색"
+  "Bold": "굵게"
+  "Italicize": "기울임"
+  "Overline": "윗줄"
+  "Strikethrough": "중간줄"
+  "Underline": "밑줄"
+  "Subscript": "아래첨자"
+  "Superscript": "위첨자"
+  "Align Left": "왼쪽 정렬"
+  "Center": "가운데 정렬"
+  "Align Right": "오른쪽 정렬"
+  "Justify Full": "양쪽 정렬"
+  "Unordered List": "순서 없는 목록"
+  "Numbered List": "번호 매긴 목록"
+  "Decrease Indentation": "내어쓰기"
+  "Increase Indentation": "들여쓰기"
+  "Insert Table Row": "열 추가"
+  "Insert a table row before the cursor": "열 추가(커서 앞)"
+  "Insert a table row after the cursor": "열 추가(커서 뒤)"
+  "Delete Table Row": "열 삭제"
+  "Delete this table row": "선택된 열 삭제"
+  "Insert Table Column": "컬럼 추가"
+  "Insert a table column before the cursor": "컬럼 추가(커서 앞)"
+  "Insert a table column after the cursor": "컬럼 추가(커서 뒤)"
+  "Delete Table Column": "컬럼 삭제"
+  "Delete this table column": "선택된 컬럼 삭제"
+  "Increase Cell Columns": "오른쪽 컬럼과 합치기"
+  "Decrease Cell Columns": "합쳐진 컬럼 나누기"
+  "Increase Cell Rows": "아래열과 합치기"
+  "Decrease Cell Rows": "합쳐진 열 나누기"
+  "Horizontal Rule": "가로선"
+  "Insert a horizontal rule": "가로선 넣기"
+  "Remove Formatting": "양식 지우기"
+  "Remove formatting for the selection": "선택 부분 양식 지우기"
+  "Edit HTML": "HTML 편집하기"
+  "Edit the HTML content": "HTML 내용 편집하기"
+  "Edit Snippet Settings": "글감 설정 편집하기"
+  "Remove Snippet": "글감 지우기"
+
+  # ### General
+  # Error Messages
+  "Mercury.Regions.%s is unsupported in this client. Supported browsers are %s.": "Mercury.Regions.%s 는 지원하지 않는 클라이언트 입니다. %s 브라우저를 지원합니다."
+  "Mercury.PageEditor can only be instantiated once.": "Mercury.PageEditor는 한 번만 갹채화 될 수 있습니다."
+  "Opera isn't a fully supported browser, your results may not be optimal.": "오페라 브라우저에선 모든 기능을 지원하지 않으므로, 결과가 최적화 되어 나타나지 않습니다."
+  "Mercury.PageEditor failed to load: %s\n\nPlease try refreshing.": "Mercury.PageEditor 가 읽기에 실패했습니다. : %s\n\n새로고침을 해보세요."
+  "Region type is malformed, no data-type provided, or \"%s\" is unknown for the \"%s\" region.": "위치 종류가 올바르지 않거나 데이터 타입이 제공되지 않았습니다. 혹은 \"%s\"가 \"%s\" 위치에 알려지지 않았습니다."
+  "Mercury was unable to save to the url: %s": "머큐리는 그 경로에 저장 할 수 없습니다.: %s"
+  # Confirmations
+  "You have unsaved changes.  Are you sure you want to leave without saving them first?": "저장하지 않은 변경사항이 있습니다. 저장하지 않고 이 페이지를 벗어나시겠습니까?"
+
+  # ### Toolbar / Buttons
+  # Error Messages
+  "Unknown button type \"%s\" used for the \"%s\" button.": "\"%s\"라는 알려지지 않는 버튼 종류가 \"%s\" 버튼에서 사용되었습니다."
+  "Unknown button structure -- please provide an array, object, or string for \"%s\".": "알 수 없는 버튼 구조 -- \"%s\"에 대한 배열이나, 객체, 또는 문자열을 제공해 주세요."
+
+  # ### Modals / Dialogs / Etc.
+  # Error Messages
+  "Mercury was unable to load %s for the \"%s\" dialog.": "머큐리는 %s 를 읽을 수 없는 문제가 \"%s\" 창에서 발생했습니다."
+  "Mercury was unable to load %s for the lightview.": "머큐리는 경량뷰에서 %s를 읽을 수 없습니다."
+  "Mercury was unable to load %s for the modal.": "머큐리는 모달 창에서 %s를 읽을 수 없습니다."
+
+  # ### Snippets
+  # Error Messages
+  "Error loading the preview for the \"%s\" snippet.": "미리보기를 %s 글감에서 읽어 오는데 오류가 발생했습니다."
+  # Misc
+  "Snippet Options": "글감 설정"
+
+  # ### Uploader
+  # Error Messages
+  "Unable to process response: %s": "처리할 수 없는 응답입니다.: %s"
+  "Error: Unable to upload the file": "오류: 파일을 올릴 수 없습니다."
+  "Malformed response from server": "서버로부터 올바르지 않은 응답을 받았습니다." # needs translation
+  "Too large": "파일이 너무 큽니다."
+  "Unsupported format": "지원하지 않는 형식입니다."
+  # Statuses
+  "Processing...": "처리중..."
+  "Uploading...": "올리는중..."
+  "Aborted": "전송 실패"
+  "Successfully uploaded...": "성공적으로 올렸습니다."
+  "Name: %s": "이름: %s"
+  "Size: %s": "용량: %s"
+  "Type: %s": "형식: %s"
+
+  # Inserting Media
+  "Error: The provided youtube share url was invalid.": "오류 : 존재하지 않는 유투브 공유 주소입니다."
+  "Error: The provided vimeo url was invalid.": "오류 : 존재하지 않는 비메오 주소 입니다."
+
+  # Statusbar
+  "Path:": "경로:"
+
+
+  # ## HTML / Template Strings
+
+  # ### Modals
+  # Insert Link Modal (link.html)
+  "Link Content": "링크 내용"
+  "Standard Links": "표준 링크"
+  "URL": "URL"
+  "Index / Bookmark Links": "색인 / 즐겨찾기 링크"
+  "Existing Links": "존재하는 링크"
+  "Bookmark": "즐겨찾기"
+  "Options": "설정"
+  "Link Target": "링크를 띄울 곳"
+  "Self (the same window or tab)": "현재 페이지  (현재와 같은창 혹은 탭)"
+  "Blank (a new window or tab)": "빈 페이지 (현재와 같은창 혹은 탭)"
+  "Top (removes any frames)": "상단 (모든 프레임이 삭제됨)"
+  "Popup Window (javascript new window popup)": "팝업 창 (자바스크립트로 새 창을 띄웁니다.)"
+  "Popup Width": "팝업 창 넓이"
+  "Popup Height": "팝업 창 높이"
+  "Insert Link": "링크 추가"
+
+  # Insert Media Modal (media.html)
+  "Images": "그림:"
+  "Videos": "영상:"
+  "YouTube Share URL": "유투브 공유 URL"
+  "Vimeo URL": "비메오 URL"
+  "Alignment": "정렬"
+  "None": "정렬 안함"
+  "Left": "왼쪽 정렬"
+  "Right": "오른쪽 정렬"
+  "Top": "위쪽 정렬"
+  "Middle": "가운데 정렬"
+  "Bottom": "아래쪽 정렬"
+  "Absolute Middle": "가운데 정렬(Absolute)"
+  "Absolute Bottom": "아래쪽 정렬(Absolute)"
+  "Width": "넓이"
+  "Height": "높이"
+  "Insert Media": "매체 추가"
+
+  # Insert Table Modal (table.html)
+  "Rows": "열"
+  "Add Before": "앞에 추가"
+  "Add After": "뒤에 추가"
+  "Remove": "삭제"
+  "Columns": "컬럼"
+  "Row Span": "열 합치기"
+  "Column Span": "컬럼 합치기"
+  "Options": "설정"
+  "Alignment": "정렬"
+  "Border": "외곽선"
+  "Spacing": "여백"
+  "Insert Table": "표 추가"
+
+  # HTML Editor Modal (htmleditor.html)
+  "HTML Editor": "HTML 편집기"
+  "Save and Replace": "저장하고 덮어쓰기"
+
+  # ### Dialogs / Etc.
+  # Color Palettes (forecolor.html, backcolor.html)
+  "Last Color Picked": "마지막으로 사용한 색"
+
+  # Block Format Select (formatblock.html)
+  "Heading 1": "머릿글 1"
+  "Heading 2": "머릿글 2"
+  "Heading 3": "머릿글 3"
+  "Heading 4": "머릿글 4"
+  "Heading 5": "머릿글 5"
+  "Heading 6": "머릿글 6"
+  "Paragraph": "단락"
+  "Blockquote": "인용구"
+  "Formatted": "공백유지"
+
+  # About Mercury Panel (about.html)
+  "Project Home": "프로젝트 홈"
+  "Project Source": "프로젝트 소스"
+
+  # ### Demo / Placeholder / Defaults
+  "The history panel is expected to be implemented with a server back end.  Since this is a demo, we didn't include it.": "최근 편집글 패널은 서버 측에서 구현이 되어야 합니다. 이 데모에선 이를 포함하지 않았습니다. "
+
+  "The notes panel is expected to be implemented with a server back end.  Since this is a demo, we didn't include it.": "최근 주석 패널은 서버 측에서 구현이 되어야 합니다. 이 데모에선 이를 포함하지 않았습니다. "
+
+  "Snippet Name": "글감 이름"
+  "A one or two line long description of what this snippet does.": "이 글감이 무슨 글감인지 한줄이나 두줄의 설명을 적으세요."
+
+  "First Name": "이름"
+  "Favorite Beer": "선호하는 맥주"
+  "Insert Snippet": "글감 넣기"


Middleware base

Middleware base

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

--- lib/performer.coffee
+++ lib/performer.coffee
@@ -0,0 +1,5 @@
+
+exports.performer = (options) ->
+  (req, res, next) ->
+
+    next()


Fixed naming in measure.js.coffee

Fixed naming in measure.js.coffee

--- app/assets/javascripts/models/measure.js.coffee
+++ app/assets/javascripts/models/measure.js.coffee
@@ -12,10 +12,9 @@
       subData = _(sub).extend(data)
       subData.isPrimary = !sub.sub_id? or sub.sub_id is 'a'
       subData
-    dates = @collection?.dates
-    @effectiveDate = @dates?.effectiveDate
-    @effectiveStartDate = @dates?.effectiveStartDate
-    @effectiveEndDate = @dates?.effectiveEndDate
+    @effectiveDate = @collection?.effectiveDate
+    @effectiveStartDate = @collection?.effectiveStartDate
+    @effectiveEndDate = @collection?.effectiveEndDate

     attrs.submeasures = new SubCollection subs, parent: this
     attrs


Set default metadata and pagination hashes.

--- app/assets/javascripts/dot_ledger/collections/index.js.coffee
+++ app/assets/javascripts/dot_ledger/collections/index.js.coffee
@@ -3,6 +3,10 @@

 DotLedger.module 'Collections', ->
   class @Base extends Backbone.Collection
+    pagination: {}
+
+    metadata: {}
+
     parse: (response, options)->
       @_fetch_options_data = options.data || {}
       @pagination = JSON.parse options.xhr.getResponseHeader('X-Pagination')


update Atom config

update Atom config

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/AlexKVal/dotfiles.git/'


added concat

added concat

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/zenati/simple_form_extension.git/'


Account: added deleteAccount View

Account: added deleteAccount View


sample recipe: custom_phrase

sample recipe: custom_phrase

error: pathspec 'sample/custom_phrase.recipe.coffee' did not match any file(s) known to git

--- sample/custom_phrase.recipe.coffee
+++ sample/custom_phrase.recipe.coffee
@@ -0,0 +1,41 @@
+# encoding: utf-8
+
+recipe = new Recipe
+  name: 'custom_phrase'
+  version: '1.0'
+  category: 'settings'
+  description: '啓用自定義短語'
+  params: [
+    {
+      name: 'schema'
+      label: '選取輸入方案'
+      required: true
+    }
+  ]
+  setup: (done) ->
+    schemaId = @params['schema']
+    s = new Config
+    s.loadFile "#{@rimeDirectory}/#{schemaId}schema.yaml", (s) =>
+      main_translators = [
+        'reverse_lookup_translator'
+        'table_translator'
+        'script_translator'
+      ]
+      translators = s.get 'engine/translators'
+      index = 0
+      for t in translators
+        if t in main_translators  # TODO: handle those with aliases
+          break
+        ++index
+      translators.insert index, 'table_translator@custom_phrase'
+      @customize schemaId, done, (c) ->
+        c.patch 'engine/translators', translators
+        c.patch 'custom_phrase',
+          dictionary: ''
+          user_dict: 'custom_phrase'
+          db_class: 'stabledb'
+          enable_completion: false
+          enable_sentence: false
+          initial_quality: 1
+
+cook recipe, ingredients


keep-alive pings urls like heroku apps to keep them from sleeping

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

--- src/scripts/keep-alive.coffee
+++ src/scripts/keep-alive.coffee
@@ -0,0 +1,94 @@
+# keep-alive pings each url in the array every minute.
+# This is specifically to keep certain heroku apps from going to sleep
+#
+# keep `http://ninjas-20.herokuapp.com` alive - Add inputted url to the collection of urls set to be pinged
+# keep `http://ninjas-20.herokuapp.com` alive - Remove inputted url to the collection of urls set to be pinged
+# what are you keeping alive - Show list of urls being kept alive
+
+
+HTTP = require "http"
+URL  = require "url"
+
+frequency = 60000
+
+ping = (url) ->
+  parsedUrl = URL.parse(url)
+  options   =
+    host: parsedUrl.host
+    port: 80
+    path: '/'
+    method: 'GET'
+
+  req = HTTP.request options, (res) ->
+    body = ""
+    res.setEncoding("utf8")
+    res.on "data", (chunk) ->
+      body += chunk
+    res.on "end", () ->
+      data =
+        response:
+          body: body
+          status: res.statusCode
+
+  req.on "error", (e) ->
+
+  req.end()
+
+
+module.exports = (robot) ->
+
+  keepAlive = () ->
+    robot.brain.data.keepalives ?= []
+
+    for url in robot.brain.data.keepalives
+      console.log(url)
+      try
+        ping(url)
+      catch e
+        console.log("that probably isn't a url: " + url)
+
+    setTimeout (->
+      keepAlive()
+    ), frequency
+
+  keepAlive()
+
+  robot.respond /keep (.*) alive$/i, (msg) ->
+    url = msg.match[1]
+
+    robot.brain.data.keepalives ?= []
+
+    if url in robot.brain.data.keepalives
+      msg.send "I already am."
+    else
+      robot.brain.data.keepalives.push url
+      msg.send "OK. I'll ping that url every " + frequency/1000 + " seconds to make sure its alive."
+
+  robot.respond /don'?t keep (.*) alive$/i, (msg) ->
+    url = msg.match[1]
+
+    robot.brain.data.keepalives ?= []
+    robot.brain.data.keepalives.pop url
+    msg.send "OK. I've removed that url from my list of urls to keep alive."
+
+  robot.respond /what are you keeping alive/i, (msg) ->
+    robot.brain.data.keepalives ?= []
+
+    if robot.brain.data.keepalives.length > 0
+      msg.send "These are the urls I'm keeping alive\n\n" + robot.brain.data.keepalives.join('\n')
+    else
+      msg.send "i'm not currently keeping any urls alive. Why don't you add one."
+
+
+
+
+
+
+
+
+
+
+
+
+
+


Compiling port of Runtime to coffee

Compiling port of Runtime to coffee

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

--- js/core/src/Runtime.coffee
+++ js/core/src/Runtime.coffee
@@ -0,0 +1,634 @@
+#     JEFRi Runtime.js 0.1.0
+#     (c) 2011-2012 David Souther
+#     JEFRi is freely distributable under the MIT license.
+#     For all details and documentation:
+#     http://jefri.org
+
+do (_=_) =>
+	root = this;
+
+	# ## JEFRi Namespace
+	root.JEFRi =
+		# Compare two entities for equality. Entities are equal if they
+		# are of the same type and have equivalent IDs.
+		EntityComparator: (a, b) ->
+			cmp =
+				a && b &&
+				a._type() is b._type() &&
+				a.id() is b.id();
+			return cmp;
+
+		#Duck type check if an object is an entity.
+		isEntity: (obj) ->
+			return obj._type && obj.id &&
+				_.isFunction(obj._type) && _.isFunction(obj.id);
+
+	# Add isEntity to the underscore function.
+	_.mixin({isEntity: JEFRi.isEntity});
+
+	# ### Runtime Constructor
+	root.JEFRi.Runtime = (contextUri, options, protos) ->
+		# Private variables we'll be using throughout the class.
+		self = this;
+		ec = this;
+		this.settings = _.extend({
+			# The location of our context
+			contextUri     : contextUri,
+			# If an entity already exists, does JEFRi update or replace?
+			updateOnIntern : true,
+			# The constructor for the default store.
+			store          : JEFRi.LocalStore
+		}, options);
+
+		# Prepare a promise for completing context loading.
+		ready = _.Deferred();
+		this.ready = ready.promise();
+
+		# In-memory representation of the loaded context.
+		this._context = {
+			meta: {},
+			contexts: {},
+			entities: {}
+		};
+		# In-memory store of JEFRi entities.
+		this._instances = {};
+		# List of entities that have been built, but not persisted.
+		this._new = [];
+		# Collection of entities that have modifications since their inception or last persistence. Partitioned by types.
+		this._modified = {};
+		# The default store
+		this._store = new this.settings.store({runtime: this});
+
+		# Some helper methods to manage modified entities.
+		# Add an entity to the modified set.
+		this._modified.set = (entity) ->
+			# Check if the type exists yet
+			if not self._modified[entity._type()]
+				# Add the type, since we didn't have it before.
+				self._modified[entity._type()] = {};
+
+			# Add the entity to the bucket.
+			self._modified[entity._type()][entity.id()] = entity;
+
+		# Remove an entity from the modified set.
+		this._modified.remove = (entity) ->
+			delete self._modified[entity._type()][entity.id()];
+
+
+		# #### Private helper functions
+		# These handle most of the heavy lifting of building Entity classes.
+
+		# A few default property values.
+		_default = (type) ->
+			switch type
+				when "boolean" then false
+				when "int" or "float" then 0
+				when "string" then ""
+				else ""
+
+		# Takes a "raw" context object and orders it into the internal _context
+		# storage.  Also builds constructors and prototypes for the context.
+		_set_context = (context, protos) ->
+			# Save the attributes
+			_.extend(ec._context.attributes, context.attributes);
+
+			# Prepare each entity
+			_.each(context.entities, (definition, name) ->
+				# Keep the definition locally, modifying it directly with the ctor and prototypes.
+				ec._context.entities[name] = definition;
+				# Ready the instances bucket
+				ec._instances[name] = {};
+
+				# Build an entity's constructor.
+				definition.Constructor = (proto) ->
+					self = this;
+
+					# Set the privileged accounting and property data.
+					this._new = true;
+					this._modified = {_count: 0};
+					this._fields = {};
+					this._relationships = {};
+					# Check for runtime prototype override.
+					proto = proto || {};
+
+					# Set the key; generate if not set by proto.
+					proto[definition.key] = proto[definition.key] || _.UUID.v4();
+
+					# Set a bunch of default values, so they're all available.
+					_.each(definition.properties, (property, name) ->
+						# Use the value provided to the constructor, or the default.
+						def = proto[name] || _default(property.type);
+						self[name](def);
+					);
+
+					# Attach a privileged copy of the full id, more for debugging than use.
+					this._id = this.id(true);
+
+					# Add runtime methods
+					_.extend(this.prototype, proto.prototype);
+
+					# Set a few event handlers
+					# Manage accounting after an entity has been persisted
+					_.on(this, 'persisted', () ->
+						this._new = false;
+						this._modified = {
+							_count: 0
+						}
+						ec._modified.remove(this);
+					)
+
+				#Set up the prototype for any of this entity.
+				_build_prototype(name, definition, (protos && protos[name]));
+			);
+
+			ready.resolve();
+
+		# Set up all the required methods - id(), _type(), and the mutaccs.
+		_build_prototype = (name, definition, proto) ->
+			ec = self;
+
+			_.extend(definition.Constructor.prototype, {
+				# Get this entity's type. Use the closure'd reference.
+				_type: (full) ->
+					full = full || false;
+					return name;
+				},
+
+				# Get this entity's ID.
+				id: (full) ->
+					return (full ? this._type() + "/" : "") + this[definition.key]();
+
+				# Find the status of an entity.
+				_status: () ->
+					state = "MODIFIED";
+					if (this._new)
+						state = "NEW";
+					else if (_.isEmpty(this._modified))
+						state = "PERSISTED";
+					return state;
+
+				_definition: () ->
+					return definition;
+
+				# Add this entity to the persist transaction
+				_persist: (transaction, callback) ->
+					deferred = _.Deferred().then(callback);
+					top = !transaction;
+					transaction = top && new JEFRi.Transaction() || transaction;
+					transaction.add(this);
+
+					#Call the on_persist handler
+					this.trigger('persisting', this, transaction);
+
+					#If we're on top, run the transaction...
+					if ( top ) then transaction.persist(callback);
+
+					return deferred.promise();
+
+				# Encode returns the bare object.
+				_encode: () ->
+					min = {};
+
+					min._type = this._type();
+
+					#Add all the properties to the writer.
+					_.each(definition.properties, (prop, name) =>
+						min[name] = this[name]();
+					);
+
+					# Don't add relationships. Any walker will be responsible for adding only the entities they need.
+
+					return min;
+			);
+
+			# Alias _encode as toJSON for ES5 JSON.stringify()
+			definition.Constructor.prototype.toJSON = definition.Constructor.prototype._encode;
+
+			# Prepare property mutaccs.
+			_.each(definition.properties, (property, field) ->
+				_build_mutacc(definition, field, property);
+			);
+
+			# Prepare navigation mutaccs.
+			_.each(definition.relationships, (relationship, rel_name) ->
+				_build_relationship(definition, rel_name, relationship);
+			);
+
+
+			if (proto) then _.extend(definition.Constructor.prototype, proto.prototype);
+
+		# Prepare a mutacc for a specific property.
+		# The property mutacc must handle entity accounting details.
+		_build_mutacc = (definition, field, property) ->
+			# Each field name is its own function combining getters and setters, depending on arguments.
+			definition.Constructor.prototype[field] = (value) ->
+				# Overloaded getter and setter.
+				if (undefined isnt value)
+					# Value is defined, so this is a setter
+					return this[field].set.call(this, value);
+				else
+					# Just a getter.
+					return this[field].get.call(this);
+
+			# Add the actual getters and setters to the new field
+			_.extend(definition.Constructor.prototype[field],
+				# The setter has some accounting details to handle
+				set: (value) ->
+					# Only actually update it if it is a new value.
+					if (value isnt this._fields[field])
+						# The actual set
+						this._fields[field] = value;
+
+						# Update the modified list if not set...
+						if (!this._modified[field])
+							this._modified[field] = this._fields[field];
+							this._modified._count += 1;
+							ec._modified.set(this);
+						else
+							# It might be getting set to the old value...
+							if (this._modified[field] is value)
+								delete this._modified[field];
+								this._modified._count -= 1;
+							# If it was the last property, remove from the context's modified list.
+							if (this._modified._count is 0)
+								ec._modified.remove(this);
+
+						# Notify observers
+						_.trigger(this, "modify", [field, value]);
+				get: () ->
+					# Just a getter.
+					return this._fields[field];
+			);
+
+		# Attach the mutators and accessors (mutaccs) to the prototype.
+		#/* TODO Thoroughly debug these functions... */
+		_build_relationship = (definition, field, relationship) ->
+			ec = self;
+
+			# The relationship is the name of a function that acts as getter/setter
+			definition.Constructor.prototype[field] = (entity) ->
+				# Use arguments, since we might have a few things coming.
+				if arguments.length > 0
+					set = (relationship.type is "has_many") ? "add" : "set";
+					return this[field][set].apply(this, arguments);
+				else
+					return this[field].get.call(this);
+
+			# The multiple relations functions.
+			if "has_many" is relationship.type
+				_.extend(definition.Constructor.prototype[field],
+					# Return the set of entities in the relationship.
+					get: (longGet) ->
+						# Lazy load
+						#if (longGet)
+							# This needs a bit of thought
+							#TODO
+						# Check if the field has ever been set
+						if (undefined is this._relationships[field])
+							# The field hasn't been set, so we haven't ever gotten this relationship before.
+							# We'll need to go through and fix that.
+							# We'll need to grab everything who points to us...
+							self = this;
+							this._relationships[field] = [];
+							# Loop over every entity this relationship could point to
+							_.each(ec._instances[relationship.to.type], (type) ->
+								# If these are related
+								if (type[relationship.to.property]() is self[relationship.property]())
+									# Add it
+									self._relationships[field].push(this);
+							);
+						return this._relationships[field];
+
+					set: (entity) ->
+						# ??
+
+					# Add an entity to the relationship.
+					add: (entity) ->
+						if (_.isArray(entity))
+							this[field].add.call(this, e) for e in entity
+							return this;
+
+						if (undefined is this._relationships[field])
+							#Lazy load
+							this[field].get.call(this);
+
+						if (_.indexBy(this._relationships[field], _.bind(JEFRi.EntityComparator, null, entity)) < 0)
+							#The entity is _NOT_ in this' array.
+							this._relationships[field].push(entity);
+
+							#Call the reverse setter
+							#Need to find the back relationship...
+							back_rel = ec.back_rel(this._type(), field, relationship);
+							#Make sure it exists
+							if back_rel then entity[back_rel.name].set.call(entity, this);
+
+						# Notify observers
+						_.trigger(this, "modify", [field, entity]);
+
+						return this;
+				);
+			# Mutaccs for has_a and is_a
+			else
+				_.extend(definition.Constructor.prototype[field],
+					get: (longGet) ->
+						#if (longGet)
+							# Lazy load
+							# This needs a bit of thought
+							#TODO
+						if (undefined is this._relationships[field])
+							# Just need the one...
+							this._relationships[field] = ec._instances[relationship.to.type][this[relationship.property]()];
+							# Make sure we found one
+							if (undefined is this._relationships[field])
+								# If not, create it.
+								key = {};
+								key[ec.definition(relationship.to.type).key] = this[relationship.to.property]();
+								this[field](ec.build(relationship.to.type, key));
+						return this._relationships[field];
+					set: (entity) ->
+						id = this[relationship.property]();
+						if ( id isnt entity[relationship.to.property]())
+							#Changing
+							this._relationships[field] = entity;
+							entity[relationship.to.property](id);
+							if ( "is_a" isnt relationship.type )
+								#Add or set this to the remote entity
+								#Need to find the back relationship...
+								back_rel = ec.back_rel(this._type(), field, relationship);
+								back = ("has_many" is back_rel.type) &&	'add' || 'set';
+								entity[back_rel.name][back].call(entity, this);
+
+						# Notify observers
+						_.trigger(this, "modify", [field, entity]);
+
+						return this;
+				);
+
+		if (options && options.debug)
+			# The context object was provided by the caller
+			_set_context(options.debug.context, protos);
+		else if (!this.settings.contextUri)
+		else
+			_.get(this.settings.contextUri, {
+				dataType: "application/json"
+			}).done(
+				(data) ->
+					if (!data) then throw { message: "Context loaded, but invalid." }
+					data = _.isString(data) && JSON.parse(data) || data;
+					_set_context(data, protos);
+			);
+
+	# #### Entity Array helper
+	pushResult = (entity) ->
+		type = entity._type();
+		if (!this[type]) then this[type] = [];
+		this[type].push(entity);
+
+	# #### Runtime Prototype
+	root.JEFRi.Runtime.prototype = _.extend({}, JEFRi.Runtime.prototype, {
+		# Reset the runtime's data, maintains context definitions.
+		clear: () ->
+			this._modified = {};
+			this._new = [];
+			this._instances = {};
+			return this;
+
+		# Get the definition of an entity type.
+		definition: (name) ->
+			name = (typeof name is "string") ? name : name._type();
+
+			return this._context.entities[name];
+
+		# Find the relationship back to this entity, if it exists
+		back_rel: (type, field, relationship) ->
+			ec = this;
+			def = ec.definition(relationship.to.type);
+			back = null;
+			_.each(def.relationships, (rel, srel_name) ->
+				if (rel.to.type is type && srel_name isnt field)
+					#Found it
+					back = rel;
+					back.name = srel_name;
+			);
+			return back;
+
+		# Add the methods in the extend prototype to the prototype of type specified
+		# affecting _ALL_ instances, both current and future, of type.
+		extend: (type, extend) ->
+			if (this._context.entities[type])
+				_.extend(
+					this._context.entities[type].Constructor.prototype,
+					extend.prototype
+				);
+
+		# Return the canonical memory reference of the entity.
+		intern: (entity, updateOnIntern) ->
+			updateOnIntern = !!updateOnIntern || this.settings.updateOnIntern;
+
+			if (entity.length && ! entity._type)
+				#Array-like
+				q = entity.length
+				for i in [0..q]
+					entity[i] = this.intern(entity[i], updateOnIntern);
+				return entity;
+
+			ret;
+			if (updateOnIntern)
+				#Merge the given entity into the stored entity.
+				ret = this._instances[entity._type()][entity.id()] || entity;
+				_.extend(ret._fields, entity._fields);
+			else
+				#Take the stored one if possible, otherwise use the given entity.
+				ret = this._instances[entity._type()][entity.id()] || entity;
+
+			#Update the saved entity
+			this._instances[entity._type()][entity.id()] = ret;
+			return ret;
+
+		# Return a new instance of an object described in the context.
+		build: (type, obj) ->
+			def = this.definition(type)
+			obj = obj || {}
+			# We are going to build the new entity first, then, if there is a local
+			# instance, we will extend the local instance with the new instance.
+			r = new def.Constructor(obj)
+			if undefined isnt obj[def.key]
+				# If the entity key is specified in obj, check the local storage.
+				demi = {_type : type};
+				demi[def.key] = obj[def.key];
+				instance = this.find(demi);
+				if (instance.length > 0)
+					# Local instance, extend it with the new obj and return local.
+					instance = instance[0];
+					_.extend(instance._fields, r._fields);
+					return instance;
+			this._instances[type][r.id()] = r;
+			this._new.push(r);
+			return r;
+
+		# Expand and intern a transaction.
+		expand: (transaction, action) ->
+			self = this;
+			entities = transaction.entities;
+			action = action || "persisted";
+
+			ret = [];
+
+			if (entities)
+				_.each(entities, (entity) ->
+					e = self.build(entity._type, entity);
+					e = self.intern(e, true);
+					#Make the entity not new...
+					_.trigger(e, action);
+					ret.push(e);
+				);
+
+			transaction.entities = ret;
+			return ret;
+
+		# Prepare a new transaction
+		transaction: (spec) ->
+			spec = spec || [];
+
+			return new JEFRi.Transaction(spec, this._store);
+
+		# Return an interned entity from the local instance matching spec.
+		#
+		# Spec requires an _type property and the entity key.
+		find: (spec) ->
+			if (typeof spec is "string")
+				spec = {_type : spec};
+			to_return = [];
+			r = this.definition(spec._type);
+			results = this._instances[spec._type];
+
+			if (spec.hasOwnProperty(r.key))
+				# If a key is set, return only that result.
+				if (results[spec[r.key]])
+					to_return.push(results[spec[r.key]]);
+			else
+				# Add results to an array to clean up the return for the user.
+				_.each(results, (result) ->
+					to_return.push(result);
+				);
+
+			return to_return;
+
+		# Return a non-array of interned entities matching spec.
+		#
+		# If spec is an array with multiple elements, and ANY ONE matches, the
+		# result array will have only the matching entities. If NONE matches, the
+		# result array will have one entity per spec.
+		get: (spec) ->
+			spec = (spec instanceof Array) ? spec : [spec];
+			self = this;
+			results = {};
+			transaction = this.transaction();
+			deferred = _.Deferred();
+
+			results.push = pushResult;
+
+			q = spec.length
+			for i in [0..q]
+				#Add the queries
+				_spec = spec[i]
+				_type = (_spec._type instanceof Function) && _spec._type() || _spec._type;
+				def = this.definition(_type);
+				id = _spec[def.key];
+
+				#Check if the ID is set and exists locally
+				if ( (undefined isnt id) && this._instances[_type][id])
+					#It is local, so use that one
+					results.push(this._instances[_type][id]);
+				else
+					#Otherwise, add to transaction
+					transaction.add(_spec);
+
+					if (this.hasOwnProperty("_page"))
+						#Add the page to the meta
+						transaction.attributes({page : this._page});
+						delete this._page;
+	#/*
+	#				TODO: If there are multiple specs, this will not work!
+	#				TODO: Need to figure out what a page means for multiple specs.
+	#				Page format: {on : 1, lines : 10, sort:[{'Type.field':order},{'Type.field':order}]}
+	#*/
+
+			# If transaction is not empty
+			if (transaction.entities.length > 0)
+				# Run the transaction
+				transaction.get().done((transaction) ->
+					# Merge the result sets, adding `gotten` things to `had` things.
+					_.each(transaction.entities, (entity) ->
+						results.push(entity);
+					);
+					deferred.resolve(results, transaction.attributes);
+				);
+			else
+				# just resolve...
+				deferred.resolve(results, {});
+			return deferred.promise();
+
+		# Pass the spec to get, and just pop the first entity.
+		get_first: (spec) ->
+			spec = (spec instanceof Array) ? spec : [spec];
+			d = _.Deferred();
+
+			this.get(spec).then((data, meta) ->
+				_type = spec._type instanceof Function && spec._type() || spec._type;
+				d.resolve(data[_type].pop(), meta);
+			);
+
+			return d.promise();
+
+		# Save all the new entities.
+		save_new: (store) ->
+			transaction = this.transaction();
+			_.trigger(this, 'saving');
+
+			#Add all new entities to the transaction
+			transaction.add(this._new);
+
+			return this._save(transaction, store);
+
+		# Save all entities with changes, including new entities.
+		save_all: (store) ->
+			transaction = this.transaction();
+			_.trigger(this, 'saving');
+
+			#Add all new entities to the transaction
+			# Modified is keyed by type...
+			_.each(this._modified, (modified) ->
+				# ...and each key contains an object of entity instances
+				_.each(modified, (entity) ->
+					entity._persist(transaction);
+				);
+			);
+
+			_.each(this._new, (neu) ->
+				this.persist(neu);
+			);
+
+			return this._save(transaction, store);
+
+		_save: (transaction, store) ->
+			store = store || this._store;
+			return store.execute('persist', transaction).then(
+				_.bind(this.expand, this)
+			);
+
+		# Returns transaction of all entities in local cache.
+		get_transaction_dump: () ->
+			transaction = this.transaction();
+
+			#Add all entities to the transaction
+			# _instances is keyed by type...
+			_.each(this._instances, (instance) ->
+				# ...and each key contains an object of entity instances
+				_.each(instance, (entity) ->
+					transaction.add(entity);
+				);
+			);
+
+			return transaction;
+	});


add devmode to sendgrid module

add devmode to sendgrid module

 On branch master

	modified:   lib/sendgrid.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/FireworksProject/platform.y.git/'


Target browser

Target browser

--- lib/moment-strftime.coffee
+++ lib/moment-strftime.coffee
@@ -1,4 +1,7 @@
-moment = require('moment')
+if require?
+  moment = require('moment')
+else
+  moment = this.moment

 replacements =
   a: 'ddd'
@@ -29,4 +32,7 @@

   @format(momentFormat)

-module.exports = moment
+if module?
+  module.exports = moment
+else
+  this.moment = moment


Frontend: new api module for simplifying code

error: pathspec 'smsgw/static/src/api/index.coffee' did not match any file(s) known to git

--- smsgw/static/src/api/index.coffee
+++ smsgw/static/src/api/index.coffee
@@ -0,0 +1,61 @@
+###
+See for more information
+http://arcturo.github.io/library/coffeescript/07_the_bad_parts.html
+###
+"use strict"
+
+Promise = require 'bluebird'
+request = require 'superagent'
+localStorage = require 'localStorage'
+
+class ApiError extends Error
+    # bad request url
+    @url = null
+    # request method
+    @method = null
+    # request response code
+    @status = null
+    # message of error, taken from meta or error message
+    @message = null
+    # data content from response body
+    @data = null
+
+
+module.exports =
+    fetch: (method, url, options) ->
+        req = null
+        switch method
+            when 'POST'
+                req = request.post
+            when 'GET'
+                req = request.get
+            when 'PUT'
+                req = request.put
+            when 'DELETE'
+                req = request.del
+
+        new Promise (resolve, reject) ->
+            req = req(url)
+                    .accept 'application/json'
+                    .type 'application/json'
+            if options.token?
+                req = req.set "Authorization", "Token #{options.token}"
+            req = req.send options.data if options.data?
+            req = req.query options.query if options.query?
+            req.end (res) ->
+                body = res.body
+                if res.ok is yes
+                    resolve body
+                else
+                    error = new ApiError()
+                    error.message = res.error.message
+                    error.status = res.status
+                    error.url = res.req.url
+
+                    if body
+                        if 'data' of body
+                            error.data = body.data
+                        if 'meta' of body and 'message' of body.meta
+                            error.message = body.meta.message
+
+                    reject error


Add comment about packing integers.

Add comment about packing integers.

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/rfw/basilisk.git/'


Creates a register for coffee-coverage

Creates a register for coffee-coverage

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

--- test/coverage-register.coffee
+++ test/coverage-register.coffee
@@ -0,0 +1,13 @@
+path = require 'path'
+coffeeCoverage = require 'coffee-coverage'
+projectRoot = path.resolve __dirname, '../'
+coverageVar = coffeeCoverage.findIstanbulVariable()
+writeOnExit = if not coverageVar then "#{projectRoot}/test/coverage-coffee.json" else null
+
+coffeeCoverage.register
+    instrumentor: 'istanbul'
+    basePath: projectRoot
+    exclude: ['test', 'node_modules', '.git', 'Gruntfile.coffee', 'grunt']
+    coverageVar: coverageVar
+    writeOnExit: writeOnExit
+    initAll: true


save -> Save

save -> Save

--- src/app/editor.coffee
+++ src/app/editor.coffee
@@ -701,7 +701,7 @@
       "Your changes will be lost if you don't save them"
       "Save", => @save(session, callback),
       "Cancel", null
-      "Don't save", callback
+      "Don't Save", callback
     )

   remove: (selector, keepData) ->


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

--- src/collidable.coffee
+++ src/collidable.coffee
@@ -109,6 +109,8 @@
           bMass = b.mass()
           totalMass = bMass + aMass

+          normal = overlap.norm()
+
           pushA = normal.scale(-2 * (relativeVelocity.dot(normal) * (bMass / totalMass)))
           pushB = normal.scale(+2 * (relativeVelocity.dot(normal) * (aMass / totalMass)))
           average = pushA.add(pushB).scale(0.5)


Add crystal-linter, disable unused zentabs

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/ylansegal/dotfiles.git/'


Collaboration: if ping fails end session for everyone

--- client/ide/AppController.coffee
+++ client/ide/AppController.coffee
@@ -1700,4 +1700,8 @@
           then console.warn err
           else
             KD.utils.killRepeat repeat
-            @showSessionEndedModal "@#{@collaborationHost} has left the session."
+            @stopCollaborationSession =>
+              new KDNotificationView
+                title    : "@#{@collaborationHost} has left the session."
+                duration : 3000
+              KD.singletons.router.handleRoute '/IDE'


do no open links on standard browser

do no open links on standard browser

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/VoiSmart/Rocket.Chat.git/'


Forgot the main AceEditor file

Forgot the main AceEditor file

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


Added cleanup migration for `<head>undefined</head>`.

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

--- scripts/migrations/head.coffee
+++ scripts/migrations/head.coffee
@@ -0,0 +1,24 @@
+define ['gh-book/xhtml-file'], (XhtmlFile) ->
+    return (model) ->
+      # We return a promise that is resolved when migration is complete.
+      promise = $.Deferred()
+      if model.get('mediaType') == XhtmlFile.prototype.mediaType
+        model.fetch().done () ->
+          orig = model.get('_original')
+          if orig and /<head>undefined<\/head>/.test(orig)
+            # Re-parse it
+            attrs = model.parse({
+              content: orig.replace(/<head>undefined<\/head>/, '')
+            })
+            model.set
+              head: attrs.head
+              body: attrs.body
+            promise.resolve("completed")
+          else
+            promise.resolve("skipped")
+        .fail () ->
+          promise.reject()
+      else
+        # Not an xhtml module, We're done.
+        promise.resolve("skipped")
+      return promise


Translated lines 19-50

Translated lines 19-50

Only exception is the translation for 'nav.code' because I require further clarification on the context in which it is used here

--- app/locale/mk-MK.coffee
+++ app/locale/mk-MK.coffee
@@ -11,43 +11,43 @@
     ipad_browser: "Лоши вести: CodeCombat не работи во прелистувачот на iPad. Добри вести: Нашата апликација за iPad е готова и чека одобрение од Apple."
     campaign: "Кампања"
     for_beginners: "За Почетници"
-    multiplayer: "Повеќе играчи"  # Not currently shown on home page
+    multiplayer: "Повеќе Играчи"  # Not currently shown on home page
     for_developers: "За Developer-и"  # Not currently shown on home page.
     or_ipad: "Или симни за iPad"

   nav:
-    play: "Levels"  # The top nav bar entry where players choose which levels to play
-    community: "Community"
-    editor: "Editor"
-    blog: "Blog"
-    forum: "Forum"
-    account: "Account"
-    profile: "Profile"
-    stats: "Stats"
-    code: "Code"
-    admin: "Admin"  # Only shows up when you are an admin
-    home: "Home"
-    contribute: "Contribute"
-    legal: "Legal"
-    about: "About"
-    contact: "Contact"
-    twitter_follow: "Follow"
-    teachers: "Teachers"
+    play: "Нивоа"  # The top nav bar entry where players choose which levels to play
+    community: "Заедница"
+    editor: "Едитор"
+    blog: "Блог"
+    forum: "Форум"
+    account: "Сметка"
+    profile: "Профил"
+    stats: "Статистики"
+    code: "Code" # TODO
+    admin: "Администратор"  # Only shows up when you are an admin
+    home: "Дома"
+    contribute: "Допринеси"
+    legal: "Законски"
+    about: "За CodeCombat"
+    contact: "Контакт"
+    twitter_follow: "Следи"
+    teachers: "Учители"

   modal:
-    close: "Close"
-    okay: "Okay"
+    close: "Затвори"
+    okay: "Во ред"

   not_found:
-    page_not_found: "Page not found"
+    page_not_found: "Страницата не е најдена"

   diplomat_suggestion:
-    title: "Help translate CodeCombat!"  # This shows up when a player switches to a non-English language using the language selector.
-    sub_heading: "We need your language skills."
-    pitch_body: "We develop CodeCombat in English, but we already have players all over the world. Many of them want to play in {English} but don't speak English, so if you can speak both, please consider signing up to be a Diplomat and help translate both the CodeCombat website and all the levels into {English}."
-    missing_translations: "Until we can translate everything into {English}, you'll see English when {English} isn't available."
-    learn_more: "Learn more about being a Diplomat"
-    subscribe_as_diplomat: "Subscribe as a Diplomat"
+    title: "Помогни да се преведе CodeCombat!"  # This shows up when a player switches to a non-English language using the language selector.
+    sub_heading: "Ни требаат твоите јазични вештини."
+    pitch_body: "Ние ја развиваме CodeCombat на Англиски, но веќе имаме играчи низ целиот свет. Многу од нив сакаат да играат на Македонски, а не разбираат Англиски, па ако ги зборуваш и двата јазика, размисли дали би сакал/а да се зачлениш како Дипломат и да помогнеш да се преведат на Македонски CodeCombat веб сајтот и сите нивоа од играта."
+    missing_translations: "Додека не преведеме сè на Македонски, ќе гледаш Англиски каде што Македонскиот не е достапен."
+    learn_more: "Научи повеќе за тоа како е да се биде Дипломат"
+    subscribe_as_diplomat: "Зачлени се како Дипломат"

   play:
     play_as: "Play As"  # Ladder page


wrong word

wrong word

--- app/locale/pt-BR.coffee
+++ app/locale/pt-BR.coffee
@@ -548,7 +548,7 @@
     main_title: "Editores do CodeCombat"
     article_title: "Editor de Artigo"
     thang_title: "Editor de Thang"
-    level_title: "Editor de Niível"
+    level_title: "Editor de Nível"
 #    achievement_title: "Achievement Editor"
     back: "Voltar"
     revert: "Reverter"


Small fix

Small fix

--- app/locale/pt-PT.coffee
+++ app/locale/pt-PT.coffee
@@ -764,7 +764,7 @@
     join_desc_2: "para começares, e assinalar a caixa abaixo para te declarares um bravo Arcomago e receberes as últimas notícias por e-mail. Queres falar sobre o que fazer ou como te envolveres mais profundamente no projeto? "
     join_desc_3: " ou encontra-nos na nossa "
     join_desc_4: "e começamos a partir daí!"
-    join_url_email: "Envia-nos um e-mail"
+    join_url_email: "Envia-nos uma mensagem"
     join_url_hipchat: "sala HipChat pública"
     archmage_subscribe_desc: "Receber e-mails relativos a novas oportunidades de programação e anúncios."
     artisan_introduction_pref: "Temos de construir mais níveis! As pessoas estão a pedir mais conteúdo, e nós mesmos só podemos construir estes tantos. Neste momento, a tua estação de trabalho é o nível um; o nosso editor de nível é pouco utilizável, até mesmo pelos seus criadores, por isso fica atento. Se tens visões de campanhas que abranjam 'for-loops' para o"


Update pt-PT.coffee

Update pt-PT.coffee

--- app/locale/pt-PT.coffee
+++ app/locale/pt-PT.coffee
@@ -49,9 +49,9 @@
     blog: "Blog"
     forum: "Fórum"
     account: "Conta"
-#    profile: "Profile"
-#    stats: "Stats"
-#    code: "Code"
+    profile: "Perfil"
+    stats: "Estatísticas"
+    code: "Código"
     admin: "Administrador"
     home: "Início"
     contribute: "Contribuir"
@@ -212,15 +212,15 @@
     profile_for_suffix: ""
 #    featured: "Featured"
 #    not_featured: "Not Featured"
-#    looking_for: "Looking for:"
+    looking_for: "À procura de:"
 #    last_updated: "Last updated:"
 #    contact: "Contact"
-#    active: "Looking for interview offers now"
-#    inactive: "Not looking for offers right now"
+    active: "Estou à procura de ofertas de intrevistas agora"
+    inactive: "Não estou à procura de ofertas neste momento"
 #    complete: "complete"
     next: "Seguinte"
     next_city: "cidade?"
-#    next_country: "pick your country."
+    next_country: "escolha o seu país."
     next_name: "nome?"
 #    next_short_description: "write a short description."
 #    next_long_description: "describe your desired position."
@@ -244,9 +244,9 @@
 #    basics_job_title: "Desired Job Title"
 #    basics_job_title_help: "What role are you looking for?"
     basics_city: "Cidade"
-#    basics_city_help: "City you want to work in (or live in now)."
+    basics_city_help: "Cidade na qual quer trabalhar (ou onde vive agora)."
     basics_country: "País"
-#    basics_country_help: "Country you want to work in (or live in now)."
+    basics_country_help: "País no qual quer trabalhar (ou onde vive agora)."
 #    basics_visa: "US Work Status"
 #    basics_visa_help: "Are you authorized to work in the US, or do you need visa sponsorship? (If you live in Canada or Australia, mark authorized.)"
     basics_looking_for: "À Procura De"
@@ -295,17 +295,17 @@
 #    education_description_help: "Highlight anything about this educational experience. (140 chars; optional)"
 #    our_notes: "CodeCombat's Notes"
 #    remarks: "Remarks"
-#    projects: "Projects"
-#    projects_header: "Add 3 projects"
+    projects: "Projetos"
+    projects_header: "Adicione 3 projetos"
 #    projects_header_2: "Projects (Top 3)"
 #    projects_blurb: "Highlight your projects to amaze employers."
-#    project_name: "Project Name"
+    project_name: "Nome do Projeto"
 #    project_name_help: "What was the project called?"
-#    project_description: "Description"
+    project_description: "Descrição"
 #    project_description_help: "Briefly describe the project."
-#    project_picture: "Picture"
+    project_picture: "Imagem"
 #    project_picture_help: "Upload a 230x115px or larger image showing off the project."
-#    project_link: "Link"
+    project_link: "Ligação"
 #    project_link_help: "Link to the project."
 #    player_code: "Player Code"

@@ -325,18 +325,18 @@
     filter_experience: "Experiência"
     filter_experience_senior: "Sénior"
     filter_experience_junior: "Júnior"
-#    filter_experience_recent_grad: "Recent Grad"
+    filter_experience_recent_grad: "Graduado Recentemente"
     filter_experience_student: "Estudante Universitário"
     filter_results: "resultados"
     start_hiring: "Começar a contratar."
-#    reasons: "Three reasons you should hire through us:"
-#    everyone_looking: "Everyone here is looking for their next opportunity."
-#    everyone_looking_blurb: "Forget about 20% LinkedIn InMail response rates. Everyone that we list on this site wants to find their next position and will respond to your request for an introduction."
-#    weeding: "Sit back; we've done the weeding for you."
-#    weeding_blurb: "Every player that we list has been screened for technical ability. We also perform phone screens for select candidates and make notes on their profiles to save you time."
-#    pass_screen: "They will pass your technical screen."
-#    pass_screen_blurb: "Review each candidate's code before reaching out. One employer found that 5x as many of our devs passed their technical screen than hiring from Hacker News."
-#    make_hiring_easier: "Make my hiring easier, please."
+    reasons: "Três razões pelas quais deve contratar através de nós:"
+    everyone_looking: "Aqui todos estão à procura da próxima oportunidade deles."
+    everyone_looking_blurb: "Esqueça os cerca de 20% de taxas de respostta do LinkedIn InMail. Todos os que nós listamos neste sítio quer encontrar a nova posição deles e responderá ao seu pedido para uma introdução."
+    weeding: "Relaxe; fizemos a parte mais difícil por si."
+    weeding_blurb: "Cada jogador que listamos foi sujeito a um teste das habilidades técnicas. Também fazemos testes por telefone para selecionar candidatos e fazer anotações nos perfis deles para lhe poupar tempo."
+    pass_screen: "Eles passarão o seu teste técnico."
+    pass_screen_blurb: "Reveja o código de cada candidato antes de chegar a ele. Um funcionário descobriu que 5x mais programadores nossos passaram o teste técnico deles do que os contratados através do Hacker News."
+    make_hiring_easier: "Torne a minha contratação mais fácil, por favor."
     what: "O que é o CodeCombat?"
     what_blurb: "O CodeCombat é um jogo de programação, no navegador e multijogador. Os jogadores escrevem código para controlar as forças deles em batalha contra outros programadores. Os nossos jogadores têm experiência com todos os conceitos tecnológicos principais."
     cost: "Quanto é que cobramos?"
@@ -430,7 +430,7 @@
     time_goto: "Ir para:"
     infinite_loop_try_again: "Tentar Novamente"
     infinite_loop_reset_level: "Reiniciar Nível"
-#    infinite_loop_comment_out: "Comment Out My Code"
+    infinite_loop_comment_out: "Comentar o Meu Código"

   game_menu:
     inventory_tab: "Inventário"
@@ -499,16 +499,16 @@
     enter: "Enter"
     escape: "Esc"
     cast_spell: "Lançar feitiço atual."
-#    continue_script: "Continue past current script."
-#    skip_scripts: "Skip past all skippable scripts."
+    continue_script: "Saltar o script atual."
+    skip_scripts: "Saltar todos os scripts saltáveis."
     toggle_playback: "Alternar entre Jogar e Pausar."
     scrub_playback: "Andar para a frente e para trás no tempo."
     single_scrub_playback: "Andar para a frente e para trás no tempo um único frame."
-#    scrub_execution: "Scrub through current spell execution."
-#    toggle_debug: "Toggle debug display."
-#    toggle_grid: "Toggle grid overlay."
-#    toggle_pathfinding: "Toggle pathfinding overlay."
-#    beautify: "Beautify your code by standardizing its formatting."
+    scrub_execution: "Analisar a execução do feitiço atual."
+    toggle_debug: "Ativar/desativar a janela de depuração."
+    toggle_grid: "Ativar/desativar a sobreposição da grelha."
+    toggle_pathfinding: "Ativar/desativar a sobreposição do encontrador de caminho."
+    beautify: "Embelezar o código ao estandardizar a formatação."
     move_wizard: "Mover o seu Feiticeiro pelo nível."

   admin:
@@ -525,13 +525,13 @@

   community:
     main_title: "Comunidade do CodeCombat"
-#    introduction: "Check out the ways you can get involved below and decide what sounds the most fun. We look forward to working with you!"
-#    level_editor_prefix: "Use the CodeCombat"
-#    level_editor_suffix: "to create and edit levels. Users have created levels for their classes, friends, hackathons, students, and siblings. If create a new level sounds intimidating you can start by forking one of ours!"
-#    thang_editor_prefix: "We call units within the game 'thangs'. Use the"
-#    thang_editor_suffix: "to modify the CodeCombat source artwork. Allow units to throw projectiles, alter the direction of an animation, change a unit's hit points, or upload your own vector sprites."
-#    article_editor_prefix: "See a mistake in some of our docs? Want to make some instructions for your own creations? Check out the"
-#    article_editor_suffix: "and help CodeCombat players get the most out of their playtime."
+    introduction: "Confira abaixo as formas de se envolver e decida o que lhe parece melhor. Estamos ansiosos por trabalhar consigo!"
+    level_editor_prefix: "Use o"
+    level_editor_suffix: "do CodeCombat para criar e editar níveis. Os utilizadores já criaram níveis para aulas, amigos, maratonas hacker, estudantes e familiares. Se criar um nível parece intimidante, pode começar por bifurcar um dos nossos!"
+    thang_editor_prefix: "Chamamos 'thangs' às unidades do jogo. Use o"
+    thang_editor_suffix: "para modificar a arte do CodeCombat. Permita às unidades lançar projéteis, altere a direção de uma animação, altere os pontos de vida de uma unidade ou anexe as suas próprias unidades."
+    article_editor_prefix: "Vê um erro em alguns dos nossos documentos? Quer escrever algumas instruções para as suas criações? Confira o"
+    article_editor_suffix: "e ajude os jogadores do CodeCombat a obter o máximo do tempo de jogo deles."
     find_us: "Encontre-nos nestes sítios"
     contribute_to_the_project: "Contribua para o projeto"

@@ -703,9 +703,9 @@
 #    art_description_prefix: "All common content is available under the"
 #    cc_license_url: "Creative Commons Attribution 4.0 International License"
 #    art_description_suffix: "Common content is anything made generally available by CodeCombat for the purpose of creating Levels. This includes:"
-#    art_music: "Music"
-#    art_sound: "Sound"
-#    art_artwork: "Artwork"
+    art_music: "Música"
+    art_sound: "Som"
+    art_artwork: "Arte"
 #    art_sprites: "Sprites"
 #    art_other: "Any and all other non-code creative works that are made available when creating Levels."
 #    art_access: "Currently there is no universal, easy system for fetching these assets. In general, fetch them from the URLs as used by the site, contact us for assistance, or help us in extending the site to make these assets more easily accessible."
@@ -713,11 +713,11 @@
 #    use_list_1: "If used in a movie or another game, include codecombat.com in the credits."
 #    use_list_2: "If used on a website, include a link near the usage, for example underneath an image, or in a general attributions page where you might also mention other Creative Commons works and open source software being used on the site. Something that's already clearly referencing CodeCombat, such as a blog post mentioning CodeCombat, does not need some separate attribution."
 #    art_paragraph_2: "If the content being used is created not by CodeCombat but instead by a user of codecombat.com, attribute them instead, and follow attribution directions provided in that resource's description if there are any."
-#    rights_title: "Rights Reserved"
+    rights_title: "Direitos Reservados"
 #    rights_desc: "All rights are reserved for Levels themselves. This includes"
-#    rights_scripts: "Scripts"
-#    rights_unit: "Unit configuration"
-#    rights_description: "Description"
+    rights_scripts: "Scripts"
+    rights_unit: "Configuração da unidade"
+    rights_description: "Descrição"
 #    rights_writings: "Writings"
 #    rights_media: "Media (sounds, music) and any other creative content made specifically for that Level and not made generally available when creating Levels."
 #    rights_clarification: "To clarify, anything that is made available in the Level Editor for the purpose of making levels is under CC, whereas the content created with the Level Editor or uploaded in the course of creation of Levels is not."
@@ -727,22 +727,22 @@

   contribute:
     page_title: "Contribuir"
-    character_classes_title: "Classes de Personagens"
+    character_classes_title: "Classes das Personagens"
     introduction_desc_intro: "Temos esperanças elevadas para o CodeCombat."
 #    introduction_desc_pref: "We want to be where programmers of all stripes come to learn and play together, introduce others to the wonderful world of coding, and reflect the best parts of the community. We can't and don't want to do that alone; what makes projects like GitHub, Stack Overflow and Linux great are the people who use them and build on them. To that end, "
     introduction_desc_github_url: "o CodeCombat é totalmente open source"
 #    introduction_desc_suf: ", and we aim to provide as many ways as possible for you to take part and make this project as much yours as ours."
-    introduction_desc_ending: "Esperemos que se junte a nós!"
+    introduction_desc_ending: "Esperamos que se junte a nós!"
     introduction_desc_signature: "- Nick, George, Scott, Michael, Jeremy e Matt"
-#    alert_account_message_intro: "Hey there!"
-#    alert_account_message: "To subscribe for class emails, you'll need to be logged in first."
+    alert_account_message_intro: "Hey, você!"
+    alert_account_message: "Para se subscrever para receber e-mails de classes, antes precisará de iniciar sessão."
 #    archmage_summary: "Interested in working on game graphics, user interface design, database and server organization, multiplayer networking, physics, sound, or game engine performance? Want to help build a game to help other people learn what you are good at? We have a lot to do and if you are an experienced programmer and want to develop for CodeCombat, this class is for you. We would love your help building the best programming game ever."
 #    archmage_introduction: "One of the best parts about building games is they synthesize so many different things. Graphics, sound, real-time networking, social networking, and of course many of the more common aspects of programming, from low-level database management, and server administration to user facing design and interface building. There's a lot to do, and if you're an experienced programmer with a hankering to really dive into the nitty-gritty of CodeCombat, this class might be for you. We would love to have your help building the best programming game ever."
-#    class_attributes: "Class Attributes"
+    class_attributes: "Atributos da Classe"
 #    archmage_attribute_1_pref: "Knowledge in "
 #    archmage_attribute_1_suf: ", or a desire to learn. Most of our code is in this language. If you're a fan of Ruby or Python, you'll feel right at home. It's JavaScript, but with a nicer syntax."
 #    archmage_attribute_2: "Some experience in programming and personal initiative. We'll help you get oriented, but we can't spend much time training you."
-#    how_to_join: "How To Join"
+    how_to_join: "Como Me Junto"
 #    join_desc_1: "Anyone can help out! Just check out our "
 #    join_desc_2: "to get started, and check the box below to mark yourself as a brave Archmage and get the latest news by email. Want to chat about what to do or how to get more deeply involved? "
 #    join_desc_3: ", or find us in our "
@@ -750,7 +750,7 @@
 #    join_url_email: "Email us"
 #    join_url_hipchat: "public HipChat room"
     more_about_archmage: "Aprenda Mais Sobre Tornar-se um Arcomago"
-#    archmage_subscribe_desc: "Get emails on new coding opportunities and announcements."
+    archmage_subscribe_desc: "Receber e-mails relativos a novas oportunidades de programação e anúncios."
 #    artisan_summary_pref: "Want to design levels and expand CodeCombat's arsenal? People are playing through our content at a pace faster than we can build! Right now, our level editor is barebone, so be wary. Making levels will be a little challenging and buggy. If you have visions of campaigns spanning for-loops to"
 #    artisan_summary_suf: ", then this class is for you."
 #    artisan_introduction_pref: "We must construct additional levels! People be clamoring for more content, and we can only build so many ourselves. Right now your workstation is level one; our level editor is barely usable even by its creators, so be wary. If you have visions of campaigns spanning for-loops to"
@@ -764,7 +764,7 @@
 #    artisan_join_step3: "Find us in our public HipChat room for help."
 #    artisan_join_step4: "Post your levels on the forum for feedback."
     more_about_artisan: "Aprenda Mais Sobre Tornar-se um Artesão"
-#    artisan_subscribe_desc: "Get emails on level editor updates and announcements."
+    artisan_subscribe_desc: "Receber e-mails relativos a novidades do editor de níveis e anúncios."
 #    adventurer_summary: "Let us be clear about your role: you are the tank. You are going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class is for you."
 #    adventurer_introduction: "Let's be clear about your role: you are the tank. You're going to take heavy damage. We need people to try out brand-new levels and help identify how to make things better. The pain will be enormous; making good games is a long process and no one gets it right the first time. If you can endure and have a high constitution score, then this class might be for you."
 #    adventurer_attribute_1: "A thirst for learning. You want to learn how to code and we want to teach you how to code. You'll probably be doing most of the teaching in this case, though."
@@ -773,7 +773,7 @@
 #    adventurer_forum_url: "our forum"
 #    adventurer_join_suf: "so if you prefer to be notified those ways, sign up there!"
     more_about_adventurer: "Aprenda Mais Sobre Tornar-se um Aventureiro"
-#    adventurer_subscribe_desc: "Get emails when there are new levels to test."
+    adventurer_subscribe_desc: "Receber e-mails quando houver novos níveis para testar."
 #    scribe_summary_pref: "CodeCombat is not just going to be a bunch of levels. It will also be a resource of programming knowledge that players can hook into. That way, each Artisan can link to a detailed article that for the player's edification: documentation akin to what the "
 #    scribe_summary_suf: " has built. If you enjoy explaining programming concepts, then this class is for you."
 #    scribe_introduction_pref: "CodeCombat isn't just going to be a bunch of levels. It will also include a resource for knowledge, a wiki of programming concepts that levels can hook into. That way rather than each Artisan having to describe in detail what a comparison operator is, they can simply link their level to the Article describing them that is already written for the player's edification. Something along the lines of what the "
@@ -783,7 +783,7 @@
 #    contact_us_url: "Contact us"
 #    scribe_join_description: "tell us a little about yourself, your experience with programming and what sort of things you'd like to write about. We'll go from there!"
     more_about_scribe: "Aprenda Mais Sobre Tornar-se um Escrivão"
-#    scribe_subscribe_desc: "Get emails about article writing announcements."
+    scribe_subscribe_desc: "Receber e-mails sobre anúncios relativos à escrita de artigos."
 #    diplomat_summary: "There is a large interest in CodeCombat in other countries that do not speak English! We are looking for translators who are willing to spend their time translating the site's corpus of words so that CodeCombat is accessible across the world as soon as possible. If you'd like to help getting CodeCombat international, then this class is for you."
 #    diplomat_introduction_pref: "So, if there's one thing we learned from the "
 #    diplomat_launch_url: "launch in October"
@@ -793,7 +793,7 @@
 #    diplomat_github_url: "on GitHub"
 #    diplomat_join_suf_github: ", edit it online, and submit a pull request. Also, check this box below to keep up-to-date on new internationalization developments!"
     more_about_diplomat: "Aprenda Mais Sobre Tornar-se um Diplomata"
-#    diplomat_subscribe_desc: "Get emails about i18n developments and levels to translate."
+    diplomat_subscribe_desc: "Receber e-mails sobre desenvolvimentos da i18n e níveis para traduzir."
 #    ambassador_summary: "We are trying to build a community, and every community needs a support team when there are troubles. We have got chats, emails, and social networks so that our users can get acquainted with the game. If you want to help people get involved, have fun, and learn some programming, then this class is for you."
 #    ambassador_introduction: "This is a community we're building, and you are the connections. We've got Olark chats, emails, and social networks with lots of people to talk with and help get acquainted with the game and learn from. If you want to help people get involved and have fun, and get a good feel of the pulse of CodeCombat and where we're going, then this class might be for you."
 #    ambassador_attribute_1: "Communication skills. Be able to identify the problems players are having and help them solve them. Also, keep the rest of us informed about what players are saying, what they like and don't like and want more of!"
@@ -801,7 +801,7 @@
 #    ambassador_join_note_strong: "Note"
 #    ambassador_join_note_desc: "One of our top priorities is to build multiplayer where players having difficulty solving levels can summon higher level wizards to help them. This will be a great way for ambassadors to do their thing. We'll keep you posted!"
     more_about_ambassador: "Aprenda Mais Sobre Tornar-se um Embaixador"
-#    ambassador_subscribe_desc: "Get emails on support updates and multiplayer developments."
+    ambassador_subscribe_desc: "Receber e-mails relativos a novidades do suporte e desenvolvimentos do modo multijogador."
     changes_auto_save: "As alterações são guardadas automaticamente quando clica nas caixas."
     diligent_scribes: "Os Nossos Dedicados Escrivões:"
     powerful_archmages: "Os Nossos Poderosos Arcomagos:"
@@ -830,7 +830,7 @@
     simulate: "Simular"
     simulation_explanation: "Ao simular jogos pode ter o seu jogo classificado mais rapidamente!"
     simulate_games: "Simular Jogos!"
-#    simulate_all: "RESET AND SIMULATE GAMES"
+    simulate_all: "REINICIAR E SIMULAR JOGOS"
     games_simulated_by: "Jogos simulados por si:"
     games_simulated_for: "Jogos simulados para si:"
     games_simulated: "Jogos simulados"
@@ -934,8 +934,8 @@
     level_session: "A Sua Sessão"
     opponent_session: "Sessão do Adversário"
     article: "Artigo"
-#    user_names: "User Names"
-#    thang_names: "Thang Names"
+    user_names: "Nomes de Utilizador"
+    thang_names: "Nomes de Thangs"
     files: "Ficheiros"
 #    top_simulators: "Top Simulators"
     source_document: "Documento Fonte"


Fixed broken url

Fixed broken url

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/evercam/evercam-dashboard.git/'


New log backend.

New log backend.

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

--- app/assets/javascripts/app/lib/app_init/log.js.coffee
+++ app/assets/javascripts/app/lib/app_init/log.js.coffee
@@ -0,0 +1,34 @@
+class App.Log
+  _instance = undefined
+
+#  @sub: (module) ->
+#  @module: (name) ->
+
+  @log: ( module, level, args... ) ->
+    if _instance == undefined
+      _instance ?= new _Singleton
+    _instance.log( module, level, args )
+
+  @debug: ( module, level, args... ) ->
+    if _instance == undefined
+      _instance ?= new _Singleton
+    _instance.log( module, level, args )
+
+
+class _Singleton
+  constructor: ->
+    console.log 'NNNNNNNEEEWWW LOG!!!'
+    @config = {}
+#      Session: true
+#      ControllerForm: true
+
+  log: ( module, level, args ) ->
+    if !@config || level isnt 'debug'
+      @_log( module, level, args )
+    else if @config[ module ]
+      @_log( module, level, args )
+
+
+  _log: ( module, level, args ) ->
+    console.log "App.#{module}(#{level})", args
+


add redactor && air redactor in afterInsertField function

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/pisaq/para.git/'


Update sk.coffee (#4193)

Update sk.coffee (#4193)

translations:About

--- app/locale/sk.coffee
+++ app/locale/sk.coffee
@@ -668,14 +668,14 @@
     managed_by: "Riadené"
     will_be_cancelled: "Končí"
     currently_free: "Nemáš platené predplatné"
-#    currently_free_until: "You currently have a subscription until"
-#    was_free_until: "You had a free subscription until"
-#    managed_subs: "Managed Subscriptions"
-#    subscribing: "Subscribing..."
-#    current_recipients: "Current Recipients"
-#    unsubscribing: "Unsubscribing"
-#    subscribe_prepaid: "Click Subscribe to use prepaid code"
-#    using_prepaid: "Using prepaid code for monthly subscription"
+    currently_free_until: "Tvoje predplatné trvá do"
+    was_free_until: "Máš predplatné zdarma do"
+    managed_subs: "Riadené predplatné"
+    subscribing: "Prihlasujem na predplatné..."
+    current_recipients: "Predplatitelia"
+    unsubscribing: "Zrušenie predpaltného"
+    subscribe_prepaid: "Klikni na Predplatné s kódom"
+    using_prepaid: "Používam Mesačné predplatné"

   choose_hero:
     choose_hero: "Vyber si svojho hrdinu"
@@ -687,7 +687,7 @@
     javascript_blurb: "Jazyk webových stránok. (Nie je to Java)"
     coffeescript_blurb: "Krajšia syntax pre JavaScript"
     lua_blurb: "Jazyk na skriptovanie hier."
-#    java_blurb: "(Subscriber Only) Android and enterprise."
+    java_blurb: "(Iba pre predplatiteľov) Android."
     status: "Stav"
     weapons: "Zbrane"
     weapons_warrior: "Meče - Krátka vzdialenosť, Žiadna mágia"
@@ -762,17 +762,17 @@
     editor_config_behaviors_description: "Automaticky doplňuje hranaté a oblé zátvorky a úvodzovky."

   about:
-#    main_title: "If you want to learn to program, you need to write (a lot of) code."
-#    main_description: "At CodeCombat, our job is to make sure you're doing that with a smile on your face."
-#    mission_link: "Mission"
-#    team_link: "Team"
-#    story_link: "Story"
-#    press_link: "Press"
-#    mission_title: "Our mission: make programming accessible to every student on Earth."
-#    mission_description_1: "Programming is magic. It's the ability to create things from pure imagination. We started CodeCombat to give learners the feeling of wizardly power at their fingertips by using typed code."
-#    mission_description_2: "As it turns out, that enables them to learn faster too. WAY faster. It's like having a conversation instead of reading a manual. We want to bring that conversation to every school and to every student, because everyone should have the chance to learn the magic of programming."
-#    team_title: "Meet the CodeCombat team"
-#    team_values: "We value open and respectful dialog, where the best idea wins. Our decisions are grounded in customer research and our process is focused on delivering tangible results for them. Everyone is hands-on, from our CEO to our GitHub contributors, because we value growth and learning in our team."
+    main_title: "Ak sa chceš naučiť programovať, musíš napísať veľa kódu."
+    main_description: "Úlohou CodeCombatu je programovanie s úsmevom."
+    mission_link: "Cieľ"
+    team_link: "Tím"
+    story_link: "Príbeh"
+    press_link: "Pre tlač"
+    mission_title: "Náš cieľ: Sprístupnenie programovania pre všetkých."
+    mission_description_1: "Programovanie je mágia.Je to možnosť, ako využiť svoju predstavivosť. Začali sme s CodeCombatom, aby naši študenti pocítili magické schopnosti pri písaní kódu."
+    mission_description_2: "Takýmto spôsobom sa naučia programovať omnoho rýchlejšie. Je to ako rozhovor namiesto čítania manuálu. Chceme umožniť túto konverzáciu každému študentovi, pretože všetci by mali mať možnosť naučiť sa programovacie čary."
+    team_title: "Zoznám sa s tímom CodeCombat"
+    team_values: "Ceníme si otvorený a zdvorilý dialóg, v ktorom vyhrá najlepšia myšlienka. Naše rozhodnutia sú založené na prieskume užívateľov. Všetci sú zainteresovaní na výsledku, od výkonného riaditeľa až po prispievateľov na  GitHube."
     nick_title: "Spoluzakladateľ" # {change}
     nick_blurb: "Motivačný Guru"
     matt_title: "Programátor" # {change}
@@ -780,14 +780,14 @@
     cat_blurb: "Ohýbačka vzduchu"
     scott_title: "Spoluzakladateľ" # {change}
     scott_blurb: "Ten rozumný"
-#    maka_title: "Customer Advocate"
-#    maka_blurb: "Storyteller"
-#    rob_title: "Software Engineer"
-#    rob_blurb: "Codes things and stuff"
-#    josh_c_title: "Game Designer"
-#    josh_c_blurb: "Designs games"
-#    robin_title: "Product Manager"
-#    robin_blurb: "Ships things"
+    maka_title: "Pomocník pre užívateľov"
+    maka_blurb: "Rozprávač"
+    rob_title: "Softvérový inžinier"
+    rob_blurb: "Kódovač"
+    josh_c_title: "Herný dizajnér"
+    josh_c_blurb: "Robí dizajn hier"
+    robin_title: "Produktový manažér"
+    robin_blurb: "Stará sa o veci"
     josh_title: "Dizajnér hier"
     josh_blurb: "Podlaha je láva"
     phoenix_title: "Softvérový inžinier"
@@ -802,25 +802,25 @@
     retrostyle_blurb: "Retro hry"
     jose_title: "Hudba"
     jose_blurb: "Vzlet"
-#    community_title: "...and our open-source community"
-#    community_subtitle: "Over 500 contributors have helped build CodeCombat, with more joining every week!"
-#    community_description_3: "CodeCombat is a"
-#    community_description_link_2: "community project"
-#    community_description_1: "with hundreds of players volunteering to create levels, contribute to our code to add features, fix bugs, playtest, and even translate the game into 50 languages so far. Employees, contributors and the site gain by sharing ideas and pooling effort, as does the open source community in general. The site is built on numerous open source projects, and we are open sourced to give back to the community and provide code-curious players a familiar project to explore and experiment with. Anyone can join the CodeCombat community! Check out our"
-#    community_description_link: "contribute page"
-#    community_description_2: "for more info."
-#    number_contributors: "Over 450 contributors have lent their support and time to this project."
-#    story_title: "Our story so far"
-#    story_subtitle: "Since 2013, CodeCombat has grown from a mere set of sketches to a living, thriving game."
-#    story_statistic_1a: "5,000,000+"
-#    story_statistic_1b: "total players"
-#    story_statistic_1c: "have started their programming journey through CodeCombat"
-#    story_statistic_2a: "We’ve been translated into over 50 languages — our players hail from"
-#    story_statistic_2b: "200+ countries"
-#    story_statistic_3a: "Together, they have written"
-#    story_statistic_3b: "1 billion lines of code and counting"
-#    story_statistic_3c: "across many different programming languages"
-#    story_long_way_1: "Though we've come a long way..."
+    community_title: "...a naša komunita open-source"
+    community_subtitle: "Vyše  500 spolupracovníkov pomohlo s tvorbou CodeCombatu. Každý týždeň pribúdajú ďalší."
+    community_description_3: "CodeCombat je"
+    community_description_link_2: "komunitný projekt"
+    community_description_1: "so stovkami hráčov, ktorí vytvárajú úrovne, pridávajú nové funkcie, opravujú chyby, testujú hru alebo ju prekladajú už do vyše 50 jazykov. Zdielanie ideí je v open source komunite samozrejmosťou. Stránka je založená na viacerých  open source projectoch a my vraciame komunite späť náš projekt, ktorého kód je možné preskúmať a experimentovať s ním. Ku komunite hry CodeCombat sa môže pridať hocikto. Pozri si"
+    community_description_link: "stránku pre prispievateľov,"
+    community_description_2: "kde nájdeš viacej informácií."
+    number_contributors: "Do nášho projektu sa zapojilo už vyše 500 spolupracovníkov."
+    story_title: "Náš doterajší príbeh"
+    story_subtitle: "Všetko sa začalo v roku 2013, keď sa začal  CodeCombat meniť z pár náčrtov na živú, vzrušujúcu hru"
+    story_statistic_1a: "5,000,000+"
+    story_statistic_1b: "hráčov"
+    story_statistic_1c: "svoju programátorskú dráhu vďaka CodeCombatu."
+    story_statistic_2a: "Hra je preložená do vyše 50 jazykov a hrajú ju hráči"
+    story_statistic_2b: "v 200+ krajinách"
+    story_statistic_3a: "Spolu napísali"
+    story_statistic_3b: "miliardy riadkov kódu"
+    story_statistic_3c: "v rôznych programovacích jazykoch"
+    story_long_way_1: "Hoci sme prešli dlhú cestu"
 #    story_sketch_caption: "Nick's very first sketch depicting a programming game in action."
 #    story_long_way_2: "we still have much to do before we complete our quest, so..."
 #    jobs_title: "Come work with us and help write CodeCombat history!"


Add image's custom scaling like Deckset

Add image's custom scaling like Deckset

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/will-hart/marp.git/'


fix example generator with no parameters

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/generator-steroids.git/'


defined log in album model

defined log in album model

--- server/models/album.coffee
+++ server/models/album.coffee
@@ -1,5 +1,6 @@
 cozydb = require 'cozydb'
 _ = require 'lodash'
+log = require('printit')('modelAlbum')

 module.exports = Album = cozydb.getModel 'Album',
     id            : String


This settings needs a full-path for things to work


Added bare-bones character entity

Added bare-bones character entity

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

--- src/wrathnet/entities/character.coffee
+++ src/wrathnet/entities/character.coffee
@@ -0,0 +1,21 @@
+#
+# WrathNet Foundation
+# Copyright (c) 2012 Tim Kurvers <http://wrathnet.org>
+#
+# World of Warcraft client foundation written in JavaScript, enabling
+# development of expansion-agnostic clients, bots and other useful tools.
+#
+# The contents of this file are subject to the MIT License, under which
+# this library is licensed. See the LICENSE file for the full license.
+#
+
+# Denotes a character
+class WrathNet.entities.Character
+
+  # Creates a new character
+  constructor: ->
+    console.log 'new character'
+
+  # Short string representation of this character
+  toString: ->
+    return '[Character]'


generate readme in default grunt target

generate readme in default grunt target

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -55,7 +55,7 @@
   grunt.loadNpmTasks 'grunt-coffeelint';

   grunt.registerTask 'build', ['clean:dist', 'copy', 'replace:asserts', 'coffee', 'uglify', 'clean:coffee']
-  grunt.registerTask 'default', ['build']
+  grunt.registerTask 'default', ['build','readme']

   grunt.registerTask 'readme', 'Generate README.md', ->
     fs = require 'fs'


Change atom config

Change atom config

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/danielgavrilov/dotfiles.git/'


Remove empty lines

Remove empty lines

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/enrmarc/f.git/'


Reset document.title after each spec to prevent test pollution

--- spec/spec-helper.coffee
+++ spec/spec-helper.coffee
@@ -7,11 +7,14 @@
 require 'window'
 window.showConsole()

+defaultTitle = document.title
+
 beforeEach ->
   window.resetTimeouts()

 afterEach ->
   $('#jasmine-content').empty()
+  document.title = defaultTitle

 window.keymap.bindKeys '*', 'meta-w': 'close'
 $(document).on 'close', -> window.close()


Make TokenizedBuffer behave consistently when tokenizeInBackground is mocked

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/stinsonga/atom.git/'


do not manually uri encode query string, already being handled by jquery

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/saijim/Multipleter.git/'


Added support for reporting progress when bulk rendering.

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/urbanetic/meteor-atlas-util.git/'