define(function () {
    // PhantomJS doesn't support bind yet
    Function.prototype.bind = Function.prototype.bind || function (thisp) {
      var fn = this;
      return function () {
        return fn.apply(thisp, arguments);
      };
    };
});

@@ -10,24 +10,62 @@
 nction () %7B%0A
+    if (!Function.prototype.bind) %7B%0A  
     // Phant
@@ -98,16 +98,18 @@
 yet%0A    
+  
 Function
@@ -130,87 +130,430 @@
 d = 
-Function.prototype.bind %7C%7C function (thisp) %7B%0A      var fn
+function(oThis) %7B%0A        if (typeof this !== 'function') %7B%0A          // closest thing possible to the ECMAScript 5%0A          // internal IsCallable function%0A          throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');%0A        %7D%0A%0A        var aArgs   = Array.prototype.slice.call(arguments, 1),%0A            fToBind
  = this
-;%0A
+,%0A   
       
-return
+   fNOP    = function() %7B%7D,%0A            fBound  =
  fun
@@ -549,33 +549,32 @@
 ound  = function
- 
 () %7B%0A        ret
@@ -574,16 +574,22 @@
     
+     
+ 
 return f
 n.ap
@@ -584,17 +584,22 @@
 return f
-n
+ToBind
 .apply(t
@@ -605,38 +605,620 @@
 this
-p, arguments);%0A      %7D;%0A    %7D;
+ instanceof fNOP ? this : oThis,%0A                        aArgs.concat(Array.prototype.slice.call(arguments)));%0A            %7D;%0A%0A        fNOP.prototype = this.prototype;%0A        fBound.prototype = new fNOP();%0A%0A        return fBound;%0A      %7D;%0A    %7D%0A    if (!String.prototype.startsWith) %7B%0A      Object.defineProperty(String.prototype, 'startsWith', %7B%0A        enumerable: false,%0A        configurable: false,%0A        writable: false,%0A        value: function(searchString, position) %7B%0A          position = position %7C%7C 0;%0A          return this.lastIndexOf(searchString, position) === position;%0A        %7D%0A      %7D);%0A    %7D
 %0A%7D);

Add String.startsWith polyfill