diff --git a/component/admin/controllers/redform.json.php b/component/admin/controllers/redform.json.php new file mode 100644 index 000000000000..16f433508697 --- /dev/null +++ b/component/admin/controllers/redform.json.php @@ -0,0 +1,19 @@ +get('tmp_path') . '/redform/filesupload/'; + + if (!Folder::exists($tmp)) + { + return; + } + + $list = Folder::files($tmp); + + if (empty($list)) + { + return; + } + + $nowMinusDay = (new DateTime) + ->modify('-1 day'); + + foreach ($list as $item) + { + $filename = $tmp . $item; + + $dateTime = new DateTime('@' . filemtime($filename)); + + if ($nowMinusDay >= $dateTime) + { + File::delete($filename); + } + } + } +} + +CliApplication::getInstance('ClearTmpFileUploadsFolderApplicationCli') + ->execute(); diff --git a/component/libraries/redform/language/en-GB/en-GB.lib_redform.ini b/component/libraries/redform/language/en-GB/en-GB.lib_redform.ini index 3a17be00f4f4..29a063650bfa 100644 --- a/component/libraries/redform/language/en-GB/en-GB.lib_redform.ini +++ b/component/libraries/redform/language/en-GB/en-GB.lib_redform.ini @@ -86,4 +86,16 @@ COM_REDFORM_FIELD_PARAMS_EXPORT_DESC="Include this field in exports" COM_REDFORM_FIELD_PARAMS_SHOW_IN_LIST="Show in lists" COM_REDFORM_FIELD_PARAMS_SHOW_IN_LIST_DESC="Show this field in submitters lists" -LIB_REDFORM_VALIDATE_FIELD_ERROR_TOO_LONG="%s field limit is %d characters" \ No newline at end of file +LIB_REDFORM_VALIDATE_FIELD_ERROR_TOO_LONG="%s field limit is %d characters" + +LIB_REDFORM_FILES_UPLOAD_DICTDEFAULTMESSAGE="Drop files here to upload" +LIB_REDFORM_FILES_UPLOAD_DICTFALLBACKMESSAGE="Your browser does not support drag'n'drop file uploads." +LIB_REDFORM_FILES_UPLOAD_DICTFALLBACKTEXT="Please use the fallback form below to upload your files like in the olden days." +LIB_REDFORM_FILES_UPLOAD_DICTFILETOOBIG="File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB." +LIB_REDFORM_FILES_UPLOAD_DICTINVALIDFILETYPE="You can't upload files of this type." +LIB_REDFORM_FILES_UPLOAD_DICTRESPONSEERROR="Server responded with {{statusCode}} code." +LIB_REDFORM_FILES_UPLOAD_DICTCANCELUPLOAD="Cancel upload" +LIB_REDFORM_FILES_UPLOAD_DICTUPLOADCANCELED="Upload canceled." +LIB_REDFORM_FILES_UPLOAD_DICTCANCELUPLOADCONFIRMATION="Are you sure you want to cancel this upload?" +LIB_REDFORM_FILES_UPLOAD_DICTREMOVEFILE="Remove file" +LIB_REDFORM_FILES_UPLOAD_DICTMAXFILESEXCEEDED="You can not upload any more files." \ No newline at end of file diff --git a/component/libraries/redform/layouts/rform/form.bootstrap.php b/component/libraries/redform/layouts/rform/form.bootstrap.php index 4f4d6871d596..5e9156a9ea93 100644 --- a/component/libraries/redform/layouts/rform/form.bootstrap.php +++ b/component/libraries/redform/layouts/rform/form.bootstrap.php @@ -26,7 +26,7 @@ $fieldsHtml = $data['fieldsHtml']; $referer64 = $data['referer64']; ?> -
diff --git a/component/libraries/redform/src/Controller/RedformJsonController.php b/component/libraries/redform/src/Controller/RedformJsonController.php new file mode 100644 index 000000000000..6e136fce9d03 --- /dev/null +++ b/component/libraries/redform/src/Controller/RedformJsonController.php @@ -0,0 +1,247 @@ +input; + $fileName = $input->getString('file_name', ''); + $token = $input->getString('token', ''); + $formId = $input->getInt('form_id', 0); + + if (!FilesUpload::fileTokenIsValid($token, $fileName, $formId)) + { + throw new RuntimeException('Permission Denied'); + } + + $tmp = Factory::getConfig()->get('tmp_path') . '/redform/filesupload/'; + + if (File::exists($tmp . $fileName)) + { + File::delete($tmp . $fileName); + } + + $fullPath = JPATH_SITE . '/' . (new FilesUpload)->getStoragePath($formId); + + if (File::exists($fullPath . $fileName)) + { + File::delete($fullPath . $fileName); + } + + echo new JsonResponse('ok'); + } + catch (Throwable $e) + { + echo new JsonResponse($e); + } + + $app->close(); + } + + /** + * @return void + * @throws Exception + * @since __DEPLOY_VERSION__ + */ + public function upload(): void + { + $app = Factory::getApplication(); + + try + { + if (!Session::checkToken()) + { + throw new RuntimeException(Text::_('JINVALID_TOKEN')); + } + + $input = $app->input; + $fieldId = $input->getInt('field_id'); + + if (empty($fieldId)) + { + throw new RuntimeException('Request is wrong!'); + } + + $data = (new RdfCoreModelFormfield)->setId($fieldId)->getItem(); + + if (empty($data)) + { + throw new RuntimeException('Request is wrong!'); + } + + $params = new Registry($data->params); + $files = $input->files->get('file', [], 'array'); + $uuid = $input->get('uuid', [], 'array'); + $formId = $input->getInt('form_id', 0); + + if (empty($files)) + { + return; + } + + $data = []; + $tmp = Factory::getConfig()->get('tmp_path') . '/redform/filesupload/'; + + if (!Folder::exists($tmp)) + { + Folder::create($tmp); + } + + $acceptedFiles = explode(',', $params->get('accepted_files', 'image/*')); + + foreach ($files as $key => $file) + { + if (((int) $params->get('maxsize') * 1024 * 1024) < $file['size']) + { + throw new RuntimeException( + str_replace( + [ + '{{filesize}}', + '{{maxFilesize}}', + ], + [ + $file['size'], + $params->get('maxsize'), + ], + Text::_('LIB_REDFORM_FILES_UPLOAD_DICTFILETOOBIG') + ) + ); + } + + if (!$this->isAcceptedFile($file, $acceptedFiles)) + { + throw new RuntimeException( + Text::_('LIB_REDFORM_FILES_UPLOAD_DICTINVALIDFILETYPE') + ); + } + + $file['uuid'] = $uuid[$key]; + $extension = pathinfo($file['name'], PATHINFO_EXTENSION); + $tmpName = $file['uuid'] . ($extension ? ('.' . $extension) : ''); + $tmpDest = $tmp . $tmpName; + + if (!File::upload($file['tmp_name'], $tmpDest)) + { + throw new RuntimeException( + 'Error file upload' + ); + } + + $file['tmp_name'] = $tmpName; + $file['token'] = FilesUpload::getTokenFile($tmpName, $formId); + $file['form_id'] = $formId; + $file['base64'] = base64_encode(json_encode($file)); + $data[$file['uuid']] = $file; + } + + echo new JsonResponse($data); + } + catch (Throwable $e) + { + echo new JsonResponse($e); + } + + $app->close(); + } + + /** + * @param array $file File + * @param array $listOfAccepts List of accepts + * + * @return boolean + * @since __DEPLOY_VERSION__ + */ + protected function isAcceptedFile(array $file, array $listOfAccepts): bool + { + if (empty($listOfAccepts)) + { + return true; + } + + $baseMimeType = preg_replace('/\/.*$/', '$1', $file['type']); + + foreach ($listOfAccepts as $acceptedFile) + { + $acceptedFile = trim($acceptedFile); + + if ($acceptedFile[0] === '.') + { + if ($this->endsWith(strtolower($acceptedFile), $file['name'])) + { + return true; + } + } + elseif (preg_match('/\/\*$/', $acceptedFile, $output)) + { + if ($baseMimeType === preg_replace('/\/\*$/', '$1', $acceptedFile)) + { + return true; + } + } + else + { + if ($acceptedFile === $file['type']) + { + return true; + } + } + } + + return false; + } + + /** + * @param string $haystack Haystack + * @param string $needle Needle + * + * @return boolean + * @since __DEPLOY_VERSION__ + */ + protected function endsWith(string $haystack, string $needle): bool + { + $length = strlen($needle); + + if (!$length) + { + return true; + } + + return substr($haystack, -$length) === $needle; + } +} diff --git a/component/libraries/redform/src/Helper/FilesUpload.php b/component/libraries/redform/src/Helper/FilesUpload.php new file mode 100644 index 000000000000..d48ecce542a3 --- /dev/null +++ b/component/libraries/redform/src/Helper/FilesUpload.php @@ -0,0 +1,91 @@ +get('secret')); + } + + /** + * @param string $tokenToCheck Token to check + * @param string $fileName File name + * @param int $formId Form Id + * + * @return boolean + * @since __DEPLOY_VERSION__ + */ + public static function fileTokenIsValid(string $tokenToCheck, string $fileName, int $formId): bool + { + return self::getTokenFile($fileName, $formId) === $tokenToCheck; + } + + /** + * Return path to storage folder, create if necessary + * + * @param integer $formId Form id + * + * @return boolean|string + */ + public function getStoragePath(int $formId): string + { + $params = ComponentHelper::getParams('com_redform'); + $db = Factory::getDbo(); + $query = $db->getQuery(true) + ->select('f.formname') + ->from('#__rwf_forms AS f') + ->where('f.id = ' . $db->q($formId)); + $formname = $db->setQuery($query) + ->loadResult(); + + $filepath = trim($params->get('upload_path', 'images/redform'), '/') + . '/' . File::makeSafe(str_replace(' ', '', $formname)); + $fullpath = JPATH_SITE . '/' . $filepath; + + if (!Folder::exists($fullpath)) + { + if (!Folder::create($fullpath)) + { + throw new RuntimeException(Text::_('COM_REDFORM_CANNOT_CREATE_FOLDER') . ': ' . $fullpath); + } + } + + if (!is_writable($fullpath)) + { + throw new RuntimeException(Text::_('COM_REDFORM_PATH_NOT_WRITABLE') . ': ' . $fullpath); + } + + clearstatcache(); + + return $filepath . '/'; + } +} diff --git a/component/media/com_redform/css/dropzone/dropzone.min.css b/component/media/com_redform/css/dropzone/dropzone.min.css new file mode 100644 index 000000000000..e8f4be413743 --- /dev/null +++ b/component/media/com_redform/css/dropzone/dropzone.min.css @@ -0,0 +1 @@ +@-webkit-keyframes passing-through{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%,70%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}100%{opacity:0;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px)}}@-moz-keyframes passing-through{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%,70%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}100%{opacity:0;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px)}}@keyframes passing-through{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%,70%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}100%{opacity:0;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px)}}@-webkit-keyframes slide-in{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}}@-moz-keyframes slide-in{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}}@keyframes slide-in{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}20%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}20%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}20%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}.dropzone,.dropzone *{box-sizing:border-box}.dropzone{min-height:150px;border:2px solid rgba(0,0,0,.3);background:#fff;padding:20px 20px}.dropzone.dz-clickable{cursor:pointer}.dropzone.dz-clickable *{cursor:default}.dropzone.dz-clickable .dz-message,.dropzone.dz-clickable .dz-message *{cursor:pointer}.dropzone.dz-started .dz-message{display:none}.dropzone.dz-drag-hover{border-style:solid}.dropzone.dz-drag-hover .dz-message{opacity:.5}.dropzone .dz-message{text-align:center;margin:2em 0}.dropzone .dz-message .dz-button{background:none;color:inherit;border:none;padding:0;font:inherit;cursor:pointer;outline:inherit}.dropzone .dz-preview{position:relative;display:inline-block;vertical-align:top;margin:16px;min-height:100px}.dropzone .dz-preview:hover{z-index:1000}.dropzone .dz-preview:hover .dz-details{opacity:1}.dropzone .dz-preview.dz-file-preview .dz-image{border-radius:20px;background:#999;background:linear-gradient(to bottom, #eee, #ddd)}.dropzone .dz-preview.dz-file-preview .dz-details{opacity:1}.dropzone .dz-preview.dz-image-preview{background:#fff}.dropzone .dz-preview.dz-image-preview .dz-details{-webkit-transition:opacity 0.2s linear;-moz-transition:opacity 0.2s linear;-ms-transition:opacity 0.2s linear;-o-transition:opacity 0.2s linear;transition:opacity 0.2s linear}.dropzone .dz-preview .dz-remove{font-size:14px;text-align:center;display:block;cursor:pointer;border:none}.dropzone .dz-preview .dz-remove:hover{text-decoration:underline}.dropzone .dz-preview:hover .dz-details{opacity:1}.dropzone .dz-preview .dz-details{z-index:20;position:absolute;top:0;left:0;opacity:0;font-size:13px;min-width:100%;max-width:100%;padding:2em 1em;text-align:center;color:rgba(0,0,0,.9);line-height:150%}.dropzone .dz-preview .dz-details .dz-size{margin-bottom:1em;font-size:16px}.dropzone .dz-preview .dz-details .dz-filename{white-space:nowrap}.dropzone .dz-preview .dz-details .dz-filename:hover span{border:1px solid rgba(200,200,200,.8);background-color:rgba(255,255,255,.8)}.dropzone .dz-preview .dz-details .dz-filename:not(:hover){overflow:hidden;text-overflow:ellipsis}.dropzone .dz-preview .dz-details .dz-filename:not(:hover) span{border:1px solid transparent}.dropzone .dz-preview .dz-details .dz-filename span,.dropzone .dz-preview .dz-details .dz-size span{background-color:rgba(255,255,255,.4);padding:0 .4em;border-radius:3px}.dropzone .dz-preview:hover .dz-image img{-webkit-transform:scale(1.05, 1.05);-moz-transform:scale(1.05, 1.05);-ms-transform:scale(1.05, 1.05);-o-transform:scale(1.05, 1.05);transform:scale(1.05, 1.05);-webkit-filter:blur(8px);filter:blur(8px)}.dropzone .dz-preview .dz-image{border-radius:20px;overflow:hidden;width:120px;height:120px;position:relative;display:block;z-index:10}.dropzone .dz-preview .dz-image img{display:block}.dropzone .dz-preview.dz-success .dz-success-mark{-webkit-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);-moz-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);-ms-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);-o-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1)}.dropzone .dz-preview.dz-error .dz-error-mark{opacity:1;-webkit-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);-moz-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);-ms-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);-o-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1)}.dropzone .dz-preview .dz-success-mark,.dropzone .dz-preview .dz-error-mark{pointer-events:none;opacity:0;z-index:500;position:absolute;display:block;top:50%;left:50%;margin-left:-27px;margin-top:-27px}.dropzone .dz-preview .dz-success-mark svg,.dropzone .dz-preview .dz-error-mark svg{display:block;width:54px;height:54px}.dropzone .dz-preview.dz-processing .dz-progress{opacity:1;-webkit-transition:all 0.2s linear;-moz-transition:all 0.2s linear;-ms-transition:all 0.2s linear;-o-transition:all 0.2s linear;transition:all 0.2s linear}.dropzone .dz-preview.dz-complete .dz-progress{opacity:0;-webkit-transition:opacity 0.4s ease-in;-moz-transition:opacity 0.4s ease-in;-ms-transition:opacity 0.4s ease-in;-o-transition:opacity 0.4s ease-in;transition:opacity 0.4s ease-in}.dropzone .dz-preview:not(.dz-processing) .dz-progress{-webkit-animation:pulse 6s ease infinite;-moz-animation:pulse 6s ease infinite;-ms-animation:pulse 6s ease infinite;-o-animation:pulse 6s ease infinite;animation:pulse 6s ease infinite}.dropzone .dz-preview .dz-progress{opacity:1;z-index:1000;pointer-events:none;position:absolute;height:16px;left:50%;top:50%;margin-top:-8px;width:80px;margin-left:-40px;background:rgba(255,255,255,.9);-webkit-transform:scale(1);border-radius:8px;overflow:hidden}.dropzone .dz-preview .dz-progress .dz-upload{background:#333;background:linear-gradient(to bottom, #666, #444);position:absolute;top:0;left:0;bottom:0;width:0;-webkit-transition:width 300ms ease-in-out;-moz-transition:width 300ms ease-in-out;-ms-transition:width 300ms ease-in-out;-o-transition:width 300ms ease-in-out;transition:width 300ms ease-in-out}.dropzone .dz-preview.dz-error .dz-error-message{display:block}.dropzone .dz-preview.dz-error:hover .dz-error-message{opacity:1;pointer-events:auto}.dropzone .dz-preview .dz-error-message{pointer-events:none;z-index:1000;position:absolute;display:block;display:none;opacity:0;-webkit-transition:opacity 0.3s ease;-moz-transition:opacity 0.3s ease;-ms-transition:opacity 0.3s ease;-o-transition:opacity 0.3s ease;transition:opacity 0.3s ease;border-radius:8px;font-size:13px;top:130px;left:-10px;width:140px;background:#be2626;background:linear-gradient(to bottom, #be2626, #a92222);padding:.5em 1.2em;color:#fff}.dropzone .dz-preview .dz-error-message:after{content:"";position:absolute;top:-6px;left:64px;width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #be2626} \ No newline at end of file diff --git a/component/media/com_redform/js/dropzone/dropzone.min.js b/component/media/com_redform/js/dropzone/dropzone.min.js new file mode 100644 index 000000000000..94e32e39fd4e --- /dev/null +++ b/component/media/com_redform/js/dropzone/dropzone.min.js @@ -0,0 +1 @@ +!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(self,(function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),a=r("unscopables"),u=Array.prototype;null==u[a]&&o.f(u,a,{configurable:!0,value:i(null)}),e.exports=function(e){u[a][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),a=n(7854),u=n(111),s=n(6656),l=n(648),c=n(8880),f=n(1320),p=n(3070).f,h=n(9518),d=n(7674),v=n(5112),y=n(9711),g=a.Int8Array,m=g&&g.prototype,b=a.Uint8ClampedArray,x=b&&b.prototype,w=g&&h(g),E=m&&h(m),k=Object.prototype,A=k.isPrototypeOf,S=v("toStringTag"),F=y("TYPED_ARRAY_TAG"),T=i&&!!d&&"Opera"!==l(a.opera),C=!1,L={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},R={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!u(e))return!1;var t=l(e);return s(L,t)||s(R,t)};for(r in L)a[r]||(T=!1);if((!T||"function"!=typeof w||w===Function.prototype)&&(w=function(){throw TypeError("Incorrect invocation")},T))for(r in L)a[r]&&d(a[r],w);if((!T||!E||E===k)&&(E=w.prototype,T))for(r in L)a[r]&&d(a[r].prototype,E);if(T&&h(x)!==E&&d(x,E),o&&!s(E,S))for(r in C=!0,p(E,S,{get:function(){return u(this)?this[F]:void 0}}),L)a[r]&&c(a[r],F,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:T,TYPED_ARRAY_TAG:C&&F,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(d){if(A.call(w,e))return e}else for(var t in L)if(s(L,r)){var n=a[t];if(n&&(e===n||A.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in L){var i=a[r];i&&s(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||f(E,e,n?t:T&&m[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(d){if(n)for(r in L)(i=a[r])&&s(i,e)&&delete i[e];if(w[e]&&!n)return;try{return f(w,e,n?t:T&&g[e]||t)}catch(e){}}for(r in L)!(i=a[r])||i[e]&&!n||f(i,e,t)}},isView:function(e){if(!u(e))return!1;var t=l(e);return"DataView"===t||s(L,t)||s(R,t)},isTypedArray:I,TypedArray:w,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),a=n(8880),u=n(2248),s=n(7293),l=n(5787),c=n(9958),f=n(7466),p=n(7067),h=n(1179),d=n(9518),v=n(7674),y=n(8006).f,g=n(3070).f,m=n(1285),b=n(8003),x=n(9909),w=x.get,E=x.set,k="ArrayBuffer",A="DataView",S="Wrong index",F=r.ArrayBuffer,T=F,C=r.DataView,L=C&&C.prototype,R=Object.prototype,I=r.RangeError,U=h.pack,O=h.unpack,_=function(e){return[255&e]},M=function(e){return[255&e,e>>8&255]},z=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},P=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},j=function(e){return U(e,23,4)},D=function(e){return U(e,52,8)},N=function(e,t){g(e.prototype,t,{get:function(){return w(this)[t]}})},B=function(e,t,n,r){var i=p(n),o=w(e);if(i+t>o.byteLength)throw I(S);var a=w(o.buffer).bytes,u=i+o.byteOffset,s=a.slice(u,u+t);return r?s:s.reverse()},q=function(e,t,n,r,i,o){var a=p(n),u=w(e);if(a+t>u.byteLength)throw I(S);for(var s=w(u.buffer).bytes,l=a+u.byteOffset,c=r(+i),f=0;f