执行过npm install命令的vue-element-admin源码
康凯
2022-05-20 aa4c235a8ca67ea8b731f90c951a465e92c0a865
1
{"remainingRequest":"D:\\源码\\vue-element-admin-master\\node_modules\\babel-loader\\lib\\index.js!D:\\源码\\vue-element-admin-master\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!D:\\源码\\vue-element-admin-master\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\源码\\vue-element-admin-master\\src\\components\\ImageCropper\\index.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\源码\\vue-element-admin-master\\src\\components\\ImageCropper\\index.vue","mtime":1649647926000},{"path":"D:\\源码\\vue-element-admin-master\\babel.config.js","mtime":1649647926000},{"path":"D:\\源码\\vue-element-admin-master\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\源码\\vue-element-admin-master\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"D:\\源码\\vue-element-admin-master\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\源码\\vue-element-admin-master\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KJ3VzZSBzdHJpY3QnOwoKaW1wb3J0IF90eXBlb2YgZnJvbSAiRDovXHU2RTkwXHU3ODAxL3Z1ZS1lbGVtZW50LWFkbWluLW1hc3Rlci9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI7CmltcG9ydCByZXF1ZXN0IGZyb20gJ0AvdXRpbHMvcmVxdWVzdCc7CmltcG9ydCBsYW5ndWFnZSBmcm9tICcuL3V0aWxzL2xhbmd1YWdlLmpzJzsKaW1wb3J0IG1pbWVzIGZyb20gJy4vdXRpbHMvbWltZXMuanMnOwppbXBvcnQgZGF0YTJibG9iIGZyb20gJy4vdXRpbHMvZGF0YTJibG9iLmpzJzsKaW1wb3J0IGVmZmVjdFJpcHBsZSBmcm9tICcuL3V0aWxzL2VmZmVjdFJpcHBsZS5qcyc7CmV4cG9ydCBkZWZhdWx0IHsKICBwcm9wczogewogICAgLy8g5Z+f77yM5LiK5Lyg5paH5Lu2bmFtZe+8jOinpuWPkeS6i+S7tuS8muW4puS4iu+8iOWmguaenOS4gOS4qumhtemdouWkmuS4quWbvueJh+S4iuS8oOaOp+S7tu+8jOWPr+S7peWBmuWMuuWIhgogICAgZmllbGQ6IHsKICAgICAgdHlwZTogU3RyaW5nLAogICAgICBkZWZhdWx0OiAnYXZhdGFyJwogICAgfSwKICAgIC8vIOWOn+WQjWtlee+8jOexu+S8vOS6jmlk77yM6Kem5Y+R5LqL5Lu25Lya5bim5LiK77yI5aaC5p6c5LiA5Liq6aG16Z2i5aSa5Liq5Zu+54mH5LiK5Lyg5o6n5Lu277yM5Y+v5Lul5YGa5Yy65YiGCiAgICBraTogewogICAgICB0eXBlOiBOdW1iZXIsCiAgICAgIGRlZmF1bHQ6IDAKICAgIH0sCiAgICAvLyDmmL7npLror6Xmjqfku7bkuI7lkKYKICAgIHZhbHVlOiB7CiAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgIGRlZmF1bHQ6IHRydWUKICAgIH0sCiAgICAvLyDkuIrkvKDlnLDlnYAKICAgIHVybDogewogICAgICB0eXBlOiBTdHJpbmcsCiAgICAgIGRlZmF1bHQ6ICcnCiAgICB9LAogICAgLy8g5YW25LuW6KaB5LiK5Lyg5paH5Lu26ZmE5bim55qE5pWw5o2u77yM5a+56LGh5qC85byPCiAgICBwYXJhbXM6IHsKICAgICAgdHlwZTogT2JqZWN0LAogICAgICBkZWZhdWx0OiBudWxsCiAgICB9LAogICAgLy8gQWRkIGN1c3RvbSBoZWFkZXJzCiAgICBoZWFkZXJzOiB7CiAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgZGVmYXVsdDogbnVsbAogICAgfSwKICAgIC8vIOWJquijgeWbvueJh+eahOWuvQogICAgd2lkdGg6IHsKICAgICAgdHlwZTogTnVtYmVyLAogICAgICBkZWZhdWx0OiAyMDAKICAgIH0sCiAgICAvLyDliaroo4Hlm77niYfnmoTpq5gKICAgIGhlaWdodDogewogICAgICB0eXBlOiBOdW1iZXIsCiAgICAgIGRlZmF1bHQ6IDIwMAogICAgfSwKICAgIC8vIOS4jeaYvuekuuaXi+i9rOWKn+iDvQogICAgbm9Sb3RhdGU6IHsKICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgZGVmYXVsdDogdHJ1ZQogICAgfSwKICAgIC8vIOS4jemihOiniOWchuW9ouWbvueJhwogICAgbm9DaXJjbGU6IHsKICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgZGVmYXVsdDogZmFsc2UKICAgIH0sCiAgICAvLyDkuI3pooTop4jmlrnlvaLlm77niYcKICAgIG5vU3F1YXJlOiB7CiAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgIGRlZmF1bHQ6IGZhbHNlCiAgICB9LAogICAgLy8g5Y2V5paH5Lu25aSn5bCP6ZmQ5Yi2CiAgICBtYXhTaXplOiB7CiAgICAgIHR5cGU6IE51bWJlciwKICAgICAgZGVmYXVsdDogMTAyNDAKICAgIH0sCiAgICAvLyDor63oqIDnsbvlnosKICAgIGxhbmdUeXBlOiB7CiAgICAgIHR5cGU6IFN0cmluZywKICAgICAgZGVmYXVsdDogJ3poJwogICAgfSwKICAgIC8vIOivreiogOWMhQogICAgbGFuZ0V4dDogewogICAgICB0eXBlOiBPYmplY3QsCiAgICAgIGRlZmF1bHQ6IG51bGwKICAgIH0sCiAgICAvLyDlm77niYfkuIrkvKDmoLzlvI8KICAgIGltZ0Zvcm1hdDogewogICAgICB0eXBlOiBTdHJpbmcsCiAgICAgIGRlZmF1bHQ6ICdwbmcnCiAgICB9LAogICAgLy8g5piv5ZCm5pSv5oyB6Leo5Z+fCiAgICB3aXRoQ3JlZGVudGlhbHM6IHsKICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgZGVmYXVsdDogZmFsc2UKICAgIH0KICB9LAogIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICB2YXIgaW1nRm9ybWF0ID0gdGhpcy5pbWdGb3JtYXQsCiAgICAgICAgbGFuZ1R5cGUgPSB0aGlzLmxhbmdUeXBlLAogICAgICAgIGxhbmdFeHQgPSB0aGlzLmxhbmdFeHQsCiAgICAgICAgd2lkdGggPSB0aGlzLndpZHRoLAogICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0OwogICAgdmFyIGlzU3VwcG9ydGVkID0gdHJ1ZTsKICAgIHZhciBhbGxvd0ltZ0Zvcm1hdCA9IFsnanBnJywgJ3BuZyddOwogICAgdmFyIHRlbXBJbWdGb3JtYXQgPSBhbGxvd0ltZ0Zvcm1hdC5pbmRleE9mKGltZ0Zvcm1hdCkgPT09IC0xID8gJ2pwZycgOiBpbWdGb3JtYXQ7CiAgICB2YXIgbGFuZyA9IGxhbmd1YWdlW2xhbmdUeXBlXSA/IGxhbmd1YWdlW2xhbmdUeXBlXSA6IGxhbmd1YWdlWydlbiddOwogICAgdmFyIG1pbWUgPSBtaW1lc1t0ZW1wSW1nRm9ybWF0XTsgLy8g6KeE6IyD5Zu+54mH5qC85byPCgogICAgdGhpcy5pbWdGb3JtYXQgPSB0ZW1wSW1nRm9ybWF0OwoKICAgIGlmIChsYW5nRXh0KSB7CiAgICAgIE9iamVjdC5hc3NpZ24obGFuZywgbGFuZ0V4dCk7CiAgICB9CgogICAgaWYgKHR5cGVvZiBGb3JtRGF0YSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICBpc1N1cHBvcnRlZCA9IGZhbHNlOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgIC8vIOWbvueJh+eahG1pbWUKICAgICAgbWltZTogbWltZSwKICAgICAgLy8g6K+t6KiA5YyFCiAgICAgIGxhbmc6IGxhbmcsCiAgICAgIC8vIOa1j+iniOWZqOaYr+WQpuaUr+aMgeivpeaOp+S7tgogICAgICBpc1N1cHBvcnRlZDogaXNTdXBwb3J0ZWQsCiAgICAgIC8vIOa1j+iniOWZqOaYr+WQpuaUr+aMgeinpuWxj+S6i+S7tgogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zCiAgICAgIGlzU3VwcG9ydFRvdWNoOiBkb2N1bWVudC5oYXNPd25Qcm9wZXJ0eSgnb250b3VjaHN0YXJ0JyksCiAgICAgIC8vIOatpemqpAogICAgICBzdGVwOiAxLAogICAgICAvLyAx6YCJ5oup5paH5Lu2IDLliaroo4EgM+S4iuS8oAogICAgICAvLyDkuIrkvKDnirbmgIHlj4rov5vluqYKICAgICAgbG9hZGluZzogMCwKICAgICAgLy8gMOacquW8gOWniyAx5q2j5ZyoIDLmiJDlip8gM+mUmeivrwogICAgICBwcm9ncmVzczogMCwKICAgICAgLy8g5piv5ZCm5pyJ6ZSZ6K+v5Y+K6ZSZ6K+v5L+h5oGvCiAgICAgIGhhc0Vycm9yOiBmYWxzZSwKICAgICAgZXJyb3JNc2c6ICcnLAogICAgICAvLyDpnIDmsYLlm77lrr3pq5jmr5QKICAgICAgcmF0aW86IHdpZHRoIC8gaGVpZ2h0LAogICAgICAvLyDljp/lm77lnLDlnYDjgIHnlJ/miJDlm77niYflnLDlnYAKICAgICAgc291cmNlSW1nOiBudWxsLAogICAgICBzb3VyY2VJbWdVcmw6ICcnLAogICAgICBjcmVhdGVJbWdVcmw6ICcnLAogICAgICAvLyDljp/lm77niYfmi5bliqjkuovku7bliJ3lp4vlgLwKICAgICAgc291cmNlSW1nTW91c2VEb3duOiB7CiAgICAgICAgb246IGZhbHNlLAogICAgICAgIG1YOiAwLAogICAgICAgIC8vIOm8oOagh+aMieS4i+eahOWdkOaghwogICAgICAgIG1ZOiAwLAogICAgICAgIHg6IDAsCiAgICAgICAgLy8gc2NhbGXljp/lm77lnZDmoIcKICAgICAgICB5OiAwCiAgICAgIH0sCiAgICAgIC8vIOeUn+aIkOWbvueJh+mihOiniOeahOWuueWZqOWkp+WwjwogICAgICBwcmV2aWV3Q29udGFpbmVyOiB7CiAgICAgICAgd2lkdGg6IDEwMCwKICAgICAgICBoZWlnaHQ6IDEwMAogICAgICB9LAogICAgICAvLyDljp/lm77lrrnlmajlrr3pq5gKICAgICAgc291cmNlSW1nQ29udGFpbmVyOiB7CiAgICAgICAgLy8gc2ljCiAgICAgICAgd2lkdGg6IDI0MCwKICAgICAgICBoZWlnaHQ6IDE4NCAvLyDlpoLmnpznlJ/miJDlm77mr5TkvovkuI7mraTkuIDoh7TkvJrlh7rnjrBidWfvvIzlhYjmlLnmiJDnibnmrornmoTmoLzlvI/lkKfvvIzlk4jlk4jlk4gKCiAgICAgIH0sCiAgICAgIC8vIOWOn+WbvuWxleekuuWxnuaApwogICAgICBzY2FsZTogewogICAgICAgIHpvb21BZGRPbjogZmFsc2UsCiAgICAgICAgLy8g5oyJ6ZKu57yp5pS+5LqL5Lu25byA5ZCvCiAgICAgICAgem9vbVN1Yk9uOiBmYWxzZSwKICAgICAgICAvLyDmjInpkq7nvKnmlL7kuovku7blvIDlkK8KICAgICAgICByYW5nZTogMSwKICAgICAgICAvLyDmnIDlpKcxMDAKICAgICAgICByb3RhdGVMZWZ0OiBmYWxzZSwKICAgICAgICAvLyDmjInpkq7lkJHlt6bml4vovazkuovku7blvIDlkK8KICAgICAgICByb3RhdGVSaWdodDogZmFsc2UsCiAgICAgICAgLy8g5oyJ6ZKu5ZCR5Y+z5peL6L2s5LqL5Lu25byA5ZCvCiAgICAgICAgZGVncmVlOiAwLAogICAgICAgIC8vIOaXi+i9rOW6puaVsAogICAgICAgIHg6IDAsCiAgICAgICAgeTogMCwKICAgICAgICB3aWR0aDogMCwKICAgICAgICBoZWlnaHQ6IDAsCiAgICAgICAgbWF4V2lkdGg6IDAsCiAgICAgICAgbWF4SGVpZ2h0OiAwLAogICAgICAgIG1pbldpZHRoOiAwLAogICAgICAgIC8vIOacgOWuvQogICAgICAgIG1pbkhlaWdodDogMCwKICAgICAgICBuYXR1cmFsV2lkdGg6IDAsCiAgICAgICAgLy8g5Y6f5a69CiAgICAgICAgbmF0dXJhbEhlaWdodDogMAogICAgICB9CiAgICB9OwogIH0sCiAgY29tcHV0ZWQ6IHsKICAgIC8vIOi/m+W6puadoeagt+W8jwogICAgcHJvZ3Jlc3NTdHlsZTogZnVuY3Rpb24gcHJvZ3Jlc3NTdHlsZSgpIHsKICAgICAgdmFyIHByb2dyZXNzID0gdGhpcy5wcm9ncmVzczsKICAgICAgcmV0dXJuIHsKICAgICAgICB3aWR0aDogcHJvZ3Jlc3MgKyAnJScKICAgICAgfTsKICAgIH0sCiAgICAvLyDljp/lm77moLflvI8KICAgIHNvdXJjZUltZ1N0eWxlOiBmdW5jdGlvbiBzb3VyY2VJbWdTdHlsZSgpIHsKICAgICAgdmFyIHNjYWxlID0gdGhpcy5zY2FsZSwKICAgICAgICAgIHNvdXJjZUltZ01hc2tpbmcgPSB0aGlzLnNvdXJjZUltZ01hc2tpbmc7CiAgICAgIHZhciB0b3AgPSBzY2FsZS55ICsgc291cmNlSW1nTWFza2luZy55ICsgJ3B4JzsKICAgICAgdmFyIGxlZnQgPSBzY2FsZS54ICsgc291cmNlSW1nTWFza2luZy54ICsgJ3B4JzsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6IHRvcCwKICAgICAgICBsZWZ0OiBsZWZ0LAogICAgICAgIHdpZHRoOiBzY2FsZS53aWR0aCArICdweCcsCiAgICAgICAgaGVpZ2h0OiBzY2FsZS5oZWlnaHQgKyAncHgnLAogICAgICAgIHRyYW5zZm9ybTogJ3JvdGF0ZSgnICsgc2NhbGUuZGVncmVlICsgJ2RlZyknLAogICAgICAgIC8vIOaXi+i9rOaXtiDlt6bkvqfljp/lp4vlm77ml4vovazmoLflvI8KICAgICAgICAnLW1zLXRyYW5zZm9ybSc6ICdyb3RhdGUoJyArIHNjYWxlLmRlZ3JlZSArICdkZWcpJywKICAgICAgICAvLyDlhbzlrrlJRTkKICAgICAgICAnLW1vei10cmFuc2Zvcm0nOiAncm90YXRlKCcgKyBzY2FsZS5kZWdyZWUgKyAnZGVnKScsCiAgICAgICAgLy8g5YW85a65RmlyZUZveAogICAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICdyb3RhdGUoJyArIHNjYWxlLmRlZ3JlZSArICdkZWcpJywKICAgICAgICAvLyDlhbzlrrlTYWZhcmkg5ZKMIGNocm9tZQogICAgICAgICctby10cmFuc2Zvcm0nOiAncm90YXRlKCcgKyBzY2FsZS5kZWdyZWUgKyAnZGVnKScgLy8g5YW85a65IE9wZXJhCgogICAgICB9OwogICAgfSwKICAgIC8vIOWOn+WbvuiSmeeJiOWxnuaApwogICAgc291cmNlSW1nTWFza2luZzogZnVuY3Rpb24gc291cmNlSW1nTWFza2luZygpIHsKICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCwKICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0LAogICAgICAgICAgcmF0aW8gPSB0aGlzLnJhdGlvLAogICAgICAgICAgc291cmNlSW1nQ29udGFpbmVyID0gdGhpcy5zb3VyY2VJbWdDb250YWluZXI7CiAgICAgIHZhciBzaWMgPSBzb3VyY2VJbWdDb250YWluZXI7CiAgICAgIHZhciBzaWNSYXRpbyA9IHNpYy53aWR0aCAvIHNpYy5oZWlnaHQ7IC8vIOWOn+WbvuWuueWZqOWuvemrmOavlAoKICAgICAgdmFyIHggPSAwOwogICAgICB2YXIgeSA9IDA7CiAgICAgIHZhciB3ID0gc2ljLndpZHRoOwogICAgICB2YXIgaCA9IHNpYy5oZWlnaHQ7CiAgICAgIHZhciBzY2FsZSA9IDE7CgogICAgICBpZiAocmF0aW8gPCBzaWNSYXRpbykgewogICAgICAgIHNjYWxlID0gc2ljLmhlaWdodCAvIGhlaWdodDsKICAgICAgICB3ID0gc2ljLmhlaWdodCAqIHJhdGlvOwogICAgICAgIHggPSAoc2ljLndpZHRoIC0gdykgLyAyOwogICAgICB9CgogICAgICBpZiAocmF0aW8gPiBzaWNSYXRpbykgewogICAgICAgIHNjYWxlID0gc2ljLndpZHRoIC8gd2lkdGg7CiAgICAgICAgaCA9IHNpYy53aWR0aCAvIHJhdGlvOwogICAgICAgIHkgPSAoc2ljLmhlaWdodCAtIGgpIC8gMjsKICAgICAgfQoKICAgICAgcmV0dXJuIHsKICAgICAgICBzY2FsZTogc2NhbGUsCiAgICAgICAgLy8g6JKZ54mI55u45a+56ZyA5rGC5a696auY55qE57yp5pS+CiAgICAgICAgeDogeCwKICAgICAgICB5OiB5LAogICAgICAgIHdpZHRoOiB3LAogICAgICAgIGhlaWdodDogaAogICAgICB9OwogICAgfSwKICAgIC8vIOWOn+WbvumBrue9qeagt+W8jwogICAgc291cmNlSW1nU2hhZGVTdHlsZTogZnVuY3Rpb24gc291cmNlSW1nU2hhZGVTdHlsZSgpIHsKICAgICAgdmFyIHNvdXJjZUltZ01hc2tpbmcgPSB0aGlzLnNvdXJjZUltZ01hc2tpbmcsCiAgICAgICAgICBzb3VyY2VJbWdDb250YWluZXIgPSB0aGlzLnNvdXJjZUltZ0NvbnRhaW5lcjsKICAgICAgdmFyIHNpYyA9IHNvdXJjZUltZ0NvbnRhaW5lcjsKICAgICAgdmFyIHNpbSA9IHNvdXJjZUltZ01hc2tpbmc7CiAgICAgIHZhciB3ID0gc2ltLndpZHRoID09PSBzaWMud2lkdGggPyBzaW0ud2lkdGggOiAoc2ljLndpZHRoIC0gc2ltLndpZHRoKSAvIDI7CiAgICAgIHZhciBoID0gc2ltLmhlaWdodCA9PT0gc2ljLmhlaWdodCA/IHNpbS5oZWlnaHQgOiAoc2ljLmhlaWdodCAtIHNpbS5oZWlnaHQpIC8gMjsKICAgICAgcmV0dXJuIHsKICAgICAgICB3aWR0aDogdyArICdweCcsCiAgICAgICAgaGVpZ2h0OiBoICsgJ3B4JwogICAgICB9OwogICAgfSwKICAgIHByZXZpZXdTdHlsZTogZnVuY3Rpb24gcHJldmlld1N0eWxlKCkgewogICAgICB2YXIgcmF0aW8gPSB0aGlzLnJhdGlvLAogICAgICAgICAgcHJldmlld0NvbnRhaW5lciA9IHRoaXMucHJldmlld0NvbnRhaW5lcjsKICAgICAgdmFyIHBjID0gcHJldmlld0NvbnRhaW5lcjsKICAgICAgdmFyIHcgPSBwYy53aWR0aDsKICAgICAgdmFyIGggPSBwYy5oZWlnaHQ7CiAgICAgIHZhciBwY1JhdGlvID0gdyAvIGg7CgogICAgICBpZiAocmF0aW8gPCBwY1JhdGlvKSB7CiAgICAgICAgdyA9IHBjLmhlaWdodCAqIHJhdGlvOwogICAgICB9CgogICAgICBpZiAocmF0aW8gPiBwY1JhdGlvKSB7CiAgICAgICAgaCA9IHBjLndpZHRoIC8gcmF0aW87CiAgICAgIH0KCiAgICAgIHJldHVybiB7CiAgICAgICAgd2lkdGg6IHcgKyAncHgnLAogICAgICAgIGhlaWdodDogaCArICdweCcKICAgICAgfTsKICAgIH0KICB9LAogIHdhdGNoOiB7CiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUobmV3VmFsdWUpIHsKICAgICAgaWYgKG5ld1ZhbHVlICYmIHRoaXMubG9hZGluZyAhPT0gMSkgewogICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgfQogICAgfQogIH0sCiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHsKICAgIC8vIOe7keWumuaMiemUrmVzY+makOiXj+atpOaPkuS7tuS6i+S7tgogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLmNsb3NlSGFuZGxlcik7CiAgfSwKICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCgpIHsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5jbG9zZUhhbmRsZXIpOwogIH0sCiAgbWV0aG9kczogewogICAgLy8g54K55Ye75rOi57q55pWI5p6cCiAgICByaXBwbGU6IGZ1bmN0aW9uIHJpcHBsZShlKSB7CiAgICAgIGVmZmVjdFJpcHBsZShlKTsKICAgIH0sCiAgICAvLyDlhbPpl63mjqfku7YKICAgIG9mZjogZnVuY3Rpb24gb2ZmKCkgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgX3RoaXMuJGVtaXQoJ2lucHV0JywgZmFsc2UpOwoKICAgICAgICBfdGhpcy4kZW1pdCgnY2xvc2UnKTsKCiAgICAgICAgaWYgKF90aGlzLnN0ZXAgPT09IDMgJiYgX3RoaXMubG9hZGluZyA9PT0gMikgewogICAgICAgICAgX3RoaXMuc2V0U3RlcCgxKTsKICAgICAgICB9CiAgICAgIH0sIDIwMCk7CiAgICB9LAogICAgLy8g6K6+572u5q2l6aqkCiAgICBzZXRTdGVwOiBmdW5jdGlvbiBzZXRTdGVwKG5vKSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzOwoKICAgICAgLy8g5bu25pe25piv5Li65LqG5pi+56S65Yqo55S75pWI5p6c5ZGi77yM5ZOI5ZOI5ZOICiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIF90aGlzMi5zdGVwID0gbm87CiAgICAgIH0sIDIwMCk7CiAgICB9LAoKICAgIC8qIOWbvueJh+mAieaLqeWMuuWfn+WHveaVsOe7keWumgogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0sCiAgICBoYW5kbGVDbGljazogZnVuY3Rpb24gaGFuZGxlQ2xpY2soZSkgewogICAgICBpZiAodGhpcy5sb2FkaW5nICE9PSAxKSB7CiAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSB0aGlzLiRyZWZzLmZpbGVpbnB1dCkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0aGlzLiRyZWZzKSB7CiAgICAgICAgICAgIHRoaXMuJHJlZnMuZmlsZWlucHV0LmNsaWNrKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgaGFuZGxlQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICBpZiAodGhpcy5sb2FkaW5nICE9PSAxKSB7CiAgICAgICAgdmFyIGZpbGVzID0gZS50YXJnZXQuZmlsZXMgfHwgZS5kYXRhVHJhbnNmZXIuZmlsZXM7CiAgICAgICAgdGhpcy5yZXNldCgpOwoKICAgICAgICBpZiAodGhpcy5jaGVja0ZpbGUoZmlsZXNbMF0pKSB7CiAgICAgICAgICB0aGlzLnNldFNvdXJjZUltZyhmaWxlc1swXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAvLyDmo4DmtYvpgInmi6nnmoTmlofku7bmmK/lkKblkIjpgIIKICAgIGNoZWNrRmlsZTogZnVuY3Rpb24gY2hlY2tGaWxlKGZpbGUpIHsKICAgICAgdmFyIGxhbmcgPSB0aGlzLmxhbmcsCiAgICAgICAgICBtYXhTaXplID0gdGhpcy5tYXhTaXplOyAvLyDku4XpmZDlm77niYcKCiAgICAgIGlmIChmaWxlLnR5cGUuaW5kZXhPZignaW1hZ2UnKSA9PT0gLTEpIHsKICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICB0aGlzLmVycm9yTXNnID0gbGFuZy5lcnJvci5vbmx5SW1nOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSAvLyDotoXlh7rlpKflsI8KCgogICAgICBpZiAoZmlsZS5zaXplIC8gMTAyNCA+IG1heFNpemUpIHsKICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICB0aGlzLmVycm9yTXNnID0gbGFuZy5lcnJvci5vdXRPZlNpemUgKyBtYXhTaXplICsgJ2tiJzsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIHJldHVybiB0cnVlOwogICAgfSwKICAgIC8vIOmHjee9ruaOp+S7tgogICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkgewogICAgICB0aGlzLmxvYWRpbmcgPSAwOwogICAgICB0aGlzLmhhc0Vycm9yID0gZmFsc2U7CiAgICAgIHRoaXMuZXJyb3JNc2cgPSAnJzsKICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7CiAgICB9LAogICAgLy8g6K6+572u5Zu+54mH5rqQCiAgICBzZXRTb3VyY2VJbWc6IGZ1bmN0aW9uIHNldFNvdXJjZUltZyhmaWxlKSB7CiAgICAgIHZhciBfdGhpczMgPSB0aGlzOwoKICAgICAgdmFyIGZyID0gbmV3IEZpbGVSZWFkZXIoKTsKCiAgICAgIGZyLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgX3RoaXMzLnNvdXJjZUltZ1VybCA9IGZyLnJlc3VsdDsKCiAgICAgICAgX3RoaXMzLnN0YXJ0Q3JvcCgpOwogICAgICB9OwoKICAgICAgZnIucmVhZEFzRGF0YVVSTChmaWxlKTsKICAgIH0sCiAgICAvLyDliaroo4HliY3lh4blpIflt6XkvZwKICAgIHN0YXJ0Q3JvcDogZnVuY3Rpb24gc3RhcnRDcm9wKCkgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKCiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgsCiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodCwKICAgICAgICAgIHJhdGlvID0gdGhpcy5yYXRpbywKICAgICAgICAgIHNjYWxlID0gdGhpcy5zY2FsZSwKICAgICAgICAgIHNvdXJjZUltZ1VybCA9IHRoaXMuc291cmNlSW1nVXJsLAogICAgICAgICAgc291cmNlSW1nTWFza2luZyA9IHRoaXMuc291cmNlSW1nTWFza2luZywKICAgICAgICAgIGxhbmcgPSB0aGlzLmxhbmc7CiAgICAgIHZhciBzaW0gPSBzb3VyY2VJbWdNYXNraW5nOwogICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7CiAgICAgIGltZy5zcmMgPSBzb3VyY2VJbWdVcmw7CgogICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBuV2lkdGggPSBpbWcubmF0dXJhbFdpZHRoOwogICAgICAgIHZhciBuSGVpZ2h0ID0gaW1nLm5hdHVyYWxIZWlnaHQ7CiAgICAgICAgdmFyIG5SYXRpbyA9IG5XaWR0aCAvIG5IZWlnaHQ7CiAgICAgICAgdmFyIHcgPSBzaW0ud2lkdGg7CiAgICAgICAgdmFyIGggPSBzaW0uaGVpZ2h0OwogICAgICAgIHZhciB4ID0gMDsKICAgICAgICB2YXIgeSA9IDA7IC8vIOWbvueJh+WDj+e0oOS4jei+vuaghwoKICAgICAgICBpZiAobldpZHRoIDwgd2lkdGggfHwgbkhlaWdodCA8IGhlaWdodCkgewogICAgICAgICAgX3RoaXM0Lmhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgIF90aGlzNC5lcnJvck1zZyA9IGxhbmcuZXJyb3IubG93ZXN0UHggKyB3aWR0aCArICcqJyArIGhlaWdodDsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmIChyYXRpbyA+IG5SYXRpbykgewogICAgICAgICAgaCA9IHcgLyBuUmF0aW87CiAgICAgICAgICB5ID0gKHNpbS5oZWlnaHQgLSBoKSAvIDI7CiAgICAgICAgfQoKICAgICAgICBpZiAocmF0aW8gPCBuUmF0aW8pIHsKICAgICAgICAgIHcgPSBoICogblJhdGlvOwogICAgICAgICAgeCA9IChzaW0ud2lkdGggLSB3KSAvIDI7CiAgICAgICAgfQoKICAgICAgICBzY2FsZS5yYW5nZSA9IDA7CiAgICAgICAgc2NhbGUueCA9IHg7CiAgICAgICAgc2NhbGUueSA9IHk7CiAgICAgICAgc2NhbGUud2lkdGggPSB3OwogICAgICAgIHNjYWxlLmhlaWdodCA9IGg7CiAgICAgICAgc2NhbGUuZGVncmVlID0gMDsKICAgICAgICBzY2FsZS5taW5XaWR0aCA9IHc7CiAgICAgICAgc2NhbGUubWluSGVpZ2h0ID0gaDsKICAgICAgICBzY2FsZS5tYXhXaWR0aCA9IG5XaWR0aCAqIHNpbS5zY2FsZTsKICAgICAgICBzY2FsZS5tYXhIZWlnaHQgPSBuSGVpZ2h0ICogc2ltLnNjYWxlOwogICAgICAgIHNjYWxlLm5hdHVyYWxXaWR0aCA9IG5XaWR0aDsKICAgICAgICBzY2FsZS5uYXR1cmFsSGVpZ2h0ID0gbkhlaWdodDsKICAgICAgICBfdGhpczQuc291cmNlSW1nID0gaW1nOwoKICAgICAgICBfdGhpczQuY3JlYXRlSW1nKCk7CgogICAgICAgIF90aGlzNC5zZXRTdGVwKDIpOwogICAgICB9OwogICAgfSwKICAgIC8vIOm8oOagh+aMieS4i+WbvueJh+WHhuWkh+enu+WKqAogICAgaW1nU3RhcnRNb3ZlOiBmdW5jdGlvbiBpbWdTdGFydE1vdmUoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIOaUr+aMgeinpuaRuOS6i+S7tu+8jOWImem8oOagh+S6i+S7tuaXoOaViAoKICAgICAgaWYgKHRoaXMuaXNTdXBwb3J0VG91Y2ggJiYgIWUudGFyZ2V0VG91Y2hlcykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgdmFyIGV0ID0gZS50YXJnZXRUb3VjaGVzID8gZS50YXJnZXRUb3VjaGVzWzBdIDogZTsKICAgICAgdmFyIHNvdXJjZUltZ01vdXNlRG93biA9IHRoaXMuc291cmNlSW1nTW91c2VEb3duLAogICAgICAgICAgc2NhbGUgPSB0aGlzLnNjYWxlOwogICAgICB2YXIgc2ltZCA9IHNvdXJjZUltZ01vdXNlRG93bjsKICAgICAgc2ltZC5tWCA9IGV0LnNjcmVlblg7CiAgICAgIHNpbWQubVkgPSBldC5zY3JlZW5ZOwogICAgICBzaW1kLnggPSBzY2FsZS54OwogICAgICBzaW1kLnkgPSBzY2FsZS55OwogICAgICBzaW1kLm9uID0gdHJ1ZTsKICAgIH0sCiAgICAvLyDpvKDmoIfmjInkuIvnirbmgIHkuIvnp7vliqjvvIzlm77niYfnp7vliqgKICAgIGltZ01vdmU6IGZ1bmN0aW9uIGltZ01vdmUoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIOaUr+aMgeinpuaRuOS6i+S7tu+8jOWImem8oOagh+S6i+S7tuaXoOaViAoKICAgICAgaWYgKHRoaXMuaXNTdXBwb3J0VG91Y2ggJiYgIWUudGFyZ2V0VG91Y2hlcykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgdmFyIGV0ID0gZS50YXJnZXRUb3VjaGVzID8gZS50YXJnZXRUb3VjaGVzWzBdIDogZTsKICAgICAgdmFyIF90aGlzJHNvdXJjZUltZ01vdXNlRCA9IHRoaXMuc291cmNlSW1nTW91c2VEb3duLAogICAgICAgICAgb24gPSBfdGhpcyRzb3VyY2VJbWdNb3VzZUQub24sCiAgICAgICAgICBtWCA9IF90aGlzJHNvdXJjZUltZ01vdXNlRC5tWCwKICAgICAgICAgIG1ZID0gX3RoaXMkc291cmNlSW1nTW91c2VELm1ZLAogICAgICAgICAgeCA9IF90aGlzJHNvdXJjZUltZ01vdXNlRC54LAogICAgICAgICAgeSA9IF90aGlzJHNvdXJjZUltZ01vdXNlRC55LAogICAgICAgICAgc2NhbGUgPSB0aGlzLnNjYWxlLAogICAgICAgICAgc291cmNlSW1nTWFza2luZyA9IHRoaXMuc291cmNlSW1nTWFza2luZzsKICAgICAgdmFyIHNpbSA9IHNvdXJjZUltZ01hc2tpbmc7CiAgICAgIHZhciBuWCA9IGV0LnNjcmVlblg7CiAgICAgIHZhciBuWSA9IGV0LnNjcmVlblk7CiAgICAgIHZhciBkWCA9IG5YIC0gbVg7CiAgICAgIHZhciBkWSA9IG5ZIC0gbVk7CiAgICAgIHZhciByWCA9IHggKyBkWDsKICAgICAgdmFyIHJZID0geSArIGRZOwogICAgICBpZiAoIW9uKSByZXR1cm47CgogICAgICBpZiAoclggPiAwKSB7CiAgICAgICAgclggPSAwOwogICAgICB9CgogICAgICBpZiAoclkgPiAwKSB7CiAgICAgICAgclkgPSAwOwogICAgICB9CgogICAgICBpZiAoclggPCBzaW0ud2lkdGggLSBzY2FsZS53aWR0aCkgewogICAgICAgIHJYID0gc2ltLndpZHRoIC0gc2NhbGUud2lkdGg7CiAgICAgIH0KCiAgICAgIGlmIChyWSA8IHNpbS5oZWlnaHQgLSBzY2FsZS5oZWlnaHQpIHsKICAgICAgICByWSA9IHNpbS5oZWlnaHQgLSBzY2FsZS5oZWlnaHQ7CiAgICAgIH0KCiAgICAgIHNjYWxlLnggPSByWDsKICAgICAgc2NhbGUueSA9IHJZOwogICAgfSwKICAgIC8vIOaMiemSruaMieS4i+W8gOWni+WQkeWPs+aXi+i9rAogICAgc3RhcnRSb3RhdGVSaWdodDogZnVuY3Rpb24gc3RhcnRSb3RhdGVSaWdodChlKSB7CiAgICAgIHZhciBfdGhpczUgPSB0aGlzOwoKICAgICAgdmFyIHNjYWxlID0gdGhpcy5zY2FsZTsKICAgICAgc2NhbGUucm90YXRlUmlnaHQgPSB0cnVlOwoKICAgICAgdmFyIHJvdGF0ZSA9IGZ1bmN0aW9uIHJvdGF0ZSgpIHsKICAgICAgICBpZiAoc2NhbGUucm90YXRlUmlnaHQpIHsKICAgICAgICAgIHZhciBkZWdyZWUgPSArK3NjYWxlLmRlZ3JlZTsKCiAgICAgICAgICBfdGhpczUuY3JlYXRlSW1nKGRlZ3JlZSk7CgogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJvdGF0ZSgpOwogICAgICAgICAgfSwgNjApOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIHJvdGF0ZSgpOwogICAgfSwKICAgIC8vIOaMiemSruaMieS4i+W8gOWni+WQkeW3puaXi+i9rAogICAgc3RhcnRSb3RhdGVMZWZ0OiBmdW5jdGlvbiBzdGFydFJvdGF0ZUxlZnQoZSkgewogICAgICB2YXIgX3RoaXM2ID0gdGhpczsKCiAgICAgIHZhciBzY2FsZSA9IHRoaXMuc2NhbGU7CiAgICAgIHNjYWxlLnJvdGF0ZUxlZnQgPSB0cnVlOwoKICAgICAgdmFyIHJvdGF0ZSA9IGZ1bmN0aW9uIHJvdGF0ZSgpIHsKICAgICAgICBpZiAoc2NhbGUucm90YXRlTGVmdCkgewogICAgICAgICAgdmFyIGRlZ3JlZSA9IC0tc2NhbGUuZGVncmVlOwoKICAgICAgICAgIF90aGlzNi5jcmVhdGVJbWcoZGVncmVlKTsKCiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcm90YXRlKCk7CiAgICAgICAgICB9LCA2MCk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgcm90YXRlKCk7CiAgICB9LAogICAgLy8g5YGc5q2i5peL6L2sCiAgICBlbmRSb3RhdGU6IGZ1bmN0aW9uIGVuZFJvdGF0ZSgpIHsKICAgICAgdmFyIHNjYWxlID0gdGhpcy5zY2FsZTsKICAgICAgc2NhbGUucm90YXRlTGVmdCA9IGZhbHNlOwogICAgICBzY2FsZS5yb3RhdGVSaWdodCA9IGZhbHNlOwogICAgfSwKICAgIC8vIOaMiemSruaMieS4i+W8gOWni+aUvuWkpwogICAgc3RhcnRab29tQWRkOiBmdW5jdGlvbiBzdGFydFpvb21BZGQoZSkgewogICAgICB2YXIgX3RoaXM3ID0gdGhpczsKCiAgICAgIHZhciBzY2FsZSA9IHRoaXMuc2NhbGU7CiAgICAgIHNjYWxlLnpvb21BZGRPbiA9IHRydWU7CgogICAgICB2YXIgem9vbSA9IGZ1bmN0aW9uIHpvb20oKSB7CiAgICAgICAgaWYgKHNjYWxlLnpvb21BZGRPbikgewogICAgICAgICAgdmFyIHJhbmdlID0gc2NhbGUucmFuZ2UgPj0gMTAwID8gMTAwIDogKytzY2FsZS5yYW5nZTsKCiAgICAgICAgICBfdGhpczcuem9vbUltZyhyYW5nZSk7CgogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHpvb20oKTsKICAgICAgICAgIH0sIDYwKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICB6b29tKCk7CiAgICB9LAogICAgLy8g5oyJ6ZKu5p2+5byA5oiW56e75byA5Y+W5raI5pS+5aSnCiAgICBlbmRab29tQWRkOiBmdW5jdGlvbiBlbmRab29tQWRkKGUpIHsKICAgICAgdGhpcy5zY2FsZS56b29tQWRkT24gPSBmYWxzZTsKICAgIH0sCiAgICAvLyDmjInpkq7mjInkuIvlvIDlp4vnvKnlsI8KICAgIHN0YXJ0Wm9vbVN1YjogZnVuY3Rpb24gc3RhcnRab29tU3ViKGUpIHsKICAgICAgdmFyIF90aGlzOCA9IHRoaXM7CgogICAgICB2YXIgc2NhbGUgPSB0aGlzLnNjYWxlOwogICAgICBzY2FsZS56b29tU3ViT24gPSB0cnVlOwoKICAgICAgdmFyIHpvb20gPSBmdW5jdGlvbiB6b29tKCkgewogICAgICAgIGlmIChzY2FsZS56b29tU3ViT24pIHsKICAgICAgICAgIHZhciByYW5nZSA9IHNjYWxlLnJhbmdlIDw9IDAgPyAwIDogLS1zY2FsZS5yYW5nZTsKCiAgICAgICAgICBfdGhpczguem9vbUltZyhyYW5nZSk7CgogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHpvb20oKTsKICAgICAgICAgIH0sIDYwKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICB6b29tKCk7CiAgICB9LAogICAgLy8g5oyJ6ZKu5p2+5byA5oiW56e75byA5Y+W5raI57yp5bCPCiAgICBlbmRab29tU3ViOiBmdW5jdGlvbiBlbmRab29tU3ViKGUpIHsKICAgICAgdmFyIHNjYWxlID0gdGhpcy5zY2FsZTsKICAgICAgc2NhbGUuem9vbVN1Yk9uID0gZmFsc2U7CiAgICB9LAogICAgem9vbUNoYW5nZTogZnVuY3Rpb24gem9vbUNoYW5nZShlKSB7CiAgICAgIHRoaXMuem9vbUltZyhlLnRhcmdldC52YWx1ZSk7CiAgICB9LAogICAgLy8g57yp5pS+5Y6f5Zu+CiAgICB6b29tSW1nOiBmdW5jdGlvbiB6b29tSW1nKG5ld1JhbmdlKSB7CiAgICAgIHZhciBfdGhpczkgPSB0aGlzOwoKICAgICAgdmFyIHNvdXJjZUltZ01hc2tpbmcgPSB0aGlzLnNvdXJjZUltZ01hc2tpbmcsCiAgICAgICAgICBzY2FsZSA9IHRoaXMuc2NhbGU7CiAgICAgIHZhciBtYXhXaWR0aCA9IHNjYWxlLm1heFdpZHRoLAogICAgICAgICAgbWF4SGVpZ2h0ID0gc2NhbGUubWF4SGVpZ2h0LAogICAgICAgICAgbWluV2lkdGggPSBzY2FsZS5taW5XaWR0aCwKICAgICAgICAgIG1pbkhlaWdodCA9IHNjYWxlLm1pbkhlaWdodCwKICAgICAgICAgIHdpZHRoID0gc2NhbGUud2lkdGgsCiAgICAgICAgICBoZWlnaHQgPSBzY2FsZS5oZWlnaHQsCiAgICAgICAgICB4ID0gc2NhbGUueCwKICAgICAgICAgIHkgPSBzY2FsZS55OwogICAgICB2YXIgc2ltID0gc291cmNlSW1nTWFza2luZzsgLy8g6JKZ54mI5a696auYCgogICAgICB2YXIgc1dpZHRoID0gc2ltLndpZHRoOwogICAgICB2YXIgc0hlaWdodCA9IHNpbS5oZWlnaHQ7IC8vIOaWsOWuvemrmAoKICAgICAgdmFyIG5XaWR0aCA9IG1pbldpZHRoICsgKG1heFdpZHRoIC0gbWluV2lkdGgpICogbmV3UmFuZ2UgLyAxMDA7CiAgICAgIHZhciBuSGVpZ2h0ID0gbWluSGVpZ2h0ICsgKG1heEhlaWdodCAtIG1pbkhlaWdodCkgKiBuZXdSYW5nZSAvIDEwMDsgLy8g5paw5Z2Q5qCH77yI5qC55o2u6JKZ54mI5Lit5b+D54K557yp5pS+77yJCgogICAgICB2YXIgblggPSBzV2lkdGggLyAyIC0gbldpZHRoIC8gd2lkdGggKiAoc1dpZHRoIC8gMiAtIHgpOwogICAgICB2YXIgblkgPSBzSGVpZ2h0IC8gMiAtIG5IZWlnaHQgLyBoZWlnaHQgKiAoc0hlaWdodCAvIDIgLSB5KTsgLy8g5Yik5pat5paw5Z2Q5qCH5piv5ZCm6LaF6L+H6JKZ54mI6ZmQ5Yi2CgogICAgICBpZiAoblggPiAwKSB7CiAgICAgICAgblggPSAwOwogICAgICB9CgogICAgICBpZiAoblkgPiAwKSB7CiAgICAgICAgblkgPSAwOwogICAgICB9CgogICAgICBpZiAoblggPCBzV2lkdGggLSBuV2lkdGgpIHsKICAgICAgICBuWCA9IHNXaWR0aCAtIG5XaWR0aDsKICAgICAgfQoKICAgICAgaWYgKG5ZIDwgc0hlaWdodCAtIG5IZWlnaHQpIHsKICAgICAgICBuWSA9IHNIZWlnaHQgLSBuSGVpZ2h0OwogICAgICB9IC8vIOi1i+WAvOWkhOeQhgoKCiAgICAgIHNjYWxlLnggPSBuWDsKICAgICAgc2NhbGUueSA9IG5ZOwogICAgICBzY2FsZS53aWR0aCA9IG5XaWR0aDsKICAgICAgc2NhbGUuaGVpZ2h0ID0gbkhlaWdodDsKICAgICAgc2NhbGUucmFuZ2UgPSBuZXdSYW5nZTsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHNjYWxlLnJhbmdlID09PSBuZXdSYW5nZSkgewogICAgICAgICAgX3RoaXM5LmNyZWF0ZUltZygpOwogICAgICAgIH0KICAgICAgfSwgMzAwKTsKICAgIH0sCiAgICAvLyDnlJ/miJDpnIDmsYLlm77niYcKICAgIGNyZWF0ZUltZzogZnVuY3Rpb24gY3JlYXRlSW1nKGUpIHsKICAgICAgdmFyIG1pbWUgPSB0aGlzLm1pbWUsCiAgICAgICAgICBzb3VyY2VJbWcgPSB0aGlzLnNvdXJjZUltZywKICAgICAgICAgIF90aGlzJHNjYWxlID0gdGhpcy5zY2FsZSwKICAgICAgICAgIHggPSBfdGhpcyRzY2FsZS54LAogICAgICAgICAgeSA9IF90aGlzJHNjYWxlLnksCiAgICAgICAgICB3aWR0aCA9IF90aGlzJHNjYWxlLndpZHRoLAogICAgICAgICAgaGVpZ2h0ID0gX3RoaXMkc2NhbGUuaGVpZ2h0LAogICAgICAgICAgZGVncmVlID0gX3RoaXMkc2NhbGUuZGVncmVlLAogICAgICAgICAgc2NhbGUgPSB0aGlzLnNvdXJjZUltZ01hc2tpbmcuc2NhbGU7CiAgICAgIHZhciBjYW52YXMgPSB0aGlzLiRyZWZzLmNhbnZhczsKICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOwoKICAgICAgaWYgKGUpIHsKICAgICAgICAvLyDlj5bmtojpvKDmoIfmjInkuIvnp7vliqjnirbmgIEKICAgICAgICB0aGlzLnNvdXJjZUltZ01vdXNlRG93bi5vbiA9IGZhbHNlOwogICAgICB9CgogICAgICBjYW52YXMud2lkdGggPSB0aGlzLndpZHRoOwogICAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpOyAvLyDlsIbpgI/mmI7ljLrln5/orr7nva7kuLrnmb3oibLlupXovrkKCiAgICAgIGN0eC5maWxsU3R5bGUgPSAnI2ZmZic7CiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7CiAgICAgIGN0eC50cmFuc2xhdGUodGhpcy53aWR0aCAqIDAuNSwgdGhpcy5oZWlnaHQgKiAwLjUpOwogICAgICBjdHgucm90YXRlKE1hdGguUEkgKiBkZWdyZWUgLyAxODApOwogICAgICBjdHgudHJhbnNsYXRlKC10aGlzLndpZHRoICogMC41LCAtdGhpcy5oZWlnaHQgKiAwLjUpOwogICAgICBjdHguZHJhd0ltYWdlKHNvdXJjZUltZywgeCAvIHNjYWxlLCB5IC8gc2NhbGUsIHdpZHRoIC8gc2NhbGUsIGhlaWdodCAvIHNjYWxlKTsKICAgICAgdGhpcy5jcmVhdGVJbWdVcmwgPSBjYW52YXMudG9EYXRhVVJMKG1pbWUpOwogICAgfSwKICAgIHByZXBhcmVVcGxvYWQ6IGZ1bmN0aW9uIHByZXBhcmVVcGxvYWQoKSB7CiAgICAgIHZhciB1cmwgPSB0aGlzLnVybCwKICAgICAgICAgIGNyZWF0ZUltZ1VybCA9IHRoaXMuY3JlYXRlSW1nVXJsLAogICAgICAgICAgZmllbGQgPSB0aGlzLmZpZWxkLAogICAgICAgICAga2kgPSB0aGlzLmtpOwogICAgICB0aGlzLiRlbWl0KCdjcm9wLXN1Y2Nlc3MnLCBjcmVhdGVJbWdVcmwsIGZpZWxkLCBraSk7CgogICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsKSB7CiAgICAgICAgdGhpcy51cGxvYWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLm9mZigpOwogICAgICB9CiAgICB9LAogICAgLy8g5LiK5Lyg5Zu+54mHCiAgICB1cGxvYWQ6IGZ1bmN0aW9uIHVwbG9hZCgpIHsKICAgICAgdmFyIF90aGlzMTAgPSB0aGlzOwoKICAgICAgdmFyIGxhbmcgPSB0aGlzLmxhbmcsCiAgICAgICAgICBpbWdGb3JtYXQgPSB0aGlzLmltZ0Zvcm1hdCwKICAgICAgICAgIG1pbWUgPSB0aGlzLm1pbWUsCiAgICAgICAgICB1cmwgPSB0aGlzLnVybCwKICAgICAgICAgIHBhcmFtcyA9IHRoaXMucGFyYW1zLAogICAgICAgICAgZmllbGQgPSB0aGlzLmZpZWxkLAogICAgICAgICAga2kgPSB0aGlzLmtpLAogICAgICAgICAgY3JlYXRlSW1nVXJsID0gdGhpcy5jcmVhdGVJbWdVcmw7CiAgICAgIHZhciBmbURhdGEgPSBuZXcgRm9ybURhdGEoKTsKICAgICAgZm1EYXRhLmFwcGVuZChmaWVsZCwgZGF0YTJibG9iKGNyZWF0ZUltZ1VybCwgbWltZSksIGZpZWxkICsgJy4nICsgaW1nRm9ybWF0KTsgLy8g5re75Yqg5YW25LuW5Y+C5pWwCgogICAgICBpZiAoX3R5cGVvZihwYXJhbXMpID09PSAnb2JqZWN0JyAmJiBwYXJhbXMpIHsKICAgICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgIGZtRGF0YS5hcHBlbmQoaywgcGFyYW1zW2tdKTsKICAgICAgICB9KTsKICAgICAgfSAvLyDnm5HlkKzov5vluqblm57osIMKICAgICAgLy8gY29uc3QgdXBsb2FkUHJvZ3Jlc3MgPSAoZXZlbnQpID0+IHsKICAgICAgLy8gICBpZiAoZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSkgewogICAgICAvLyAgICAgdGhpcy5wcm9ncmVzcyA9IDEwMCAqIE1hdGgucm91bmQoZXZlbnQubG9hZGVkKSAvIGV2ZW50LnRvdGFsCiAgICAgIC8vICAgfQogICAgICAvLyB9CiAgICAgIC8vIOS4iuS8oOaWh+S7tgoKCiAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgdGhpcy5sb2FkaW5nID0gMTsKICAgICAgdGhpcy5zZXRTdGVwKDMpOwogICAgICByZXF1ZXN0KHsKICAgICAgICB1cmw6IHVybCwKICAgICAgICBtZXRob2Q6ICdwb3N0JywKICAgICAgICBkYXRhOiBmbURhdGEKICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzRGF0YSkgewogICAgICAgIF90aGlzMTAubG9hZGluZyA9IDI7CgogICAgICAgIF90aGlzMTAuJGVtaXQoJ2Nyb3AtdXBsb2FkLXN1Y2Nlc3MnLCByZXNEYXRhLmRhdGEpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgaWYgKF90aGlzMTAudmFsdWUpIHsKICAgICAgICAgIF90aGlzMTAubG9hZGluZyA9IDM7CiAgICAgICAgICBfdGhpczEwLmhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgIF90aGlzMTAuZXJyb3JNc2cgPSBsYW5nLmZhaWw7CgogICAgICAgICAgX3RoaXMxMC4kZW1pdCgnY3JvcC11cGxvYWQtZmFpbCcsIGVyciwgZmllbGQsIGtpKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwKICAgIGNsb3NlSGFuZGxlcjogZnVuY3Rpb24gY2xvc2VIYW5kbGVyKGUpIHsKICAgICAgaWYgKHRoaXMudmFsdWUgJiYgKGUua2V5ID09PSAnRXNjYXBlJyB8fCBlLmtleUNvZGUgPT09IDI3KSkgewogICAgICAgIHRoaXMub2ZmKCk7CiAgICAgIH0KICAgIH0KICB9Cn07"},{"version":3,"mappings":"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QACA;QACA;QACA;QACA;QACA;QACA;QACA,UAPA,CAQA;;QACA;UACA;UACA;UACA;QACA;;QACA;UACA1B;UACAxB;QACA;;QACA;UACAuB;UACAxB;QACA;;QACAI;QACAA;QACAA;QACAA;QACAA;QACAA;QACAA;QACAA;QACAA;QACAA;QACAA;QACAA;QACA;;QACA;;QACA;MACA,CArCA;IAsCA,CAtIA;IAuIA;IACAgD,YAxIA,wBAwIAhB,CAxIA,EAwIA;MACAA,mBADA,CAEA;;MACA;QACA;MACA;;MACA;MACA;MAAA;MACA;MACAiB;MACAA;MACAA;MACAA;MACAA;IACA,CAtJA;IAuJA;IACAC,OAxJA,mBAwJAlB,CAxJA,EAwJA;MACAA,mBADA,CAEA;;MACA;QACA;MACA;;MACA;MACA,4BAIA,IAJA,CACAxC,kBADA;MAAA,IACAC,EADA,yBACAA,EADA;MAAA,IACAC,EADA,yBACAA,EADA;MAAA,IACAC,EADA,yBACAA,EADA;MAAA,IACAC,CADA,yBACAA,CADA;MAAA,IACAC,CADA,yBACAA,CADA;MAAA,IAEAG,KAFA,GAIA,IAJA,CAEAA,KAFA;MAAA,IAGAmB,gBAHA,GAIA,IAJA,CAGAA,gBAHA;MAKA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;MACA;QACAgC;MACA;;MACA;QACAC;MACA;;MACA;QACAD;MACA;;MACA;QACAC;MACA;;MACApD;MACAA;IACA,CA1LA;IA2LA;IACAqD,gBA5LA,4BA4LArB,CA5LA,EA4LA;MAAA;;MACA;MACAhC;;MACA;QACA;UACA;;UACA;;UACAmC;YACAmB;UACA,CAFA,EAEA,EAFA;QAGA;MACA,CARA;;MASAA;IACA,CAzMA;IA0MA;IACAC,eA3MA,2BA2MAvB,CA3MA,EA2MA;MAAA;;MACA;MACAhC;;MACA;QACA;UACA;;UACA;;UACAmC;YACAmB;UACA,CAFA,EAEA,EAFA;QAGA;MACA,CARA;;MASAA;IACA,CAxNA;IAyNA;IACAE,SA1NA,uBA0NA;MACA;MACAxD;MACAA;IACA,CA9NA;IA+NA;IACAyD,YAhOA,wBA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","names":["props","field","type","default","ki","value","url","params","headers","width","height","noRotate","noCircle","noSquare","maxSize","langType","langExt","imgFormat","withCredentials","data","allowImgFormat","Object","isSupported","mime","lang","isSupportTouch","step","loading","progress","hasError","errorMsg","ratio","sourceImg","sourceImgUrl","createImgUrl","sourceImgMouseDown","on","mX","mY","x","y","previewContainer","sourceImgContainer","scale","zoomAddOn","zoomSubOn","range","rotateLeft","rotateRight","degree","maxWidth","maxHeight","minWidth","minHeight","naturalWidth","naturalHeight","computed","progressStyle","sourceImgStyle","top","left","transform","sourceImgMasking","w","h","sourceImgShadeStyle","sim","previewStyle","watch","newValue","created","document","destroyed","methods","ripple","e","effectRipple","off","setTimeout","setStep","no","preventDefault","handleClick","handleChange","checkFile","file","reset","setSourceImg","fr","startCrop","img","imgStartMove","simd","imgMove","rX","rY","startRotateRight","rotate","startRotateLeft","endRotate","startZoomAdd","zoom","endZoomAdd","startZoomSub","endZoomSub","zoomChange","zoomImg","newRange","nX","nY","createImg","canvas","ctx","prepareUpload","upload","fmData","data2blob","request","method","then","catch","closeHandler"],"sourceRoot":"src/components/ImageCropper","sources":["index.vue"],"sourcesContent":["<template>\n  <div v-show=\"value\" class=\"vue-image-crop-upload\">\n    <div class=\"vicp-wrap\">\n      <div class=\"vicp-close\" @click=\"off\">\n        <i class=\"vicp-icon4\" />\n      </div>\n\n      <div v-show=\"step == 1\" class=\"vicp-step1\">\n        <div\n          class=\"vicp-drop-area\"\n          @dragleave=\"preventDefault\"\n          @dragover=\"preventDefault\"\n          @dragenter=\"preventDefault\"\n          @click=\"handleClick\"\n          @drop=\"handleChange\"\n        >\n          <i v-show=\"loading != 1\" class=\"vicp-icon1\">\n            <i class=\"vicp-icon1-arrow\" />\n            <i class=\"vicp-icon1-body\" />\n            <i class=\"vicp-icon1-bottom\" />\n          </i>\n          <span v-show=\"loading !== 1\" class=\"vicp-hint\">{{ lang.hint }}</span>\n          <span v-show=\"!isSupported\" class=\"vicp-no-supported-hint\">{{ lang.noSupported }}</span>\n          <input v-show=\"false\" v-if=\"step == 1\" ref=\"fileinput\" type=\"file\" @change=\"handleChange\">\n        </div>\n        <div v-show=\"hasError\" class=\"vicp-error\">\n          <i class=\"vicp-icon2\" />\n          {{ errorMsg }}\n        </div>\n        <div class=\"vicp-operate\">\n          <a @click=\"off\" @mousedown=\"ripple\">{{ lang.btn.off }}</a>\n        </div>\n      </div>\n\n      <div v-if=\"step == 2\" class=\"vicp-step2\">\n        <div class=\"vicp-crop\">\n          <div v-show=\"true\" class=\"vicp-crop-left\">\n            <div class=\"vicp-img-container\">\n              <img\n                ref=\"img\"\n                :src=\"sourceImgUrl\"\n                :style=\"sourceImgStyle\"\n                class=\"vicp-img\"\n                draggable=\"false\"\n                @drag=\"preventDefault\"\n                @dragstart=\"preventDefault\"\n                @dragend=\"preventDefault\"\n                @dragleave=\"preventDefault\"\n                @dragover=\"preventDefault\"\n                @dragenter=\"preventDefault\"\n                @drop=\"preventDefault\"\n                @touchstart=\"imgStartMove\"\n                @touchmove=\"imgMove\"\n                @touchend=\"createImg\"\n                @touchcancel=\"createImg\"\n                @mousedown=\"imgStartMove\"\n                @mousemove=\"imgMove\"\n                @mouseup=\"createImg\"\n                @mouseout=\"createImg\"\n              >\n              <div :style=\"sourceImgShadeStyle\" class=\"vicp-img-shade vicp-img-shade-1\" />\n              <div :style=\"sourceImgShadeStyle\" class=\"vicp-img-shade vicp-img-shade-2\" />\n            </div>\n\n            <div class=\"vicp-range\">\n              <input\n                :value=\"scale.range\"\n                type=\"range\"\n                step=\"1\"\n                min=\"0\"\n                max=\"100\"\n                @input=\"zoomChange\"\n              >\n              <i\n                class=\"vicp-icon5\"\n                @mousedown=\"startZoomSub\"\n                @mouseout=\"endZoomSub\"\n                @mouseup=\"endZoomSub\"\n              />\n              <i\n                class=\"vicp-icon6\"\n                @mousedown=\"startZoomAdd\"\n                @mouseout=\"endZoomAdd\"\n                @mouseup=\"endZoomAdd\"\n              />\n            </div>\n\n            <div v-if=\"!noRotate\" class=\"vicp-rotate\">\n              <i @mousedown=\"startRotateLeft\" @mouseout=\"endRotate\" @mouseup=\"endRotate\">↺</i>\n              <i @mousedown=\"startRotateRight\" @mouseout=\"endRotate\" @mouseup=\"endRotate\">↻</i>\n            </div>\n          </div>\n          <div v-show=\"true\" class=\"vicp-crop-right\">\n            <div class=\"vicp-preview\">\n              <div v-if=\"!noSquare\" class=\"vicp-preview-item\">\n                <img :src=\"createImgUrl\" :style=\"previewStyle\">\n                <span>{{ lang.preview }}</span>\n              </div>\n              <div v-if=\"!noCircle\" class=\"vicp-preview-item vicp-preview-item-circle\">\n                <img :src=\"createImgUrl\" :style=\"previewStyle\">\n                <span>{{ lang.preview }}</span>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"vicp-operate\">\n          <a @click=\"setStep(1)\" @mousedown=\"ripple\">{{ lang.btn.back }}</a>\n          <a class=\"vicp-operate-btn\" @click=\"prepareUpload\" @mousedown=\"ripple\">{{ lang.btn.save }}</a>\n        </div>\n      </div>\n\n      <div v-if=\"step == 3\" class=\"vicp-step3\">\n        <div class=\"vicp-upload\">\n          <span v-show=\"loading === 1\" class=\"vicp-loading\">{{ lang.loading }}</span>\n          <div class=\"vicp-progress-wrap\">\n            <span v-show=\"loading === 1\" :style=\"progressStyle\" class=\"vicp-progress\" />\n          </div>\n          <div v-show=\"hasError\" class=\"vicp-error\">\n            <i class=\"vicp-icon2\" />\n            {{ errorMsg }}\n          </div>\n          <div v-show=\"loading === 2\" class=\"vicp-success\">\n            <i class=\"vicp-icon3\" />\n            {{ lang.success }}\n          </div>\n        </div>\n        <div class=\"vicp-operate\">\n          <a @click=\"setStep(2)\" @mousedown=\"ripple\">{{ lang.btn.back }}</a>\n          <a @click=\"off\" @mousedown=\"ripple\">{{ lang.btn.close }}</a>\n        </div>\n      </div>\n      <canvas v-show=\"false\" ref=\"canvas\" :width=\"width\" :height=\"height\" />\n    </div>\n  </div>\n</template>\n\n<script>\n'use strict'\nimport request from '@/utils/request'\nimport language from './utils/language.js'\nimport mimes from './utils/mimes.js'\nimport data2blob from './utils/data2blob.js'\nimport effectRipple from './utils/effectRipple.js'\nexport default {\n  props: {\n    // 域,上传文件name,触发事件会带上(如果一个页面多个图片上传控件,可以做区分\n    field: {\n      type: String,\n      default: 'avatar'\n    },\n    // 原名key,类似于id,触发事件会带上(如果一个页面多个图片上传控件,可以做区分\n    ki: {\n      type: Number,\n      default: 0\n    },\n    // 显示该控件与否\n    value: {\n      type: Boolean,\n      default: true\n    },\n    // 上传地址\n    url: {\n      type: String,\n      default: ''\n    },\n    // 其他要上传文件附带的数据,对象格式\n    params: {\n      type: Object,\n      default: null\n    },\n    // Add custom headers\n    headers: {\n      type: Object,\n      default: null\n    },\n    // 剪裁图片的宽\n    width: {\n      type: Number,\n      default: 200\n    },\n    // 剪裁图片的高\n    height: {\n      type: Number,\n      default: 200\n    },\n    // 不显示旋转功能\n    noRotate: {\n      type: Boolean,\n      default: true\n    },\n    // 不预览圆形图片\n    noCircle: {\n      type: Boolean,\n      default: false\n    },\n    // 不预览方形图片\n    noSquare: {\n      type: Boolean,\n      default: false\n    },\n    // 单文件大小限制\n    maxSize: {\n      type: Number,\n      default: 10240\n    },\n    // 语言类型\n    langType: {\n      type: String,\n      default: 'zh'\n    },\n    // 语言包\n    langExt: {\n      type: Object,\n      default: null\n    },\n    // 图片上传格式\n    imgFormat: {\n      type: String,\n      default: 'png'\n    },\n    // 是否支持跨域\n    withCredentials: {\n      type: Boolean,\n      default: false\n    }\n  },\n  data() {\n    const { imgFormat, langType, langExt, width, height } = this\n    let isSupported = true\n    const allowImgFormat = ['jpg', 'png']\n    const tempImgFormat =\n      allowImgFormat.indexOf(imgFormat) === -1 ? 'jpg' : imgFormat\n    const lang = language[langType] ? language[langType] : language['en']\n    const mime = mimes[tempImgFormat]\n    // 规范图片格式\n    this.imgFormat = tempImgFormat\n    if (langExt) {\n      Object.assign(lang, langExt)\n    }\n    if (typeof FormData !== 'function') {\n      isSupported = false\n    }\n    return {\n      // 图片的mime\n      mime,\n      // 语言包\n      lang,\n      // 浏览器是否支持该控件\n      isSupported,\n      // 浏览器是否支持触屏事件\n      // eslint-disable-next-line no-prototype-builtins\n      isSupportTouch: document.hasOwnProperty('ontouchstart'),\n      // 步骤\n      step: 1, // 1选择文件 2剪裁 3上传\n      // 上传状态及进度\n      loading: 0, // 0未开始 1正在 2成功 3错误\n      progress: 0,\n      // 是否有错误及错误信息\n      hasError: false,\n      errorMsg: '',\n      // 需求图宽高比\n      ratio: width / height,\n      // 原图地址、生成图片地址\n      sourceImg: null,\n      sourceImgUrl: '',\n      createImgUrl: '',\n      // 原图片拖动事件初始值\n      sourceImgMouseDown: {\n        on: false,\n        mX: 0, // 鼠标按下的坐标\n        mY: 0,\n        x: 0, // scale原图坐标\n        y: 0\n      },\n      // 生成图片预览的容器大小\n      previewContainer: {\n        width: 100,\n        height: 100\n      },\n      // 原图容器宽高\n      sourceImgContainer: {\n        // sic\n        width: 240,\n        height: 184 // 如果生成图比例与此一致会出现bug,先改成特殊的格式吧,哈哈哈\n      },\n      // 原图展示属性\n      scale: {\n        zoomAddOn: false, // 按钮缩放事件开启\n        zoomSubOn: false, // 按钮缩放事件开启\n        range: 1, // 最大100\n        rotateLeft: false, // 按钮向左旋转事件开启\n        rotateRight: false, // 按钮向右旋转事件开启\n        degree: 0, // 旋转度数\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n        maxWidth: 0,\n        maxHeight: 0,\n        minWidth: 0, // 最宽\n        minHeight: 0,\n        naturalWidth: 0, // 原宽\n        naturalHeight: 0\n      }\n    }\n  },\n  computed: {\n    // 进度条样式\n    progressStyle() {\n      const { progress } = this\n      return {\n        width: progress + '%'\n      }\n    },\n    // 原图样式\n    sourceImgStyle() {\n      const { scale, sourceImgMasking } = this\n      const top = scale.y + sourceImgMasking.y + 'px'\n      const left = scale.x + sourceImgMasking.x + 'px'\n      return {\n        top,\n        left,\n        width: scale.width + 'px',\n        height: scale.height + 'px',\n        transform: 'rotate(' + scale.degree + 'deg)', // 旋转时 左侧原始图旋转样式\n        '-ms-transform': 'rotate(' + scale.degree + 'deg)', // 兼容IE9\n        '-moz-transform': 'rotate(' + scale.degree + 'deg)', // 兼容FireFox\n        '-webkit-transform': 'rotate(' + scale.degree + 'deg)', // 兼容Safari 和 chrome\n        '-o-transform': 'rotate(' + scale.degree + 'deg)' // 兼容 Opera\n      }\n    },\n    // 原图蒙版属性\n    sourceImgMasking() {\n      const { width, height, ratio, sourceImgContainer } = this\n      const sic = sourceImgContainer\n      const sicRatio = sic.width / sic.height // 原图容器宽高比\n      let x = 0\n      let y = 0\n      let w = sic.width\n      let h = sic.height\n      let scale = 1\n      if (ratio < sicRatio) {\n        scale = sic.height / height\n        w = sic.height * ratio\n        x = (sic.width - w) / 2\n      }\n      if (ratio > sicRatio) {\n        scale = sic.width / width\n        h = sic.width / ratio\n        y = (sic.height - h) / 2\n      }\n      return {\n        scale, // 蒙版相对需求宽高的缩放\n        x,\n        y,\n        width: w,\n        height: h\n      }\n    },\n    // 原图遮罩样式\n    sourceImgShadeStyle() {\n      const { sourceImgMasking, sourceImgContainer } = this\n      const sic = sourceImgContainer\n      const sim = sourceImgMasking\n      const w =\n        sim.width === sic.width ? sim.width : (sic.width - sim.width) / 2\n      const h =\n        sim.height === sic.height ? sim.height : (sic.height - sim.height) / 2\n      return {\n        width: w + 'px',\n        height: h + 'px'\n      }\n    },\n    previewStyle() {\n      const { ratio, previewContainer } = this\n      const pc = previewContainer\n      let w = pc.width\n      let h = pc.height\n      const pcRatio = w / h\n      if (ratio < pcRatio) {\n        w = pc.height * ratio\n      }\n      if (ratio > pcRatio) {\n        h = pc.width / ratio\n      }\n      return {\n        width: w + 'px',\n        height: h + 'px'\n      }\n    }\n  },\n  watch: {\n    value(newValue) {\n      if (newValue && this.loading !== 1) {\n        this.reset()\n      }\n    }\n  },\n  created() {\n    // 绑定按键esc隐藏此插件事件\n    document.addEventListener('keyup', this.closeHandler)\n  },\n  destroyed() {\n    document.removeEventListener('keyup', this.closeHandler)\n  },\n  methods: {\n    // 点击波纹效果\n    ripple(e) {\n      effectRipple(e)\n    },\n    // 关闭控件\n    off() {\n      setTimeout(() => {\n        this.$emit('input', false)\n        this.$emit('close')\n        if (this.step === 3 && this.loading === 2) {\n          this.setStep(1)\n        }\n      }, 200)\n    },\n    // 设置步骤\n    setStep(no) {\n      // 延时是为了显示动画效果呢,哈哈哈\n      setTimeout(() => {\n        this.step = no\n      }, 200)\n    },\n    /* 图片选择区域函数绑定\n     ---------------------------------------------------------------*/\n    preventDefault(e) {\n      e.preventDefault()\n      return false\n    },\n    handleClick(e) {\n      if (this.loading !== 1) {\n        if (e.target !== this.$refs.fileinput) {\n          e.preventDefault()\n          if (document.activeElement !== this.$refs) {\n            this.$refs.fileinput.click()\n          }\n        }\n      }\n    },\n    handleChange(e) {\n      e.preventDefault()\n      if (this.loading !== 1) {\n        const files = e.target.files || e.dataTransfer.files\n        this.reset()\n        if (this.checkFile(files[0])) {\n          this.setSourceImg(files[0])\n        }\n      }\n    },\n    /* ---------------------------------------------------------------*/\n    // 检测选择的文件是否合适\n    checkFile(file) {\n      const { lang, maxSize } = this\n      // 仅限图片\n      if (file.type.indexOf('image') === -1) {\n        this.hasError = true\n        this.errorMsg = lang.error.onlyImg\n        return false\n      }\n      // 超出大小\n      if (file.size / 1024 > maxSize) {\n        this.hasError = true\n        this.errorMsg = lang.error.outOfSize + maxSize + 'kb'\n        return false\n      }\n      return true\n    },\n    // 重置控件\n    reset() {\n      this.loading = 0\n      this.hasError = false\n      this.errorMsg = ''\n      this.progress = 0\n    },\n    // 设置图片源\n    setSourceImg(file) {\n      const fr = new FileReader()\n      fr.onload = e => {\n        this.sourceImgUrl = fr.result\n        this.startCrop()\n      }\n      fr.readAsDataURL(file)\n    },\n    // 剪裁前准备工作\n    startCrop() {\n      const {\n        width,\n        height,\n        ratio,\n        scale,\n        sourceImgUrl,\n        sourceImgMasking,\n        lang\n      } = this\n      const sim = sourceImgMasking\n      const img = new Image()\n      img.src = sourceImgUrl\n      img.onload = () => {\n        const nWidth = img.naturalWidth\n        const nHeight = img.naturalHeight\n        const nRatio = nWidth / nHeight\n        let w = sim.width\n        let h = sim.height\n        let x = 0\n        let y = 0\n        // 图片像素不达标\n        if (nWidth < width || nHeight < height) {\n          this.hasError = true\n          this.errorMsg = lang.error.lowestPx + width + '*' + height\n          return false\n        }\n        if (ratio > nRatio) {\n          h = w / nRatio\n          y = (sim.height - h) / 2\n        }\n        if (ratio < nRatio) {\n          w = h * nRatio\n          x = (sim.width - w) / 2\n        }\n        scale.range = 0\n        scale.x = x\n        scale.y = y\n        scale.width = w\n        scale.height = h\n        scale.degree = 0\n        scale.minWidth = w\n        scale.minHeight = h\n        scale.maxWidth = nWidth * sim.scale\n        scale.maxHeight = nHeight * sim.scale\n        scale.naturalWidth = nWidth\n        scale.naturalHeight = nHeight\n        this.sourceImg = img\n        this.createImg()\n        this.setStep(2)\n      }\n    },\n    // 鼠标按下图片准备移动\n    imgStartMove(e) {\n      e.preventDefault()\n      // 支持触摸事件,则鼠标事件无效\n      if (this.isSupportTouch && !e.targetTouches) {\n        return false\n      }\n      const et = e.targetTouches ? e.targetTouches[0] : e\n      const { sourceImgMouseDown, scale } = this\n      const simd = sourceImgMouseDown\n      simd.mX = et.screenX\n      simd.mY = et.screenY\n      simd.x = scale.x\n      simd.y = scale.y\n      simd.on = true\n    },\n    // 鼠标按下状态下移动,图片移动\n    imgMove(e) {\n      e.preventDefault()\n      // 支持触摸事件,则鼠标事件无效\n      if (this.isSupportTouch && !e.targetTouches) {\n        return false\n      }\n      const et = e.targetTouches ? e.targetTouches[0] : e\n      const {\n        sourceImgMouseDown: { on, mX, mY, x, y },\n        scale,\n        sourceImgMasking\n      } = this\n      const sim = sourceImgMasking\n      const nX = et.screenX\n      const nY = et.screenY\n      const dX = nX - mX\n      const dY = nY - mY\n      let rX = x + dX\n      let rY = y + dY\n      if (!on) return\n      if (rX > 0) {\n        rX = 0\n      }\n      if (rY > 0) {\n        rY = 0\n      }\n      if (rX < sim.width - scale.width) {\n        rX = sim.width - scale.width\n      }\n      if (rY < sim.height - scale.height) {\n        rY = sim.height - scale.height\n      }\n      scale.x = rX\n      scale.y = rY\n    },\n    // 按钮按下开始向右旋转\n    startRotateRight(e) {\n      const { scale } = this\n      scale.rotateRight = true\n      const rotate = () => {\n        if (scale.rotateRight) {\n          const degree = ++scale.degree\n          this.createImg(degree)\n          setTimeout(function() {\n            rotate()\n          }, 60)\n        }\n      }\n      rotate()\n    },\n    // 按钮按下开始向左旋转\n    startRotateLeft(e) {\n      const { scale } = this\n      scale.rotateLeft = true\n      const rotate = () => {\n        if (scale.rotateLeft) {\n          const degree = --scale.degree\n          this.createImg(degree)\n          setTimeout(function() {\n            rotate()\n          }, 60)\n        }\n      }\n      rotate()\n    },\n    // 停止旋转\n    endRotate() {\n      const { scale } = this\n      scale.rotateLeft = false\n      scale.rotateRight = false\n    },\n    // 按钮按下开始放大\n    startZoomAdd(e) {\n      const { scale } = this\n      scale.zoomAddOn = true\n      const zoom = () => {\n        if (scale.zoomAddOn) {\n          const range = scale.range >= 100 ? 100 : ++scale.range\n          this.zoomImg(range)\n          setTimeout(function() {\n            zoom()\n          }, 60)\n        }\n      }\n      zoom()\n    },\n    // 按钮松开或移开取消放大\n    endZoomAdd(e) {\n      this.scale.zoomAddOn = false\n    },\n    // 按钮按下开始缩小\n    startZoomSub(e) {\n      const { scale } = this\n      scale.zoomSubOn = true\n      const zoom = () => {\n        if (scale.zoomSubOn) {\n          const range = scale.range <= 0 ? 0 : --scale.range\n          this.zoomImg(range)\n          setTimeout(function() {\n            zoom()\n          }, 60)\n        }\n      }\n      zoom()\n    },\n    // 按钮松开或移开取消缩小\n    endZoomSub(e) {\n      const { scale } = this\n      scale.zoomSubOn = false\n    },\n    zoomChange(e) {\n      this.zoomImg(e.target.value)\n    },\n    // 缩放原图\n    zoomImg(newRange) {\n      const { sourceImgMasking, scale } = this\n      const {\n        maxWidth,\n        maxHeight,\n        minWidth,\n        minHeight,\n        width,\n        height,\n        x,\n        y\n      } = scale\n      const sim = sourceImgMasking\n      // 蒙版宽高\n      const sWidth = sim.width\n      const sHeight = sim.height\n      // 新宽高\n      const nWidth = minWidth + ((maxWidth - minWidth) * newRange) / 100\n      const nHeight = minHeight + ((maxHeight - minHeight) * newRange) / 100\n      // 新坐标(根据蒙版中心点缩放)\n      let nX = sWidth / 2 - (nWidth / width) * (sWidth / 2 - x)\n      let nY = sHeight / 2 - (nHeight / height) * (sHeight / 2 - y)\n      // 判断新坐标是否超过蒙版限制\n      if (nX > 0) {\n        nX = 0\n      }\n      if (nY > 0) {\n        nY = 0\n      }\n      if (nX < sWidth - nWidth) {\n        nX = sWidth - nWidth\n      }\n      if (nY < sHeight - nHeight) {\n        nY = sHeight - nHeight\n      }\n      // 赋值处理\n      scale.x = nX\n      scale.y = nY\n      scale.width = nWidth\n      scale.height = nHeight\n      scale.range = newRange\n      setTimeout(() => {\n        if (scale.range === newRange) {\n          this.createImg()\n        }\n      }, 300)\n    },\n    // 生成需求图片\n    createImg(e) {\n      const {\n        mime,\n        sourceImg,\n        scale: { x, y, width, height, degree },\n        sourceImgMasking: { scale }\n      } = this\n      const canvas = this.$refs.canvas\n      const ctx = canvas.getContext('2d')\n      if (e) {\n        // 取消鼠标按下移动状态\n        this.sourceImgMouseDown.on = false\n      }\n      canvas.width = this.width\n      canvas.height = this.height\n      ctx.clearRect(0, 0, this.width, this.height)\n      // 将透明区域设置为白色底边\n      ctx.fillStyle = '#fff'\n      ctx.fillRect(0, 0, this.width, this.height)\n      ctx.translate(this.width * 0.5, this.height * 0.5)\n      ctx.rotate((Math.PI * degree) / 180)\n      ctx.translate(-this.width * 0.5, -this.height * 0.5)\n      ctx.drawImage(\n        sourceImg,\n        x / scale,\n        y / scale,\n        width / scale,\n        height / scale\n      )\n      this.createImgUrl = canvas.toDataURL(mime)\n    },\n    prepareUpload() {\n      const { url, createImgUrl, field, ki } = this\n      this.$emit('crop-success', createImgUrl, field, ki)\n      if (typeof url === 'string' && url) {\n        this.upload()\n      } else {\n        this.off()\n      }\n    },\n    // 上传图片\n    upload() {\n      const {\n        lang,\n        imgFormat,\n        mime,\n        url,\n        params,\n        field,\n        ki,\n        createImgUrl\n      } = this\n      const fmData = new FormData()\n      fmData.append(\n        field,\n        data2blob(createImgUrl, mime),\n        field + '.' + imgFormat\n      )\n      // 添加其他参数\n      if (typeof params === 'object' && params) {\n        Object.keys(params).forEach(k => {\n          fmData.append(k, params[k])\n        })\n      }\n      // 监听进度回调\n      // const uploadProgress = (event) => {\n      //   if (event.lengthComputable) {\n      //     this.progress = 100 * Math.round(event.loaded) / event.total\n      //   }\n      // }\n      // 上传文件\n      this.reset()\n      this.loading = 1\n      this.setStep(3)\n      request({\n        url,\n        method: 'post',\n        data: fmData\n      })\n        .then(resData => {\n          this.loading = 2\n          this.$emit('crop-upload-success', resData.data)\n        })\n        .catch(err => {\n          if (this.value) {\n            this.loading = 3\n            this.hasError = true\n            this.errorMsg = lang.fail\n            this.$emit('crop-upload-fail', err, field, ki)\n          }\n        })\n    },\n    closeHandler(e) {\n      if (this.value && (e.key === 'Escape' || e.keyCode === 27)) {\n        this.off()\n      }\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\">\n@charset \"UTF-8\";\n@-webkit-keyframes vicp_progress {\n  0% {\n    background-position-y: 0;\n  }\n  100% {\n    background-position-y: 40px;\n  }\n}\n@keyframes vicp_progress {\n  0% {\n    background-position-y: 0;\n  }\n  100% {\n    background-position-y: 40px;\n  }\n}\n@-webkit-keyframes vicp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(0) translatey(-60px);\n    transform: scale(0) translatey(-60px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale(1) translatey(0);\n    transform: scale(1) translatey(0);\n  }\n}\n@keyframes vicp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(0) translatey(-60px);\n    transform: scale(0) translatey(-60px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale(1) translatey(0);\n    transform: scale(1) translatey(0);\n  }\n}\n.vue-image-crop-upload {\n  position: fixed;\n  display: block;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  z-index: 10000;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.65);\n  -webkit-tap-highlight-color: transparent;\n  -moz-tap-highlight-color: transparent;\n}\n.vue-image-crop-upload .vicp-wrap {\n  -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  position: fixed;\n  display: block;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  z-index: 10000;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  margin: auto;\n  width: 600px;\n  height: 330px;\n  padding: 25px;\n  background-color: #fff;\n  border-radius: 2px;\n  -webkit-animation: vicp 0.12s ease-in;\n  animation: vicp 0.12s ease-in;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-close {\n  position: absolute;\n  right: -30px;\n  top: -30px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4 {\n  position: relative;\n  display: block;\n  width: 30px;\n  height: 30px;\n  cursor: pointer;\n  -webkit-transition: -webkit-transform 0.18s;\n  transition: -webkit-transform 0.18s;\n  transition: transform 0.18s;\n  transition: transform 0.18s, -webkit-transform 0.18s;\n  -webkit-transform: rotate(0);\n  -ms-transform: rotate(0);\n  transform: rotate(0);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4::after,\n.vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4::before {\n  -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  content: \"\";\n  position: absolute;\n  top: 12px;\n  left: 4px;\n  width: 20px;\n  height: 3px;\n  -webkit-transform: rotate(45deg);\n  -ms-transform: rotate(45deg);\n  transform: rotate(45deg);\n  background-color: #fff;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4::after {\n  -webkit-transform: rotate(-45deg);\n  -ms-transform: rotate(-45deg);\n  transform: rotate(-45deg);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4:hover {\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area {\n  position: relative;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 35px;\n  height: 170px;\n  background-color: rgba(0, 0, 0, 0.03);\n  text-align: center;\n  border: 1px dashed rgba(0, 0, 0, 0.08);\n  overflow: hidden;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area .vicp-icon1 {\n  display: block;\n  margin: 0 auto 6px;\n  width: 42px;\n  height: 42px;\n  overflow: hidden;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step1\n  .vicp-drop-area\n  .vicp-icon1\n  .vicp-icon1-arrow {\n  display: block;\n  margin: 0 auto;\n  width: 0;\n  height: 0;\n  border-bottom: 14.7px solid rgba(0, 0, 0, 0.3);\n  border-left: 14.7px solid transparent;\n  border-right: 14.7px solid transparent;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step1\n  .vicp-drop-area\n  .vicp-icon1\n  .vicp-icon1-body {\n  display: block;\n  width: 12.6px;\n  height: 14.7px;\n  margin: 0 auto;\n  background-color: rgba(0, 0, 0, 0.3);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step1\n  .vicp-drop-area\n  .vicp-icon1\n  .vicp-icon1-bottom {\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  display: block;\n  height: 12.6px;\n  border: 6px solid rgba(0, 0, 0, 0.3);\n  border-top: none;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area .vicp-hint {\n  display: block;\n  padding: 15px;\n  font-size: 14px;\n  color: #666;\n  line-height: 30px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step1\n  .vicp-drop-area\n  .vicp-no-supported-hint {\n  display: block;\n  position: absolute;\n  top: 0;\n  left: 0;\n  padding: 30px;\n  width: 100%;\n  height: 60px;\n  line-height: 30px;\n  background-color: #eee;\n  text-align: center;\n  color: #666;\n  font-size: 14px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area:hover {\n  cursor: pointer;\n  border-color: rgba(0, 0, 0, 0.1);\n  background-color: rgba(0, 0, 0, 0.05);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop {\n  overflow: hidden;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left {\n  float: left;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-img-container {\n  position: relative;\n  display: block;\n  width: 240px;\n  height: 180px;\n  background-color: #e5e5e0;\n  overflow: hidden;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-img-container\n  .vicp-img {\n  position: absolute;\n  display: block;\n  cursor: move;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-img-container\n  .vicp-img-shade {\n  -webkit-box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);\n  box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);\n  position: absolute;\n  background-color: rgba(241, 242, 243, 0.8);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-img-container\n  .vicp-img-shade.vicp-img-shade-1 {\n  top: 0;\n  left: 0;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-img-container\n  .vicp-img-shade.vicp-img-shade-2 {\n  bottom: 0;\n  right: 0;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-rotate {\n  position: relative;\n  width: 240px;\n  height: 18px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-rotate\n  i {\n  display: block;\n  width: 18px;\n  height: 18px;\n  border-radius: 100%;\n  line-height: 18px;\n  text-align: center;\n  font-size: 12px;\n  font-weight: bold;\n  background-color: rgba(0, 0, 0, 0.08);\n  color: #fff;\n  overflow: hidden;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-rotate\n  i:hover {\n  -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  cursor: pointer;\n  background-color: rgba(0, 0, 0, 0.14);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-rotate\n  i:first-child {\n  float: left;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-rotate\n  i:last-child {\n  float: right;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range {\n  position: relative;\n  margin: 30px 0 10px 0;\n  width: 240px;\n  height: 18px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon5,\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon6 {\n  position: absolute;\n  top: 0;\n  width: 18px;\n  height: 18px;\n  border-radius: 100%;\n  background-color: rgba(0, 0, 0, 0.08);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon5:hover,\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon6:hover {\n  -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  cursor: pointer;\n  background-color: rgba(0, 0, 0, 0.14);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon5 {\n  left: 0;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon5::before {\n  position: absolute;\n  content: \"\";\n  display: block;\n  left: 3px;\n  top: 8px;\n  width: 12px;\n  height: 2px;\n  background-color: #fff;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon6 {\n  right: 0;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon6::before {\n  position: absolute;\n  content: \"\";\n  display: block;\n  left: 3px;\n  top: 8px;\n  width: 12px;\n  height: 2px;\n  background-color: #fff;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  .vicp-icon6::after {\n  position: absolute;\n  content: \"\";\n  display: block;\n  top: 3px;\n  left: 8px;\n  width: 2px;\n  height: 12px;\n  background-color: #fff;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"] {\n  display: block;\n  padding-top: 5px;\n  margin: 0 auto;\n  width: 180px;\n  height: 8px;\n  vertical-align: top;\n  background: transparent;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  cursor: pointer;\n  /* 滑块\n               ---------------------------------------------------------------*/\n  /* 轨道\n               ---------------------------------------------------------------*/\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:focus {\n  outline: none;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-webkit-slider-thumb {\n  -webkit-box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);\n  box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);\n  -webkit-appearance: none;\n  appearance: none;\n  margin-top: -3px;\n  width: 12px;\n  height: 12px;\n  background-color: #61c091;\n  border-radius: 100%;\n  border: none;\n  -webkit-transition: 0.2s;\n  transition: 0.2s;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-moz-range-thumb {\n  box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);\n  -moz-appearance: none;\n  appearance: none;\n  width: 12px;\n  height: 12px;\n  background-color: #61c091;\n  border-radius: 100%;\n  border: none;\n  -webkit-transition: 0.2s;\n  transition: 0.2s;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-ms-thumb {\n  box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);\n  appearance: none;\n  width: 12px;\n  height: 12px;\n  background-color: #61c091;\n  border: none;\n  border-radius: 100%;\n  -webkit-transition: 0.2s;\n  transition: 0.2s;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:active::-moz-range-thumb {\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  width: 14px;\n  height: 14px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:active::-ms-thumb {\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  width: 14px;\n  height: 14px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:active::-webkit-slider-thumb {\n  -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n  margin-top: -4px;\n  width: 14px;\n  height: 14px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-webkit-slider-runnable-track {\n  -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  width: 100%;\n  height: 6px;\n  cursor: pointer;\n  border-radius: 2px;\n  border: none;\n  background-color: rgba(68, 170, 119, 0.3);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-moz-range-track {\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  width: 100%;\n  height: 6px;\n  cursor: pointer;\n  border-radius: 2px;\n  border: none;\n  background-color: rgba(68, 170, 119, 0.3);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-ms-track {\n  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);\n  width: 100%;\n  cursor: pointer;\n  background: transparent;\n  border-color: transparent;\n  color: transparent;\n  height: 6px;\n  border-radius: 2px;\n  border: none;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-ms-fill-lower {\n  background-color: rgba(68, 170, 119, 0.3);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]::-ms-fill-upper {\n  background-color: rgba(68, 170, 119, 0.15);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:focus::-webkit-slider-runnable-track {\n  background-color: rgba(68, 170, 119, 0.5);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:focus::-moz-range-track {\n  background-color: rgba(68, 170, 119, 0.5);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:focus::-ms-fill-lower {\n  background-color: rgba(68, 170, 119, 0.45);\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-left\n  .vicp-range\n  input[type=\"range\"]:focus::-ms-fill-upper {\n  background-color: rgba(68, 170, 119, 0.25);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-right {\n  float: right;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-right\n  .vicp-preview {\n  height: 150px;\n  overflow: hidden;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-right\n  .vicp-preview\n  .vicp-preview-item {\n  position: relative;\n  padding: 5px;\n  width: 100px;\n  height: 100px;\n  float: left;\n  margin-right: 16px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-right\n  .vicp-preview\n  .vicp-preview-item\n  span {\n  position: absolute;\n  bottom: -30px;\n  width: 100%;\n  font-size: 14px;\n  color: #bbb;\n  display: block;\n  text-align: center;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-right\n  .vicp-preview\n  .vicp-preview-item\n  img {\n  position: absolute;\n  display: block;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  margin: auto;\n  padding: 3px;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  overflow: hidden;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-right\n  .vicp-preview\n  .vicp-preview-item.vicp-preview-item-circle {\n  margin-right: 0;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step2\n  .vicp-crop\n  .vicp-crop-right\n  .vicp-preview\n  .vicp-preview-item.vicp-preview-item-circle\n  img {\n  border-radius: 100%;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload {\n  position: relative;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 35px;\n  height: 170px;\n  background-color: rgba(0, 0, 0, 0.03);\n  text-align: center;\n  border: 1px dashed #ddd;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-loading {\n  display: block;\n  padding: 15px;\n  font-size: 16px;\n  color: #999;\n  line-height: 30px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-progress-wrap {\n  margin-top: 12px;\n  background-color: rgba(0, 0, 0, 0.08);\n  border-radius: 3px;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step3\n  .vicp-upload\n  .vicp-progress-wrap\n  .vicp-progress {\n  position: relative;\n  display: block;\n  height: 5px;\n  border-radius: 3px;\n  background-color: #4a7;\n  -webkit-box-shadow: 0 2px 6px 0 rgba(68, 170, 119, 0.3);\n  box-shadow: 0 2px 6px 0 rgba(68, 170, 119, 0.3);\n  -webkit-transition: width 0.15s linear;\n  transition: width 0.15s linear;\n  background-image: -webkit-linear-gradient(\n    135deg,\n    rgba(255, 255, 255, 0.2) 25%,\n    transparent 25%,\n    transparent 50%,\n    rgba(255, 255, 255, 0.2) 50%,\n    rgba(255, 255, 255, 0.2) 75%,\n    transparent 75%,\n    transparent\n  );\n  background-image: linear-gradient(\n    -45deg,\n    rgba(255, 255, 255, 0.2) 25%,\n    transparent 25%,\n    transparent 50%,\n    rgba(255, 255, 255, 0.2) 50%,\n    rgba(255, 255, 255, 0.2) 75%,\n    transparent 75%,\n    transparent\n  );\n  background-size: 40px 40px;\n  -webkit-animation: vicp_progress 0.5s linear infinite;\n  animation: vicp_progress 0.5s linear infinite;\n}\n.vue-image-crop-upload\n  .vicp-wrap\n  .vicp-step3\n  .vicp-upload\n  .vicp-progress-wrap\n  .vicp-progress::after {\n  content: \"\";\n  position: absolute;\n  display: block;\n  top: -3px;\n  right: -3px;\n  width: 9px;\n  height: 9px;\n  border: 1px solid rgba(245, 246, 247, 0.7);\n  -webkit-box-shadow: 0 1px 4px 0 rgba(68, 170, 119, 0.7);\n  box-shadow: 0 1px 4px 0 rgba(68, 170, 119, 0.7);\n  border-radius: 100%;\n  background-color: #4a7;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-error,\n.vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-success {\n  height: 100px;\n  line-height: 100px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-operate {\n  position: absolute;\n  right: 20px;\n  bottom: 20px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-operate a {\n  position: relative;\n  float: left;\n  display: block;\n  margin-left: 10px;\n  width: 100px;\n  height: 36px;\n  line-height: 36px;\n  text-align: center;\n  cursor: pointer;\n  font-size: 14px;\n  color: #4a7;\n  border-radius: 2px;\n  overflow: hidden;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-operate a:hover {\n  background-color: rgba(0, 0, 0, 0.03);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-error,\n.vue-image-crop-upload .vicp-wrap .vicp-success {\n  display: block;\n  font-size: 14px;\n  line-height: 24px;\n  height: 24px;\n  color: #d10;\n  text-align: center;\n  vertical-align: top;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-success {\n  color: #4a7;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-icon3 {\n  position: relative;\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  top: 4px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-icon3::after {\n  position: absolute;\n  top: 3px;\n  left: 6px;\n  width: 6px;\n  height: 10px;\n  border-width: 0 2px 2px 0;\n  border-color: #4a7;\n  border-style: solid;\n  -webkit-transform: rotate(45deg);\n  -ms-transform: rotate(45deg);\n  transform: rotate(45deg);\n  content: \"\";\n}\n.vue-image-crop-upload .vicp-wrap .vicp-icon2 {\n  position: relative;\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  top: 4px;\n}\n.vue-image-crop-upload .vicp-wrap .vicp-icon2::after,\n.vue-image-crop-upload .vicp-wrap .vicp-icon2::before {\n  content: \"\";\n  position: absolute;\n  top: 9px;\n  left: 4px;\n  width: 13px;\n  height: 2px;\n  background-color: #d10;\n  -webkit-transform: rotate(45deg);\n  -ms-transform: rotate(45deg);\n  transform: rotate(45deg);\n}\n.vue-image-crop-upload .vicp-wrap .vicp-icon2::after {\n  -webkit-transform: rotate(-45deg);\n  -ms-transform: rotate(-45deg);\n  transform: rotate(-45deg);\n}\n.e-ripple {\n  position: absolute;\n  border-radius: 100%;\n  background-color: rgba(0, 0, 0, 0.15);\n  background-clip: padding-box;\n  pointer-events: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  -webkit-transform: scale(0);\n  -ms-transform: scale(0);\n  transform: scale(0);\n  opacity: 1;\n}\n.e-ripple.z-active {\n  opacity: 0;\n  -webkit-transform: scale(2);\n  -ms-transform: scale(2);\n  transform: scale(2);\n  -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;\n  transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;\n  transition: opacity 1.2s ease-out, transform 0.6s ease-out;\n  transition: opacity 1.2s ease-out, transform 0.6s ease-out,\n    -webkit-transform 0.6s ease-out;\n}\n</style>\n"]}]}