{"version":3,"sources":["webpack:///./node_modules/create-hmac/browser.js","webpack:///./node_modules/crypto-browserify/index.js","webpack:///./node_modules/create-ecdh/node_modules/bn.js/lib/bn.js","webpack:///./node_modules/create-hash/md5.js","webpack:///./node_modules/create-hash/browser.js","webpack:///./node_modules/cropperjs/dist/cropper.js","webpack:///./node_modules/create-hmac/legacy.js","webpack:///./node_modules/delayed-stream/lib/delayed_stream.js","webpack:///./node_modules/create-ecdh/browser.js"],"names":["inherits","Legacy","Base","Buffer","md5","RIPEMD160","sha","ZEROS","alloc","Hmac","alg","key","call","this","from","blocksize","_alg","_key","length","hash","update","digest","concat","ipad","_ipad","allocUnsafe","opad","_opad","i","_hash","prototype","_update","data","_final","h","module","exports","toLowerCase","randomBytes","rng","pseudoRandomBytes","prng","createHash","Hash","createHmac","algos","algoKeys","Object","keys","hashes","getHashes","p","pbkdf2","pbkdf2Sync","aes","Cipher","createCipher","Cipheriv","createCipheriv","Decipher","createDecipher","Decipheriv","createDecipheriv","getCiphers","listCiphers","dh","DiffieHellmanGroup","createDiffieHellmanGroup","getDiffieHellman","createDiffieHellman","DiffieHellman","sign","createSign","Sign","createVerify","Verify","createECDH","publicEncrypt","privateEncrypt","publicDecrypt","privateDecrypt","rf","randomFill","randomFillSync","createCredentials","Error","join","constants","assert","val","msg","ctor","superCtor","super_","TempCtor","constructor","BN","number","base","endian","isBN","negative","words","red","_init","wordSize","window","e","parseHex4Bits","string","index","c","charCodeAt","parseHexByte","lowerBound","r","parseBase","str","start","end","mul","len","Math","min","num","Array","isArray","max","left","right","cmp","_initNumber","_initArray","toString","replace","_parseHex","_parseBase","toArray","ceil","j","w","off","strip","parseLength","limbLen","limbPow","total","mod","word","imuln","_iaddn","pow","copy","dest","clone","_expand","size","_normSign","inspect","zeros","groupSizes","groupBases","toBitArray","bitLength","bit","wbit","smallMulTo","self","out","a","b","lo","carry","k","ncarry","rword","maxJ","padding","groupSize","groupBase","isZero","modn","idivn","toNumber","ret","toJSON","toBuffer","toArrayLike","ArrayType","byteLength","reqLength","littleEndian","res","q","andln","iushrn","clz32","_countBits","t","_zeroBits","hi","zeroBits","toTwos","width","abs","inotn","iaddn","fromTwos","testn","notn","ineg","isNeg","neg","iuor","ior","or","uor","iuand","iand","and","uand","iuxor","ixor","xor","uxor","bytesNeeded","bitsLeft","setn","iadd","isub","add","sub","comb10MulTo","mid","o","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","imul","w0","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","bigMulTo","hncarry","jumboMulTo","fftm","FFTM","mulp","x","y","mulTo","makeRBT","N","l","revBin","rb","permute","rbt","rws","iws","rtws","itws","transform","s","rtwdf","cos","PI","itwdf","sin","rtwdf_","itwdf_","re","ie","ro","io","rx","guessLen13b","n","m","odd","conjugate","normalize13b","ws","round","convert13b","stub","ph","_","rwst","iwst","nrws","nrwst","niwst","rmws","mulf","muln","sqr","isqr","iushln","bits","carryMask","newCarry","ishln","hint","extended","mask","maskedWords","ishrn","shln","ushln","shrn","ushrn","imaskn","maskn","isubn","addn","subn","iabs","_ishlnsubmul","shift","_wordDiv","mode","bhi","bhiBits","diff","qj","div","divmod","positive","divn","umod","divRound","dm","half","r2","acc","egcd","A","B","C","D","g","isEven","yp","xp","im","isOdd","jm","gcd","_invmp","x1","x2","delta","cmpn","invm","bincn","ucmp","gtn","gt","gten","gte","ltn","lt","lten","lte","eqn","eq","Red","toRed","ctx","convertTo","_forceRed","fromRed","convertFrom","forceRed","redAdd","redIAdd","redSub","redISub","redShl","shl","redMul","_verify2","redIMul","redSqr","_verify1","redISqr","redSqrt","sqrt","redInvm","redNeg","redPow","primes","k256","p224","p192","p25519","MPrime","name","tmp","_tmp","K256","P224","P192","P25519","prime","_prime","Mont","imod","rinv","minv","ireduce","rlen","split","imulK","undefined","_strip","input","output","outLen","prev","next","mod3","one","nOne","lpow","z","inv","windowSize","wnd","current","currentLen","mont","u","MD5","buffer","global","factory","ownKeys","object","enumerableOnly","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread2","target","arguments","source","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_typeof","obj","Symbol","iterator","_classCallCheck","instance","Constructor","TypeError","_defineProperties","props","descriptor","configurable","writable","_createClass","protoProps","staticProps","value","_toConsumableArray","arr","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","_arrayLikeToArray","iter","minLen","slice","test","arr2","IS_BROWSER","document","WINDOW","IS_TOUCH_DEVICE","documentElement","HAS_POINTER_EVENT","NAMESPACE","ACTION_ALL","ACTION_CROP","ACTION_MOVE","ACTION_ZOOM","ACTION_EAST","ACTION_WEST","ACTION_SOUTH","ACTION_NORTH","ACTION_NORTH_EAST","ACTION_NORTH_WEST","ACTION_SOUTH_EAST","ACTION_SOUTH_WEST","CLASS_CROP","CLASS_DISABLED","CLASS_HIDDEN","CLASS_HIDE","CLASS_INVISIBLE","CLASS_MODAL","CLASS_MOVE","DATA_ACTION","DATA_PREVIEW","DRAG_MODE_CROP","DRAG_MODE_MOVE","DRAG_MODE_NONE","EVENT_CROP","EVENT_CROP_END","EVENT_CROP_MOVE","EVENT_CROP_START","EVENT_DBLCLICK","EVENT_TOUCH_START","EVENT_TOUCH_MOVE","EVENT_TOUCH_END","EVENT_POINTER_DOWN","EVENT_POINTER_MOVE","EVENT_POINTER_UP","EVENT_READY","EVENT_RESIZE","EVENT_WHEEL","EVENT_ZOOM","MIME_TYPE_JPEG","REGEXP_ACTIONS","REGEXP_DATA_URL","REGEXP_DATA_URL_JPEG","REGEXP_TAG_NAME","MIN_CONTAINER_WIDTH","MIN_CONTAINER_HEIGHT","DEFAULTS","viewMode","dragMode","initialAspectRatio","NaN","aspectRatio","preview","responsive","restore","checkCrossOrigin","checkOrientation","modal","guides","center","highlight","background","autoCrop","autoCropArea","movable","rotatable","scalable","zoomable","zoomOnTouch","zoomOnWheel","wheelZoomRatio","cropBoxMovable","cropBoxResizable","toggleDragModeOnDblclick","minCanvasWidth","minCanvasHeight","minCropBoxWidth","minCropBoxHeight","minContainerWidth","minContainerHeight","ready","cropstart","cropmove","cropend","crop","zoom","TEMPLATE","isNaN","Number","isNumber","isPositiveNumber","Infinity","isUndefined","isObject","hasOwnProperty","isPlainObject","_constructor","error","isFunction","callback","assign","_len","args","arg","REGEXP_DECIMALS","normalizeDecimalNumber","times","REGEXP_SUFFIX","setStyle","element","styles","style","property","hasClass","classList","contains","className","indexOf","addClass","elem","trim","removeClass","remove","toggleClass","added","REGEXP_CAMEL_CASE","toParamCase","getData","dataset","getAttribute","setData","setAttribute","removeData","removeAttribute","REGEXP_SPACES","onceSupported","supported","once","listener","options","get","set","addEventListener","removeEventListener","removeListener","type","handler","event","listeners","addListener","_handler","_element$listeners","_len2","_key2","dispatchEvent","Event","CustomEvent","detail","bubbles","cancelable","createEvent","initCustomEvent","getOffset","box","getBoundingClientRect","pageXOffset","clientLeft","top","pageYOffset","clientTop","location","REGEXP_ORIGINS","isCrossOriginURL","url","parts","match","protocol","hostname","port","addTimestamp","timestamp","Date","getTime","getTransforms","_ref","rotate","scaleX","scaleY","translateX","translateY","values","WebkitTransform","msTransform","getMaxZoomRatio","pointers","pointers2","maxRatio","pointer","pointerId","pointer2","startX","y1","startY","endX","y2","endY","z1","z2","ratio","getPointer","_ref2","endOnly","pageX","pageY","getPointersCenter","count","_ref3","getAdjustedSizes","_ref4","height","isValidWidth","isValidHeight","adjustedWidth","getRotatedSizes","_ref5","degree","arc","sinArc","cosArc","newWidth","newHeight","getSourceCanvas","image","_ref6","_ref7","_ref8","imageAspectRatio","imageNaturalWidth","naturalWidth","imageNaturalHeight","naturalHeight","_ref6$rotate","_ref6$scaleX","_ref6$scaleY","_ref8$fillColor","fillColor","_ref8$imageSmoothingE","imageSmoothingEnabled","_ref8$imageSmoothingQ","imageSmoothingQuality","_ref8$maxWidth","maxWidth","_ref8$maxHeight","maxHeight","_ref8$minWidth","minWidth","_ref8$minHeight","minHeight","canvas","createElement","context","getContext","maxSizes","minSizes","destMaxSizes","destMinSizes","destWidth","destHeight","params","fillStyle","fillRect","save","translate","scale","drawImage","map","param","floor","fromCharCode","String","getStringFromCharCode","dataView","getUint8","REGEXP_DATA_URL_HEAD","dataURLToArrayBuffer","dataURL","base64","binary","atob","arrayBuffer","ArrayBuffer","uint8","Uint8Array","arrayBufferToDataURL","mimeType","chunks","chunkSize","subarray","btoa","resetAndGetOrientation","orientation","DataView","app1Start","ifdStart","offset","exifIDCode","tiffOffset","endianness","getUint16","firstIFDOffset","getUint32","_offset","_length","setUint16","parseOrientation","render","initContainer","initCanvas","initCropBox","renderCanvas","cropped","renderCropBox","container","cropper","containerData","offsetWidth","offsetHeight","imageData","rotated","canvasWidth","canvasHeight","canvasData","limited","limitCanvas","oldLeft","oldTop","initialCanvasData","sizeLimited","positionLimited","cropBoxData","_getAdjustedSizes","newCanvasLeft","newCanvasTop","minLeft","minTop","maxLeft","maxTop","changed","transformed","_getRotatedSizes","renderImage","limitCropBox","initialCropBoxData","maxCropBoxWidth","maxCropBoxHeight","face","cropBox","disabled","initPreview","crossOrigin","crossOriginUrl","alt","src","viewBox","appendChild","viewBoxImage","previews","ownerDocument","querySelectorAll","querySelector","el","img","html","innerHTML","cssText","resetPreview","cropBoxWidth","cropBoxHeight","originalWidth","originalHeight","getElementsByTagName","events","bind","onCropStart","cropStart","onWheel","wheel","passive","capture","onDblclick","dblclick","onCropMove","cropMove","onCropEnd","cropEnd","onResize","resize","unbind","handlers","ratioX","ratioY","getCanvasData","getCropBoxData","setCanvasData","setCropBoxData","setDragMode","dragBox","_this","preventDefault","wheeling","setTimeout","deltaY","wheelDelta","buttons","button","pointerType","ctrlKey","action","changedTouches","touch","identifier","originalEvent","cropping","change","bottom","renderable","shiftKey","range","check","side","move","methods","reset","initialImageData","clear","hasSameSize","isImg","replaced","uncreate","load","enable","disable","destroy","originalUrl","offsetX","offsetY","_this$canvasData","moveTo","_originalEvent","zoomTo","pivot","oldRatio","rotateTo","_scaleX","_scaleY","rounded","getContainerData","getImageData","sized","widthChanged","heightChanged","getCroppedCanvas","HTMLCanvasElement","_this$getData","initialX","initialY","initialWidth","initialHeight","_options$imageSmoothi","srcWidth","srcHeight","dstX","dstY","dstWidth","dstHeight","sourceWidth","sourceHeight","srcX","srcY","setAspectRatio","croppable","AnotherCropper","Cropper","tagName","reloading","sizing","init","toDataURL","read","xhr","XMLHttpRequest","onabort","onerror","ontimeout","onprogress","getResponseHeader","abort","onload","response","onloadend","open","responseType","withCredentials","send","_parseOrientation","stop","parentNode","insertBefore","nextSibling","_this2","isIOSWebKit","navigator","userAgent","done","build","sizingImage","body","removeChild","template","getElementsByClassName","unbuild","Stream","util","DelayedStream","dataSize","maxDataSize","pauseStream","_maxDataSizeExceeded","_released","_bufferedEvents","create","delayedStream","option","realEmit","emit","_handleEmit","on","pause","readable","setEncoding","resume","release","pipe","_checkIfMaxDataSizeExceeded","message","curve","ECDH","aliases","secp256k1","secp224r1","prime256v1","prime192v1","ed25519","secp384r1","secp521r1","curveType","elliptic","ec","formatReturnValue","bn","enc","buf","fill","p256","secp256r1","secp192r1","p384","p521","generateKeys","format","genKeyPair","getPublicKey","computeSecret","other","inenc","isBuffer","otherPub","keyFromPublic","getPublic","getPrivate","getX","getPrivateKey","setPublicKey","pub","_importPublic","setPrivateKey","priv","_priv","_importPrivate"],"mappings":"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","file":"js/account~d939e436.e99c2c54.js","sourcesContent":["'use strict'\nvar inherits = require('inherits')\nvar Legacy = require('./legacy')\nvar Base = require('cipher-base')\nvar Buffer = require('safe-buffer').Buffer\nvar md5 = require('create-hash/md5')\nvar RIPEMD160 = require('ripemd160')\n\nvar sha = require('sha.js')\n\nvar ZEROS = Buffer.alloc(128)\n\nfunction Hmac (alg, key) {\n Base.call(this, 'digest')\n if (typeof key === 'string') {\n key = Buffer.from(key)\n }\n\n var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64\n\n this._alg = alg\n this._key = key\n if (key.length > blocksize) {\n var hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg)\n key = hash.update(key).digest()\n } else if (key.length < blocksize) {\n key = Buffer.concat([key, ZEROS], blocksize)\n }\n\n var ipad = this._ipad = Buffer.allocUnsafe(blocksize)\n var opad = this._opad = Buffer.allocUnsafe(blocksize)\n\n for (var i = 0; i < blocksize; i++) {\n ipad[i] = key[i] ^ 0x36\n opad[i] = key[i] ^ 0x5C\n }\n this._hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg)\n this._hash.update(ipad)\n}\n\ninherits(Hmac, Base)\n\nHmac.prototype._update = function (data) {\n this._hash.update(data)\n}\n\nHmac.prototype._final = function () {\n var h = this._hash.digest()\n var hash = this._alg === 'rmd160' ? new RIPEMD160() : sha(this._alg)\n return hash.update(this._opad).update(h).digest()\n}\n\nmodule.exports = function createHmac (alg, key) {\n alg = alg.toLowerCase()\n if (alg === 'rmd160' || alg === 'ripemd160') {\n return new Hmac('rmd160', key)\n }\n if (alg === 'md5') {\n return new Legacy(md5, key)\n }\n return new Hmac(alg, key)\n}\n","'use strict'\n\nexports.randomBytes = exports.rng = exports.pseudoRandomBytes = exports.prng = require('randombytes')\nexports.createHash = exports.Hash = require('create-hash')\nexports.createHmac = exports.Hmac = require('create-hmac')\n\nvar algos = require('browserify-sign/algos')\nvar algoKeys = Object.keys(algos)\nvar hashes = ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160'].concat(algoKeys)\nexports.getHashes = function () {\n return hashes\n}\n\nvar p = require('pbkdf2')\nexports.pbkdf2 = p.pbkdf2\nexports.pbkdf2Sync = p.pbkdf2Sync\n\nvar aes = require('browserify-cipher')\n\nexports.Cipher = aes.Cipher\nexports.createCipher = aes.createCipher\nexports.Cipheriv = aes.Cipheriv\nexports.createCipheriv = aes.createCipheriv\nexports.Decipher = aes.Decipher\nexports.createDecipher = aes.createDecipher\nexports.Decipheriv = aes.Decipheriv\nexports.createDecipheriv = aes.createDecipheriv\nexports.getCiphers = aes.getCiphers\nexports.listCiphers = aes.listCiphers\n\nvar dh = require('diffie-hellman')\n\nexports.DiffieHellmanGroup = dh.DiffieHellmanGroup\nexports.createDiffieHellmanGroup = dh.createDiffieHellmanGroup\nexports.getDiffieHellman = dh.getDiffieHellman\nexports.createDiffieHellman = dh.createDiffieHellman\nexports.DiffieHellman = dh.DiffieHellman\n\nvar sign = require('browserify-sign')\n\nexports.createSign = sign.createSign\nexports.Sign = sign.Sign\nexports.createVerify = sign.createVerify\nexports.Verify = sign.Verify\n\nexports.createECDH = require('create-ecdh')\n\nvar publicEncrypt = require('public-encrypt')\n\nexports.publicEncrypt = publicEncrypt.publicEncrypt\nexports.privateEncrypt = publicEncrypt.privateEncrypt\nexports.publicDecrypt = publicEncrypt.publicDecrypt\nexports.privateDecrypt = publicEncrypt.privateDecrypt\n\n// the least I can do is make error messages for the rest of the node.js/crypto api.\n// ;[\n// 'createCredentials'\n// ].forEach(function (name) {\n// exports[name] = function () {\n// throw new Error([\n// 'sorry, ' + name + ' is not implemented yet',\n// 'we accept pull requests',\n// 'https://github.com/crypto-browserify/crypto-browserify'\n// ].join('\\n'))\n// }\n// })\n\nvar rf = require('randomfill')\n\nexports.randomFill = rf.randomFill\nexports.randomFillSync = rf.randomFillSync\n\nexports.createCredentials = function () {\n throw new Error([\n 'sorry, createCredentials is not implemented yet',\n 'we accept pull requests',\n 'https://github.com/crypto-browserify/crypto-browserify'\n ].join('\\n'))\n}\n\nexports.constants = {\n 'DH_CHECK_P_NOT_SAFE_PRIME': 2,\n 'DH_CHECK_P_NOT_PRIME': 1,\n 'DH_UNABLE_TO_CHECK_GENERATOR': 4,\n 'DH_NOT_SUITABLE_GENERATOR': 8,\n 'NPN_ENABLED': 1,\n 'ALPN_ENABLED': 1,\n 'RSA_PKCS1_PADDING': 1,\n 'RSA_SSLV23_PADDING': 2,\n 'RSA_NO_PADDING': 3,\n 'RSA_PKCS1_OAEP_PADDING': 4,\n 'RSA_X931_PADDING': 5,\n 'RSA_PKCS1_PSS_PADDING': 6,\n 'POINT_CONVERSION_COMPRESSED': 2,\n 'POINT_CONVERSION_UNCOMPRESSED': 4,\n 'POINT_CONVERSION_HYBRID': 6\n}\n","(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n Buffer = window.Buffer;\n } else {\n Buffer = require('buffer').Buffer;\n }\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n this.negative = 1;\n }\n\n if (start < number.length) {\n if (base === 16) {\n this._parseHex(number, start, endian);\n } else {\n this._parseBase(number, base, start);\n if (endian === 'le') {\n this._initArray(this.toArray(), base, endian);\n }\n }\n }\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [ number & 0x3ffffff ];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [ 0 ];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this.strip();\n };\n\n function parseHex4Bits (string, index) {\n var c = string.charCodeAt(index);\n // 'A' - 'F'\n if (c >= 65 && c <= 70) {\n return c - 55;\n // 'a' - 'f'\n } else if (c >= 97 && c <= 102) {\n return c - 87;\n // '0' - '9'\n } else {\n return (c - 48) & 0xf;\n }\n }\n\n function parseHexByte (string, lowerBound, index) {\n var r = parseHex4Bits(string, index);\n if (index - 1 >= lowerBound) {\n r |= parseHex4Bits(string, index - 1) << 4;\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start, endian) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n // 24-bits chunks\n var off = 0;\n var j = 0;\n\n var w;\n if (endian === 'be') {\n for (i = number.length - 1; i >= start; i -= 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n } else {\n var parseLength = number.length - start;\n for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n }\n\n this.strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n r += c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n r += c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n r += c;\n }\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [ 0 ];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n this.strip();\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype.strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n BN.prototype.inspect = function inspect () {\n return (this.red ? '';\n };\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16);\n };\n\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n assert(typeof Buffer !== 'undefined');\n return this.toArrayLike(Buffer, endian, length);\n };\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n this.strip();\n var littleEndian = endian === 'le';\n var res = new ArrayType(reqLength);\n\n var b, i;\n var q = this.clone();\n if (!littleEndian) {\n // Assume big-endian\n for (i = 0; i < reqLength - byteLength; i++) {\n res[i] = 0;\n }\n\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[reqLength - i - 1] = b;\n }\n } else {\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[i] = b;\n }\n\n for (; i < reqLength; i++) {\n res[i] = 0;\n }\n }\n\n return res;\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this.strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this.strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this.strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this.strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this.strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this.strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n function jumboMulTo (self, num, out) {\n var fftm = new FFTM();\n return fftm.mulp(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out.strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n\n return this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this.strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) < num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this.strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this.strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this.strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q.strip();\n }\n a.strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modn = function modn (num) {\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return acc;\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n return this.strip();\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this.strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n if (r.strip !== undefined) {\n // r is BN v4 instance\n r.strip();\n } else {\n // r is BN v5 instance\n r._strip();\n }\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n return a.umod(this.m)._forceRed(this);\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","var MD5 = require('md5.js')\n\nmodule.exports = function (buffer) {\n return new MD5().update(buffer).digest()\n}\n","'use strict'\nvar inherits = require('inherits')\nvar MD5 = require('md5.js')\nvar RIPEMD160 = require('ripemd160')\nvar sha = require('sha.js')\nvar Base = require('cipher-base')\n\nfunction Hash (hash) {\n Base.call(this, 'digest')\n\n this._hash = hash\n}\n\ninherits(Hash, Base)\n\nHash.prototype._update = function (data) {\n this._hash.update(data)\n}\n\nHash.prototype._final = function () {\n return this._hash.digest()\n}\n\nmodule.exports = function createHash (alg) {\n alg = alg.toLowerCase()\n if (alg === 'md5') return new MD5()\n if (alg === 'rmd160' || alg === 'ripemd160') return new RIPEMD160()\n\n return new Hash(sha(alg))\n}\n","/*!\n * Cropper.js v1.5.12\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2021-06-12T08:00:17.411Z\n */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Cropper = factory());\n}(this, (function () { 'use strict';\n\n function ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n }\n\n function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n }\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n }\n\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n }\n\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n var WINDOW = IS_BROWSER ? window : {};\n var IS_TOUCH_DEVICE = IS_BROWSER && WINDOW.document.documentElement ? 'ontouchstart' in WINDOW.document.documentElement : false;\n var HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false;\n var NAMESPACE = 'cropper'; // Actions\n\n var ACTION_ALL = 'all';\n var ACTION_CROP = 'crop';\n var ACTION_MOVE = 'move';\n var ACTION_ZOOM = 'zoom';\n var ACTION_EAST = 'e';\n var ACTION_WEST = 'w';\n var ACTION_SOUTH = 's';\n var ACTION_NORTH = 'n';\n var ACTION_NORTH_EAST = 'ne';\n var ACTION_NORTH_WEST = 'nw';\n var ACTION_SOUTH_EAST = 'se';\n var ACTION_SOUTH_WEST = 'sw'; // Classes\n\n var CLASS_CROP = \"\".concat(NAMESPACE, \"-crop\");\n var CLASS_DISABLED = \"\".concat(NAMESPACE, \"-disabled\");\n var CLASS_HIDDEN = \"\".concat(NAMESPACE, \"-hidden\");\n var CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\n var CLASS_INVISIBLE = \"\".concat(NAMESPACE, \"-invisible\");\n var CLASS_MODAL = \"\".concat(NAMESPACE, \"-modal\");\n var CLASS_MOVE = \"\".concat(NAMESPACE, \"-move\"); // Data keys\n\n var DATA_ACTION = \"\".concat(NAMESPACE, \"Action\");\n var DATA_PREVIEW = \"\".concat(NAMESPACE, \"Preview\"); // Drag modes\n\n var DRAG_MODE_CROP = 'crop';\n var DRAG_MODE_MOVE = 'move';\n var DRAG_MODE_NONE = 'none'; // Events\n\n var EVENT_CROP = 'crop';\n var EVENT_CROP_END = 'cropend';\n var EVENT_CROP_MOVE = 'cropmove';\n var EVENT_CROP_START = 'cropstart';\n var EVENT_DBLCLICK = 'dblclick';\n var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown';\n var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove';\n var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup';\n var EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START;\n var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE;\n var EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END;\n var EVENT_READY = 'ready';\n var EVENT_RESIZE = 'resize';\n var EVENT_WHEEL = 'wheel';\n var EVENT_ZOOM = 'zoom'; // Mime types\n\n var MIME_TYPE_JPEG = 'image/jpeg'; // RegExps\n\n var REGEXP_ACTIONS = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/;\n var REGEXP_DATA_URL = /^data:/;\n var REGEXP_DATA_URL_JPEG = /^data:image\\/jpeg;base64,/;\n var REGEXP_TAG_NAME = /^img|canvas$/i; // Misc\n // Inspired by the default width and height of a canvas element.\n\n var MIN_CONTAINER_WIDTH = 200;\n var MIN_CONTAINER_HEIGHT = 100;\n\n var DEFAULTS = {\n // Define the view mode of the cropper\n viewMode: 0,\n // 0, 1, 2, 3\n // Define the dragging mode of the cropper\n dragMode: DRAG_MODE_CROP,\n // 'crop', 'move' or 'none'\n // Define the initial aspect ratio of the crop box\n initialAspectRatio: NaN,\n // Define the aspect ratio of the crop box\n aspectRatio: NaN,\n // An object with the previous cropping result data\n data: null,\n // A selector for adding extra containers to preview\n preview: '',\n // Re-render the cropper when resize the window\n responsive: true,\n // Restore the cropped area after resize the window\n restore: true,\n // Check if the current image is a cross-origin image\n checkCrossOrigin: true,\n // Check the current image's Exif Orientation information\n checkOrientation: true,\n // Show the black modal\n modal: true,\n // Show the dashed lines for guiding\n guides: true,\n // Show the center indicator for guiding\n center: true,\n // Show the white modal to highlight the crop box\n highlight: true,\n // Show the grid background\n background: true,\n // Enable to crop the image automatically when initialize\n autoCrop: true,\n // Define the percentage of automatic cropping area when initializes\n autoCropArea: 0.8,\n // Enable to move the image\n movable: true,\n // Enable to rotate the image\n rotatable: true,\n // Enable to scale the image\n scalable: true,\n // Enable to zoom the image\n zoomable: true,\n // Enable to zoom the image by dragging touch\n zoomOnTouch: true,\n // Enable to zoom the image by wheeling mouse\n zoomOnWheel: true,\n // Define zoom ratio when zoom the image by wheeling mouse\n wheelZoomRatio: 0.1,\n // Enable to move the crop box\n cropBoxMovable: true,\n // Enable to resize the crop box\n cropBoxResizable: true,\n // Toggle drag mode between \"crop\" and \"move\" when click twice on the cropper\n toggleDragModeOnDblclick: true,\n // Size limitation\n minCanvasWidth: 0,\n minCanvasHeight: 0,\n minCropBoxWidth: 0,\n minCropBoxHeight: 0,\n minContainerWidth: MIN_CONTAINER_WIDTH,\n minContainerHeight: MIN_CONTAINER_HEIGHT,\n // Shortcuts of events\n ready: null,\n cropstart: null,\n cropmove: null,\n cropend: null,\n crop: null,\n zoom: null\n };\n\n var TEMPLATE = '
' + '
' + '
' + '
' + '
' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
';\n\n /**\n * Check if the given value is not a number.\n */\n\n var isNaN = Number.isNaN || WINDOW.isNaN;\n /**\n * Check if the given value is a number.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a number, else `false`.\n */\n\n function isNumber(value) {\n return typeof value === 'number' && !isNaN(value);\n }\n /**\n * Check if the given value is a positive number.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a positive number, else `false`.\n */\n\n var isPositiveNumber = function isPositiveNumber(value) {\n return value > 0 && value < Infinity;\n };\n /**\n * Check if the given value is undefined.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is undefined, else `false`.\n */\n\n function isUndefined(value) {\n return typeof value === 'undefined';\n }\n /**\n * Check if the given value is an object.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is an object, else `false`.\n */\n\n function isObject(value) {\n return _typeof(value) === 'object' && value !== null;\n }\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n /**\n * Check if the given value is a plain object.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a plain object, else `false`.\n */\n\n function isPlainObject(value) {\n if (!isObject(value)) {\n return false;\n }\n\n try {\n var _constructor = value.constructor;\n var prototype = _constructor.prototype;\n return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf');\n } catch (error) {\n return false;\n }\n }\n /**\n * Check if the given value is a function.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a function, else `false`.\n */\n\n function isFunction(value) {\n return typeof value === 'function';\n }\n var slice = Array.prototype.slice;\n /**\n * Convert array-like or iterable object to an array.\n * @param {*} value - The value to convert.\n * @returns {Array} Returns a new array.\n */\n\n function toArray(value) {\n return Array.from ? Array.from(value) : slice.call(value);\n }\n /**\n * Iterate the given data.\n * @param {*} data - The data to iterate.\n * @param {Function} callback - The process function for each element.\n * @returns {*} The original data.\n */\n\n function forEach(data, callback) {\n if (data && isFunction(callback)) {\n if (Array.isArray(data) || isNumber(data.length)\n /* array-like */\n ) {\n toArray(data).forEach(function (value, key) {\n callback.call(data, value, key, data);\n });\n } else if (isObject(data)) {\n Object.keys(data).forEach(function (key) {\n callback.call(data, data[key], key, data);\n });\n }\n }\n\n return data;\n }\n /**\n * Extend the given object.\n * @param {*} target - The target object to extend.\n * @param {*} args - The rest objects for merging to the target object.\n * @returns {Object} The extended object.\n */\n\n var assign = Object.assign || function assign(target) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (isObject(target) && args.length > 0) {\n args.forEach(function (arg) {\n if (isObject(arg)) {\n Object.keys(arg).forEach(function (key) {\n target[key] = arg[key];\n });\n }\n });\n }\n\n return target;\n };\n var REGEXP_DECIMALS = /\\.\\d*(?:0|9){12}\\d*$/;\n /**\n * Normalize decimal number.\n * Check out {@link https://0.30000000000000004.com/}\n * @param {number} value - The value to normalize.\n * @param {number} [times=100000000000] - The times for normalizing.\n * @returns {number} Returns the normalized number.\n */\n\n function normalizeDecimalNumber(value) {\n var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000;\n return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value;\n }\n var REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/;\n /**\n * Apply styles to the given element.\n * @param {Element} element - The target element.\n * @param {Object} styles - The styles for applying.\n */\n\n function setStyle(element, styles) {\n var style = element.style;\n forEach(styles, function (value, property) {\n if (REGEXP_SUFFIX.test(property) && isNumber(value)) {\n value = \"\".concat(value, \"px\");\n }\n\n style[property] = value;\n });\n }\n /**\n * Check if the given element has a special class.\n * @param {Element} element - The element to check.\n * @param {string} value - The class to search.\n * @returns {boolean} Returns `true` if the special class was found.\n */\n\n function hasClass(element, value) {\n return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\n }\n /**\n * Add classes to the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be added.\n */\n\n function addClass(element, value) {\n if (!value) {\n return;\n }\n\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n addClass(elem, value);\n });\n return;\n }\n\n if (element.classList) {\n element.classList.add(value);\n return;\n }\n\n var className = element.className.trim();\n\n if (!className) {\n element.className = value;\n } else if (className.indexOf(value) < 0) {\n element.className = \"\".concat(className, \" \").concat(value);\n }\n }\n /**\n * Remove classes from the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be removed.\n */\n\n function removeClass(element, value) {\n if (!value) {\n return;\n }\n\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n removeClass(elem, value);\n });\n return;\n }\n\n if (element.classList) {\n element.classList.remove(value);\n return;\n }\n\n if (element.className.indexOf(value) >= 0) {\n element.className = element.className.replace(value, '');\n }\n }\n /**\n * Add or remove classes from the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be toggled.\n * @param {boolean} added - Add only.\n */\n\n function toggleClass(element, value, added) {\n if (!value) {\n return;\n }\n\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n toggleClass(elem, value, added);\n });\n return;\n } // IE10-11 doesn't support the second parameter of `classList.toggle`\n\n\n if (added) {\n addClass(element, value);\n } else {\n removeClass(element, value);\n }\n }\n var REGEXP_CAMEL_CASE = /([a-z\\d])([A-Z])/g;\n /**\n * Transform the given string from camelCase to kebab-case\n * @param {string} value - The value to transform.\n * @returns {string} The transformed value.\n */\n\n function toParamCase(value) {\n return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase();\n }\n /**\n * Get data from the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to get.\n * @returns {string} The data value.\n */\n\n function getData(element, name) {\n if (isObject(element[name])) {\n return element[name];\n }\n\n if (element.dataset) {\n return element.dataset[name];\n }\n\n return element.getAttribute(\"data-\".concat(toParamCase(name)));\n }\n /**\n * Set data to the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to set.\n * @param {string} data - The data value.\n */\n\n function setData(element, name, data) {\n if (isObject(data)) {\n element[name] = data;\n } else if (element.dataset) {\n element.dataset[name] = data;\n } else {\n element.setAttribute(\"data-\".concat(toParamCase(name)), data);\n }\n }\n /**\n * Remove data from the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to remove.\n */\n\n function removeData(element, name) {\n if (isObject(element[name])) {\n try {\n delete element[name];\n } catch (error) {\n element[name] = undefined;\n }\n } else if (element.dataset) {\n // #128 Safari not allows to delete dataset property\n try {\n delete element.dataset[name];\n } catch (error) {\n element.dataset[name] = undefined;\n }\n } else {\n element.removeAttribute(\"data-\".concat(toParamCase(name)));\n }\n }\n var REGEXP_SPACES = /\\s\\s*/;\n\n var onceSupported = function () {\n var supported = false;\n\n if (IS_BROWSER) {\n var once = false;\n\n var listener = function listener() {};\n\n var options = Object.defineProperty({}, 'once', {\n get: function get() {\n supported = true;\n return once;\n },\n\n /**\n * This setter can fix a `TypeError` in strict mode\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only}\n * @param {boolean} value - The value to set\n */\n set: function set(value) {\n once = value;\n }\n });\n WINDOW.addEventListener('test', listener, options);\n WINDOW.removeEventListener('test', listener, options);\n }\n\n return supported;\n }();\n /**\n * Remove event listener from the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Function} listener - The event listener.\n * @param {Object} options - The event options.\n */\n\n\n function removeListener(element, type, listener) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var handler = listener;\n type.trim().split(REGEXP_SPACES).forEach(function (event) {\n if (!onceSupported) {\n var listeners = element.listeners;\n\n if (listeners && listeners[event] && listeners[event][listener]) {\n handler = listeners[event][listener];\n delete listeners[event][listener];\n\n if (Object.keys(listeners[event]).length === 0) {\n delete listeners[event];\n }\n\n if (Object.keys(listeners).length === 0) {\n delete element.listeners;\n }\n }\n }\n\n element.removeEventListener(event, handler, options);\n });\n }\n /**\n * Add event listener to the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Function} listener - The event listener.\n * @param {Object} options - The event options.\n */\n\n function addListener(element, type, listener) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var _handler = listener;\n type.trim().split(REGEXP_SPACES).forEach(function (event) {\n if (options.once && !onceSupported) {\n var _element$listeners = element.listeners,\n listeners = _element$listeners === void 0 ? {} : _element$listeners;\n\n _handler = function handler() {\n delete listeners[event][listener];\n element.removeEventListener(event, _handler, options);\n\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n listener.apply(element, args);\n };\n\n if (!listeners[event]) {\n listeners[event] = {};\n }\n\n if (listeners[event][listener]) {\n element.removeEventListener(event, listeners[event][listener], options);\n }\n\n listeners[event][listener] = _handler;\n element.listeners = listeners;\n }\n\n element.addEventListener(event, _handler, options);\n });\n }\n /**\n * Dispatch event on the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Object} data - The additional event data.\n * @returns {boolean} Indicate if the event is default prevented or not.\n */\n\n function dispatchEvent(element, type, data) {\n var event; // Event and CustomEvent on IE9-11 are global objects, not constructors\n\n if (isFunction(Event) && isFunction(CustomEvent)) {\n event = new CustomEvent(type, {\n detail: data,\n bubbles: true,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, data);\n }\n\n return element.dispatchEvent(event);\n }\n /**\n * Get the offset base on the document.\n * @param {Element} element - The target element.\n * @returns {Object} The offset data.\n */\n\n function getOffset(element) {\n var box = element.getBoundingClientRect();\n return {\n left: box.left + (window.pageXOffset - document.documentElement.clientLeft),\n top: box.top + (window.pageYOffset - document.documentElement.clientTop)\n };\n }\n var location = WINDOW.location;\n var REGEXP_ORIGINS = /^(\\w+:)\\/\\/([^:/?#]*):?(\\d*)/i;\n /**\n * Check if the given URL is a cross origin URL.\n * @param {string} url - The target URL.\n * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`.\n */\n\n function isCrossOriginURL(url) {\n var parts = url.match(REGEXP_ORIGINS);\n return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port);\n }\n /**\n * Add timestamp to the given URL.\n * @param {string} url - The target URL.\n * @returns {string} The result URL.\n */\n\n function addTimestamp(url) {\n var timestamp = \"timestamp=\".concat(new Date().getTime());\n return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp;\n }\n /**\n * Get transforms base on the given object.\n * @param {Object} obj - The target object.\n * @returns {string} A string contains transform values.\n */\n\n function getTransforms(_ref) {\n var rotate = _ref.rotate,\n scaleX = _ref.scaleX,\n scaleY = _ref.scaleY,\n translateX = _ref.translateX,\n translateY = _ref.translateY;\n var values = [];\n\n if (isNumber(translateX) && translateX !== 0) {\n values.push(\"translateX(\".concat(translateX, \"px)\"));\n }\n\n if (isNumber(translateY) && translateY !== 0) {\n values.push(\"translateY(\".concat(translateY, \"px)\"));\n } // Rotate should come first before scale to match orientation transform\n\n\n if (isNumber(rotate) && rotate !== 0) {\n values.push(\"rotate(\".concat(rotate, \"deg)\"));\n }\n\n if (isNumber(scaleX) && scaleX !== 1) {\n values.push(\"scaleX(\".concat(scaleX, \")\"));\n }\n\n if (isNumber(scaleY) && scaleY !== 1) {\n values.push(\"scaleY(\".concat(scaleY, \")\"));\n }\n\n var transform = values.length ? values.join(' ') : 'none';\n return {\n WebkitTransform: transform,\n msTransform: transform,\n transform: transform\n };\n }\n /**\n * Get the max ratio of a group of pointers.\n * @param {string} pointers - The target pointers.\n * @returns {number} The result ratio.\n */\n\n function getMaxZoomRatio(pointers) {\n var pointers2 = _objectSpread2({}, pointers);\n\n var maxRatio = 0;\n forEach(pointers, function (pointer, pointerId) {\n delete pointers2[pointerId];\n forEach(pointers2, function (pointer2) {\n var x1 = Math.abs(pointer.startX - pointer2.startX);\n var y1 = Math.abs(pointer.startY - pointer2.startY);\n var x2 = Math.abs(pointer.endX - pointer2.endX);\n var y2 = Math.abs(pointer.endY - pointer2.endY);\n var z1 = Math.sqrt(x1 * x1 + y1 * y1);\n var z2 = Math.sqrt(x2 * x2 + y2 * y2);\n var ratio = (z2 - z1) / z1;\n\n if (Math.abs(ratio) > Math.abs(maxRatio)) {\n maxRatio = ratio;\n }\n });\n });\n return maxRatio;\n }\n /**\n * Get a pointer from an event object.\n * @param {Object} event - The target event object.\n * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not.\n * @returns {Object} The result pointer contains start and/or end point coordinates.\n */\n\n function getPointer(_ref2, endOnly) {\n var pageX = _ref2.pageX,\n pageY = _ref2.pageY;\n var end = {\n endX: pageX,\n endY: pageY\n };\n return endOnly ? end : _objectSpread2({\n startX: pageX,\n startY: pageY\n }, end);\n }\n /**\n * Get the center point coordinate of a group of pointers.\n * @param {Object} pointers - The target pointers.\n * @returns {Object} The center point coordinate.\n */\n\n function getPointersCenter(pointers) {\n var pageX = 0;\n var pageY = 0;\n var count = 0;\n forEach(pointers, function (_ref3) {\n var startX = _ref3.startX,\n startY = _ref3.startY;\n pageX += startX;\n pageY += startY;\n count += 1;\n });\n pageX /= count;\n pageY /= count;\n return {\n pageX: pageX,\n pageY: pageY\n };\n }\n /**\n * Get the max sizes in a rectangle under the given aspect ratio.\n * @param {Object} data - The original sizes.\n * @param {string} [type='contain'] - The adjust type.\n * @returns {Object} The result sizes.\n */\n\n function getAdjustedSizes(_ref4) // or 'cover'\n {\n var aspectRatio = _ref4.aspectRatio,\n height = _ref4.height,\n width = _ref4.width;\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain';\n var isValidWidth = isPositiveNumber(width);\n var isValidHeight = isPositiveNumber(height);\n\n if (isValidWidth && isValidHeight) {\n var adjustedWidth = height * aspectRatio;\n\n if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) {\n height = width / aspectRatio;\n } else {\n width = height * aspectRatio;\n }\n } else if (isValidWidth) {\n height = width / aspectRatio;\n } else if (isValidHeight) {\n width = height * aspectRatio;\n }\n\n return {\n width: width,\n height: height\n };\n }\n /**\n * Get the new sizes of a rectangle after rotated.\n * @param {Object} data - The original sizes.\n * @returns {Object} The result sizes.\n */\n\n function getRotatedSizes(_ref5) {\n var width = _ref5.width,\n height = _ref5.height,\n degree = _ref5.degree;\n degree = Math.abs(degree) % 180;\n\n if (degree === 90) {\n return {\n width: height,\n height: width\n };\n }\n\n var arc = degree % 90 * Math.PI / 180;\n var sinArc = Math.sin(arc);\n var cosArc = Math.cos(arc);\n var newWidth = width * cosArc + height * sinArc;\n var newHeight = width * sinArc + height * cosArc;\n return degree > 90 ? {\n width: newHeight,\n height: newWidth\n } : {\n width: newWidth,\n height: newHeight\n };\n }\n /**\n * Get a canvas which drew the given image.\n * @param {HTMLImageElement} image - The image for drawing.\n * @param {Object} imageData - The image data.\n * @param {Object} canvasData - The canvas data.\n * @param {Object} options - The options.\n * @returns {HTMLCanvasElement} The result canvas.\n */\n\n function getSourceCanvas(image, _ref6, _ref7, _ref8) {\n var imageAspectRatio = _ref6.aspectRatio,\n imageNaturalWidth = _ref6.naturalWidth,\n imageNaturalHeight = _ref6.naturalHeight,\n _ref6$rotate = _ref6.rotate,\n rotate = _ref6$rotate === void 0 ? 0 : _ref6$rotate,\n _ref6$scaleX = _ref6.scaleX,\n scaleX = _ref6$scaleX === void 0 ? 1 : _ref6$scaleX,\n _ref6$scaleY = _ref6.scaleY,\n scaleY = _ref6$scaleY === void 0 ? 1 : _ref6$scaleY;\n var aspectRatio = _ref7.aspectRatio,\n naturalWidth = _ref7.naturalWidth,\n naturalHeight = _ref7.naturalHeight;\n var _ref8$fillColor = _ref8.fillColor,\n fillColor = _ref8$fillColor === void 0 ? 'transparent' : _ref8$fillColor,\n _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled,\n imageSmoothingEnabled = _ref8$imageSmoothingE === void 0 ? true : _ref8$imageSmoothingE,\n _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality,\n imageSmoothingQuality = _ref8$imageSmoothingQ === void 0 ? 'low' : _ref8$imageSmoothingQ,\n _ref8$maxWidth = _ref8.maxWidth,\n maxWidth = _ref8$maxWidth === void 0 ? Infinity : _ref8$maxWidth,\n _ref8$maxHeight = _ref8.maxHeight,\n maxHeight = _ref8$maxHeight === void 0 ? Infinity : _ref8$maxHeight,\n _ref8$minWidth = _ref8.minWidth,\n minWidth = _ref8$minWidth === void 0 ? 0 : _ref8$minWidth,\n _ref8$minHeight = _ref8.minHeight,\n minHeight = _ref8$minHeight === void 0 ? 0 : _ref8$minHeight;\n var canvas = document.createElement('canvas');\n var context = canvas.getContext('2d');\n var maxSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: maxWidth,\n height: maxHeight\n });\n var minSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: minWidth,\n height: minHeight\n }, 'cover');\n var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth));\n var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight)); // Note: should always use image's natural sizes for drawing as\n // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90\n\n var destMaxSizes = getAdjustedSizes({\n aspectRatio: imageAspectRatio,\n width: maxWidth,\n height: maxHeight\n });\n var destMinSizes = getAdjustedSizes({\n aspectRatio: imageAspectRatio,\n width: minWidth,\n height: minHeight\n }, 'cover');\n var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth));\n var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight));\n var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight];\n canvas.width = normalizeDecimalNumber(width);\n canvas.height = normalizeDecimalNumber(height);\n context.fillStyle = fillColor;\n context.fillRect(0, 0, width, height);\n context.save();\n context.translate(width / 2, height / 2);\n context.rotate(rotate * Math.PI / 180);\n context.scale(scaleX, scaleY);\n context.imageSmoothingEnabled = imageSmoothingEnabled;\n context.imageSmoothingQuality = imageSmoothingQuality;\n context.drawImage.apply(context, [image].concat(_toConsumableArray(params.map(function (param) {\n return Math.floor(normalizeDecimalNumber(param));\n }))));\n context.restore();\n return canvas;\n }\n var fromCharCode = String.fromCharCode;\n /**\n * Get string from char code in data view.\n * @param {DataView} dataView - The data view for read.\n * @param {number} start - The start index.\n * @param {number} length - The read length.\n * @returns {string} The read result.\n */\n\n function getStringFromCharCode(dataView, start, length) {\n var str = '';\n length += start;\n\n for (var i = start; i < length; i += 1) {\n str += fromCharCode(dataView.getUint8(i));\n }\n\n return str;\n }\n var REGEXP_DATA_URL_HEAD = /^data:.*,/;\n /**\n * Transform Data URL to array buffer.\n * @param {string} dataURL - The Data URL to transform.\n * @returns {ArrayBuffer} The result array buffer.\n */\n\n function dataURLToArrayBuffer(dataURL) {\n var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, '');\n var binary = atob(base64);\n var arrayBuffer = new ArrayBuffer(binary.length);\n var uint8 = new Uint8Array(arrayBuffer);\n forEach(uint8, function (value, i) {\n uint8[i] = binary.charCodeAt(i);\n });\n return arrayBuffer;\n }\n /**\n * Transform array buffer to Data URL.\n * @param {ArrayBuffer} arrayBuffer - The array buffer to transform.\n * @param {string} mimeType - The mime type of the Data URL.\n * @returns {string} The result Data URL.\n */\n\n function arrayBufferToDataURL(arrayBuffer, mimeType) {\n var chunks = []; // Chunk Typed Array for better performance (#435)\n\n var chunkSize = 8192;\n var uint8 = new Uint8Array(arrayBuffer);\n\n while (uint8.length > 0) {\n // XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9\n // eslint-disable-next-line prefer-spread\n chunks.push(fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize))));\n uint8 = uint8.subarray(chunkSize);\n }\n\n return \"data:\".concat(mimeType, \";base64,\").concat(btoa(chunks.join('')));\n }\n /**\n * Get orientation value from given array buffer.\n * @param {ArrayBuffer} arrayBuffer - The array buffer to read.\n * @returns {number} The read orientation value.\n */\n\n function resetAndGetOrientation(arrayBuffer) {\n var dataView = new DataView(arrayBuffer);\n var orientation; // Ignores range error when the image does not have correct Exif information\n\n try {\n var littleEndian;\n var app1Start;\n var ifdStart; // Only handle JPEG image (start by 0xFFD8)\n\n if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {\n var length = dataView.byteLength;\n var offset = 2;\n\n while (offset + 1 < length) {\n if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {\n app1Start = offset;\n break;\n }\n\n offset += 1;\n }\n }\n\n if (app1Start) {\n var exifIDCode = app1Start + 4;\n var tiffOffset = app1Start + 10;\n\n if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {\n var endianness = dataView.getUint16(tiffOffset);\n littleEndian = endianness === 0x4949;\n\n if (littleEndian || endianness === 0x4D4D\n /* bigEndian */\n ) {\n if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {\n var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\n\n if (firstIFDOffset >= 0x00000008) {\n ifdStart = tiffOffset + firstIFDOffset;\n }\n }\n }\n }\n }\n\n if (ifdStart) {\n var _length = dataView.getUint16(ifdStart, littleEndian);\n\n var _offset;\n\n var i;\n\n for (i = 0; i < _length; i += 1) {\n _offset = ifdStart + i * 12 + 2;\n\n if (dataView.getUint16(_offset, littleEndian) === 0x0112\n /* Orientation */\n ) {\n // 8 is the offset of the current tag's value\n _offset += 8; // Get the original orientation value\n\n orientation = dataView.getUint16(_offset, littleEndian); // Override the orientation with its default value\n\n dataView.setUint16(_offset, 1, littleEndian);\n break;\n }\n }\n }\n } catch (error) {\n orientation = 1;\n }\n\n return orientation;\n }\n /**\n * Parse Exif Orientation value.\n * @param {number} orientation - The orientation to parse.\n * @returns {Object} The parsed result.\n */\n\n function parseOrientation(orientation) {\n var rotate = 0;\n var scaleX = 1;\n var scaleY = 1;\n\n switch (orientation) {\n // Flip horizontal\n case 2:\n scaleX = -1;\n break;\n // Rotate left 180°\n\n case 3:\n rotate = -180;\n break;\n // Flip vertical\n\n case 4:\n scaleY = -1;\n break;\n // Flip vertical and rotate right 90°\n\n case 5:\n rotate = 90;\n scaleY = -1;\n break;\n // Rotate right 90°\n\n case 6:\n rotate = 90;\n break;\n // Flip horizontal and rotate right 90°\n\n case 7:\n rotate = 90;\n scaleX = -1;\n break;\n // Rotate left 90°\n\n case 8:\n rotate = -90;\n break;\n }\n\n return {\n rotate: rotate,\n scaleX: scaleX,\n scaleY: scaleY\n };\n }\n\n var render = {\n render: function render() {\n this.initContainer();\n this.initCanvas();\n this.initCropBox();\n this.renderCanvas();\n\n if (this.cropped) {\n this.renderCropBox();\n }\n },\n initContainer: function initContainer() {\n var element = this.element,\n options = this.options,\n container = this.container,\n cropper = this.cropper;\n var minWidth = Number(options.minContainerWidth);\n var minHeight = Number(options.minContainerHeight);\n addClass(cropper, CLASS_HIDDEN);\n removeClass(element, CLASS_HIDDEN);\n var containerData = {\n width: Math.max(container.offsetWidth, minWidth >= 0 ? minWidth : MIN_CONTAINER_WIDTH),\n height: Math.max(container.offsetHeight, minHeight >= 0 ? minHeight : MIN_CONTAINER_HEIGHT)\n };\n this.containerData = containerData;\n setStyle(cropper, {\n width: containerData.width,\n height: containerData.height\n });\n addClass(element, CLASS_HIDDEN);\n removeClass(cropper, CLASS_HIDDEN);\n },\n // Canvas (image wrapper)\n initCanvas: function initCanvas() {\n var containerData = this.containerData,\n imageData = this.imageData;\n var viewMode = this.options.viewMode;\n var rotated = Math.abs(imageData.rotate) % 180 === 90;\n var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth;\n var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight;\n var aspectRatio = naturalWidth / naturalHeight;\n var canvasWidth = containerData.width;\n var canvasHeight = containerData.height;\n\n if (containerData.height * aspectRatio > containerData.width) {\n if (viewMode === 3) {\n canvasWidth = containerData.height * aspectRatio;\n } else {\n canvasHeight = containerData.width / aspectRatio;\n }\n } else if (viewMode === 3) {\n canvasHeight = containerData.width / aspectRatio;\n } else {\n canvasWidth = containerData.height * aspectRatio;\n }\n\n var canvasData = {\n aspectRatio: aspectRatio,\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight,\n width: canvasWidth,\n height: canvasHeight\n };\n this.canvasData = canvasData;\n this.limited = viewMode === 1 || viewMode === 2;\n this.limitCanvas(true, true);\n canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n canvasData.left = (containerData.width - canvasData.width) / 2;\n canvasData.top = (containerData.height - canvasData.height) / 2;\n canvasData.oldLeft = canvasData.left;\n canvasData.oldTop = canvasData.top;\n this.initialCanvasData = assign({}, canvasData);\n },\n limitCanvas: function limitCanvas(sizeLimited, positionLimited) {\n var options = this.options,\n containerData = this.containerData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData;\n var viewMode = options.viewMode;\n var aspectRatio = canvasData.aspectRatio;\n var cropped = this.cropped && cropBoxData;\n\n if (sizeLimited) {\n var minCanvasWidth = Number(options.minCanvasWidth) || 0;\n var minCanvasHeight = Number(options.minCanvasHeight) || 0;\n\n if (viewMode > 1) {\n minCanvasWidth = Math.max(minCanvasWidth, containerData.width);\n minCanvasHeight = Math.max(minCanvasHeight, containerData.height);\n\n if (viewMode === 3) {\n if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n minCanvasWidth = minCanvasHeight * aspectRatio;\n } else {\n minCanvasHeight = minCanvasWidth / aspectRatio;\n }\n }\n } else if (viewMode > 0) {\n if (minCanvasWidth) {\n minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0);\n } else if (minCanvasHeight) {\n minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0);\n } else if (cropped) {\n minCanvasWidth = cropBoxData.width;\n minCanvasHeight = cropBoxData.height;\n\n if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n minCanvasWidth = minCanvasHeight * aspectRatio;\n } else {\n minCanvasHeight = minCanvasWidth / aspectRatio;\n }\n }\n }\n\n var _getAdjustedSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: minCanvasWidth,\n height: minCanvasHeight\n });\n\n minCanvasWidth = _getAdjustedSizes.width;\n minCanvasHeight = _getAdjustedSizes.height;\n canvasData.minWidth = minCanvasWidth;\n canvasData.minHeight = minCanvasHeight;\n canvasData.maxWidth = Infinity;\n canvasData.maxHeight = Infinity;\n }\n\n if (positionLimited) {\n if (viewMode > (cropped ? 0 : 1)) {\n var newCanvasLeft = containerData.width - canvasData.width;\n var newCanvasTop = containerData.height - canvasData.height;\n canvasData.minLeft = Math.min(0, newCanvasLeft);\n canvasData.minTop = Math.min(0, newCanvasTop);\n canvasData.maxLeft = Math.max(0, newCanvasLeft);\n canvasData.maxTop = Math.max(0, newCanvasTop);\n\n if (cropped && this.limited) {\n canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width));\n canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height));\n canvasData.maxLeft = cropBoxData.left;\n canvasData.maxTop = cropBoxData.top;\n\n if (viewMode === 2) {\n if (canvasData.width >= containerData.width) {\n canvasData.minLeft = Math.min(0, newCanvasLeft);\n canvasData.maxLeft = Math.max(0, newCanvasLeft);\n }\n\n if (canvasData.height >= containerData.height) {\n canvasData.minTop = Math.min(0, newCanvasTop);\n canvasData.maxTop = Math.max(0, newCanvasTop);\n }\n }\n }\n } else {\n canvasData.minLeft = -canvasData.width;\n canvasData.minTop = -canvasData.height;\n canvasData.maxLeft = containerData.width;\n canvasData.maxTop = containerData.height;\n }\n }\n },\n renderCanvas: function renderCanvas(changed, transformed) {\n var canvasData = this.canvasData,\n imageData = this.imageData;\n\n if (transformed) {\n var _getRotatedSizes = getRotatedSizes({\n width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1),\n height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1),\n degree: imageData.rotate || 0\n }),\n naturalWidth = _getRotatedSizes.width,\n naturalHeight = _getRotatedSizes.height;\n\n var width = canvasData.width * (naturalWidth / canvasData.naturalWidth);\n var height = canvasData.height * (naturalHeight / canvasData.naturalHeight);\n canvasData.left -= (width - canvasData.width) / 2;\n canvasData.top -= (height - canvasData.height) / 2;\n canvasData.width = width;\n canvasData.height = height;\n canvasData.aspectRatio = naturalWidth / naturalHeight;\n canvasData.naturalWidth = naturalWidth;\n canvasData.naturalHeight = naturalHeight;\n this.limitCanvas(true, false);\n }\n\n if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) {\n canvasData.left = canvasData.oldLeft;\n }\n\n if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) {\n canvasData.top = canvasData.oldTop;\n }\n\n canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n this.limitCanvas(false, true);\n canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft);\n canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop);\n canvasData.oldLeft = canvasData.left;\n canvasData.oldTop = canvasData.top;\n setStyle(this.canvas, assign({\n width: canvasData.width,\n height: canvasData.height\n }, getTransforms({\n translateX: canvasData.left,\n translateY: canvasData.top\n })));\n this.renderImage(changed);\n\n if (this.cropped && this.limited) {\n this.limitCropBox(true, true);\n }\n },\n renderImage: function renderImage(changed) {\n var canvasData = this.canvasData,\n imageData = this.imageData;\n var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth);\n var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight);\n assign(imageData, {\n width: width,\n height: height,\n left: (canvasData.width - width) / 2,\n top: (canvasData.height - height) / 2\n });\n setStyle(this.image, assign({\n width: imageData.width,\n height: imageData.height\n }, getTransforms(assign({\n translateX: imageData.left,\n translateY: imageData.top\n }, imageData))));\n\n if (changed) {\n this.output();\n }\n },\n initCropBox: function initCropBox() {\n var options = this.options,\n canvasData = this.canvasData;\n var aspectRatio = options.aspectRatio || options.initialAspectRatio;\n var autoCropArea = Number(options.autoCropArea) || 0.8;\n var cropBoxData = {\n width: canvasData.width,\n height: canvasData.height\n };\n\n if (aspectRatio) {\n if (canvasData.height * aspectRatio > canvasData.width) {\n cropBoxData.height = cropBoxData.width / aspectRatio;\n } else {\n cropBoxData.width = cropBoxData.height * aspectRatio;\n }\n }\n\n this.cropBoxData = cropBoxData;\n this.limitCropBox(true, true); // Initialize auto crop area\n\n cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); // The width/height of auto crop area must large than \"minWidth/Height\"\n\n cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea);\n cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea);\n cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2;\n cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2;\n cropBoxData.oldLeft = cropBoxData.left;\n cropBoxData.oldTop = cropBoxData.top;\n this.initialCropBoxData = assign({}, cropBoxData);\n },\n limitCropBox: function limitCropBox(sizeLimited, positionLimited) {\n var options = this.options,\n containerData = this.containerData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData,\n limited = this.limited;\n var aspectRatio = options.aspectRatio;\n\n if (sizeLimited) {\n var minCropBoxWidth = Number(options.minCropBoxWidth) || 0;\n var minCropBoxHeight = Number(options.minCropBoxHeight) || 0;\n var maxCropBoxWidth = limited ? Math.min(containerData.width, canvasData.width, canvasData.width + canvasData.left, containerData.width - canvasData.left) : containerData.width;\n var maxCropBoxHeight = limited ? Math.min(containerData.height, canvasData.height, canvasData.height + canvasData.top, containerData.height - canvasData.top) : containerData.height; // The min/maxCropBoxWidth/Height must be less than container's width/height\n\n minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width);\n minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height);\n\n if (aspectRatio) {\n if (minCropBoxWidth && minCropBoxHeight) {\n if (minCropBoxHeight * aspectRatio > minCropBoxWidth) {\n minCropBoxHeight = minCropBoxWidth / aspectRatio;\n } else {\n minCropBoxWidth = minCropBoxHeight * aspectRatio;\n }\n } else if (minCropBoxWidth) {\n minCropBoxHeight = minCropBoxWidth / aspectRatio;\n } else if (minCropBoxHeight) {\n minCropBoxWidth = minCropBoxHeight * aspectRatio;\n }\n\n if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) {\n maxCropBoxHeight = maxCropBoxWidth / aspectRatio;\n } else {\n maxCropBoxWidth = maxCropBoxHeight * aspectRatio;\n }\n } // The minWidth/Height must be less than maxWidth/Height\n\n\n cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth);\n cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight);\n cropBoxData.maxWidth = maxCropBoxWidth;\n cropBoxData.maxHeight = maxCropBoxHeight;\n }\n\n if (positionLimited) {\n if (limited) {\n cropBoxData.minLeft = Math.max(0, canvasData.left);\n cropBoxData.minTop = Math.max(0, canvasData.top);\n cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width;\n cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height;\n } else {\n cropBoxData.minLeft = 0;\n cropBoxData.minTop = 0;\n cropBoxData.maxLeft = containerData.width - cropBoxData.width;\n cropBoxData.maxTop = containerData.height - cropBoxData.height;\n }\n }\n },\n renderCropBox: function renderCropBox() {\n var options = this.options,\n containerData = this.containerData,\n cropBoxData = this.cropBoxData;\n\n if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) {\n cropBoxData.left = cropBoxData.oldLeft;\n }\n\n if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) {\n cropBoxData.top = cropBoxData.oldTop;\n }\n\n cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n this.limitCropBox(false, true);\n cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft);\n cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop);\n cropBoxData.oldLeft = cropBoxData.left;\n cropBoxData.oldTop = cropBoxData.top;\n\n if (options.movable && options.cropBoxMovable) {\n // Turn to move the canvas when the crop box is equal to the container\n setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL);\n }\n\n setStyle(this.cropBox, assign({\n width: cropBoxData.width,\n height: cropBoxData.height\n }, getTransforms({\n translateX: cropBoxData.left,\n translateY: cropBoxData.top\n })));\n\n if (this.cropped && this.limited) {\n this.limitCanvas(true, true);\n }\n\n if (!this.disabled) {\n this.output();\n }\n },\n output: function output() {\n this.preview();\n dispatchEvent(this.element, EVENT_CROP, this.getData());\n }\n };\n\n var preview = {\n initPreview: function initPreview() {\n var element = this.element,\n crossOrigin = this.crossOrigin;\n var preview = this.options.preview;\n var url = crossOrigin ? this.crossOriginUrl : this.url;\n var alt = element.alt || 'The image to preview';\n var image = document.createElement('img');\n\n if (crossOrigin) {\n image.crossOrigin = crossOrigin;\n }\n\n image.src = url;\n image.alt = alt;\n this.viewBox.appendChild(image);\n this.viewBoxImage = image;\n\n if (!preview) {\n return;\n }\n\n var previews = preview;\n\n if (typeof preview === 'string') {\n previews = element.ownerDocument.querySelectorAll(preview);\n } else if (preview.querySelector) {\n previews = [preview];\n }\n\n this.previews = previews;\n forEach(previews, function (el) {\n var img = document.createElement('img'); // Save the original size for recover\n\n setData(el, DATA_PREVIEW, {\n width: el.offsetWidth,\n height: el.offsetHeight,\n html: el.innerHTML\n });\n\n if (crossOrigin) {\n img.crossOrigin = crossOrigin;\n }\n\n img.src = url;\n img.alt = alt;\n /**\n * Override img element styles\n * Add `display:block` to avoid margin top issue\n * Add `height:auto` to override `height` attribute on IE8\n * (Occur only when margin-top <= -height)\n */\n\n img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;\"';\n el.innerHTML = '';\n el.appendChild(img);\n });\n },\n resetPreview: function resetPreview() {\n forEach(this.previews, function (element) {\n var data = getData(element, DATA_PREVIEW);\n setStyle(element, {\n width: data.width,\n height: data.height\n });\n element.innerHTML = data.html;\n removeData(element, DATA_PREVIEW);\n });\n },\n preview: function preview() {\n var imageData = this.imageData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData;\n var cropBoxWidth = cropBoxData.width,\n cropBoxHeight = cropBoxData.height;\n var width = imageData.width,\n height = imageData.height;\n var left = cropBoxData.left - canvasData.left - imageData.left;\n var top = cropBoxData.top - canvasData.top - imageData.top;\n\n if (!this.cropped || this.disabled) {\n return;\n }\n\n setStyle(this.viewBoxImage, assign({\n width: width,\n height: height\n }, getTransforms(assign({\n translateX: -left,\n translateY: -top\n }, imageData))));\n forEach(this.previews, function (element) {\n var data = getData(element, DATA_PREVIEW);\n var originalWidth = data.width;\n var originalHeight = data.height;\n var newWidth = originalWidth;\n var newHeight = originalHeight;\n var ratio = 1;\n\n if (cropBoxWidth) {\n ratio = originalWidth / cropBoxWidth;\n newHeight = cropBoxHeight * ratio;\n }\n\n if (cropBoxHeight && newHeight > originalHeight) {\n ratio = originalHeight / cropBoxHeight;\n newWidth = cropBoxWidth * ratio;\n newHeight = originalHeight;\n }\n\n setStyle(element, {\n width: newWidth,\n height: newHeight\n });\n setStyle(element.getElementsByTagName('img')[0], assign({\n width: width * ratio,\n height: height * ratio\n }, getTransforms(assign({\n translateX: -left * ratio,\n translateY: -top * ratio\n }, imageData))));\n });\n }\n };\n\n var events = {\n bind: function bind() {\n var element = this.element,\n options = this.options,\n cropper = this.cropper;\n\n if (isFunction(options.cropstart)) {\n addListener(element, EVENT_CROP_START, options.cropstart);\n }\n\n if (isFunction(options.cropmove)) {\n addListener(element, EVENT_CROP_MOVE, options.cropmove);\n }\n\n if (isFunction(options.cropend)) {\n addListener(element, EVENT_CROP_END, options.cropend);\n }\n\n if (isFunction(options.crop)) {\n addListener(element, EVENT_CROP, options.crop);\n }\n\n if (isFunction(options.zoom)) {\n addListener(element, EVENT_ZOOM, options.zoom);\n }\n\n addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this));\n\n if (options.zoomable && options.zoomOnWheel) {\n addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), {\n passive: false,\n capture: true\n });\n }\n\n if (options.toggleDragModeOnDblclick) {\n addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n }\n\n addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this));\n addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this));\n\n if (options.responsive) {\n addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this));\n }\n },\n unbind: function unbind() {\n var element = this.element,\n options = this.options,\n cropper = this.cropper;\n\n if (isFunction(options.cropstart)) {\n removeListener(element, EVENT_CROP_START, options.cropstart);\n }\n\n if (isFunction(options.cropmove)) {\n removeListener(element, EVENT_CROP_MOVE, options.cropmove);\n }\n\n if (isFunction(options.cropend)) {\n removeListener(element, EVENT_CROP_END, options.cropend);\n }\n\n if (isFunction(options.crop)) {\n removeListener(element, EVENT_CROP, options.crop);\n }\n\n if (isFunction(options.zoom)) {\n removeListener(element, EVENT_ZOOM, options.zoom);\n }\n\n removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart);\n\n if (options.zoomable && options.zoomOnWheel) {\n removeListener(cropper, EVENT_WHEEL, this.onWheel, {\n passive: false,\n capture: true\n });\n }\n\n if (options.toggleDragModeOnDblclick) {\n removeListener(cropper, EVENT_DBLCLICK, this.onDblclick);\n }\n\n removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove);\n removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd);\n\n if (options.responsive) {\n removeListener(window, EVENT_RESIZE, this.onResize);\n }\n }\n };\n\n var handlers = {\n resize: function resize() {\n if (this.disabled) {\n return;\n }\n\n var options = this.options,\n container = this.container,\n containerData = this.containerData;\n var ratioX = container.offsetWidth / containerData.width;\n var ratioY = container.offsetHeight / containerData.height;\n var ratio = Math.abs(ratioX - 1) > Math.abs(ratioY - 1) ? ratioX : ratioY; // Resize when width changed or height changed\n\n if (ratio !== 1) {\n var canvasData;\n var cropBoxData;\n\n if (options.restore) {\n canvasData = this.getCanvasData();\n cropBoxData = this.getCropBoxData();\n }\n\n this.render();\n\n if (options.restore) {\n this.setCanvasData(forEach(canvasData, function (n, i) {\n canvasData[i] = n * ratio;\n }));\n this.setCropBoxData(forEach(cropBoxData, function (n, i) {\n cropBoxData[i] = n * ratio;\n }));\n }\n }\n },\n dblclick: function dblclick() {\n if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) {\n return;\n }\n\n this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP);\n },\n wheel: function wheel(event) {\n var _this = this;\n\n var ratio = Number(this.options.wheelZoomRatio) || 0.1;\n var delta = 1;\n\n if (this.disabled) {\n return;\n }\n\n event.preventDefault(); // Limit wheel speed to prevent zoom too fast (#21)\n\n if (this.wheeling) {\n return;\n }\n\n this.wheeling = true;\n setTimeout(function () {\n _this.wheeling = false;\n }, 50);\n\n if (event.deltaY) {\n delta = event.deltaY > 0 ? 1 : -1;\n } else if (event.wheelDelta) {\n delta = -event.wheelDelta / 120;\n } else if (event.detail) {\n delta = event.detail > 0 ? 1 : -1;\n }\n\n this.zoom(-delta * ratio, event);\n },\n cropStart: function cropStart(event) {\n var buttons = event.buttons,\n button = event.button;\n\n if (this.disabled // Handle mouse event and pointer event and ignore touch event\n || (event.type === 'mousedown' || event.type === 'pointerdown' && event.pointerType === 'mouse') && ( // No primary button (Usually the left button)\n isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0 // Open context menu\n || event.ctrlKey)) {\n return;\n }\n\n var options = this.options,\n pointers = this.pointers;\n var action;\n\n if (event.changedTouches) {\n // Handle touch event\n forEach(event.changedTouches, function (touch) {\n pointers[touch.identifier] = getPointer(touch);\n });\n } else {\n // Handle mouse event and pointer event\n pointers[event.pointerId || 0] = getPointer(event);\n }\n\n if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) {\n action = ACTION_ZOOM;\n } else {\n action = getData(event.target, DATA_ACTION);\n }\n\n if (!REGEXP_ACTIONS.test(action)) {\n return;\n }\n\n if (dispatchEvent(this.element, EVENT_CROP_START, {\n originalEvent: event,\n action: action\n }) === false) {\n return;\n } // This line is required for preventing page zooming in iOS browsers\n\n\n event.preventDefault();\n this.action = action;\n this.cropping = false;\n\n if (action === ACTION_CROP) {\n this.cropping = true;\n addClass(this.dragBox, CLASS_MODAL);\n }\n },\n cropMove: function cropMove(event) {\n var action = this.action;\n\n if (this.disabled || !action) {\n return;\n }\n\n var pointers = this.pointers;\n event.preventDefault();\n\n if (dispatchEvent(this.element, EVENT_CROP_MOVE, {\n originalEvent: event,\n action: action\n }) === false) {\n return;\n }\n\n if (event.changedTouches) {\n forEach(event.changedTouches, function (touch) {\n // The first parameter should not be undefined (#432)\n assign(pointers[touch.identifier] || {}, getPointer(touch, true));\n });\n } else {\n assign(pointers[event.pointerId || 0] || {}, getPointer(event, true));\n }\n\n this.change(event);\n },\n cropEnd: function cropEnd(event) {\n if (this.disabled) {\n return;\n }\n\n var action = this.action,\n pointers = this.pointers;\n\n if (event.changedTouches) {\n forEach(event.changedTouches, function (touch) {\n delete pointers[touch.identifier];\n });\n } else {\n delete pointers[event.pointerId || 0];\n }\n\n if (!action) {\n return;\n }\n\n event.preventDefault();\n\n if (!Object.keys(pointers).length) {\n this.action = '';\n }\n\n if (this.cropping) {\n this.cropping = false;\n toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);\n }\n\n dispatchEvent(this.element, EVENT_CROP_END, {\n originalEvent: event,\n action: action\n });\n }\n };\n\n var change = {\n change: function change(event) {\n var options = this.options,\n canvasData = this.canvasData,\n containerData = this.containerData,\n cropBoxData = this.cropBoxData,\n pointers = this.pointers;\n var action = this.action;\n var aspectRatio = options.aspectRatio;\n var left = cropBoxData.left,\n top = cropBoxData.top,\n width = cropBoxData.width,\n height = cropBoxData.height;\n var right = left + width;\n var bottom = top + height;\n var minLeft = 0;\n var minTop = 0;\n var maxWidth = containerData.width;\n var maxHeight = containerData.height;\n var renderable = true;\n var offset; // Locking aspect ratio in \"free mode\" by holding shift key\n\n if (!aspectRatio && event.shiftKey) {\n aspectRatio = width && height ? width / height : 1;\n }\n\n if (this.limited) {\n minLeft = cropBoxData.minLeft;\n minTop = cropBoxData.minTop;\n maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width);\n maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height);\n }\n\n var pointer = pointers[Object.keys(pointers)[0]];\n var range = {\n x: pointer.endX - pointer.startX,\n y: pointer.endY - pointer.startY\n };\n\n var check = function check(side) {\n switch (side) {\n case ACTION_EAST:\n if (right + range.x > maxWidth) {\n range.x = maxWidth - right;\n }\n\n break;\n\n case ACTION_WEST:\n if (left + range.x < minLeft) {\n range.x = minLeft - left;\n }\n\n break;\n\n case ACTION_NORTH:\n if (top + range.y < minTop) {\n range.y = minTop - top;\n }\n\n break;\n\n case ACTION_SOUTH:\n if (bottom + range.y > maxHeight) {\n range.y = maxHeight - bottom;\n }\n\n break;\n }\n };\n\n switch (action) {\n // Move crop box\n case ACTION_ALL:\n left += range.x;\n top += range.y;\n break;\n // Resize crop box\n\n case ACTION_EAST:\n if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n renderable = false;\n break;\n }\n\n check(ACTION_EAST);\n width += range.x;\n\n if (width < 0) {\n action = ACTION_WEST;\n width = -width;\n left -= width;\n }\n\n if (aspectRatio) {\n height = width / aspectRatio;\n top += (cropBoxData.height - height) / 2;\n }\n\n break;\n\n case ACTION_NORTH:\n if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n renderable = false;\n break;\n }\n\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n\n if (height < 0) {\n action = ACTION_SOUTH;\n height = -height;\n top -= height;\n }\n\n if (aspectRatio) {\n width = height * aspectRatio;\n left += (cropBoxData.width - width) / 2;\n }\n\n break;\n\n case ACTION_WEST:\n if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n renderable = false;\n break;\n }\n\n check(ACTION_WEST);\n width -= range.x;\n left += range.x;\n\n if (width < 0) {\n action = ACTION_EAST;\n width = -width;\n left -= width;\n }\n\n if (aspectRatio) {\n height = width / aspectRatio;\n top += (cropBoxData.height - height) / 2;\n }\n\n break;\n\n case ACTION_SOUTH:\n if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n renderable = false;\n break;\n }\n\n check(ACTION_SOUTH);\n height += range.y;\n\n if (height < 0) {\n action = ACTION_NORTH;\n height = -height;\n top -= height;\n }\n\n if (aspectRatio) {\n width = height * aspectRatio;\n left += (cropBoxData.width - width) / 2;\n }\n\n break;\n\n case ACTION_NORTH_EAST:\n if (aspectRatio) {\n if (range.y <= 0 && (top <= minTop || right >= maxWidth)) {\n renderable = false;\n break;\n }\n\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n width = height * aspectRatio;\n } else {\n check(ACTION_NORTH);\n check(ACTION_EAST);\n\n if (range.x >= 0) {\n if (right < maxWidth) {\n width += range.x;\n } else if (range.y <= 0 && top <= minTop) {\n renderable = false;\n }\n } else {\n width += range.x;\n }\n\n if (range.y <= 0) {\n if (top > minTop) {\n height -= range.y;\n top += range.y;\n }\n } else {\n height -= range.y;\n top += range.y;\n }\n }\n\n if (width < 0 && height < 0) {\n action = ACTION_SOUTH_WEST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_NORTH_WEST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_SOUTH_EAST;\n height = -height;\n top -= height;\n }\n\n break;\n\n case ACTION_NORTH_WEST:\n if (aspectRatio) {\n if (range.y <= 0 && (top <= minTop || left <= minLeft)) {\n renderable = false;\n break;\n }\n\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n width = height * aspectRatio;\n left += cropBoxData.width - width;\n } else {\n check(ACTION_NORTH);\n check(ACTION_WEST);\n\n if (range.x <= 0) {\n if (left > minLeft) {\n width -= range.x;\n left += range.x;\n } else if (range.y <= 0 && top <= minTop) {\n renderable = false;\n }\n } else {\n width -= range.x;\n left += range.x;\n }\n\n if (range.y <= 0) {\n if (top > minTop) {\n height -= range.y;\n top += range.y;\n }\n } else {\n height -= range.y;\n top += range.y;\n }\n }\n\n if (width < 0 && height < 0) {\n action = ACTION_SOUTH_EAST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_NORTH_EAST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_SOUTH_WEST;\n height = -height;\n top -= height;\n }\n\n break;\n\n case ACTION_SOUTH_WEST:\n if (aspectRatio) {\n if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) {\n renderable = false;\n break;\n }\n\n check(ACTION_WEST);\n width -= range.x;\n left += range.x;\n height = width / aspectRatio;\n } else {\n check(ACTION_SOUTH);\n check(ACTION_WEST);\n\n if (range.x <= 0) {\n if (left > minLeft) {\n width -= range.x;\n left += range.x;\n } else if (range.y >= 0 && bottom >= maxHeight) {\n renderable = false;\n }\n } else {\n width -= range.x;\n left += range.x;\n }\n\n if (range.y >= 0) {\n if (bottom < maxHeight) {\n height += range.y;\n }\n } else {\n height += range.y;\n }\n }\n\n if (width < 0 && height < 0) {\n action = ACTION_NORTH_EAST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_SOUTH_EAST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_NORTH_WEST;\n height = -height;\n top -= height;\n }\n\n break;\n\n case ACTION_SOUTH_EAST:\n if (aspectRatio) {\n if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) {\n renderable = false;\n break;\n }\n\n check(ACTION_EAST);\n width += range.x;\n height = width / aspectRatio;\n } else {\n check(ACTION_SOUTH);\n check(ACTION_EAST);\n\n if (range.x >= 0) {\n if (right < maxWidth) {\n width += range.x;\n } else if (range.y >= 0 && bottom >= maxHeight) {\n renderable = false;\n }\n } else {\n width += range.x;\n }\n\n if (range.y >= 0) {\n if (bottom < maxHeight) {\n height += range.y;\n }\n } else {\n height += range.y;\n }\n }\n\n if (width < 0 && height < 0) {\n action = ACTION_NORTH_WEST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_SOUTH_WEST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_NORTH_EAST;\n height = -height;\n top -= height;\n }\n\n break;\n // Move canvas\n\n case ACTION_MOVE:\n this.move(range.x, range.y);\n renderable = false;\n break;\n // Zoom canvas\n\n case ACTION_ZOOM:\n this.zoom(getMaxZoomRatio(pointers), event);\n renderable = false;\n break;\n // Create crop box\n\n case ACTION_CROP:\n if (!range.x || !range.y) {\n renderable = false;\n break;\n }\n\n offset = getOffset(this.cropper);\n left = pointer.startX - offset.left;\n top = pointer.startY - offset.top;\n width = cropBoxData.minWidth;\n height = cropBoxData.minHeight;\n\n if (range.x > 0) {\n action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST;\n } else if (range.x < 0) {\n left -= width;\n action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST;\n }\n\n if (range.y < 0) {\n top -= height;\n } // Show the crop box if is hidden\n\n\n if (!this.cropped) {\n removeClass(this.cropBox, CLASS_HIDDEN);\n this.cropped = true;\n\n if (this.limited) {\n this.limitCropBox(true, true);\n }\n }\n\n break;\n }\n\n if (renderable) {\n cropBoxData.width = width;\n cropBoxData.height = height;\n cropBoxData.left = left;\n cropBoxData.top = top;\n this.action = action;\n this.renderCropBox();\n } // Override\n\n\n forEach(pointers, function (p) {\n p.startX = p.endX;\n p.startY = p.endY;\n });\n }\n };\n\n var methods = {\n // Show the crop box manually\n crop: function crop() {\n if (this.ready && !this.cropped && !this.disabled) {\n this.cropped = true;\n this.limitCropBox(true, true);\n\n if (this.options.modal) {\n addClass(this.dragBox, CLASS_MODAL);\n }\n\n removeClass(this.cropBox, CLASS_HIDDEN);\n this.setCropBoxData(this.initialCropBoxData);\n }\n\n return this;\n },\n // Reset the image and crop box to their initial states\n reset: function reset() {\n if (this.ready && !this.disabled) {\n this.imageData = assign({}, this.initialImageData);\n this.canvasData = assign({}, this.initialCanvasData);\n this.cropBoxData = assign({}, this.initialCropBoxData);\n this.renderCanvas();\n\n if (this.cropped) {\n this.renderCropBox();\n }\n }\n\n return this;\n },\n // Clear the crop box\n clear: function clear() {\n if (this.cropped && !this.disabled) {\n assign(this.cropBoxData, {\n left: 0,\n top: 0,\n width: 0,\n height: 0\n });\n this.cropped = false;\n this.renderCropBox();\n this.limitCanvas(true, true); // Render canvas after crop box rendered\n\n this.renderCanvas();\n removeClass(this.dragBox, CLASS_MODAL);\n addClass(this.cropBox, CLASS_HIDDEN);\n }\n\n return this;\n },\n\n /**\n * Replace the image's src and rebuild the cropper\n * @param {string} url - The new URL.\n * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one.\n * @returns {Cropper} this\n */\n replace: function replace(url) {\n var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!this.disabled && url) {\n if (this.isImg) {\n this.element.src = url;\n }\n\n if (hasSameSize) {\n this.url = url;\n this.image.src = url;\n\n if (this.ready) {\n this.viewBoxImage.src = url;\n forEach(this.previews, function (element) {\n element.getElementsByTagName('img')[0].src = url;\n });\n }\n } else {\n if (this.isImg) {\n this.replaced = true;\n }\n\n this.options.data = null;\n this.uncreate();\n this.load(url);\n }\n }\n\n return this;\n },\n // Enable (unfreeze) the cropper\n enable: function enable() {\n if (this.ready && this.disabled) {\n this.disabled = false;\n removeClass(this.cropper, CLASS_DISABLED);\n }\n\n return this;\n },\n // Disable (freeze) the cropper\n disable: function disable() {\n if (this.ready && !this.disabled) {\n this.disabled = true;\n addClass(this.cropper, CLASS_DISABLED);\n }\n\n return this;\n },\n\n /**\n * Destroy the cropper and remove the instance from the image\n * @returns {Cropper} this\n */\n destroy: function destroy() {\n var element = this.element;\n\n if (!element[NAMESPACE]) {\n return this;\n }\n\n element[NAMESPACE] = undefined;\n\n if (this.isImg && this.replaced) {\n element.src = this.originalUrl;\n }\n\n this.uncreate();\n return this;\n },\n\n /**\n * Move the canvas with relative offsets\n * @param {number} offsetX - The relative offset distance on the x-axis.\n * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis.\n * @returns {Cropper} this\n */\n move: function move(offsetX) {\n var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX;\n var _this$canvasData = this.canvasData,\n left = _this$canvasData.left,\n top = _this$canvasData.top;\n return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY));\n },\n\n /**\n * Move the canvas to an absolute point\n * @param {number} x - The x-axis coordinate.\n * @param {number} [y=x] - The y-axis coordinate.\n * @returns {Cropper} this\n */\n moveTo: function moveTo(x) {\n var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n var canvasData = this.canvasData;\n var changed = false;\n x = Number(x);\n y = Number(y);\n\n if (this.ready && !this.disabled && this.options.movable) {\n if (isNumber(x)) {\n canvasData.left = x;\n changed = true;\n }\n\n if (isNumber(y)) {\n canvasData.top = y;\n changed = true;\n }\n\n if (changed) {\n this.renderCanvas(true);\n }\n }\n\n return this;\n },\n\n /**\n * Zoom the canvas with a relative ratio\n * @param {number} ratio - The target ratio.\n * @param {Event} _originalEvent - The original event if any.\n * @returns {Cropper} this\n */\n zoom: function zoom(ratio, _originalEvent) {\n var canvasData = this.canvasData;\n ratio = Number(ratio);\n\n if (ratio < 0) {\n ratio = 1 / (1 - ratio);\n } else {\n ratio = 1 + ratio;\n }\n\n return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent);\n },\n\n /**\n * Zoom the canvas to an absolute ratio\n * @param {number} ratio - The target ratio.\n * @param {Object} pivot - The zoom pivot point coordinate.\n * @param {Event} _originalEvent - The original event if any.\n * @returns {Cropper} this\n */\n zoomTo: function zoomTo(ratio, pivot, _originalEvent) {\n var options = this.options,\n canvasData = this.canvasData;\n var width = canvasData.width,\n height = canvasData.height,\n naturalWidth = canvasData.naturalWidth,\n naturalHeight = canvasData.naturalHeight;\n ratio = Number(ratio);\n\n if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) {\n var newWidth = naturalWidth * ratio;\n var newHeight = naturalHeight * ratio;\n\n if (dispatchEvent(this.element, EVENT_ZOOM, {\n ratio: ratio,\n oldRatio: width / naturalWidth,\n originalEvent: _originalEvent\n }) === false) {\n return this;\n }\n\n if (_originalEvent) {\n var pointers = this.pointers;\n var offset = getOffset(this.cropper);\n var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : {\n pageX: _originalEvent.pageX,\n pageY: _originalEvent.pageY\n }; // Zoom from the triggering point of the event\n\n canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width);\n canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height);\n } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) {\n canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width);\n canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height);\n } else {\n // Zoom from the center of the canvas\n canvasData.left -= (newWidth - width) / 2;\n canvasData.top -= (newHeight - height) / 2;\n }\n\n canvasData.width = newWidth;\n canvasData.height = newHeight;\n this.renderCanvas(true);\n }\n\n return this;\n },\n\n /**\n * Rotate the canvas with a relative degree\n * @param {number} degree - The rotate degree.\n * @returns {Cropper} this\n */\n rotate: function rotate(degree) {\n return this.rotateTo((this.imageData.rotate || 0) + Number(degree));\n },\n\n /**\n * Rotate the canvas to an absolute degree\n * @param {number} degree - The rotate degree.\n * @returns {Cropper} this\n */\n rotateTo: function rotateTo(degree) {\n degree = Number(degree);\n\n if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) {\n this.imageData.rotate = degree % 360;\n this.renderCanvas(true, true);\n }\n\n return this;\n },\n\n /**\n * Scale the image on the x-axis.\n * @param {number} scaleX - The scale ratio on the x-axis.\n * @returns {Cropper} this\n */\n scaleX: function scaleX(_scaleX) {\n var scaleY = this.imageData.scaleY;\n return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1);\n },\n\n /**\n * Scale the image on the y-axis.\n * @param {number} scaleY - The scale ratio on the y-axis.\n * @returns {Cropper} this\n */\n scaleY: function scaleY(_scaleY) {\n var scaleX = this.imageData.scaleX;\n return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY);\n },\n\n /**\n * Scale the image\n * @param {number} scaleX - The scale ratio on the x-axis.\n * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis.\n * @returns {Cropper} this\n */\n scale: function scale(scaleX) {\n var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;\n var imageData = this.imageData;\n var transformed = false;\n scaleX = Number(scaleX);\n scaleY = Number(scaleY);\n\n if (this.ready && !this.disabled && this.options.scalable) {\n if (isNumber(scaleX)) {\n imageData.scaleX = scaleX;\n transformed = true;\n }\n\n if (isNumber(scaleY)) {\n imageData.scaleY = scaleY;\n transformed = true;\n }\n\n if (transformed) {\n this.renderCanvas(true, true);\n }\n }\n\n return this;\n },\n\n /**\n * Get the cropped area position and size data (base on the original image)\n * @param {boolean} [rounded=false] - Indicate if round the data values or not.\n * @returns {Object} The result cropped data.\n */\n getData: function getData() {\n var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var options = this.options,\n imageData = this.imageData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData;\n var data;\n\n if (this.ready && this.cropped) {\n data = {\n x: cropBoxData.left - canvasData.left,\n y: cropBoxData.top - canvasData.top,\n width: cropBoxData.width,\n height: cropBoxData.height\n };\n var ratio = imageData.width / imageData.naturalWidth;\n forEach(data, function (n, i) {\n data[i] = n / ratio;\n });\n\n if (rounded) {\n // In case rounding off leads to extra 1px in right or bottom border\n // we should round the top-left corner and the dimension (#343).\n var bottom = Math.round(data.y + data.height);\n var right = Math.round(data.x + data.width);\n data.x = Math.round(data.x);\n data.y = Math.round(data.y);\n data.width = right - data.x;\n data.height = bottom - data.y;\n }\n } else {\n data = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n };\n }\n\n if (options.rotatable) {\n data.rotate = imageData.rotate || 0;\n }\n\n if (options.scalable) {\n data.scaleX = imageData.scaleX || 1;\n data.scaleY = imageData.scaleY || 1;\n }\n\n return data;\n },\n\n /**\n * Set the cropped area position and size with new data\n * @param {Object} data - The new data.\n * @returns {Cropper} this\n */\n setData: function setData(data) {\n var options = this.options,\n imageData = this.imageData,\n canvasData = this.canvasData;\n var cropBoxData = {};\n\n if (this.ready && !this.disabled && isPlainObject(data)) {\n var transformed = false;\n\n if (options.rotatable) {\n if (isNumber(data.rotate) && data.rotate !== imageData.rotate) {\n imageData.rotate = data.rotate;\n transformed = true;\n }\n }\n\n if (options.scalable) {\n if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) {\n imageData.scaleX = data.scaleX;\n transformed = true;\n }\n\n if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) {\n imageData.scaleY = data.scaleY;\n transformed = true;\n }\n }\n\n if (transformed) {\n this.renderCanvas(true, true);\n }\n\n var ratio = imageData.width / imageData.naturalWidth;\n\n if (isNumber(data.x)) {\n cropBoxData.left = data.x * ratio + canvasData.left;\n }\n\n if (isNumber(data.y)) {\n cropBoxData.top = data.y * ratio + canvasData.top;\n }\n\n if (isNumber(data.width)) {\n cropBoxData.width = data.width * ratio;\n }\n\n if (isNumber(data.height)) {\n cropBoxData.height = data.height * ratio;\n }\n\n this.setCropBoxData(cropBoxData);\n }\n\n return this;\n },\n\n /**\n * Get the container size data.\n * @returns {Object} The result container data.\n */\n getContainerData: function getContainerData() {\n return this.ready ? assign({}, this.containerData) : {};\n },\n\n /**\n * Get the image position and size data.\n * @returns {Object} The result image data.\n */\n getImageData: function getImageData() {\n return this.sized ? assign({}, this.imageData) : {};\n },\n\n /**\n * Get the canvas position and size data.\n * @returns {Object} The result canvas data.\n */\n getCanvasData: function getCanvasData() {\n var canvasData = this.canvasData;\n var data = {};\n\n if (this.ready) {\n forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) {\n data[n] = canvasData[n];\n });\n }\n\n return data;\n },\n\n /**\n * Set the canvas position and size with new data.\n * @param {Object} data - The new canvas data.\n * @returns {Cropper} this\n */\n setCanvasData: function setCanvasData(data) {\n var canvasData = this.canvasData;\n var aspectRatio = canvasData.aspectRatio;\n\n if (this.ready && !this.disabled && isPlainObject(data)) {\n if (isNumber(data.left)) {\n canvasData.left = data.left;\n }\n\n if (isNumber(data.top)) {\n canvasData.top = data.top;\n }\n\n if (isNumber(data.width)) {\n canvasData.width = data.width;\n canvasData.height = data.width / aspectRatio;\n } else if (isNumber(data.height)) {\n canvasData.height = data.height;\n canvasData.width = data.height * aspectRatio;\n }\n\n this.renderCanvas(true);\n }\n\n return this;\n },\n\n /**\n * Get the crop box position and size data.\n * @returns {Object} The result crop box data.\n */\n getCropBoxData: function getCropBoxData() {\n var cropBoxData = this.cropBoxData;\n var data;\n\n if (this.ready && this.cropped) {\n data = {\n left: cropBoxData.left,\n top: cropBoxData.top,\n width: cropBoxData.width,\n height: cropBoxData.height\n };\n }\n\n return data || {};\n },\n\n /**\n * Set the crop box position and size with new data.\n * @param {Object} data - The new crop box data.\n * @returns {Cropper} this\n */\n setCropBoxData: function setCropBoxData(data) {\n var cropBoxData = this.cropBoxData;\n var aspectRatio = this.options.aspectRatio;\n var widthChanged;\n var heightChanged;\n\n if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) {\n if (isNumber(data.left)) {\n cropBoxData.left = data.left;\n }\n\n if (isNumber(data.top)) {\n cropBoxData.top = data.top;\n }\n\n if (isNumber(data.width) && data.width !== cropBoxData.width) {\n widthChanged = true;\n cropBoxData.width = data.width;\n }\n\n if (isNumber(data.height) && data.height !== cropBoxData.height) {\n heightChanged = true;\n cropBoxData.height = data.height;\n }\n\n if (aspectRatio) {\n if (widthChanged) {\n cropBoxData.height = cropBoxData.width / aspectRatio;\n } else if (heightChanged) {\n cropBoxData.width = cropBoxData.height * aspectRatio;\n }\n }\n\n this.renderCropBox();\n }\n\n return this;\n },\n\n /**\n * Get a canvas drawn the cropped image.\n * @param {Object} [options={}] - The config options.\n * @returns {HTMLCanvasElement} - The result canvas.\n */\n getCroppedCanvas: function getCroppedCanvas() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (!this.ready || !window.HTMLCanvasElement) {\n return null;\n }\n\n var canvasData = this.canvasData;\n var source = getSourceCanvas(this.image, this.imageData, canvasData, options); // Returns the source canvas if it is not cropped.\n\n if (!this.cropped) {\n return source;\n }\n\n var _this$getData = this.getData(),\n initialX = _this$getData.x,\n initialY = _this$getData.y,\n initialWidth = _this$getData.width,\n initialHeight = _this$getData.height;\n\n var ratio = source.width / Math.floor(canvasData.naturalWidth);\n\n if (ratio !== 1) {\n initialX *= ratio;\n initialY *= ratio;\n initialWidth *= ratio;\n initialHeight *= ratio;\n }\n\n var aspectRatio = initialWidth / initialHeight;\n var maxSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: options.maxWidth || Infinity,\n height: options.maxHeight || Infinity\n });\n var minSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: options.minWidth || 0,\n height: options.minHeight || 0\n }, 'cover');\n\n var _getAdjustedSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: options.width || (ratio !== 1 ? source.width : initialWidth),\n height: options.height || (ratio !== 1 ? source.height : initialHeight)\n }),\n width = _getAdjustedSizes.width,\n height = _getAdjustedSizes.height;\n\n width = Math.min(maxSizes.width, Math.max(minSizes.width, width));\n height = Math.min(maxSizes.height, Math.max(minSizes.height, height));\n var canvas = document.createElement('canvas');\n var context = canvas.getContext('2d');\n canvas.width = normalizeDecimalNumber(width);\n canvas.height = normalizeDecimalNumber(height);\n context.fillStyle = options.fillColor || 'transparent';\n context.fillRect(0, 0, width, height);\n var _options$imageSmoothi = options.imageSmoothingEnabled,\n imageSmoothingEnabled = _options$imageSmoothi === void 0 ? true : _options$imageSmoothi,\n imageSmoothingQuality = options.imageSmoothingQuality;\n context.imageSmoothingEnabled = imageSmoothingEnabled;\n\n if (imageSmoothingQuality) {\n context.imageSmoothingQuality = imageSmoothingQuality;\n } // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage\n\n\n var sourceWidth = source.width;\n var sourceHeight = source.height; // Source canvas parameters\n\n var srcX = initialX;\n var srcY = initialY;\n var srcWidth;\n var srcHeight; // Destination canvas parameters\n\n var dstX;\n var dstY;\n var dstWidth;\n var dstHeight;\n\n if (srcX <= -initialWidth || srcX > sourceWidth) {\n srcX = 0;\n srcWidth = 0;\n dstX = 0;\n dstWidth = 0;\n } else if (srcX <= 0) {\n dstX = -srcX;\n srcX = 0;\n srcWidth = Math.min(sourceWidth, initialWidth + srcX);\n dstWidth = srcWidth;\n } else if (srcX <= sourceWidth) {\n dstX = 0;\n srcWidth = Math.min(initialWidth, sourceWidth - srcX);\n dstWidth = srcWidth;\n }\n\n if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) {\n srcY = 0;\n srcHeight = 0;\n dstY = 0;\n dstHeight = 0;\n } else if (srcY <= 0) {\n dstY = -srcY;\n srcY = 0;\n srcHeight = Math.min(sourceHeight, initialHeight + srcY);\n dstHeight = srcHeight;\n } else if (srcY <= sourceHeight) {\n dstY = 0;\n srcHeight = Math.min(initialHeight, sourceHeight - srcY);\n dstHeight = srcHeight;\n }\n\n var params = [srcX, srcY, srcWidth, srcHeight]; // Avoid \"IndexSizeError\"\n\n if (dstWidth > 0 && dstHeight > 0) {\n var scale = width / initialWidth;\n params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale);\n } // All the numerical parameters should be integer for `drawImage`\n // https://github.com/fengyuanchen/cropper/issues/476\n\n\n context.drawImage.apply(context, [source].concat(_toConsumableArray(params.map(function (param) {\n return Math.floor(normalizeDecimalNumber(param));\n }))));\n return canvas;\n },\n\n /**\n * Change the aspect ratio of the crop box.\n * @param {number} aspectRatio - The new aspect ratio.\n * @returns {Cropper} this\n */\n setAspectRatio: function setAspectRatio(aspectRatio) {\n var options = this.options;\n\n if (!this.disabled && !isUndefined(aspectRatio)) {\n // 0 -> NaN\n options.aspectRatio = Math.max(0, aspectRatio) || NaN;\n\n if (this.ready) {\n this.initCropBox();\n\n if (this.cropped) {\n this.renderCropBox();\n }\n }\n }\n\n return this;\n },\n\n /**\n * Change the drag mode.\n * @param {string} mode - The new drag mode.\n * @returns {Cropper} this\n */\n setDragMode: function setDragMode(mode) {\n var options = this.options,\n dragBox = this.dragBox,\n face = this.face;\n\n if (this.ready && !this.disabled) {\n var croppable = mode === DRAG_MODE_CROP;\n var movable = options.movable && mode === DRAG_MODE_MOVE;\n mode = croppable || movable ? mode : DRAG_MODE_NONE;\n options.dragMode = mode;\n setData(dragBox, DATA_ACTION, mode);\n toggleClass(dragBox, CLASS_CROP, croppable);\n toggleClass(dragBox, CLASS_MOVE, movable);\n\n if (!options.cropBoxMovable) {\n // Sync drag mode to crop box when it is not movable\n setData(face, DATA_ACTION, mode);\n toggleClass(face, CLASS_CROP, croppable);\n toggleClass(face, CLASS_MOVE, movable);\n }\n }\n\n return this;\n }\n };\n\n var AnotherCropper = WINDOW.Cropper;\n\n var Cropper = /*#__PURE__*/function () {\n /**\n * Create a new Cropper.\n * @param {Element} element - The target element for cropping.\n * @param {Object} [options={}] - The configuration options.\n */\n function Cropper(element) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Cropper);\n\n if (!element || !REGEXP_TAG_NAME.test(element.tagName)) {\n throw new Error('The first argument is required and must be an or element.');\n }\n\n this.element = element;\n this.options = assign({}, DEFAULTS, isPlainObject(options) && options);\n this.cropped = false;\n this.disabled = false;\n this.pointers = {};\n this.ready = false;\n this.reloading = false;\n this.replaced = false;\n this.sized = false;\n this.sizing = false;\n this.init();\n }\n\n _createClass(Cropper, [{\n key: \"init\",\n value: function init() {\n var element = this.element;\n var tagName = element.tagName.toLowerCase();\n var url;\n\n if (element[NAMESPACE]) {\n return;\n }\n\n element[NAMESPACE] = this;\n\n if (tagName === 'img') {\n this.isImg = true; // e.g.: \"img/picture.jpg\"\n\n url = element.getAttribute('src') || '';\n this.originalUrl = url; // Stop when it's a blank image\n\n if (!url) {\n return;\n } // e.g.: \"https://example.com/img/picture.jpg\"\n\n\n url = element.src;\n } else if (tagName === 'canvas' && window.HTMLCanvasElement) {\n url = element.toDataURL();\n }\n\n this.load(url);\n }\n }, {\n key: \"load\",\n value: function load(url) {\n var _this = this;\n\n if (!url) {\n return;\n }\n\n this.url = url;\n this.imageData = {};\n var element = this.element,\n options = this.options;\n\n if (!options.rotatable && !options.scalable) {\n options.checkOrientation = false;\n } // Only IE10+ supports Typed Arrays\n\n\n if (!options.checkOrientation || !window.ArrayBuffer) {\n this.clone();\n return;\n } // Detect the mime type of the image directly if it is a Data URL\n\n\n if (REGEXP_DATA_URL.test(url)) {\n // Read ArrayBuffer from Data URL of JPEG images directly for better performance\n if (REGEXP_DATA_URL_JPEG.test(url)) {\n this.read(dataURLToArrayBuffer(url));\n } else {\n // Only a JPEG image may contains Exif Orientation information,\n // the rest types of Data URLs are not necessary to check orientation at all.\n this.clone();\n }\n\n return;\n } // 1. Detect the mime type of the image by a XMLHttpRequest.\n // 2. Load the image as ArrayBuffer for reading orientation if its a JPEG image.\n\n\n var xhr = new XMLHttpRequest();\n var clone = this.clone.bind(this);\n this.reloading = true;\n this.xhr = xhr; // 1. Cross origin requests are only supported for protocol schemes:\n // http, https, data, chrome, chrome-extension.\n // 2. Access to XMLHttpRequest from a Data URL will be blocked by CORS policy\n // in some browsers as IE11 and Safari.\n\n xhr.onabort = clone;\n xhr.onerror = clone;\n xhr.ontimeout = clone;\n\n xhr.onprogress = function () {\n // Abort the request directly if it not a JPEG image for better performance\n if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) {\n xhr.abort();\n }\n };\n\n xhr.onload = function () {\n _this.read(xhr.response);\n };\n\n xhr.onloadend = function () {\n _this.reloading = false;\n _this.xhr = null;\n }; // Bust cache when there is a \"crossOrigin\" property to avoid browser cache error\n\n\n if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) {\n url = addTimestamp(url);\n } // The third parameter is required for avoiding side-effect (#682)\n\n\n xhr.open('GET', url, true);\n xhr.responseType = 'arraybuffer';\n xhr.withCredentials = element.crossOrigin === 'use-credentials';\n xhr.send();\n }\n }, {\n key: \"read\",\n value: function read(arrayBuffer) {\n var options = this.options,\n imageData = this.imageData; // Reset the orientation value to its default value 1\n // as some iOS browsers will render image with its orientation\n\n var orientation = resetAndGetOrientation(arrayBuffer);\n var rotate = 0;\n var scaleX = 1;\n var scaleY = 1;\n\n if (orientation > 1) {\n // Generate a new URL which has the default orientation value\n this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG);\n\n var _parseOrientation = parseOrientation(orientation);\n\n rotate = _parseOrientation.rotate;\n scaleX = _parseOrientation.scaleX;\n scaleY = _parseOrientation.scaleY;\n }\n\n if (options.rotatable) {\n imageData.rotate = rotate;\n }\n\n if (options.scalable) {\n imageData.scaleX = scaleX;\n imageData.scaleY = scaleY;\n }\n\n this.clone();\n }\n }, {\n key: \"clone\",\n value: function clone() {\n var element = this.element,\n url = this.url;\n var crossOrigin = element.crossOrigin;\n var crossOriginUrl = url;\n\n if (this.options.checkCrossOrigin && isCrossOriginURL(url)) {\n if (!crossOrigin) {\n crossOrigin = 'anonymous';\n } // Bust cache when there is not a \"crossOrigin\" property (#519)\n\n\n crossOriginUrl = addTimestamp(url);\n }\n\n this.crossOrigin = crossOrigin;\n this.crossOriginUrl = crossOriginUrl;\n var image = document.createElement('img');\n\n if (crossOrigin) {\n image.crossOrigin = crossOrigin;\n }\n\n image.src = crossOriginUrl || url;\n image.alt = element.alt || 'The image to crop';\n this.image = image;\n image.onload = this.start.bind(this);\n image.onerror = this.stop.bind(this);\n addClass(image, CLASS_HIDE);\n element.parentNode.insertBefore(image, element.nextSibling);\n }\n }, {\n key: \"start\",\n value: function start() {\n var _this2 = this;\n\n var image = this.image;\n image.onload = null;\n image.onerror = null;\n this.sizing = true; // Match all browsers that use WebKit as the layout engine in iOS devices,\n // such as Safari for iOS, Chrome for iOS, and in-app browsers.\n\n var isIOSWebKit = WINDOW.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(WINDOW.navigator.userAgent);\n\n var done = function done(naturalWidth, naturalHeight) {\n assign(_this2.imageData, {\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight,\n aspectRatio: naturalWidth / naturalHeight\n });\n _this2.initialImageData = assign({}, _this2.imageData);\n _this2.sizing = false;\n _this2.sized = true;\n\n _this2.build();\n }; // Most modern browsers (excepts iOS WebKit)\n\n\n if (image.naturalWidth && !isIOSWebKit) {\n done(image.naturalWidth, image.naturalHeight);\n return;\n }\n\n var sizingImage = document.createElement('img');\n var body = document.body || document.documentElement;\n this.sizingImage = sizingImage;\n\n sizingImage.onload = function () {\n done(sizingImage.width, sizingImage.height);\n\n if (!isIOSWebKit) {\n body.removeChild(sizingImage);\n }\n };\n\n sizingImage.src = image.src; // iOS WebKit will convert the image automatically\n // with its orientation once append it into DOM (#279)\n\n if (!isIOSWebKit) {\n sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;';\n body.appendChild(sizingImage);\n }\n }\n }, {\n key: \"stop\",\n value: function stop() {\n var image = this.image;\n image.onload = null;\n image.onerror = null;\n image.parentNode.removeChild(image);\n this.image = null;\n }\n }, {\n key: \"build\",\n value: function build() {\n if (!this.sized || this.ready) {\n return;\n }\n\n var element = this.element,\n options = this.options,\n image = this.image; // Create cropper elements\n\n var container = element.parentNode;\n var template = document.createElement('div');\n template.innerHTML = TEMPLATE;\n var cropper = template.querySelector(\".\".concat(NAMESPACE, \"-container\"));\n var canvas = cropper.querySelector(\".\".concat(NAMESPACE, \"-canvas\"));\n var dragBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-drag-box\"));\n var cropBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-crop-box\"));\n var face = cropBox.querySelector(\".\".concat(NAMESPACE, \"-face\"));\n this.container = container;\n this.cropper = cropper;\n this.canvas = canvas;\n this.dragBox = dragBox;\n this.cropBox = cropBox;\n this.viewBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-view-box\"));\n this.face = face;\n canvas.appendChild(image); // Hide the original image\n\n addClass(element, CLASS_HIDDEN); // Inserts the cropper after to the current image\n\n container.insertBefore(cropper, element.nextSibling); // Show the image if is hidden\n\n if (!this.isImg) {\n removeClass(image, CLASS_HIDE);\n }\n\n this.initPreview();\n this.bind();\n options.initialAspectRatio = Math.max(0, options.initialAspectRatio) || NaN;\n options.aspectRatio = Math.max(0, options.aspectRatio) || NaN;\n options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0;\n addClass(cropBox, CLASS_HIDDEN);\n\n if (!options.guides) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-dashed\")), CLASS_HIDDEN);\n }\n\n if (!options.center) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-center\")), CLASS_HIDDEN);\n }\n\n if (options.background) {\n addClass(cropper, \"\".concat(NAMESPACE, \"-bg\"));\n }\n\n if (!options.highlight) {\n addClass(face, CLASS_INVISIBLE);\n }\n\n if (options.cropBoxMovable) {\n addClass(face, CLASS_MOVE);\n setData(face, DATA_ACTION, ACTION_ALL);\n }\n\n if (!options.cropBoxResizable) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-line\")), CLASS_HIDDEN);\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-point\")), CLASS_HIDDEN);\n }\n\n this.render();\n this.ready = true;\n this.setDragMode(options.dragMode);\n\n if (options.autoCrop) {\n this.crop();\n }\n\n this.setData(options.data);\n\n if (isFunction(options.ready)) {\n addListener(element, EVENT_READY, options.ready, {\n once: true\n });\n }\n\n dispatchEvent(element, EVENT_READY);\n }\n }, {\n key: \"unbuild\",\n value: function unbuild() {\n if (!this.ready) {\n return;\n }\n\n this.ready = false;\n this.unbind();\n this.resetPreview();\n this.cropper.parentNode.removeChild(this.cropper);\n removeClass(this.element, CLASS_HIDDEN);\n }\n }, {\n key: \"uncreate\",\n value: function uncreate() {\n if (this.ready) {\n this.unbuild();\n this.ready = false;\n this.cropped = false;\n } else if (this.sizing) {\n this.sizingImage.onload = null;\n this.sizing = false;\n this.sized = false;\n } else if (this.reloading) {\n this.xhr.onabort = null;\n this.xhr.abort();\n } else if (this.image) {\n this.stop();\n }\n }\n /**\n * Get the no conflict cropper class.\n * @returns {Cropper} The cropper class.\n */\n\n }], [{\n key: \"noConflict\",\n value: function noConflict() {\n window.Cropper = AnotherCropper;\n return Cropper;\n }\n /**\n * Change the default options.\n * @param {Object} options - The new default options.\n */\n\n }, {\n key: \"setDefaults\",\n value: function setDefaults(options) {\n assign(DEFAULTS, isPlainObject(options) && options);\n }\n }]);\n\n return Cropper;\n }();\n\n assign(Cropper.prototype, render, preview, events, handlers, change, methods);\n\n return Cropper;\n\n})));\n","'use strict'\nvar inherits = require('inherits')\nvar Buffer = require('safe-buffer').Buffer\n\nvar Base = require('cipher-base')\n\nvar ZEROS = Buffer.alloc(128)\nvar blocksize = 64\n\nfunction Hmac (alg, key) {\n Base.call(this, 'digest')\n if (typeof key === 'string') {\n key = Buffer.from(key)\n }\n\n this._alg = alg\n this._key = key\n\n if (key.length > blocksize) {\n key = alg(key)\n } else if (key.length < blocksize) {\n key = Buffer.concat([key, ZEROS], blocksize)\n }\n\n var ipad = this._ipad = Buffer.allocUnsafe(blocksize)\n var opad = this._opad = Buffer.allocUnsafe(blocksize)\n\n for (var i = 0; i < blocksize; i++) {\n ipad[i] = key[i] ^ 0x36\n opad[i] = key[i] ^ 0x5C\n }\n\n this._hash = [ipad]\n}\n\ninherits(Hmac, Base)\n\nHmac.prototype._update = function (data) {\n this._hash.push(data)\n}\n\nHmac.prototype._final = function () {\n var h = this._alg(Buffer.concat(this._hash))\n return this._alg(Buffer.concat([this._opad, h]))\n}\nmodule.exports = Hmac\n","var Stream = require('stream').Stream;\nvar util = require('util');\n\nmodule.exports = DelayedStream;\nfunction DelayedStream() {\n this.source = null;\n this.dataSize = 0;\n this.maxDataSize = 1024 * 1024;\n this.pauseStream = true;\n\n this._maxDataSizeExceeded = false;\n this._released = false;\n this._bufferedEvents = [];\n}\nutil.inherits(DelayedStream, Stream);\n\nDelayedStream.create = function(source, options) {\n var delayedStream = new this();\n\n options = options || {};\n for (var option in options) {\n delayedStream[option] = options[option];\n }\n\n delayedStream.source = source;\n\n var realEmit = source.emit;\n source.emit = function() {\n delayedStream._handleEmit(arguments);\n return realEmit.apply(source, arguments);\n };\n\n source.on('error', function() {});\n if (delayedStream.pauseStream) {\n source.pause();\n }\n\n return delayedStream;\n};\n\nObject.defineProperty(DelayedStream.prototype, 'readable', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this.source.readable;\n }\n});\n\nDelayedStream.prototype.setEncoding = function() {\n return this.source.setEncoding.apply(this.source, arguments);\n};\n\nDelayedStream.prototype.resume = function() {\n if (!this._released) {\n this.release();\n }\n\n this.source.resume();\n};\n\nDelayedStream.prototype.pause = function() {\n this.source.pause();\n};\n\nDelayedStream.prototype.release = function() {\n this._released = true;\n\n this._bufferedEvents.forEach(function(args) {\n this.emit.apply(this, args);\n }.bind(this));\n this._bufferedEvents = [];\n};\n\nDelayedStream.prototype.pipe = function() {\n var r = Stream.prototype.pipe.apply(this, arguments);\n this.resume();\n return r;\n};\n\nDelayedStream.prototype._handleEmit = function(args) {\n if (this._released) {\n this.emit.apply(this, args);\n return;\n }\n\n if (args[0] === 'data') {\n this.dataSize += args[1].length;\n this._checkIfMaxDataSizeExceeded();\n }\n\n this._bufferedEvents.push(args);\n};\n\nDelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {\n if (this._maxDataSizeExceeded) {\n return;\n }\n\n if (this.dataSize <= this.maxDataSize) {\n return;\n }\n\n this._maxDataSizeExceeded = true;\n var message =\n 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'\n this.emit('error', new Error(message));\n};\n","var elliptic = require('elliptic')\nvar BN = require('bn.js')\n\nmodule.exports = function createECDH (curve) {\n return new ECDH(curve)\n}\n\nvar aliases = {\n secp256k1: {\n name: 'secp256k1',\n byteLength: 32\n },\n secp224r1: {\n name: 'p224',\n byteLength: 28\n },\n prime256v1: {\n name: 'p256',\n byteLength: 32\n },\n prime192v1: {\n name: 'p192',\n byteLength: 24\n },\n ed25519: {\n name: 'ed25519',\n byteLength: 32\n },\n secp384r1: {\n name: 'p384',\n byteLength: 48\n },\n secp521r1: {\n name: 'p521',\n byteLength: 66\n }\n}\n\naliases.p224 = aliases.secp224r1\naliases.p256 = aliases.secp256r1 = aliases.prime256v1\naliases.p192 = aliases.secp192r1 = aliases.prime192v1\naliases.p384 = aliases.secp384r1\naliases.p521 = aliases.secp521r1\n\nfunction ECDH (curve) {\n this.curveType = aliases[curve]\n if (!this.curveType) {\n this.curveType = {\n name: curve\n }\n }\n this.curve = new elliptic.ec(this.curveType.name) // eslint-disable-line new-cap\n this.keys = void 0\n}\n\nECDH.prototype.generateKeys = function (enc, format) {\n this.keys = this.curve.genKeyPair()\n return this.getPublicKey(enc, format)\n}\n\nECDH.prototype.computeSecret = function (other, inenc, enc) {\n inenc = inenc || 'utf8'\n if (!Buffer.isBuffer(other)) {\n other = new Buffer(other, inenc)\n }\n var otherPub = this.curve.keyFromPublic(other).getPublic()\n var out = otherPub.mul(this.keys.getPrivate()).getX()\n return formatReturnValue(out, enc, this.curveType.byteLength)\n}\n\nECDH.prototype.getPublicKey = function (enc, format) {\n var key = this.keys.getPublic(format === 'compressed', true)\n if (format === 'hybrid') {\n if (key[key.length - 1] % 2) {\n key[0] = 7\n } else {\n key[0] = 6\n }\n }\n return formatReturnValue(key, enc)\n}\n\nECDH.prototype.getPrivateKey = function (enc) {\n return formatReturnValue(this.keys.getPrivate(), enc)\n}\n\nECDH.prototype.setPublicKey = function (pub, enc) {\n enc = enc || 'utf8'\n if (!Buffer.isBuffer(pub)) {\n pub = new Buffer(pub, enc)\n }\n this.keys._importPublic(pub)\n return this\n}\n\nECDH.prototype.setPrivateKey = function (priv, enc) {\n enc = enc || 'utf8'\n if (!Buffer.isBuffer(priv)) {\n priv = new Buffer(priv, enc)\n }\n\n var _priv = new BN(priv)\n _priv = _priv.toString(16)\n this.keys = this.curve.genKeyPair()\n this.keys._importPrivate(_priv)\n return this\n}\n\nfunction formatReturnValue (bn, enc, len) {\n if (!Array.isArray(bn)) {\n bn = bn.toArray()\n }\n var buf = new Buffer(bn)\n if (len && buf.length < len) {\n var zeros = new Buffer(len - buf.length)\n zeros.fill(0)\n buf = Buffer.concat([zeros, buf])\n }\n if (!enc) {\n return buf\n } else {\n return buf.toString(enc)\n }\n}\n"],"sourceRoot":""}