| /* | 
|  * JavaScript Canvas to Blob 2.0.5 | 
|  * https://github.com/blueimp/JavaScript-Canvas-to-Blob | 
|  * | 
|  * Copyright 2012, Sebastian Tschan | 
|  * https://blueimp.net | 
|  * | 
|  * Licensed under the MIT license: | 
|  * http://www.opensource.org/licenses/MIT | 
|  * | 
|  * Based on stackoverflow user Stoive's code snippet: | 
|  * http://stackoverflow.com/q/4998908 | 
|  */ | 
|   | 
| /*jslint nomen: true, regexp: true */ | 
| /*global window, atob, Blob, ArrayBuffer, Uint8Array, define */ | 
|   | 
| (function (window) { | 
|     'use strict'; | 
|     var CanvasPrototype = window.HTMLCanvasElement && | 
|             window.HTMLCanvasElement.prototype, | 
|         hasBlobConstructor = window.Blob && (function () { | 
|             try { | 
|                 return Boolean(new Blob()); | 
|             } catch (e) { | 
|                 return false; | 
|             } | 
|         }()), | 
|         hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array && | 
|             (function () { | 
|                 try { | 
|                     return new Blob([new Uint8Array(100)]).size === 100; | 
|                 } catch (e) { | 
|                     return false; | 
|                 } | 
|             }()), | 
|         BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || | 
|             window.MozBlobBuilder || window.MSBlobBuilder, | 
|         dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob && | 
|             window.ArrayBuffer && window.Uint8Array && function (dataURI) { | 
|                 var byteString, | 
|                     arrayBuffer, | 
|                     intArray, | 
|                     i, | 
|                     mimeString, | 
|                     bb; | 
|                 if (dataURI.split(',')[0].indexOf('base64') >= 0) { | 
|                     // Convert base64 to raw binary data held in a string: | 
|                     byteString = atob(dataURI.split(',')[1]); | 
|                 } else { | 
|                     // Convert base64/URLEncoded data component to raw binary data: | 
|                     byteString = decodeURIComponent(dataURI.split(',')[1]); | 
|                 } | 
|                 // Write the bytes of the string to an ArrayBuffer: | 
|                 arrayBuffer = new ArrayBuffer(byteString.length); | 
|                 intArray = new Uint8Array(arrayBuffer); | 
|                 for (i = 0; i < byteString.length; i += 1) { | 
|                     intArray[i] = byteString.charCodeAt(i); | 
|                 } | 
|                 // Separate out the mime component: | 
|                 mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; | 
|                 // Write the ArrayBuffer (or ArrayBufferView) to a blob: | 
|                 if (hasBlobConstructor) { | 
|                     return new Blob( | 
|                         [hasArrayBufferViewSupport ? intArray : arrayBuffer], | 
|                         {type: mimeString} | 
|                     ); | 
|                 } | 
|                 bb = new BlobBuilder(); | 
|                 bb.append(arrayBuffer); | 
|                 return bb.getBlob(mimeString); | 
|             }; | 
|     if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) { | 
|         if (CanvasPrototype.mozGetAsFile) { | 
|             CanvasPrototype.toBlob = function (callback, type, quality) { | 
|                 if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) { | 
|                     callback(dataURLtoBlob(this.toDataURL(type, quality))); | 
|                 } else { | 
|                     callback(this.mozGetAsFile('blob', type)); | 
|                 } | 
|             }; | 
|         } else if (CanvasPrototype.toDataURL && dataURLtoBlob) { | 
|             CanvasPrototype.toBlob = function (callback, type, quality) { | 
|                 callback(dataURLtoBlob(this.toDataURL(type, quality))); | 
|             }; | 
|         } | 
|     } | 
|     if (typeof define === 'function' && define.amd) { | 
|         define(function () { | 
|             return dataURLtoBlob; | 
|         }); | 
|     } else { | 
|         window.dataURLtoBlob = dataURLtoBlob; | 
|     } | 
| }(window)); |