From 41eeee1a306afc54fe0f31821f3e60532f1f9a0a Mon Sep 17 00:00:00 2001 From: Jon Gilkison Date: Thu, 3 Oct 2019 18:49:15 +0700 Subject: [PATCH] 3.2.0 * Activating Media Cloud will now import your WP Offload Media or WP-Stateless settings, making the transition as smooth as possible. * Improved import for media uploaded with WP Offload Media or WP-Stateless * New and improved background processing system, completely replaced the old error prone one * New Task Manager shows you all running background tasks and upcoming scheduled ones * Vastly improved Elementor integration * Fixed Smush Pro integration (thanks to Brett Porcelli!) * Asset push now queues uploads in the background instead of during page loads * Support for "Bucket Only Policy" with Google Cloud Storage (thanks to Wietse Muizelaar!) * Fix for environment variable MCLOUD_STORAGE_GOOGLE_CREDENTIALS_FILE (thanks to Wietse Muizelaar!) * When "Delete Uploaded Files" is enabled, deletes can be queued in the background to be deleted in the future. Allowing other plugins to process the upload before being removed from the local server. * New "Clean Uploads" task removes media from the local uploads directory. * Fix for path handling during migration and imports * Fix for Vision where items were not being queued in a background task * Fix for upload paths using @{version} token * New integrated inline help system * If Assets are enabled, added entries to WordPress admin bar to update build version and clear asset cache * The `import` command line task renamed to `migrateToStorage` * Added new `importFromStorage` command line task * Added new `updateElementor` command line task * Ability to hide Task Manager on multisite sub-sites * Improved error reporting for invalid credentials * Fixed dreaded white screen of doom when invalid cloud storage credentials are supplied * Fix for blank settings pages in more restrictive server setups --- classes/CLI/Command.php | 41 + classes/Documentation/Docs.php | 527 -------- .../Documentation/Markdown/MarkdownExtra.php | 95 -- .../Driver/Backblaze/BackblazeStorage.php | 6 +- .../Driver/GoogleCloud/GoogleStorage.php | 86 +- classes/Storage/Driver/S3/S3Storage.php | 58 +- classes/Storage/StorageInterface.php | 6 + classes/Storage/StorageSettings.php | 213 +++- classes/Tasks/AsyncRequest.php | 163 --- classes/Tasks/AttachmentTask.php | 128 ++ classes/Tasks/BackgroundProcess.php | 624 ---------- classes/Tasks/BatchManager.php | 745 ------------ classes/Tasks/Model.php | 260 ++++ classes/Tasks/RecurringTaskScheduler.php | 558 +++++++++ classes/Tasks/Task.php | 1061 +++++++++++++++++ classes/Tasks/TaskData.php | 178 +++ classes/Tasks/TaskDatabase.php | 147 +++ classes/Tasks/TaskManager.php | 582 +++++++++ classes/Tasks/TaskRunner.php | 432 +++++++ classes/Tasks/TaskSchedule.php | 397 ++++++ classes/Tasks/TestTask.php | 113 ++ classes/Tools/BatchTool.php | 553 --------- classes/Tools/Crop/CropTool.php | 27 +- classes/Tools/Debugging/DebuggingTool.php | 5 + .../System/Batch/TestBatchProcess.php | 96 -- .../Debugging/System/Batch/TestBatchTool.php | 104 -- .../System/SystemCompatibilityTool.php | 257 +--- classes/Tools/Imgix/ImgixTool.php | 6 +- classes/Tools/Storage/CLI/StorageCommands.php | 180 ++- classes/Tools/Storage/StorageTool.php | 722 +++++++++-- .../Tools/Storage/Tasks/CleanUploadsTask.php | 246 ++++ .../Tools/Storage/Tasks/DeleteUploadsTask.php | 189 +++ classes/Tools/Storage/Tasks/UnlinkTask.php | 180 +++ classes/Tools/Tasks/CLI/TasksCommands.php | 154 +++ classes/Tools/Tasks/TasksTool.php | 116 ++ classes/Tools/Tool.php | 123 +- classes/Tools/ToolSettings.php | 111 ++ classes/Tools/ToolsManager.php | 340 ++++-- .../Vision/Batch/ImportVisionBatchProcess.php | 119 -- .../Vision/Batch/ImportVisionBatchTool.php | 147 --- .../Tools/Vision/CLI/VisionCLICommands.php | 116 +- .../Tools/Vision/Tasks/ProcessVisionTask.php | 186 +++ classes/Tools/Vision/VisionTool.php | 37 +- classes/Utilities/Environment.php | 31 + classes/Utilities/Helpers.php | 52 + classes/Utilities/Logging/DatabaseLogger.php | 2 +- classes/Utilities/Logging/Logger.php | 30 +- classes/Utilities/Prefixer.php | 35 +- classes/Utilities/View.php | 4 + composer.json | 2 - config/batch-processing.config.php | 31 +- config/crop.config.php | 1 + config/debugging.config.php | 5 +- config/image-optimizers.config.php | 2 +- config/imgix.config.php | 2 + config/migrations/migrations.php | 5 - config/storage.config.php | 32 +- config/storage/google.config.php | 20 +- config/storage/s3.config.php | 1 + .../tasks.config.php | 27 +- config/vision.config.php | 6 +- docs/advanced/command-line.md | 82 -- docs/advanced/environment-variables.md | 238 ---- docs/advanced/hooks.md | 293 ----- docs/advanced/index.md | 3 - docs/assets.md | 42 - docs/batch-processing.md | 24 - docs/cloud-storage/index.md | 86 -- docs/cloud-storage/setup/amazon-s3.md | 140 --- docs/cloud-storage/setup/backblaze.md | 57 - docs/cloud-storage/setup/do-spaces.md | 81 -- .../setup/google-cloud-storage.md | 157 --- docs/cloud-storage/setup/wasabi.md | 70 -- docs/config.json | 120 -- docs/crop-tool.md | 6 - docs/direct-uploads/index.md | 33 - docs/direct-uploads/installing-ffprobe.md | 58 - docs/docs.css | 23 - docs/docs.index | Bin 52224 -> 0 bytes docs/dynamic-images.md | 59 - docs/image-editor.md | 6 - docs/image-size-manager.md | 69 -- docs/img/bio.jpg | Bin 51763 -> 0 bytes docs/img/callout-headline.jpg | Bin 47870 -> 0 bytes docs/img/callout-information-multiple.jpg | Bin 52638 -> 0 bytes docs/img/callout-information-single.jpg | Bin 45192 -> 0 bytes docs/img/callout-information.jpg | Bin 45178 -> 0 bytes docs/img/carousel.jpg | Bin 46269 -> 0 bytes docs/img/case-study.jpg | Bin 44601 -> 0 bytes docs/img/footer-navigation.jpg | Bin 21029 -> 0 bytes docs/img/hero-captioned.jpg | Bin 31871 -> 0 bytes docs/img/hero-primary.jpg | Bin 39493 -> 0 bytes docs/img/hero-simple.jpg | Bin 26224 -> 0 bytes docs/img/icon-callout-1.png | Bin 1033 -> 0 bytes docs/img/icon-callout-10.png | Bin 1282 -> 0 bytes docs/img/icon-callout-11.png | Bin 1118 -> 0 bytes docs/img/icon-callout-12.png | Bin 1252 -> 0 bytes docs/img/icon-callout-2.png | Bin 1188 -> 0 bytes docs/img/icon-callout-3.png | Bin 1264 -> 0 bytes docs/img/icon-callout-4.png | Bin 1157 -> 0 bytes docs/img/icon-callout-5.png | Bin 1243 -> 0 bytes docs/img/icon-callout-6.png | Bin 1271 -> 0 bytes docs/img/icon-callout-7.png | Bin 1116 -> 0 bytes docs/img/icon-callout-8.png | Bin 1288 -> 0 bytes docs/img/icon-callout-9.png | Bin 1277 -> 0 bytes docs/img/icon-ism-gear.png | Bin 2293 -> 0 bytes docs/img/icon-ism-trash.png | Bin 2213 -> 0 bytes docs/img/image-block.jpg | Bin 28036 -> 0 bytes docs/img/information-panel-horizontal.jpg | Bin 65526 -> 0 bytes docs/img/information-panel-vertical.jpg | Bin 77225 -> 0 bytes docs/img/leadership-grid.jpg | Bin 68355 -> 0 bytes docs/img/logo.svg | 14 - docs/img/news-item.jpg | Bin 24770 -> 0 bytes docs/img/post-list.jpg | Bin 62056 -> 0 bytes docs/img/publish-notification.jpg | Bin 35506 -> 0 bytes docs/img/site-publisher.jpg | Bin 45022 -> 0 bytes docs/img/text-block.jpg | Bin 45160 -> 0 bytes docs/img/text-header.jpg | Bin 26847 -> 0 bytes docs/img/top-navigation.jpg | Bin 18317 -> 0 bytes docs/img/two-column-text-block.jpg | Bin 29229 -> 0 bytes docs/img/xandr-logo.svg | 46 - docs/imgix.md | 65 - docs/index.md | 29 - docs/integrations.md | 42 - docs/storage-browser.md | 20 - docs/toc.md | 47 - docs/vision.md | 123 -- helpers/ilab-media-tool-wordpress-helpers.php | 6 + ilab-media-tools.php | 19 +- public/css/ilab-media-cloud.css | 4 +- public/css/media-cloud-docs.css | 1 - public/img/ilab-ui-icon-add.png | Bin 0 -> 296 bytes public/img/ilab-ui-icon-add.svg | 1 + public/img/ilab-ui-icon-help.svg | 1 + public/img/ilab-ui-icon-youtube.svg | 1 + public/img/mcloud-icon-help.svg | 1 + public/js/docs-prism.js | 103 +- public/js/ilab-dismiss-notice.js | 2 +- public/js/ilab-face-detect.js | 2 +- public/js/ilab-image-sizes.js | 2 +- public/js/ilab-media-direct-upload-google.js | 2 +- .../js/ilab-media-direct-upload-other-s3.js | 2 +- public/js/ilab-media-direct-upload-s3.js | 2 +- public/js/ilab-media-direct-upload.js | 2 +- public/js/ilab-media-grid.js | 2 +- public/js/ilab-media-tools.js | 2 +- public/js/ilab-media-upload.js | 2 +- public/js/ilab-modal.js | 2 +- public/js/ilab-settings.js | 2 +- public/js/ilab-storage-browser.js | 2 +- public/js/mcloud-admin.js | 2 +- public/js/media-cloud-docs.js | 1 - public/mix-manifest.json | 7 +- readme.txt | 30 +- views/base/features.blade.php | 4 - views/base/fields/help.blade.php | 2 +- views/base/fields/password.blade.php | 5 +- views/base/settings.blade.php | 57 +- views/base/support.blade.php | 289 ----- views/base/upgrade.blade.php | 2 + views/base/wrong-license.blade.php | 11 + views/debug/trouble-shooter.blade.php | 47 +- views/imgix/ilab-imgix-ui.blade.php | 6 + views/importer/importer.blade.php | 143 --- .../instructions/clear-cache.blade.php | 10 - .../instructions/storage-exporter.blade.php | 16 - views/support/beacon.blade.php | 7 + views/support/crisp.blade.php | 1 - views/support/silent-beacon.blade.php | 3 + views/tasks/batch-info.blade.php | 58 + views/tasks/batch.blade.php | 88 ++ views/tasks/batch/clean-uploads.blade.php | 9 + views/tasks/batch/clear-glide-cache.blade.php | 9 + views/tasks/batch/import-task.blade.php | 9 + .../instructions/clean-uploads.blade.php | 9 + .../instructions/clear-glide-cache.blade.php | 4 + .../batch/instructions/import-task.blade.php | 11 + .../instructions/migrate-task.blade.php} | 7 +- .../instructions/process-vision.blade.php} | 3 +- .../regenerate-thumbs-task.blade.php} | 3 +- .../instructions/unlink-media-task.blade.php | 4 + .../instructions/update-elementor.blade.php | 4 + views/tasks/batch/migrate-task.blade.php | 9 + views/tasks/batch/process-vision.blade.php | 9 + .../batch/regenerate-thumbs-task.blade.php | 9 + views/tasks/batch/unlink-media-task.blade.php | 9 + views/tasks/batch/update-elementor.blade.php | 9 + views/tasks/task-manager.blade.php | 212 ++++ views/templates/modal.blade.php | 6 + views/templates/sub-page.blade.php | 2 + 190 files changed, 7415 insertions(+), 6629 deletions(-) delete mode 100755 classes/Documentation/Docs.php delete mode 100755 classes/Documentation/Markdown/MarkdownExtra.php delete mode 100755 classes/Tasks/AsyncRequest.php create mode 100755 classes/Tasks/AttachmentTask.php delete mode 100755 classes/Tasks/BackgroundProcess.php delete mode 100755 classes/Tasks/BatchManager.php create mode 100755 classes/Tasks/Model.php create mode 100755 classes/Tasks/RecurringTaskScheduler.php create mode 100755 classes/Tasks/Task.php create mode 100755 classes/Tasks/TaskData.php create mode 100755 classes/Tasks/TaskDatabase.php create mode 100755 classes/Tasks/TaskManager.php create mode 100755 classes/Tasks/TaskRunner.php create mode 100755 classes/Tasks/TaskSchedule.php create mode 100755 classes/Tasks/TestTask.php delete mode 100755 classes/Tools/BatchTool.php delete mode 100755 classes/Tools/Debugging/System/Batch/TestBatchProcess.php delete mode 100755 classes/Tools/Debugging/System/Batch/TestBatchTool.php create mode 100755 classes/Tools/Storage/Tasks/CleanUploadsTask.php create mode 100755 classes/Tools/Storage/Tasks/DeleteUploadsTask.php create mode 100755 classes/Tools/Storage/Tasks/UnlinkTask.php create mode 100755 classes/Tools/Tasks/CLI/TasksCommands.php create mode 100755 classes/Tools/Tasks/TasksTool.php create mode 100755 classes/Tools/ToolSettings.php delete mode 100755 classes/Tools/Vision/Batch/ImportVisionBatchProcess.php delete mode 100755 classes/Tools/Vision/Batch/ImportVisionBatchTool.php create mode 100755 classes/Tools/Vision/Tasks/ProcessVisionTask.php mode change 100644 => 100755 classes/Utilities/View.php rename classes/Tools/BatchToolInterface.php => config/tasks.config.php (54%) delete mode 100755 docs/advanced/command-line.md delete mode 100755 docs/advanced/environment-variables.md delete mode 100755 docs/advanced/hooks.md delete mode 100755 docs/advanced/index.md delete mode 100755 docs/assets.md delete mode 100755 docs/batch-processing.md delete mode 100755 docs/cloud-storage/index.md delete mode 100755 docs/cloud-storage/setup/amazon-s3.md delete mode 100755 docs/cloud-storage/setup/backblaze.md delete mode 100755 docs/cloud-storage/setup/do-spaces.md delete mode 100755 docs/cloud-storage/setup/google-cloud-storage.md delete mode 100755 docs/cloud-storage/setup/wasabi.md delete mode 100755 docs/config.json delete mode 100755 docs/crop-tool.md delete mode 100755 docs/direct-uploads/index.md delete mode 100755 docs/direct-uploads/installing-ffprobe.md delete mode 100755 docs/docs.css delete mode 100755 docs/docs.index delete mode 100755 docs/dynamic-images.md delete mode 100755 docs/image-editor.md delete mode 100755 docs/image-size-manager.md delete mode 100755 docs/img/bio.jpg delete mode 100755 docs/img/callout-headline.jpg delete mode 100755 docs/img/callout-information-multiple.jpg delete mode 100755 docs/img/callout-information-single.jpg delete mode 100755 docs/img/callout-information.jpg delete mode 100755 docs/img/carousel.jpg delete mode 100755 docs/img/case-study.jpg delete mode 100755 docs/img/footer-navigation.jpg delete mode 100755 docs/img/hero-captioned.jpg delete mode 100755 docs/img/hero-primary.jpg delete mode 100755 docs/img/hero-simple.jpg delete mode 100755 docs/img/icon-callout-1.png delete mode 100755 docs/img/icon-callout-10.png delete mode 100755 docs/img/icon-callout-11.png delete mode 100755 docs/img/icon-callout-12.png delete mode 100755 docs/img/icon-callout-2.png delete mode 100755 docs/img/icon-callout-3.png delete mode 100755 docs/img/icon-callout-4.png delete mode 100755 docs/img/icon-callout-5.png delete mode 100755 docs/img/icon-callout-6.png delete mode 100755 docs/img/icon-callout-7.png delete mode 100755 docs/img/icon-callout-8.png delete mode 100755 docs/img/icon-callout-9.png delete mode 100755 docs/img/icon-ism-gear.png delete mode 100755 docs/img/icon-ism-trash.png delete mode 100755 docs/img/image-block.jpg delete mode 100755 docs/img/information-panel-horizontal.jpg delete mode 100755 docs/img/information-panel-vertical.jpg delete mode 100755 docs/img/leadership-grid.jpg delete mode 100755 docs/img/logo.svg delete mode 100755 docs/img/news-item.jpg delete mode 100755 docs/img/post-list.jpg delete mode 100755 docs/img/publish-notification.jpg delete mode 100755 docs/img/site-publisher.jpg delete mode 100755 docs/img/text-block.jpg delete mode 100755 docs/img/text-header.jpg delete mode 100755 docs/img/top-navigation.jpg delete mode 100755 docs/img/two-column-text-block.jpg delete mode 100755 docs/img/xandr-logo.svg delete mode 100755 docs/imgix.md delete mode 100755 docs/index.md delete mode 100755 docs/integrations.md delete mode 100755 docs/storage-browser.md delete mode 100755 docs/toc.md delete mode 100755 docs/vision.md delete mode 100755 public/css/media-cloud-docs.css create mode 100755 public/img/ilab-ui-icon-add.png create mode 100755 public/img/ilab-ui-icon-add.svg create mode 100755 public/img/ilab-ui-icon-help.svg create mode 100755 public/img/ilab-ui-icon-youtube.svg create mode 100755 public/img/mcloud-icon-help.svg delete mode 100755 public/js/media-cloud-docs.js delete mode 100755 views/base/support.blade.php create mode 100755 views/base/wrong-license.blade.php delete mode 100755 views/importer/importer.blade.php delete mode 100755 views/importer/instructions/clear-cache.blade.php delete mode 100755 views/importer/instructions/storage-exporter.blade.php create mode 100755 views/support/beacon.blade.php delete mode 100755 views/support/crisp.blade.php create mode 100755 views/support/silent-beacon.blade.php create mode 100755 views/tasks/batch-info.blade.php create mode 100755 views/tasks/batch.blade.php create mode 100755 views/tasks/batch/clean-uploads.blade.php create mode 100755 views/tasks/batch/clear-glide-cache.blade.php create mode 100755 views/tasks/batch/import-task.blade.php create mode 100755 views/tasks/batch/instructions/clean-uploads.blade.php create mode 100755 views/tasks/batch/instructions/clear-glide-cache.blade.php create mode 100755 views/tasks/batch/instructions/import-task.blade.php rename views/{importer/instructions/storage-importer.blade.php => tasks/batch/instructions/migrate-task.blade.php} (68%) rename views/{importer/instructions/vision.blade.php => tasks/batch/instructions/process-vision.blade.php} (88%) rename views/{importer/instructions/regeneration.blade.php => tasks/batch/instructions/regenerate-thumbs-task.blade.php} (88%) create mode 100755 views/tasks/batch/instructions/unlink-media-task.blade.php create mode 100755 views/tasks/batch/instructions/update-elementor.blade.php create mode 100755 views/tasks/batch/migrate-task.blade.php create mode 100755 views/tasks/batch/process-vision.blade.php create mode 100755 views/tasks/batch/regenerate-thumbs-task.blade.php create mode 100755 views/tasks/batch/unlink-media-task.blade.php create mode 100755 views/tasks/batch/update-elementor.blade.php create mode 100755 views/tasks/task-manager.blade.php diff --git a/classes/CLI/Command.php b/classes/CLI/Command.php index 68996800..8f3d28a7 100755 --- a/classes/CLI/Command.php +++ b/classes/CLI/Command.php @@ -16,6 +16,8 @@ namespace ILAB\MediaCloud\CLI; +use ILAB\MediaCloud\Tasks\Task; + if (!defined('ABSPATH')) { header('Location: /'); die; } abstract class Command extends \WP_CLI_Command { @@ -35,5 +37,44 @@ public static function Out($string, $newline = false) { \WP_CLI::out(\WP_CLI::colorize($string).($newline ? "\n" : "")); } + /** + * @param Task $task + * @param array $options + * @param array $selected + * + * @throws \Exception + */ + protected function runTask($task, $options = [], $selected = []) { + $task->cli = true; + $task->setHandlers(function($message, $newLine) { + Command::Info($message, $newLine); + }, function($message) { + Command::Error($message); + }); + + $task->prepare($options); + if ($task->totalItems == 0) { + self::Warn("No items found to process. Exiting."); + exit(0); + } + + $task->save(); + + + Command::Out("", true); + Command::Info("Found %W{$task->totalItems}%n items.", true); + + while(true) { + $result = $task->run(); + if (intval($result) >= Task::TASK_COMPLETE) { + $task->cleanUp(); + break; + } + } + + Command::Info("Complete.", true); + Command::Out("", true); + } + public abstract static function Register(); } \ No newline at end of file diff --git a/classes/Documentation/Docs.php b/classes/Documentation/Docs.php deleted file mode 100755 index 616e4f1e..00000000 --- a/classes/Documentation/Docs.php +++ /dev/null @@ -1,527 +0,0 @@ -docPath = trailingslashit(ILAB_TOOLS_DIR).'docs'; - $this->docURL = trailingslashit(ILAB_TOOLS_URL).'docs'; - $this->tocPath = $this->docPath.'/toc.md'; - $this->debugMode = (defined('WP_ENV') && (WP_ENV != 'production')); - $this->canSearch = (file_exists($this->docPath.'/docs.index') && extension_loaded('sqlite3')); - - if (!file_exists($this->tocPath)) { - return; - } - - $this->versionInfo = get_option('media_cloud_documentation_info', null); - $this->toc = get_option('media_cloud_documentation_toc', null); - if (empty($this->toc) || empty($this->versionInfo)) { - $this->parseTOC(); - } else { - $currentVersion = get_option('media_cloud_documentation_version', null); - if ($currentVersion != MEDIA_CLOUD_VERSION) { - $this->parseTOC(); - } - } - - if (empty($this->toc)) { - return; - } - - add_action('admin_enqueue_scripts', function(){ - wp_enqueue_script('media-cloud-docs-js', ILAB_PUB_JS_URL.'/media-cloud-docs.js'); - wp_enqueue_script('media-cloud-docs-prism-js', ILAB_PUB_JS_URL.'/docs-prism.js'); - wp_enqueue_style('media-cloud-docs-css', ILAB_PUB_CSS_URL . '/media-cloud-docs.css' ); -// -// if (file_exists($this->currentConfig->dir.'docs.css')) { -// wp_enqueue_style('media-cloud-docs-css-'.$this->currentDocs, $this->currentConfig->url.'/docs.css' ); -// } - }); - - if (is_admin()) { - add_action('wp_ajax_media_cloud_render_doc_page', [$this,'renderAjaxPage']); - } - } - - //region Admin Menu - public function registerAdminMenu($parentSlug) { - if (!$this->loaded()) { - return; - } - - add_submenu_page($parentSlug, 'Media Cloud Documentation', 'Documentation', 'manage_options','media-cloud-docs', [$this,'renderMenuPage']); - - } - //endregion - - //region Structural - /** - * Gets child TOC entries for the current page - * - * @param $page - * @param $entries - * @return array|null - */ - private function getChildrenEntriesFor($page, $entries) { - foreach($entries as $entry) { - if ($entry['src'] == $page) { - if (isset($entry['children'])) { - return $entry['children']; - } else { - return []; - } - } - - if (isset($entry['children'])) { - $res = $this->getChildrenEntriesFor($page, $entry['children']); - if (is_array($res)) { - return $res; - } - } - } - - return null; - } - - /** - * Searches the TOC for the current page - * - * @param $entries - * @param $results - * @return bool - */ - private function searchForCurrentPage($entries, &$results) { - foreach($entries as $entry) { - if ($entry['src'] == $this->currentPage) { - $results[] = [ - 'title' => $entry['title'], - 'src' => $entry['src'], - 'anchor' => arrayPath($entry, 'anchor', null) - ]; - - return true; - } - - if (isset($entry['children'])) { - if ($this->searchForCurrentPage($entry['children'],$results)) { - $results[] = [ - 'title' => $entry['title'], - 'src' => $entry['src'], - 'anchor' => arrayPath($entry, 'anchor', null) - ]; - - return true; - } - } - } - - return false; - } - - /** - * Returns the breadcrumb trail for the current page - * - * @return array - */ - private function getTrailForCurrentPage() { - $title = arrayPath($this->versionInfo, 'title', 'Documentation'); - - $result = [ - [ - 'title' => $title, - 'src' => 'index' - ] - ]; - - if ($this->currentPage == 'index') { - return $result; - } - - $searchResults = []; - $this->searchForCurrentPage($this->toc, $searchResults); - $searchResults = array_reverse($searchResults); - - return array_merge($result, $searchResults); - } - //endregion - - //region Page rendering - private function loadCurrentPage() { - if (empty($this->toc)) { - return false; - } - - // Get the currently requested page - $this->currentPage = 'index'; - if (isset($_GET['doc-page'])) { - $this->currentPage = $_GET['doc-page']; - } else if (isset($_POST['doc-page'])) { - $this->currentPage = $_POST['doc-page']; - } - - $pagePath = trailingslashit($this->docPath).$this->currentPage.'.md'; - if (!file_exists($pagePath)) { - return false; - } - - $this->currentPagePath = $pagePath; - return true; - } - - /** - * Converts TOC entries to HTML - * @param $entries - * @return string - */ - private function convertEntriesToHTML($entries) { - $html = ''; - foreach($entries as $entry) { - if ($entry['src'] == 'index') { - continue; - } - - $url = admin_url('admin.php?page=media-cloud-docs&doc-page='.$entry['src']); - $anchor = arrayPath($entry, 'anchor', ''); - if (!empty($anchor)) { - $anchor = '#'.$anchor; - } - - $hasChildren = !empty($entry['children']); - $html .= "
  • {$entry['title']}"; - if (isset($entry['children'])) { - $html .= ''; - } - $html .= "
  • "; - } - - return $html; - } - - /** - * Renders the breadcrumbs for the current page - * - * @return string - */ - private function renderBreadcrumbs() { - $trailResults = $this->getTrailForCurrentPage(); - - $dropdown = ""; - - $result = '
    '.$dropdown.'
    '; - - return $result; - } - - /** - * Renders the header - * - * @return string - */ - private function renderHeader() { - $searchText = (isset($_POST['search-text'])) ? $_POST['search-text'] : null; - - $result = "
    "; - if (isset($this->versionInfo['logo'])) { - $title = isset($this->versionInfo['title']) ? $this->versionInfo['title'] : 'Documentation'; - $logoSrc = trailingslashit($this->docURL).$this->versionInfo['logo']; - $logoWidth = $this->versionInfo['logo-width']; - $logoHeight = $this->versionInfo['logo-height']; - - $result .= "$title"; - } else { - $result .= ""; - } - - if ($this->canSearch) { - $result .= ""; - } - - $result .= "
    "; - - return $result; - } - - private function renderPage() { - if (!$this->loadCurrentPage()) { - return ''; - } - - $result = ''; - - $text = file_get_contents($this->currentPagePath); - - $parser = new MarkdownExtra(); - - $parser->header_id_func = function($val) { - return sanitize_title($val); - }; - - $parser->url_filter_func = function($url) { - // other doc links - if (preg_match("/.*\.md/", $url)) { - $url = str_replace('.md', '', $url); - $hash = ''; - if (strpos($url, '#') !== false) { - $urlParts = explode('#', $url); - $url = $urlParts[1]; - $hash = '#'.$urlParts[2]; - } - return admin_url("admin.php?page=media-cloud-docs&doc-page={$url}{$hash}"); - } - - // admin links - if (preg_match("/admin:(.*)/", $url, $matches)) { - return admin_url($matches[1]); - } - - // images local to the doc - $matches = []; - if (preg_match("/(^[^\/]{1}.*\.(?:jpg|png|jpeg|svg))/", $url, $matches)) { - if (strpos($url, 'http://') === 0) { - return $url; - } - - if (strpos($url, 'https://') === 0) { - return $url; - } - - return trailingslashit($this->docURL).$url; - } - - return $url; - }; - - // Process embeds - $embeds = []; - if (preg_match_all("/\@\s*\[[^]]*\]\s*\(([^)]*)\)/m", $text, $embeds)) { - for($i = 0; $i < count($embeds[1]); $i++) { - $embedCode = wp_oembed_get($embeds[1][$i]); - $isVideo = preg_match ("/\b(?:vimeo\.com|youtube\.com|youtu\.be|dailymotion\.com)\b/i", $embeds[1][$i]); - $text = str_replace($embeds[0][$i], "
    $embedCode
    ", $text); - } - } - - // Process toc - $tocs = []; - if (preg_match_all("/@toc\(([^)]*)\)/m", $text, $tocs)) { - for($i = 0; $i < count($tocs[1]); $i++) { - $tocPage = $tocs[1][$i]; - if (empty($tocPage)) { - $tocPage = $this->currentPage; - } - - if ($tocPage == 'index') { - $entries = $this->toc; - } else { - $entries = $this->getChildrenEntriesFor($tocPage, $this->toc); - } - - if (!empty($entries) && is_array($entries) && (count($entries) > 0)) { - $tocHTML = ''; - $text = str_replace($tocs[0][$i], $tocHTML, $text); - } - } - } - - // Convert to HTML - $html = $parser->transform($text); - - $result .= $this->renderHeader(); - $result .= $this->renderBreadcrumbs(); - - $tocList = $this->convertEntriesToHTML($this->toc); - - $result .= "
    $tocList
    $html
    "; - - return $result; - } - - private function renderSearchResults() { - if (!$this->loadCurrentPage()) { - return ''; - } - } - - public function renderAjaxPage() { - if ($this->canSearch && isset($_POST['search-text'])) { - $page = $this->renderSearchResults(); - } else { - $page = $this->renderPage(); - } - - if (empty($page)) { - wp_send_json(['status' => 'error'], 400); - } - - wp_send_json(['status' => 'ok', 'html' => $page]); - } - - public function renderMenuPage() { - if ($this->canSearch && isset($_POST['search-text'])) { - echo $this->renderSearchResults(); - } else { - echo $this->renderPage(); - } - } - //endregion - - //region TOC Loading - private function parseTOCHeader(&$toc) { - preg_match('//ms', $toc, $matches); - if (empty($matches)) { - return false; - } - - $header = $matches[1]; - if (empty($header)) { - return false; - } - - $toc = str_replace($matches[0],'', $toc); - - preg_match_all('/^([aA-zZ-]+)\s*:\s*[\'"]*(.+?)[\'"]*$/ms', $header, $headerFields, PREG_SET_ORDER); - if (empty($headerFields)) { - return false; - } - - $this->versionInfo = []; - foreach($headerFields as $headerField) { - $this->versionInfo[$headerField[1]] = $headerField[2]; - } - - return true; - } - - private function parseTOC() { - $this->toc = null; - - $toc = file_get_contents($this->tocPath); - if (empty($toc)) { - return; - } - - if (!$this->parseTOCHeader($toc)) { - return; - } - - $parser = new MarkdownExtra(); - $html = $parser->transform($toc); - - - $htmlDoc = new HTML5DOMDocument(); - $htmlDoc->loadHTML($html); - - /** @var HTML5DOMElement $ul */ - $ul = $htmlDoc->querySelector('ul'); - $this->toc = $this->parseList($ul); - - - if (!$this->debugMode) { - update_option('media_cloud_documentation_version', MEDIA_CLOUD_VERSION); - update_option('media_cloud_documentation_info', $this->versionInfo); - update_option('media_cloud_documentation_toc', $this->toc); - } - } - - private function parseList($ul) { - $result = []; - /** @var HTML5DOMElement $li */ - foreach($ul->childNodes as $li) { - if ($li->nodeName != 'li') { - continue; - } - - $tocEntry = []; - /** @var HTML5DOMElement $childNode */ - foreach($li->childNodes as $childNode) { - if ($childNode->nodeType == XML_TEXT_NODE) { - $text = trim($childNode->textContent); - if (empty($text)) { - continue; - } - - $tocEntry["title"] = $text; - } else if ($childNode->nodeType == XML_ELEMENT_NODE) { - if ($childNode->nodeName == 'ul') { - $tocEntry['children'] = $this->parseList($childNode); - } else if ($childNode->nodeName == 'a') { - $text = trim($childNode->textContent); - $tocEntry['title'] = $text; - - $href = $childNode->getAttribute('href'); - $anchor = null; - if (strpos($href, '#') !== false) { - $hrefParts = explode('#', $href); - $href = str_replace('.md', '', $hrefParts[0]); - $anchor = $hrefParts[1]; - } else { - $href = str_replace('.md', '', $href); - } - - $tocEntry['src'] = $href; - if (!empty($anchor)) { - $tocEntry['anchor'] = $anchor; - } - } - } - } - - if (!empty($tocEntry)) { - $result[] = $tocEntry; - } - } - - return $result; - } - //endregion - - public function loaded() { - return !empty($this->toc); - } -} \ No newline at end of file diff --git a/classes/Documentation/Markdown/MarkdownExtra.php b/classes/Documentation/Markdown/MarkdownExtra.php deleted file mode 100755 index 56f77336..00000000 --- a/classes/Documentation/Markdown/MarkdownExtra.php +++ /dev/null @@ -1,95 +0,0 @@ - $s) { - if (preg_match('/^ *-+: *$/', $s)) - $attr[$n] = $this->_doTable_makeAlignAttr('right'); - else if (preg_match('/^ *:-+: *$/', $s)) - $attr[$n] = $this->_doTable_makeAlignAttr('center'); - else if (preg_match('/^ *:-+ *$/', $s)) - $attr[$n] = $this->_doTable_makeAlignAttr('left'); - else - $attr[$n] = ''; - } - - // Parsing span elements, including code spans, character escapes, - // and inline HTML tags, so that pipes inside those gets ignored. - $head = $this->parseSpan($head); - $headers = preg_split('/ *[|] */', $head); - $col_count = count($headers); - $attr = array_pad($attr, $col_count, ''); - - foreach($headers as $n => $headerText) { - if (preg_match("/(.*){([0-9.]+(?:px|em|rem|vw|vh|%))}/", $headerText, $classMatches)) { - $attr[$n] .= " style='width:{$classMatches[2]}; max-width:{$classMatches[2]}'"; - $headers[$n] = $classMatches[1]; - } else if (preg_match("/(.*){([aA-zZ0-9-_ ]+)}/", $headerText, $classMatches)) { - $attr[$n] .= " class='{$classMatches[2]}'"; - $headers[$n] = $classMatches[1]; - } - } - - // Write column headers. - $text = "\n"; - $text .= "\n"; - $text .= "\n"; - foreach ($headers as $n => $header) - $text .= " " . $this->runSpanGamut(trim($header)) . "\n"; - $text .= "\n"; - $text .= "\n"; - - // Split content by row. - $rows = explode("\n", trim($content, "\n")); - - $text .= "\n"; - foreach ($rows as $row) { - // Parsing span elements, including code spans, character escapes, - // and inline HTML tags, so that pipes inside those gets ignored. - $row = $this->parseSpan($row); - - // Split row by cell. - $row_cells = preg_split('/ *[|] */', $row, $col_count); - $row_cells = array_pad($row_cells, $col_count, ''); - - $text .= "\n"; - foreach ($row_cells as $n => $cell) - $text .= " " . $this->runSpanGamut(trim($cell)) . "\n"; - $text .= "\n"; - } - $text .= "\n"; - $text .= "
    "; - - return $this->hashBlock($text) . "\n"; - } -} \ No newline at end of file diff --git a/classes/Storage/Driver/Backblaze/BackblazeStorage.php b/classes/Storage/Driver/Backblaze/BackblazeStorage.php index abfefa8e..4000bf4b 100755 --- a/classes/Storage/Driver/Backblaze/BackblazeStorage.php +++ b/classes/Storage/Driver/Backblaze/BackblazeStorage.php @@ -184,7 +184,11 @@ public function enabled() { return true; } - public function client() { + public function settingsError() { + return $this->settingsError; + } + + public function client() { if ($this->client == null) { $this->client = $this->getClient(); } diff --git a/classes/Storage/Driver/GoogleCloud/GoogleStorage.php b/classes/Storage/Driver/GoogleCloud/GoogleStorage.php index 202a4e73..584b2860 100755 --- a/classes/Storage/Driver/GoogleCloud/GoogleStorage.php +++ b/classes/Storage/Driver/GoogleCloud/GoogleStorage.php @@ -101,6 +101,7 @@ public function __construct() { $this->useBucketPolicyOnly = Environment::Option('mcloud-storage-bucket-policy-only', null, false); + $this->client = $this->getClient(); } //endregion @@ -135,6 +136,7 @@ public static function defaultDownloadUrl() { if (!filter_var($url, FILTER_VALIDATE_URL)) { $url = 'https://'.$url; } + return $url; } @@ -228,7 +230,11 @@ public function enabled() { return true; } - public function client() { + public function settingsError() { + return $this->settingsError; + } + + public function client() { if ($this->client == null) { $this->client = $this->getClient(); } @@ -305,29 +311,21 @@ public function copy($sourceKey, $destKey, $acl, $mime = false, $cacheControl = $sourceObject = $bucket->object($sourceKey); - if(!$this->usesBucketPolicyOnly()) { - try { - $sourceObject->copy($bucket,[ - 'name' => $destKey, - 'predefinedAcl' => self::GOOGLE_ACL[$acl], - 'metadata'=> [ - 'cacheControl' => $cacheControl - ] - ]); - } catch (\Exception $ex) { - StorageException::ThrowFromOther($ex); - } - } else { - try { - $sourceObject->copy($bucket,[ - 'name' => $destKey, - 'metadata'=> [ - 'cacheControl' => $cacheControl - ] - ]); - } catch (\Exception $ex) { - StorageException::ThrowFromOther($ex); + try { + $data = [ + 'name' => $destKey, + 'metadata'=> [ + 'cacheControl' => $cacheControl + ] + ]; + + if (!$this->usesBucketPolicyOnly()) { + $data['predefinedAcl'] = self::GOOGLE_ACL[$acl]; } + + $sourceObject->copy($bucket, $data); + } catch (\Exception $ex) { + StorageException::ThrowFromOther($ex); } } @@ -357,18 +355,18 @@ public function upload($key, $fileName, $acl, $cacheControl=null, $expires=null, try { Logger::startTiming("Start Upload", ['file' => $key]); - if(!$this->usesBucketPolicyOnly()) { - $object = $bucket->upload(fopen($fileName, 'r'),[ - 'name' => $key, - 'predefinedAcl' => self::GOOGLE_ACL[$acl], - 'metadata'=> $metadata - ]); - } else { - $object = $bucket->upload(fopen($fileName, 'r'),[ - 'name' => $key, - 'metadata'=> $metadata - ]); + + $data = [ + 'name' => $key, + 'metadata'=> $metadata + ]; + + if (!$this->usesBucketPolicyOnly()) { + $data['predefinedAcl'] = self::GOOGLE_ACL[$acl]; } + + $object = $bucket->upload(fopen($fileName, 'r'), $data); + Logger::endTiming("End Upload", ['file' => $key]); } catch (\Exception $ex) { Logger::error("Error uploading $fileName ...",['exception' => $ex->getMessage()]); @@ -435,17 +433,17 @@ public function createDirectory($key) { try { Logger::startTiming("Start Create Directory", ['file' => $key]); + + $data = [ + 'name' => $key + ]; + if (!$this->usesBucketPolicyOnly()) { - $object = $bucket->upload(null,[ - 'name' => $key, - 'predefinedAcl' => self::GOOGLE_ACL['public-read'] - ]); - } else { - $object = $bucket->upload(null,[ - 'name' => $key, - 'predefinedAcl' => self::GOOGLE_ACL['public-read'] - ]); + $data['predefinedAcl'] = self::GOOGLE_ACL['public-read']; } + + $bucket->upload(null, $data); + Logger::endTiming("End Create Directory", ['file' => $key]); return true; @@ -611,7 +609,7 @@ public function uploadUrl($key, $acl, $mimeType=null, $cacheControl = null, $exp $options['cacheControl'] = $cacheControl; } - if(!$this->usesBucketPolicyOnly()) { + if (!$this->usesBucketPolicyOnly()) { $options['predefinedAcl'] = self::GOOGLE_ACL[$acl]; } diff --git a/classes/Storage/Driver/S3/S3Storage.php b/classes/Storage/Driver/S3/S3Storage.php index 10cc6492..996e1465 100755 --- a/classes/Storage/Driver/S3/S3Storage.php +++ b/classes/Storage/Driver/S3/S3Storage.php @@ -29,6 +29,7 @@ use ILAB\MediaCloud\Utilities\NoticeManager; use ILABAmazon\Credentials\CredentialProvider; use ILABAmazon\Exception\AwsException; +use ILABAmazon\Exception\CredentialsException; use ILABAmazon\S3\PostObjectV4; use ILABAmazon\S3\S3Client; use ILABAmazon\S3\S3MultiRegionClient; @@ -217,10 +218,33 @@ public function validateSettings($errorCollector = null) { if($this->enabled()) { $client = $this->getClient($errorCollector); - if($client) { - if($client->doesBucketExist($this->bucket)) { - $valid = true; - } else { + if (!empty($client)) { + $connectError = false; + + try { + if($client->doesBucketExist($this->bucket)) { + $valid = true; + } + } catch (\Exception $ex) { + $connectError = true; + $valid = false; + + if ($errorCollector) { + if ($ex instanceof CredentialsException) { + if ($this->useCredentialProvider) { + $errorCollector->addError("Your Amazon credentials are invalid. You have enabled Use Credential Provider but it appears that isn't configured properly. Either turn off that setting and provide an access key and secret, or double check your credential provider setup."); + } else { + $errorCollector->addError("Your Amazon credentials are invalid. Verify that the access key, secret and bucket name are correct and try this test again."); + } + } else { + $errorCollector->addError("Error attempting to validate client settings. The error was: ".$ex->getMessage()); + } + } + + Logger::error("Error insuring bucket exists.", ['exception' => $ex->getMessage()]); + } + + if (empty($valid) && empty($connectError)) { try { Logger::info("Bucket does not exist, trying to list buckets."); @@ -242,10 +266,18 @@ public function validateSettings($errorCollector = null) { Logger::info("Bucket does not exist."); } - } - catch(AwsException $ex) { + } catch(AwsException $ex) { if ($errorCollector) { - $errorCollector->addError("Error insuring that {$this->bucket} exists. Message: ".$ex->getMessage()); + $adminUrl = admin_url('admin.php?page=media-cloud-settings&tab=storage'); + if ($ex->getAwsErrorCode() == 'SignatureDoesNotMatch') { + $errorCollector->addError("Your S3 credentials are invalid. It appears that the Secret you specified is invalid. Please double check your settings."); + } else if ($ex->getAwsErrorCode() == 'InvalidAccessKeyId') { + $errorCollector->addError("Your S3 credentials are invalid. It appears that the Access Key you specified is invalid. Please double check your settings."); + } else if ($ex->getAwsErrorCode() == 'AccessDenied') { + $errorCollector->addError("The Bucket you specified doesn't exist or you don't have access to it. You may have also specified the wrong Region. It's also possible that you don't have the correct permissions specified in your IAM policy. Please set the Region to Automatic and double check the Bucket Name in your settings."); + } else { + $errorCollector->addError($ex->getAwsErrorMessage()); + } } Logger::error("Error insuring bucket exists.", ['exception' => $ex->getMessage()]); @@ -277,17 +309,17 @@ public function enabled() { } if ($this->settingsError) { - $adminUrl = admin_url('admin.php?page=media-cloud-settings&tab=storage'); - $testUrl = admin_url('admin.php?page=media-tools-troubleshooter'); - NoticeManager::instance()->displayAdminNotice('error', "Your cloud storage settings are incorrect. Please verify your settings or run the systems test to troubleshoot the issue."); - return false; } return true; } - public function client() { + public function settingsError() { + return $this->settingsError; + } + + public function client() { if ($this->client == null) { $this->client = $this->getClient(); } @@ -380,7 +412,6 @@ protected function getS3MultiRegionClient() { } $s3 = new S3MultiRegionClient($config); - return $s3; } @@ -455,7 +486,6 @@ protected function getS3Client($region = false, $errorCollector = null) { } $s3 = new S3Client($config); - return $s3; } diff --git a/classes/Storage/StorageInterface.php b/classes/Storage/StorageInterface.php index 7d991ac3..70fe6d2e 100755 --- a/classes/Storage/StorageInterface.php +++ b/classes/Storage/StorageInterface.php @@ -93,6 +93,12 @@ public function usesSignedURLs(); */ public function enabled(); + /** + * Flag that indicates if the storage interface has a settings error which prevents it from working. + * @return bool + */ + public function settingsError(); + /** * Validates settings. * diff --git a/classes/Storage/StorageSettings.php b/classes/Storage/StorageSettings.php index 6672f05c..23911b18 100755 --- a/classes/Storage/StorageSettings.php +++ b/classes/Storage/StorageSettings.php @@ -16,6 +16,7 @@ namespace ILAB\MediaCloud\Storage; +use function ILAB\MediaCloud\Utilities\arrayPath; use ILAB\MediaCloud\Utilities\Environment; use ILAB\MediaCloud\Utilities\NoticeManager; use ILAB\MediaCloud\Utilities\Prefixer; @@ -63,6 +64,9 @@ final class StorageSettings { /** @var bool */ private $deleteOnUpload = false; + /** @var bool */ + private $queuedDeletes = true; + /** @var bool */ private $deleteFromStorage = false; @@ -76,8 +80,9 @@ final class StorageSettings { //region Constructor private function __construct() { - $this->deleteOnUpload = Environment::Option('mcloud-storage-delete-uploads'); - $this->deleteFromStorage = Environment::Option('mcloud-storage-delete-from-server'); + $this->deleteOnUpload = Environment::Option('mcloud-storage-delete-uploads', null, false); + $this->deleteFromStorage = Environment::Option('mcloud-storage-delete-from-server', null, false); + $this->queuedDeletes = Environment::Option('mcloud-storage-queue-deletes', null, true); $this->prefixFormat = Environment::Option('mcloud-storage-prefix', ''); $this->uploadImages = Environment::Option('mcloud-storage-upload-images', null, true); @@ -275,6 +280,11 @@ public static function deleteOnUpload() { return self::instance()->deleteOnUpload; } + /** @return bool */ + public static function queuedDeletes() { + return self::instance()->queuedDeletes; + } + /** @return bool */ public static function deleteFromStorage() { return self::instance()->deleteFromStorage; @@ -287,4 +297,203 @@ public static function alternativeFormatTypes() { return self::instance()->alternateFormatTypes; } //endregion + + //region Migration + + public static function migrateFromOtherPlugin() { + $beenHereBefore = get_option('mcloud-other-plugins-migrated'); + if (!empty($beenHereBefore)) { + return; + } + + $migratedFrom = null; + $migrated = false; + $statelessVersion = get_option('wp-stateless-current-version'); + if (!empty($statelessVersion)) { + $migrated = static::migrateStatelessSettings(); + $migratedFrom = 'WP-Stateless'; + } else { + $migrated = static::migrateOffloadSettings(); + $migratedFrom = 'WP Offload Media'; + } + + if (!empty($migrated)) { + Environment::UpdateOption('mcloud-tool-enabled-storage', true); + NoticeManager::instance()->displayAdminNotice('info', "Media Cloud noticed you were using {$migratedFrom} and has migrated your settings automatically. Everything should be working as before, but make sure to double check your Cloud Storage settings.", true, 'mcloud-migrated-other-plugin', 'forever'); + update_option('mcloud-other-plugins-did-migrate', $migratedFrom); + } + + update_option('mcloud-other-plugins-migrated', true); + } + + //endregion + + //region Stateless Migrations + + private static function migrateStatelessSettings() { + $jsonConfigData = get_option('sm_key_json'); + if (empty($jsonConfigData)) { + return false; + } + + $bucket = get_option('sm_bucket'); + if (empty($bucket)) { + return false; + } + + $mode = get_option('sm_mode', 'cdn'); + if ($mode === 'disabled') { + return false; + } + + Environment::UpdateOption('mcloud-storage-provider', 'google'); + Environment::UpdateOption('mcloud-storage-google-credentials', $jsonConfigData); + Environment::UpdateOption('mcloud-storage-google-bucket', $bucket); + + $deleteUploads = ($mode === 'stateless'); + if (!empty($deleteUploads)) { + Environment::UpdateOption("mcloud-storage-delete-uploads", true); + } + + $cdn = get_option('sm_custom_domain'); + if (!empty($cdn)) { + Environment::UpdateOption("mcloud-storage-cdn-base", $cdn); + } + + $uploadDir = trim(get_option('sm_root_dir'), '/'); + if (!empty($uploadDir)) { + Environment::UpdateOption("mcloud-storage-prefix", $uploadDir); + } + + $cacheControl = get_option('sm_cache_control'); + if (!empty($cacheControl)) { + Environment::UpdateOption("mcloud-storage-cache-control", $cacheControl); + } + + return true; + } + + //endregion + + //region Offload Migrations + + private static function migrateOffloadMiscSettings($offloadConfig) { + $deleteUploads = arrayPath($offloadConfig, 'remove-local-file', false); + $cdn = arrayPath($offloadConfig, 'cloudfront', null); + $prefix = arrayPath($offloadConfig, 'object-prefix', null); + $usePrefix = arrayPath($offloadConfig, 'enable-object-prefix', false); + + if (!empty($deleteUploads)) { + Environment::UpdateOption("mcloud-storage-delete-uploads", true); + } + + if (!empty($cdn)) { + Environment::UpdateOption("mcloud-storage-cdn-base", 'https://'.$cdn); + } + + if (!empty($prefix) && !empty($usePrefix)) { + $prefix = rtrim($prefix, '/'); + + $useYearMonth = arrayPath($offloadConfig, 'use-yearmonth-folders', false); + if (!empty($useYearMonth)) { + $prefix = trailingslashit($prefix).'@{date:Y/m}'; + } + + $useVersioning = arrayPath($offloadConfig, 'object-versioning', false); + if ($useVersioning) { + $prefix = trailingslashit($prefix).'@{versioning}'; + } + + Environment::UpdateOption("mcloud-storage-prefix", $prefix); + } + } + + private static function migrateOffload($provider, $key, $secret) { + $offloadConfig = get_option('tantan_wordpress_s3'); + $bucket = arrayPath($offloadConfig, 'bucket', null); + $region = arrayPath($offloadConfig, 'region', 'auto'); + if (empty($bucket)) { + return false; + } + + Environment::UpdateOption('mcloud-storage-provider', $provider); + Environment::UpdateOption("mcloud-storage-s3-access-key", $key); + Environment::UpdateOption("mcloud-storage-s3-secret", $secret); + Environment::UpdateOption("mcloud-storage-s3-bucket", $bucket); + + if ($provider === 'do') { + Environment::UpdateOption("mcloud-storage-s3-endpoint", "https://{$region}.digitaloceanspaces.com"); + } else { + Environment::UpdateOption("mcloud-storage-s3-region", $region); + } + + static::migrateOffloadMiscSettings($offloadConfig); + + return true; + } + + private static function migrateOffloadFromConfig($data) { + $provider = arrayPath($data, 'provider', null); + if (empty($provider) || !in_array($provider, ['aws', 'do', 'gcp'])) { + return false; + } + + $providerMap = ['aws' => 's3', 'do' => 'do', 'gcp' => 'google']; + $provider = $providerMap[$provider]; + + if ($provider !== 'google') { + $key = arrayPath($data, 'access-key-id'); + $secret = arrayPath($data, 'secret-access-key'); + + return static::migrateOffload($provider, $key, $secret); + } + + $keyPath = arrayPath($data, 'key-file-path', null); + if (!empty($keyPath) && file_exists($keyPath)) { + $googleConfig = file_get_contents($keyPath); + } else { + $googleConfigData = arrayPath($data, 'key-file', null); + if (empty($googleConfigData) || !is_array($googleConfigData)) { + return false; + } + + $googleConfig = json_encode($googleConfigData, JSON_PRETTY_PRINT); + } + + if (empty($googleConfig)) { + return false; + } + + $offloadConfig = get_option('tantan_wordpress_s3'); + $bucket = arrayPath($offloadConfig, 'bucket', null); + if (empty($bucket)) { + return false; + } + + Environment::UpdateOption('mcloud-storage-provider', 'google'); + Environment::UpdateOption('mcloud-storage-google-credentials', $googleConfig); + Environment::UpdateOption('mcloud-storage-google-bucket', $bucket); + + static::migrateOffloadMiscSettings($offloadConfig); + + return true; + } + + public static function migrateOffloadSettings() { + $migrated = false; + if (defined('AS3CF_SETTINGS')) { + $data = unserialize(constant('AS3CF_SETTINGS')); + if (!empty($data)) { + $migrated = static::migrateOffloadFromConfig($data); + } + } else { + $offloadConfig = get_option('tantan_wordpress_s3'); + if (!empty($offloadConfig)) { + $migrated = static::migrateOffloadFromConfig($offloadConfig); + } + } + + return $migrated; + } + //endregion } \ No newline at end of file diff --git a/classes/Tasks/AsyncRequest.php b/classes/Tasks/AsyncRequest.php deleted file mode 100755 index af52904e..00000000 --- a/classes/Tasks/AsyncRequest.php +++ /dev/null @@ -1,163 +0,0 @@ -identifier = $this->prefix . '_' . $this->action; - - add_action( 'wp_ajax_' . $this->identifier, array( $this, 'maybe_handle' ) ); - add_action( 'wp_ajax_nopriv_' . $this->identifier, array( $this, 'maybe_handle' ) ); - } - - /** - * Set data used during the request - * - * @param array $data Data. - * - * @return $this - */ - public function data( $data ) { - $this->data = $data; - - return $this; - } - - /** - * Dispatch the async request - * - * @return array|WP_Error - */ - public function dispatch() { - $url = add_query_arg( $this->get_query_args(), $this->get_query_url() ); - $args = $this->get_post_args(); - - return BatchManager::postRequest($url, $args); - } - - /** - * Get query args - * - * @return array - */ - protected function get_query_args() { - if ( property_exists( $this, 'query_args' ) ) { - return $this->query_args; - } - - return array( - 'action' => $this->identifier, - 'nonce' => wp_create_nonce( $this->identifier ), - ); - } - - /** - * Get query URL - * - * @return string - */ - protected function get_query_url() { - if ( property_exists( $this, 'query_url' ) ) { - return $this->query_url; - } - - return admin_url( 'admin-ajax.php' ); - } - - /** - * Get post args - * - * @return array - */ - protected function get_post_args() { - if ( property_exists( $this, 'post_args' ) ) { - return $this->post_args; - } - - return array( - 'blocking' => false, - 'body' => $this->data, - 'cookies' => $_COOKIE, - ); - } - - /** - * Maybe handle - * - * Check for correct nonce and pass to handler. - */ - public function maybe_handle() { - $check = check_ajax_referer( $this->identifier, 'nonce', false ); - - Logger::info( "Maybe handle, check nonce: " . (($check) ? 'true' : 'false')); - - if (!$check) { - wp_die(); - } - - $this->handle(); - - wp_die(); - } - - /** - * Handle - * - * Override this method to perform any actions required - * during the async request. - */ - abstract protected function handle(); - -} diff --git a/classes/Tasks/AttachmentTask.php b/classes/Tasks/AttachmentTask.php new file mode 100755 index 00000000..45bc19a1 --- /dev/null +++ b/classes/Tasks/AttachmentTask.php @@ -0,0 +1,128 @@ +currentItemID = $post_id; + + $file = get_attached_file($post_id); + if (empty($file)) { + $this->currentFile = null; + } else { + $this->currentFile = basename($file); + } + + $this->currentTitle = get_post_field('post_title', $post_id); + + $thumb = wp_get_attachment_image_src($post_id, 'thumbnail', true); + if (!empty($thumb)) { + $this->currentThumb = $thumb[0]; + $this->isIcon = (($thumb[1] != 150) && ($thumb[2] != 150)); + } else { + $this->currentThumb = null; + $this->isIcon = false; + } + + $this->save(); + } + + /** + * Add any additional \WP_Query post arguments to the query + * + * @param $args + * + * @return array + */ + protected function filterPostArgs($args) { + return $args; + } + + /** + * @param array $options + * @param array $selectedItems + * + * @return array|bool + */ + public function prepare($options = [], $selectedItems = []) { + Logger::info("Preparing attachment task"); + + if (!empty($options['selected-items'])) { + $selectedItems = explode(',', $options['selected-items']); + } + + $this->options = $options; + + if (!empty($selectedItems) && is_array($selectedItems)) { + foreach($selectedItems as $postId) { + $this->addItem(['id' => $postId]); + } + } else { + $args = [ + 'post_type' => 'attachment', + 'post_status' => 'inherit', + 'posts_per_page' => 100, + 'fields' => 'ids' + ]; + + if (!empty($options['sort-order']) && ($options['sort-order'] != 'default')) { + if (in_array($options['sort-order'], ['date-asc', 'date-desc', 'title-asc', 'title-desc'])) { + $parts = explode('-', $options['sort-order']); + $args['orderby'] = $parts[0]; + $args['order'] = strtoupper($parts[1]); + } else if (in_array($options['sort-order'], ['filename-asc', 'filename-desc'])) { + $args['meta_key'] = '_wp_attached_file'; + $args['orderby'] = 'meta_value'; + $args['order'] = ($options['sort-order'] == 'filename-asc') ? 'ASC' : 'DESC'; + } + } + + + + if (isset($options['limit'])) { + $args['posts_per_page'] = $options['limit']; + if (isset($assoc_args['offset'])) { + $args['offset'] = $options['offset']; + } + } else { + $args['nopaging'] = true; + } + + $args['post_mime_type'] = StorageSettings::allowedMimeTypes(); + + $args = $this->filterPostArgs($args); + + $query = new \WP_Query($args); + $postIds = $query->posts; + foreach($postIds as $postId) { + $this->addItem(['id' => $postId]); + } + } + + Logger::info("Added {$this->totalItems} to the task."); + return ($this->totalItems > 0); + } + +} \ No newline at end of file diff --git a/classes/Tasks/BackgroundProcess.php b/classes/Tasks/BackgroundProcess.php deleted file mode 100755 index 6283b6ab..00000000 --- a/classes/Tasks/BackgroundProcess.php +++ /dev/null @@ -1,624 +0,0 @@ -cron_hook_identifier = $this->identifier . '_cron'; - $this->cron_interval_identifier = $this->identifier . '_cron_interval'; - - add_action( $this->cron_hook_identifier, array( $this, 'handle_cron_healthcheck' ) ); - add_filter( 'cron_schedules', array( $this, 'schedule_cron_healthcheck' ) ); - } - - /** - * Dispatch - * - * @access public - * @return void - */ - public function dispatch() { - // Schedule the cron healthcheck. - $this->schedule_event(); - - // Perform remote post. - parent::dispatch(); - } - - /** - * Push to queue - * - * @param mixed $data Data. - * - * @return $this - */ - public function push_to_queue( $data ) { - $this->data[] = $data; - - return $this; - } - - /** - * Save queue - * - * @return $this - */ - public function save() { - $key = $this->generate_key(); - - if ( ! empty( $this->data ) ) { - $totalChunks = ceil(count($this->data) / $this->chunk_size_limit); - - for($i = 0; $i < $totalChunks; $i++) { - $chunk = array_slice($this->data, $i * $this->chunk_size_limit, $this->chunk_size_limit); - update_site_option('__'.$key.'_chunk_'.$i, $chunk); - } - -// Logger::info( "Saving queue: $key", $this->data); - update_site_option( $key, [ - 'status' => 'running', - 'current_chunk' => 0, - 'total_chunks' => $totalChunks - ]); - } - - return $this; - } - - /** - * Update queue - * - * @param string $key Key. - * @param array $data Data. - * - * @return $this - */ - public function update( $key, $status, $data ) { - if ( ! empty( $data ) ) { - $currentChunk = $status['current_chunk']; - Logger::info("Updating chunk data for index $currentChunk. New size: ".count($data)); - update_site_option( '__'.$key.'_chunk_'.$currentChunk, $data); - } else { - Logger::info("No update, proccessing next chunk."); - return $this->next_chunk($key, $status); - } - - return $this; - } - - /** - * Update queue - * - * @param string $key Key. - * @param array $data Data. - * - * @return $this - */ - public function next_chunk( $key, $status ) { - $currentChunk = $status['current_chunk']; - delete_site_option( '__'.$key.'_chunk_'.$currentChunk); - - $currentChunk++; - if ($currentChunk >= $status['total_chunks']) { - Logger::info("All chunks processed."); - $status['status'] = 'finished'; - $this->delete($key, $status); - } else { - Logger::info("Update batch status: {$currentChunk}"); - $status['current_chunk'] = $currentChunk; - update_site_option( $key, $status ); - } - - //$this->delete( $batch->key ); - - - return $this; - } - - /** - * Delete queue - * - * @param string $key Key. - * - * @return $this - */ - public function delete( $key, $status ) { - $totalChunks = $status['total_chunks']; - for($i = 0; $i < $totalChunks; $i++) { - delete_site_option('__'.$key.'_chunk_'.$i); - } - - delete_site_option( $key ); - - return $this; - } - - /** - * Generate key - * - * Generates a unique key based on microtime. Queue items are - * given a unique key so that they can be merged upon save. - * - * @param int $length Length. - * - * @return string - */ - protected function generate_key( $length = 64 ) { - $unique = md5( microtime() . rand() ); - $prepend = $this->identifier . '_batch_'; - - return substr( $prepend . $unique, 0, $length ); - } - - /** - * Maybe process queue - * - * Checks whether data exists within the queue and that - * the process is not already running. - */ - public function maybe_handle() { - if ( $this->is_process_running() ) { - // Background process already running. - wp_die(); - } - - if ( $this->is_queue_empty() ) { - // No data to process. - wp_die(); - } - - Logger::info("Maybe handle {$this->identifier}"); - - check_ajax_referer( $this->identifier, 'nonce' ); - - if (is_callable('fastcgi_finish_request')) { - ignore_user_abort(true); - fastcgi_finish_request(); - } - - $this->handle(); - - wp_die(); - } - - protected function forceOutput() { - ini_set('output_buffering', 'off'); - ini_set('zlib.output_compression', false); - - ini_set('implicit_flush', true); - ob_implicit_flush(true); - for($i = 0; $i < 1000; $i++) { - echo "\n"; - } - } - - /** - * Is queue empty - * - * @return bool - */ - protected function is_queue_empty() { - global $wpdb; - - $table = $wpdb->options; - $column = 'option_name'; - - if ( is_multisite() ) { - $table = $wpdb->sitemeta; - $column = 'meta_key'; - } - - $key = $this->identifier . '_batch_%'; - - $count = $wpdb->get_var( $wpdb->prepare( " - SELECT COUNT(*) - FROM {$table} - WHERE {$column} LIKE %s - ", $key ) ); - - return ( $count > 0 ) ? false : true; - } - - /** - * Is process running - * - * Check whether the current process is already running - * in a background process. - */ - protected function is_process_running() { - $lockData = get_option($this->identifier . '_process_lock', null); - - if (!empty($lockData) || isset($lockData['expires'])) { - if (time() <= $lockData['expires']) { - Logger::info('Lock still active. Expires in: '.($lockData['expires'] - time())); - - return true; - } else { - Logger::info("Lock expired"); - } - } - - if (!empty($lockData)) { - delete_option($this->identifier . '_process_lock'); - } else { - Logger::info('No lock data.'); - } - - return false; - } - - /** - * Lock process - * - * Lock the process so that multiple instances can't run simultaneously. - * Override if applicable, but the duration should be greater than that - * defined in the time_exceeded() method. - */ - protected function lock_process() { - Logger::info( "Locking process {$this->identifier}"); - $this->start_time = time(); // Set start time of current process. - - $lock_duration = ( property_exists( $this, 'queue_lock_time' ) ) ? $this->queue_lock_time : 60; // 1 minute - $lock_duration = apply_filters( $this->identifier . '_queue_lock_time', $lock_duration ); - - update_option($this->identifier . '_process_lock', ['time' => microtime(), 'expires' => time() + $lock_duration]); - } - - /** - * Unlock process - * - * Unlock the process so that other instances can spawn. - * - * @return $this - */ - protected function unlock_process() { - Logger::info( "Unlocking process {$this->identifier}"); - - delete_option($this->identifier . '_process_lock'); - - return $this; - } - - /** - * Get batch - * - * @return stdClass Return the first batch from the queue - */ - protected function get_batch() { - global $wpdb; - - $table = $wpdb->options; - $column = 'option_name'; - $key_column = 'option_id'; - $value_column = 'option_value'; - - if ( is_multisite() ) { - $table = $wpdb->sitemeta; - $column = 'meta_key'; - $key_column = 'meta_id'; - $value_column = 'meta_value'; - } - - $key = $this->identifier . '_batch_%'; - - $query = $wpdb->get_row( $wpdb->prepare( " - SELECT * - FROM {$table} - WHERE {$column} LIKE %s - ORDER BY {$key_column} ASC - LIMIT 1 - ", $key ) ); - - $batch = new \stdClass(); - $batch->key = $query->$column; - $batch->status = unserialize($query->$value_column); - Logger::info($query->$value_column); - - if ($batch->status['status'] == 'running') { - $currentChunk = $batch->status['current_chunk']; - $batch->data = get_site_option( '__'.$batch->key.'_chunk_'.$currentChunk); - } else { - $batch->data = []; - } - - return $batch; - } - - protected function shouldHandle() { - return true; - } - - /** - * Handle - * - * Pass each queue item to the task handler, while remaining - * within server memory and time limit constraints. - */ - protected function handle() { - $this->lock_process(); - - $shouldCancelAll = false; - - do { - $batch = $this->get_batch(); - - if ((count($batch->data) == 0) || (!$this->shouldHandle())) { - $shouldCancelAll = true; - Logger::info( "No batch to process", $batch); - break; - } - - Logger::info( "Processing Batch", $batch->status); - foreach ( $batch->data as $key => $value ) { - if ($this->shouldHandle()) { -// Logger::info( "Running task", $value); - - $task = $this->task( $value ); - - if ( false !== $task ) { - $batch->data[ $key ] = $task; - } else { - unset( $batch->data[ $key ] ); - } - - if ( $this->time_exceeded() || $this->memory_exceeded() ) { - // Batch limits reached. - break; - } - } - } - - // Update or delete current batch. - if ( ! empty( $batch->data ) ) { - $this->update( $batch->key, $batch->status, $batch->data ); - } else { - Logger::info("Current chunk empty, proccessing next chunk."); - $this->next_chunk( $batch->key, $batch->status ); - } - } while ( ! $this->time_exceeded() && ! $this->memory_exceeded() && ! $this->is_queue_empty() ); - - $this->unlock_process(); - - if ($shouldCancelAll) { - $this->complete(); - static::cancelAll(); - } else { - if ( ! $this->is_queue_empty() ) { - $this->dispatch(); - } else { - $this->complete(); - } - } - - wp_die(); - } - - /** - * Memory exceeded - * - * Ensures the batch process never exceeds 90% - * of the maximum WordPress memory. - * - * @return bool - */ - protected function memory_exceeded() { - $memory_limit = $this->get_memory_limit() * 0.9; // 90% of max memory - $current_memory = memory_get_usage( true ); - $return = false; - - if ( $current_memory >= $memory_limit ) { - $return = true; - } - - return apply_filters( $this->identifier . '_memory_exceeded', $return ); - } - - /** - * Get memory limit - * - * @return int - */ - protected function get_memory_limit() { - if ( function_exists( 'ini_get' ) ) { - $memory_limit = ini_get( 'memory_limit' ); - } else { - // Sensible default. - $memory_limit = '128M'; - } - - if ( ! $memory_limit || -1 === $memory_limit ) { - // Unlimited, set to 32GB. - $memory_limit = '32000M'; - } - - return intval( $memory_limit ) * 1024 * 1024; - } - - /** - * Time exceeded. - * - * Ensures the batch never exceeds a sensible time limit. - * A timeout limit of 30s is common on shared hosting. - * - * @return bool - */ - protected function time_exceeded() { - $finish = $this->start_time + apply_filters( $this->identifier . '_default_time_limit', 20 ); // 20 seconds - $return = false; - - if ( time() >= $finish ) { - $return = true; - } - - return apply_filters( $this->identifier . '_time_exceeded', $return ); - } - - /** - * Complete. - * - * Override if applicable, but ensure that the below actions are - * performed, or, call parent::complete(). - */ - protected function complete() { - // Unschedule the cron healthcheck. - $this->clear_scheduled_event(); - } - - /** - * Schedule cron healthcheck - * - * @access public - * @param mixed $schedules Schedules. - * @return mixed - */ - public function schedule_cron_healthcheck( $schedules ) { - $interval = apply_filters( $this->identifier . '_cron_interval', 5 ); - - if ( property_exists( $this, 'cron_interval' ) ) { - $interval = apply_filters( $this->identifier . '_cron_interval', $this->cron_interval_identifier ); - } - - // Adds every 5 minutes to the existing schedules. - $schedules[ $this->identifier . '_cron_interval' ] = array( - 'interval' => MINUTE_IN_SECONDS * $interval, - 'display' => sprintf( __( 'Every %d Minutes' ), $interval ), - ); - - return $schedules; - } - - /** - * Handle cron healthcheck - * - * Restart the background process if not already running - * and data exists in the queue. - */ - public function handle_cron_healthcheck() { - if ( $this->is_process_running() ) { - // Background process already running. - exit; - } - - if ( $this->is_queue_empty() ) { - // No data to process. - $this->clear_scheduled_event(); - exit; - } - - $this->handle(); - - exit; - } - - /** - * Schedule event - */ - protected function schedule_event() { - if ( ! wp_next_scheduled( $this->cron_hook_identifier ) ) { - wp_schedule_event( time(), $this->cron_interval_identifier, $this->cron_hook_identifier ); - } - } - - /** - * Clear scheduled event - */ - protected function clear_scheduled_event() { - $timestamp = wp_next_scheduled( $this->cron_hook_identifier ); - - if ( $timestamp ) { - wp_unschedule_event( $timestamp, $this->cron_hook_identifier ); - } - } - - /** - * Cancel Process - * - * Stop processing queue items, clear cronjob and delete batch. - * - */ - public function cancel_process() { - if ( ! $this->is_queue_empty() ) { - $batch = $this->get_batch(); - - $this->delete( $batch->key, $batch->status ); - - wp_clear_scheduled_hook( $this->cron_hook_identifier ); - } - - } - - /** - * Task - * - * Override this method to perform any actions required on each - * queue item. Return the modified item for further processing - * in the next pass through. Or, return false to remove the - * item from the queue. - * - * @param mixed $item Queue item to iterate over. - * - * @return mixed - */ - abstract public function task( $item ); - - /** - * Override in subclasses to handle this process being cancelled. - */ - public static function cancelAll() { - } -} \ No newline at end of file diff --git a/classes/Tasks/BatchManager.php b/classes/Tasks/BatchManager.php deleted file mode 100755 index b46364ff..00000000 --- a/classes/Tasks/BatchManager.php +++ /dev/null @@ -1,745 +0,0 @@ -dispatchBatchesIfNeeded(); - } else { - add_filter('cron_schedules', function($schedules) { - if (isset($schedules['1min'])) { - return $schedules; - } - - $schedules['1min'] = [ - 'interval' => 60, - 'display' => 'Once every minute' - ]; - - return $schedules; - }); - - add_action('ilab_media_tools_run_batch_hook', function(){ - BatchManager::instance()->dispatchBatchesIfNeeded(); - }); - - if (!wp_next_scheduled('ilab_media_tools_run_batch_hook')) { - wp_schedule_event(time(), '1min', 'ilab_media_tools_run_batch_hook'); - } - } - }); - } - - //endregion - - //region Properties - - public function setStartTime($batch) { - update_option("ilab_media_tools_{$batch}_start_time", microtime(true)); - } - - public function startTime($batch) { - return get_option("ilab_media_tools_{$batch}_start_time", microtime(true)); - } - - /** - * Returns the current status (true = running, false = not running) for a given batch - * @param string $batch - * @return bool - */ - public function status($batch) { - return get_option("ilab_media_tools_{$batch}_status", false); - } - - /** - * Sets the status for a given batch - * @param string $batch - * @param bool $status - */ - public function setStatus($batch, $status) { - update_option("ilab_media_tools_{$batch}_status", $status); - } - - /** - * Returns the index of the item currently being processed - * @param $batch - * @return int - */ - public function current($batch) { - return get_option("ilab_media_tools_{$batch}_current", 0); - } - - /** - * Sets the current index being processed - * @param $batch - * @param int $index - */ - public function setCurrent($batch, $index) { - update_option("ilab_media_tools_{$batch}_current", $index); - } - - /** - * Sets the current thumbnail of the file being processed - * @param $batch - * @param array $thumbUrl - */ - public function setCommandLineThumb($batch, $thumbUrl) { - update_option("ilab_media_tools_{$batch}_command_line_thumb", $thumbUrl); - } - - /** - * Returns the ID of the item currently being processed - * @param $batch - * @return int|null - */ - public function currentID($batch) { - return get_option("ilab_media_tools_{$batch}_current_id", 0); - } - - /** - * Sets the current index being processed - * @param $batch - * @param int $index - */ - public function setCurrentID($batch, $id) { - update_option("ilab_media_tools_{$batch}_current_id", $id); - } - - - /** - * Sets the current key being processed - * @param $batch - * @param string|null $key - */ - public function setCurrentKey($batch, $key) { - update_option("ilab_media_tools_{$batch}_current_key", $key); - } - - /** - * Returns the key of the item currently being processed - * @param $batch - * @return string|null - */ - public function currentKey($batch) { - return get_option("ilab_media_tools_{$batch}_current_key", null); - } - - /** - * Returns the file name of the current item being processed - * @param $batch - * @return string|null - */ - public function currentFile($batch) { - return get_option("ilab_media_tools_{$batch}_file"); - } - - /** - * Sets the current file being processed - * @param $batch - * @param string|null $file - */ - public function setCurrentFile($batch, $file) { - $this->setLastUpdateToNow($batch); - update_option("ilab_media_tools_{$batch}_file", $file); - } - - public function currentThumbUrl($batch) { - return get_option("ilab_media_tools_{$batch}_thumb_url"); - } - - public function setCurrentThumbUrl($batch, $url) { - update_option("ilab_media_tools_{$batch}_thumb_url", $url); - } - - public function currentThumbIsIcon($batch) { - return get_option("ilab_media_tools_{$batch}_is_icon"); - } - - public function setCurrentThumbIsIcon($batch, $isIcon) { - update_option("ilab_media_tools_{$batch}_is_icon", $isIcon); - } - - /** - * Sets the time the last task update occurred - * @param $batch - */ - public function setLastUpdateToNow($batch) { - update_option("ilab_media_tools_{$batch}_last_update", microtime(true)); - } - - /** - * Returns the count of items in this batch being processed - * @param $batch - * @return int - */ - public function totalCount($batch) { - return get_option("ilab_media_tools_{$batch}_total", 0); - } - - /** - * Sets the count of total items to be processed by this batch - * @param $batch - * @param int $count - */ - public function setTotalCount($batch, $count) { - update_option("ilab_media_tools_{$batch}_total", $count); - } - - /** - * Returns a bool flag determining if this batch should stop processing. - * @param $batch - * @return bool - */ - public function shouldCancel($batch) { - return get_option("ilab_media_tools_{$batch}_should_cancel", false); - } - - /** - * Sets the flag determining if this batch should be cancelled - * @param $batch - * @param $cancel - */ - public function setShouldCancel($batch, $cancel) { - update_option("ilab_media_tools_{$batch}_should_cancel", $cancel); - } - - /** - * Returns the time this batch was last run - * @param $batch - * @return int - */ - public function lastRun($batch) { - return get_option("ilab_media_tools_{$batch}_last_run", time()); - } - - /** - * Sets the time this batch was last run - * @param $batch - * @param $time - */ - public function setLastRun($batch, $time) { - update_option("ilab_media_tools_{$batch}_last_run", $time); - } - - /** - * Sets the time this batch was last run to the current time - * @param $batch - */ - public function setLastRunToNow($batch) { - $this->setLastRun($batch, time()); - } - - /** - * Returns the amount of time the last item took to process in seconds - * @param $batch - * @return float - */ - public function lastTime($batch) { - return get_option("ilab_media_tools_{$batch}_last_time", 0); - } - - /** - * Returns the total processing time for this batch - * @param $batch - * @return float - */ - public function totalTime($batch) { - return get_option("ilab_media_tools_{$batch}_total_time", 0); - } - - /** - * Increments the total processing time for the batch - * @param $batch - * @param float $lastTime - */ - public function incrementTotalTime($batch, $lastTime) { - update_option("ilab_media_tools_{$batch}_last_time", $lastTime); - update_option("ilab_media_tools_{$batch}_total_time", $this->totalTime($batch) + $lastTime); - } - - /** - * Sets the current error - * @param $batch - * @param $error - */ - public function setErrorMessage($batch, $error) { - update_option("ilab_media_tools_{$batch}_error_id", $batch.'-error-'.sanitize_title(microtime(true)).'-forever'); - update_option("ilab_media_tools_{$batch}_error_message", $error); - } - - /** - * Returns the current error message - * @param $batch - * @return mixed|void - */ - public function errorMessage($batch) { - return get_option("ilab_media_tools_{$batch}_error_message", null); - } - - /** - * Returns the current message id - * - * @param $batch - * @return mixed|void - */ - public function errorMessageId($batch) { - return get_option("ilab_media_tools_{$batch}_error_id", null); - } - - /** - * Returns the amount of time that has elapsed since the last item was processed. - * @param $batch - * @return float - */ - public function lastUpdate($batch) { - $lu = get_option("ilab_media_tools_{$batch}_last_update", 0); - if ($lu > 0) { - $lu = microtime(true) - $lu; - } - - return $lu; - } - - /** - * Returns the amount of time that has elapsed since the last item was processed. - * @param $batch - * @return float - */ - public function lastCommandLineThumb($batch) { - return get_option("ilab_media_tools_{$batch}_command_line_thumb", false); - } - - //endregion - - /** - * Returns stats about this batch - * - * @param $batch - * @return array - */ - public function stats($batch) { - $total = $this->totalCount($batch); - $current = $this->current($batch); - $totalTime = $this->totalTime($batch); - - $progress = 0; - if ($total > 0) { - $progress = ($current / $total) * 100; - } - - $postsPerMinute = 0; - $postsPerSecond = 0; - $eta = 0; - if (($totalTime > 0) && ($current > 1)) { - $postsPerSecond = ($totalTime / ($current - 1)); - if ($postsPerSecond > 0) { - $postsPerMinute = 60 / $postsPerSecond; - $eta = ($total - $current) / $postsPerMinute; - } - } - - - - $thumbUrl = null; - $icon = false; - - if (!empty($this->currentThumbUrl($batch))) { - $thumbUrl = $this->currentThumbUrl($batch); - $icon = $this->currentThumbIsIcon($batch); - } - else if (!empty($this->currentID($batch))) { - $commandLine = Environment::Option("mcloud-{$batch}-batch-command-line-processing", null, false); - - $found = false; - if ($commandLine) { - $thumbData = $this->lastCommandLineThumb($batch); - if (!empty($thumbData)) { - $thumbUrl = $thumbData['thumbUrl']; - $icon = $thumbData['icon']; - - $found = true; - } - } - - if (!$found) { - $thumb = wp_get_attachment_image_src($this->currentID($batch), 'thumbnail', true); - if (!empty($thumb)) { - $thumbUrl = $thumb[0]; - $icon = (($thumb[1] != 150) && ($thumb[2] != 150)); - } - } - } - - return [ - 'running' => $this->status($batch), - 'current' => $current, - 'currentID' => $this->currentID($batch), - 'currentKey' => $this->currentKey($batch), - 'thumb' => $thumbUrl, - 'icon' => $icon, - 'currentFile' => $this->currentFile($batch), - 'total' => $total, - 'totalTime' => microtime(true) - $this->startTime($batch), - 'lastTime' => $this->lastTime($batch), - 'lastRun' => $this->lastRun($batch), - 'lastUpdate' => $this->lastUpdate($batch), - 'eta' => $eta, - 'progress' => $progress, - 'postsPerMinute' => $postsPerMinute, - 'postsPerSecond' => $postsPerSecond, - 'shouldCancel' => $this->shouldCancel($batch) - ]; - } - - /** - * Display any error for a batch - * @param $batch - */ - public function displayAnyErrors($batch) { - $error = $this->errorMessage($batch); - - if (!empty($error)) { - NoticeManager::instance()->displayAdminNotice('error', $error, true, $this->errorMessageId($batch)); - } - } - - /** - * Removes an stored information about the batch - * @param $batch - */ - public function reset($batch) { - Environment::DeleteOption('mcloud-storage-batch-command-line-processing'); - - delete_option("ilab_media_tools_{$batch}_start_time"); - delete_option("ilab_media_tools_{$batch}_status"); - delete_option("ilab_media_tools_{$batch}_current"); - delete_option("ilab_media_tools_{$batch}_current_id"); - delete_option("ilab_media_tools_{$batch}_current_key"); - delete_option("ilab_media_tools_{$batch}_file"); - delete_option("ilab_media_tools_{$batch}_total"); - delete_option("ilab_media_tools_{$batch}_last_run"); - delete_option("ilab_media_tools_{$batch}_total_time"); - delete_option("ilab_media_tools_{$batch}_last_time"); - delete_option("ilab_media_tools_{$batch}_last_update"); - delete_option("ilab_media_tools_{$batch}_thumb_url"); - delete_option("ilab_media_tools_{$batch}_is_icon"); - delete_option("ilab_media_tools_{$batch}_command_line_thumb"); - } - - /** - * Adds posts to a batch. If another one of this batch type is running, it will be cancelled. - * @param $batch - * @param $postIDs - */ - public function addToBatch($batch, $postIDs) { - - } - - /** - * Adds posts to a batch and runs it. If another one of this batch type is running, it will be cancelled. - * @param string $batch - * @param array $postIDs - * @param array|null $options - * @throws \Exception - */ - public function addToBatchAndRun($batch, $postIDs, $options = null) { - if (!isset(static::$batchClasses[$batch])) { - throw new \Exception("Batch '$batch' is not registered."); - } - - $this->reset($batch); - - if (count($postIDs) == 0) { - return; - } - - Logger::info("Testing connectivity."); - $testResult = $this->testConnectivity(null, 3); - Logger::info("Finished Testing connectivity."); - if ($testResult !== true) { - $error = 'Unknown'; - - if ($testResult instanceof \Exception) { - $error = $testResult->getMessage(); - } else { - $error = 'HTTP response code was '.$testResult->getStatusCode(); - } - - $storageSettingsURL = admin_url('admin.php?page=media-cloud-settings&tab=batch-processing'); - if (strpos($error, 'SSL') !== false) { - $hint = "Try changing the Verify SSL in Batch Processing Settings to No to see if that helps."; - } else { - $hint = "Try changing the Connection Timeout in Batch Processing Settings to a higher number like 0.1 or 1 to see if that helps."; - } - $message = "There was an error attempting to run your batch. $hint The actual error was: $error"; - $this->setErrorMessage($batch, $message); - - throw new \Exception($message); - } - - $firstPostFile = get_attached_file($postIDs[0]); - $fileName = basename($firstPostFile); - - $this->setStartTime($batch); - $this->setCurrent($batch, 1); - $this->setTotalCount($batch, count($postIDs)); - $this->setCurrentFile($batch, $fileName); - $this->setShouldCancel($batch, false); - $this->setStatus($batch, true); - - /** @var BackgroundProcess $batchProcess */ - $batchProcess = new static::$batchClasses[$batch](); - - $index = 0; - foreach($postIDs as $postID) { - $details = ['index' => $index, 'post' => $postID, 'options' => (empty($options)) ? [] : $options]; - $batchProcess->push_to_queue($details); - $index++; - } - - $batchProcess->save(); - $batchProcess->dispatch(); - - $this->setLastRun($batch, time()); - } - - /** - * Determines if enough time has elapsed since the last time the batch was "forced" to run and then runs it if so - */ - public function dispatchBatchesIfNeeded() { - foreach(static::$batchClasses as $batch => $batchClass) { - if ($this->status($batch)) { - $lastRun = $this->lastRun($batch); - - if ((time() - $lastRun) > 60) { - $this->setLastRun($batch, time()); - - /** @var BackgroundProcess $process */ - $process = new $batchClass(); - $process->dispatch(); - } - } - } - } - - /** - * Posts a background processing request - * - * @param $url - * @param $args - * - * @return bool|\Exception|ResponseInterface - */ - public static function postRequest($url, $args, $timeoutOverride = false) { - $verifySSL = Environment::Option('mcloud-storage-batch-verify-ssl', null, 'default'); - $connectTimeout = Environment::Option('mcloud-storage-batch-connect-timeout', null, 0.01); - $timeout = Environment::Option('mcloud-storage-batch-timeout', null, 0.01); - $skipDNS = Environment::Option('mcloud-storage-batch-skip-dns', null, false); - - if ($skipDNS) { - $ip = getHostByName(getHostName()); - if (empty($ip)) { - $ip = $_SERVER['SERVER_ADDR']; - } - - if (empty($ip)) { - $ip = '127.0.0.1'; - } - - $host = parse_url($url, PHP_URL_HOST); - $url = str_replace($host, $ip, $url); - - $headers = [ - 'Host' => $host - ]; - - if (isset($args['headers'])) { - $args['headers'] = array_merge($args['headers'], $headers); - } else { - $args['headers'] = $headers; - } - - $cookies = CookieJar::fromArray($args['cookies'], $ip); - } else { - $cookies = CookieJar::fromArray($args['cookies'], $_SERVER['HTTP_HOST']); - } - - if ($verifySSL == 'default') { - $verifySSL = apply_filters( 'https_local_ssl_verify', true); - } else { - $verifySSL = ($verifySSL == 'yes'); - } - - $rawUrl = esc_url_raw( $url ); - - $options = [ - 'synchronous' => !empty($args['blocking']), - 'cookies' => $cookies, - 'verify' => $verifySSL - ]; - - if (isset($args['body'])) { - if (is_array($args['body'])) { - $options['form_params'] = $args['body']; - } else { - $options['body'] = $args['body']; - } - } - - if (!empty($headers)) { - $options['headers'] = $headers; - } - - if ($timeoutOverride !== false) { - $options['timeout'] = $timeoutOverride; - $options['connect_timeout'] = $timeoutOverride; - } else { - $options['timeout'] = max(0.01, $timeout); - $options['connect_timeout'] = max(0.01, $connectTimeout);; - } - - $client = new Client(); - try { - if (empty($options['synchronous'])) { - Logger::info("Async call to $rawUrl"); - $options['synchronous'] = true; - $client->postSync($rawUrl, $options); - Logger::info("Async call to $rawUrl complete."); - return true; - } else { - Logger::info("Synchronous call to $rawUrl"); - $result = $client->post($rawUrl, $options); - Logger::info("Synchronous call to $rawUrl complete."); - return $result; - } - } catch (\Exception $ex) { - if (!empty($args['blocking'])) { - return $ex; - } else { - Logger::info("Async exception: ".$ex->getMessage()); - } - } - - return true; - } - - /** - * Tests connectivity to for the bulk importer - * @param ErrorCollector|null $errorCollector - * @return bool|ResponseInterface|\Exception|\WP_Error - */ - public function testConnectivity($errorCollector = null, $timeoutOverride = false) { - $url = add_query_arg(['action' => 'ilab_batch_test', 'nonce' => wp_create_nonce('ilab_batch_test')], admin_url('admin-ajax.php')); - $args = [ - 'blocking' => true, - 'body' => 'allo mate', - 'cookies' => $_COOKIE, - ]; - - /** @var bool|ResponseInterface $result */ - $result = static::postRequest($url, $args, $timeoutOverride); - - if ($result === true) { - return true; - } - - if ($result instanceof \Exception) { - if ($errorCollector) { - $errorCollector->addError("Could not connect to the server for bulk background processing. The error was: ".$result->getMessage()); - } - - Logger::error("Testing connectivity to the site for background processing failed. Error was: ".$result->getMessage()); - return $result; - } else if ($result->getStatusCode() != 200) { - if ($errorCollector) { - $errorCollector->addError("Could not connect to the server for bulk background processing. The server returned a {$result->getStatusCode()} response code."); - } - - Logger::error("Testing connectivity to the site for background processing failed. Site returned a {$result->getStatusCode()} status.", ['body' => $result->getBody()]); - return $result; - } - - $json = json_decode((string)$result->getBody(), true); - if (empty($json) || !isset($json['test']) || (isset($json['test']) && ($json['test'] != 'worked'))) { - if ($errorCollector) { - $errorCollector->addError("Was able to connect to the server for bulk background processing but the JSON response was incorrect: ".$result->getBody()); - } - - Logger::error("Testing connectivity to the site for background processing failed. Was able to connect to the site but the JSON response was not expected.", ['body' => $result->getBody()]); - return new \WP_Error(500, "The server response from the connectivity test was not in the expected format."); - } - - return true; - } - - public function testAccess() { - json_response(['test' => 'worked']); - } - -} \ No newline at end of file diff --git a/classes/Tasks/Model.php b/classes/Tasks/Model.php new file mode 100755 index 00000000..e8463ca7 --- /dev/null +++ b/classes/Tasks/Model.php @@ -0,0 +1,260 @@ +modelState = self::MODEL_LIVE; + + if (is_array($data)) { + $data = (object)$data; + } + + if (property_exists($data, 'id')) { + $this->id = intval($data->id); + } + + $modelProps = array_keys($this->modelProperties); + foreach($modelProps as $prop) { + if (property_exists($data, $prop)) { + if (in_array($prop, $this->serializedProperties)) { + $this->{$prop} = maybe_unserialize($data->{$prop}); + } else { + $this->{$prop} = $data->{$prop}; + } + } + } + } + + } + + //endregion + + //region Magic + + /** + * @param string $name + * + * @return mixed|null + */ + public function __get($name) { + if (in_array($name, array_keys($this->modelProperties))) { + return $this->{$name}; + } + + return null; + } + + /** + * @param string $name + * @param mixed $value + */ + public function __set($name, $value) { + if (in_array($name, array_keys($this->modelProperties))) { + $this->{$name} = $value; + if ($this->modelState == self::MODEL_LIVE) { + $this->modelState = self::MODEL_DIRTY; + } + } + } + + /** + * @param string $name + * + * @return bool + */ + public function __isset($name) { + if (in_array($name, array_keys($this->modelProperties))) { + return true; + } + + return false; + } + + //endregion + + //region Properties + + /** + * Model's ID + * @return int|null + */ + public function id() { + return $this->id; + } + + //endregion + + //region Saving/Deleting + + /** + * Saves or updates the model + * + * @return bool + * @throws \Exception + */ + public function save() { + if ($this->modelState == self::MODEL_DELETED) { + return false; + } + + global $wpdb; + + $data = []; + $formats = []; + + foreach($this->modelProperties as $prop => $format) { + if (in_array($prop, $this->serializedProperties)) { + $data[$prop] = maybe_serialize($this->{$prop}); + $formats[] = '%s'; + } else { + $data[$prop] = $this->{$prop}; + $formats[] = $format; + } + } + + if ($this->modelState == self::MODEL_NEW) { + $result = $wpdb->insert(static::table(), $data, $formats); + if (!empty($result)) { + $this->id = $wpdb->insert_id; + $this->modelState = self::MODEL_LIVE; + return true; + } + } else { + $result = $wpdb->update(static::table(), $data, ['id' => $this->id], $formats); + if (!empty($result)) { + $this->modelState = self::MODEL_LIVE; + return true; + } + } + + return false; + } + + /** + * Deletes the model. + * + * @return bool + * @throws \Exception + */ + public function delete() { + if (($this->modelState == self::MODEL_DELETED) || ($this->modelState == self::MODEL_NEW)) { + return false; + } + + global $wpdb; + + $result = $wpdb->delete(static::table(), ['id' => $this->id]); + if (!empty($result)) { + $this->modelState = self::MODEL_DELETED; + return true; + } + + return false; + } + + //endregion + + //region Queries + /** + * Returns a task with the given ID + * + * @param $id + * + * @return Model|null + * @throws \Exception + */ + public static function instance($id) { + global $wpdb; + + $table = static::table(); + $rows = $wpdb->get_results($wpdb->prepare("select * from {$table} where id = %d", $id)); + + foreach($rows as $row) { + return new static($row); + } + + return null; + } + //endregion +} \ No newline at end of file diff --git a/classes/Tasks/RecurringTaskScheduler.php b/classes/Tasks/RecurringTaskScheduler.php new file mode 100755 index 00000000..0bafca1a --- /dev/null +++ b/classes/Tasks/RecurringTaskScheduler.php @@ -0,0 +1,558 @@ + 1, + 'hour' => 2, + 'day' => 3, + 'month' => 4, + 'week' => 5, + ]; + + //region Init + + public function __construct($taskType, $options, $selection) { + $this->taskType = $taskType; + $this->options = $options; + $this->selection = $selection; + } + + //endregion + + //region Dynamic + + public function __call($name, $arguments) { + preg_match('/^every([A-Z][a-zA-Z]+)?(Minute|Hour|Day|Month)s?$/', $name, $matches); + + + if (!count($matches) || ('Zero' === $matches[1])) { + throw new \BadMethodCallException("Method '{$name}' is not supported."); + } + + $amount = !empty($matches[1]) ? $this->wordToNumber($this->splitCamel($matches[1])) : 1; + if (!$amount) { + throw new \BadMethodCallException(); + } + + return $this->every(mb_strtolower($matches[2]), $amount); + } + + //endregion + + + //region Cron + + /** + * Splice the given value into the given position of the expression. + * + * @param int $position + * @param string $value + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + protected function spliceIntoPosition($position, $value) { + $segments = explode(' ', $this->cronExpression); + $segments[$position - 1] = $value; + + return $this->cron(implode(' ', $segments)); + } + + /** + * The Cron expression representing the event's frequency. + * + * @param string $expression + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function cron($expression) { + /** @var array $parts */ + $parts = preg_split('/\s/', $expression, -1, PREG_SPLIT_NO_EMPTY); + if (count($parts) > 5) { + throw new \Exception("Expression '{$expression}' has more than five parts and this is not allowed."); + } + + $this->cronExpression = $expression; + return $this; + } + + //endregion + + //region Scheduling + /** + * Schedule the event to run hourly. + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function hourly() { + return $this->cron('0 * * * *'); + } + + /** + * Schedule the event to run daily. + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function daily() { + return $this->cron('0 0 * * *'); + } + + /** + * Schedule the event to run on a certain date. + * + * @param string $date + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function on($date) { + $parsedDate = date_parse($date); + $segments = array_intersect_key($parsedDate, $this->fieldsPosition); + + foreach ($segments as $key => $value) { + if (false !== $value) { + $this->spliceIntoPosition($this->fieldsPosition[$key], (string) $value); + } + } + + return $this; + } + + /** + * Schedule the command at a given time. + * + * @param string $time + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function at($time) { + return $this->dailyAt($time); + } + + /** + * Schedule the event to run daily at a given time (10:00, 19:30, etc). + * + * @param string $time + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function dailyAt($time) { + $segments = explode(':', $time); + $firstSegment = (int)$segments[0]; + $secondSegment = count($segments) > 1 ? (int) $segments[1] : '0'; + + return $this + ->spliceIntoPosition(2, $firstSegment) + ->spliceIntoPosition(1, $secondSegment) + ; + } + + /** + * Schedule the event to run twice daily. + * + * @param int $first + * @param int $second + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function twiceDaily($first = 1, $second = 13) { + $hours = $first . ',' . $second; + + return $this + ->spliceIntoPosition(1, '0') + ->spliceIntoPosition(2, $hours) + ; + } + + /** + * Schedule the event to run only on weekdays. + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function weekdays() { + return $this->spliceIntoPosition(5, '1-5'); + } + + /** + * Schedule the event to run only on Mondays. + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function mondays() { + return $this->days(1); + } + + /** + * Schedule the event to run only on Tuesdays. + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function tuesdays() { + return $this->days(2); + } + + /** + * Schedule the event to run only on Wednesdays. + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function wednesdays() { + return $this->days(3); + } + + /** + * Schedule the event to run only on Thursdays. + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function thursdays() { + return $this->days(4); + } + + /** + * Schedule the event to run only on Fridays. + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function fridays() { + return $this->days(5); + } + + /** + * Schedule the event to run only on Saturdays. + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function saturdays() { + return $this->days(6); + } + + /** + * Schedule the event to run only on Sundays. + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function sundays() { + return $this->days(0); + } + + /** + * Schedule the event to run weekly. + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function weekly() { + return $this->cron('0 0 * * 0'); + } + + /** + * Schedule the event to run weekly on a given day and time. + * + * @param int|string $day + * @param string $time + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function weeklyOn($day, $time = '0:0') { + $this->dailyAt($time); + + return $this->spliceIntoPosition(5, (string) $day); + } + + /** + * Schedule the event to run monthly. + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function monthly() { + return $this->cron('0 0 1 * *'); + } + + /** + * Schedule the event to run quarterly. + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function quarterly() { + return $this->cron('0 0 1 */3 *'); + } + + /** + * Schedule the event to run yearly. + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function yearly() { + return $this->cron('0 0 1 1 *'); + } + + /** + * Set the days of the week the command should run on. + * + * @param mixed $days + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function days($days) { + $days =is_array($days) ? $days : func_get_args(); + + return $this->spliceIntoPosition(5, implode(',', $days)); + } + + /** + * Set hour for the cron job. + * + * @param mixed $value + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function hour($value) { + $value =is_array($value) ? $value : func_get_args(); + + return $this->spliceIntoPosition(2, implode(',', $value)); + } + + /** + * Set minute for the cron job. + * + * @param mixed $value + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function minute($value) { + $value =is_array($value) ? $value : func_get_args(); + + return $this->spliceIntoPosition(1, implode(',', $value)); + } + + /** + * Set hour for the cron job. + * + * @param mixed $value + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function dayOfMonth($value) { + $value =is_array($value) ? $value : func_get_args(); + + return $this->spliceIntoPosition(3, implode(',', $value)); + } + + /** + * Set hour for the cron job. + * + * @param mixed $value + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function month($value) { + $value =is_array($value) ? $value : func_get_args(); + + return $this->spliceIntoPosition(4, implode(',', $value)); + } + + /** + * Set hour for the cron job. + * + * @param mixed $value + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function dayOfWeek($value) { + $value =is_array($value) ? $value : func_get_args(); + + return $this->spliceIntoPosition(5, implode(',', $value)); + } + + /** + * Another way to the frequency of the cron job. + * + * @param null $unit + * @param null $value + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public function every($unit = null, $value = null) { + if (null === $unit || !isset($this->fieldsPosition[$unit])) { + return $this; + } + + $value = (1 === (int) $value) ? '*' : '*/' . $value; + + return $this->spliceIntoPosition($this->fieldsPosition[$unit], $value) + ->applyMask($unit); + } + + //endregion + + //region Saving + public function save() { + $schedule = new TaskSchedule(); + $schedule->taskType = $this->taskType; + + $cron = CronExpression::factory($this->cronExpression); + $schedule->nextRun = $cron->getNextRunDate()->getTimestamp(); + + $schedule->recurring = true; + $schedule->schedule = $this->cronExpression; + $schedule->options = $this->options; + $schedule->selection = $this->selection; + $schedule->save(); + + return $schedule; + } + //endregion + + //region Utilities + + private function splitCamel($text) { + $pattern = '/(?<=[a-z])(?=[A-Z])/x'; + /** @var array $segments */ + $segments = preg_split($pattern, $text); + return mb_strtolower(implode(' ', $segments)); + } + + private function wordToNumber($text) + { + $data = strtr( + $text, + [ + 'zero' => '0', + 'a' => '1', + 'one' => '1', + 'two' => '2', + 'three' => '3', + 'four' => '4', + 'five' => '5', + 'six' => '6', + 'seven' => '7', + 'eight' => '8', + 'nine' => '9', + 'ten' => '10', + 'eleven' => '11', + 'twelve' => '12', + 'thirteen' => '13', + 'fourteen' => '14', + 'fifteen' => '15', + 'sixteen' => '16', + 'seventeen' => '17', + 'eighteen' => '18', + 'nineteen' => '19', + 'twenty' => '20', + 'thirty' => '30', + 'forty' => '40', + 'fourty' => '40', + 'fifty' => '50', + 'sixty' => '60', + 'seventy' => '70', + 'eighty' => '80', + 'ninety' => '90', + 'hundred' => '100', + 'thousand' => '1000', + 'million' => '1000000', + 'billion' => '1000000000', + 'and' => '', + ] + ); + + /** @var array $matchedParts */ + $matchedParts =preg_split('/[\s-]+/', $data); + // Coerce all tokens to numbers + $parts =array_map('floatval', $matchedParts); + + $tmp = null; + $sum = 0; + $last = null; + + foreach ($parts as $part) { + if (null !== $tmp) { + if ($tmp > $part) { + if ($last >= 1000) { + $sum += $tmp; + $tmp = $part; + } else { + $tmp += $part; + } + } else { + $tmp *= $part; + } + } else { + $tmp = $part; + } + + $last = $part; + } + + return $sum + $tmp; + } + + /** + * Mask a cron expression. + * + * @param $unit + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + protected function applyMask($unit) { + $cron = explode(' ', $this->cronExpression); + $mask = ['0', '0', '1', '1', '*', '*']; + $fpos = $this->fieldsPosition[$unit] - 1; + + array_splice($cron, 0, $fpos, array_slice($mask, 0, $fpos)); + + return $this->cron(implode(' ', $cron)); + } + //endregion +} \ No newline at end of file diff --git a/classes/Tasks/Task.php b/classes/Tasks/Task.php new file mode 100755 index 00000000..5b51b28b --- /dev/null +++ b/classes/Tasks/Task.php @@ -0,0 +1,1061 @@ + '%d', + 'type' => '%s', + 'cli' => '%d', + 'tuid' => '%s', + 'totalItems' => '%d', + 'currentItem' => '%d', + 'startTime' => '%f', + 'endTime' => '%f', + 'lastRun' => '%f', + 'duration' => '%f', + 'timePer' => '%f', + 'memoryPer' => '%d', + 'lastTime' => '%f', + 'currentItemID' => '%s', + 'currentTitle' => '%s', + 'currentFile' => '%s', + 'currentThumb' => '%s', + 'isIcon' => '%d', + 'errorMessage' => '%s', + 'options' => '%s' + ]; + + protected $serializedProperties = ['options']; + + //endregion + + //region Static Methods + /** + * The identifier for the task. Must be overridden. Default implementation throws exception. + * @return string + * @throws \Exception + */ + public static function identifier() { + throw new \Exception("Not implemented."); + } + + /** + * The title for the task. Must be overridden. Default implementation throws exception. + * @return string + * @throws \Exception + */ + public static function title() { + throw new \Exception("Not implemented."); + } + + /** + * View containing instructions for the task + * @return string|null + */ + public static function instructionView() { + return null; + } + + /** + * The menu title for the task. + * @return string + * @throws \Exception + */ + public static function menuTitle() { + return static::title(); + } + + /** + * The title of the menu item in the bulk actions drop down. Return null for no bulk action. + * + * @return string|null + */ + public static function bulkActionTitle() { + return null; + } + + /** + * Determines if this a user task or not. User tasks are displayed in the admin menu. + * + * @return false + */ + public static function userTask() { + return false; + } + + /** + * Controls if this task stops on an error. + * + * @return bool + */ + public static function stopOnError() { + return true; + } + + /** + * Controls if this task can be run from task manager. + * + * @return bool + */ + public static function runFromTaskManager() { + return true; + } + + /** + * The available options when running a task. + * @return array + */ + public static function taskOptions() { + return []; + } + + /** + * The identifier for analytics + * @return string + */ + public static function analyticsId() { + return null; + } + //endregion + + //region Model Related + + /** + * Database table this model uses. + * @return string + */ + public static function table() { + global $wpdb; + return "{$wpdb->base_prefix}mcloud_task"; + } + + //endregion + + //region Init + + public function __construct($data = null) { + parent::__construct($data); + $this->type = static::identifier(); + + if ($this->id != null) { + $this->data = TaskData::dataForTask($this); + } + } + + //endregion + + //region Saving/Deleting + + public function save() { + Logger::info("SAVING TASK"); + + if ($this->tuid == null) { + $this->tuid = gen_uuid(12); + } + + if (parent::save()) { + foreach($this->data as $data) { + $data->save(); + } + } + } + + /** + * Clean up the current task + * + * @return bool|void + * @throws \Exception + */ + public function delete() { + if (parent::delete()) { + foreach($this->data as $data) { + $data->delete(); + } + + return true; + } + + return false; + } + + public function cleanUp() { + foreach($this->data as $data) { + $data->delete(); + } + } + + //endregion + + //region Execution + + /** + * Runs the task. + * + * @return bool + * @throws \Exception + */ + public function run() { + if ($this->locked()) { + Logger::info("Already running ..."); + return self::TASK_ALREADY_RUNNING; + } + + $this->lock(); + + $this->taskStartTime = time(); + + if ($this->state == self::STATE_WAITING) { + $this->startTime = time(); + $this->state = self::STATE_RUNNING; + + $this->save(); + + if (!empty(static::analyticsId())) { + Tracker::trackView(static::title(), static::analyticsId().'/start'); + } + } + + Logger::info("Grabbing first chunk."); + + /** @var TaskData $chunk */ + $chunk = $this->nextChunk(); + if (empty($chunk)) { + Logger::info("Chunk is empty!"); + + $this->state = self::STATE_COMPLETE; + $this->updateTiming(); + $this->save(); + + $this->unlock(); + + if (!empty(static::analyticsId())) { + Tracker::trackView(static::title(), static::analyticsId().'/finish'); + } + + $this->complete(); + + return self::TASK_COMPLETE; + } + + $firstTime = true; + $result = self::TASK_TIME_LIMIT; + while ($this->canWork($firstTime)) { + $this->lock(); + + $firstTime = false; + + if ($this->isCancelled()) { + $this->info("Task was cancelled. Exiting.", true); + + Logger::info("Task was cancelled. Exiting."); + $this->state = self::STATE_CANCELLED; + $this->updateTiming(); + $this->save(); + + $this->unlock(); + + if (!empty(static::analyticsId())) { + Tracker::trackView(static::title(), static::analyticsId().'/cancel'); + } + + $this->complete(); + + return self::TASK_CANCELLED; + } + + $nextItem = $chunk->nextItem(); + if (empty($nextItem)) { + $this->updateTiming(); + $this->save(); + + $result = self::TASK_CHUNK_COMPLETE; + break; + } + + try { + $time = microtime(true); + $memory = memory_get_usage(true); + $this->currentItem++; + $this->info("[{$this->currentItem} of {$this->totalItems}] Processing ... ", false); + $result = $this->performTask($nextItem); + $this->info("{$this->currentFile} ... Done.", true); + + $this->lastTime = microtime(true) - $time; + + if ($this->memoryPer == 0) { + $this->memoryPer = memory_get_usage(true) - $memory; + } else { + $this->memoryPer = ($this->memoryPer + (memory_get_usage(true) - $memory)) / 2; + } + + $this->lastRun = time(); + $this->updateTiming(); + $this->save(); + + if (empty($result) || is_wp_error($result)) { + $result = self::TASK_ERROR; + + $this->endTime = time(); + $this->updateTiming(); + + $this->state = self::STATE_ERROR; + + if (is_wp_error($result)) { + $this->errorMessage = $result->get_error_message(); + } else { + $this->errorMessage = "Unknown error."; + } + + $this->info("{$this->currentFile} ... Error.", true); + $this->error($this->errorMessage); + + $this->save(); + + if (!empty(static::analyticsId())) { + Tracker::trackView(static::title(), static::analyticsId().'/error'); + } + + $this->complete(); + + break; + } + } catch (\Exception $ex) { + $this->state = self::STATE_ERROR; + $this->endTime = time(); + $this->errorMessage = $ex->getMessage(); + $this->updateTiming(); + $this->save(); + + $this->info("{$this->currentFile} ... Error.", true); + $this->error($this->errorMessage); + + if (!empty(static::analyticsId())) { + Tracker::trackView(static::title(), static::analyticsId().'/error'); + } + + $this->complete(); + + break; + } + } + + Logger::info("Unlocking ..."); + $this->unlock(); + return $result; + } + + /** + * Performs the actual task + * + * @param $item + * + * @return bool + */ + public abstract function performTask($item); + + + /** + * Called when the task completed + */ + public function complete() { + } + + /** + * Determines if the task can do unit of work. + * + * @return bool + */ + public function canWork($firstTime) { + $maxTime = null; + + if (function_exists('ini_get')) { + $maxTime = ini_get('max_execution_time'); + } + + if (empty($maxTime)) { + $maxTime = 60; + } + + $maxTime = apply_filters('media-cloud/batch/max-time', $maxTime); + + if (time() > $this->taskStartTime + $maxTime) { + Logger::info("Time is up!"); + return false; + } + + $memory = memory_get_usage(true); + $limit = $this->memoryLimit() * 0.9; + + if (!$firstTime) { + $limit -= $this->memoryPer; + } + if ($memory >= $limit) { + Logger::info("Out of memory!"); + return false; + } + + + return true; + } + + private function memoryLimit() { + if (function_exists('ini_get')) { + $memory_limit = intval(ini_get('memory_limit')); + } else { + $memory_limit = 128; + } + + if (empty($memory_limit) || ($memory_limit == -1)) { + $memory_limit = 64000; + } + + return $memory_limit * 1024 * 1024; + } + + + public function nextChunk() { + if (count($this->data) == 0) { + Logger::info("Data is empty!"); + return false; + } + + /** @var TaskData $data */ + $data = $this->data[0]; + if ($data->complete()) { + Logger::info("Data is complete!"); + + $data->delete(); + array_shift($this->data); + + + Logger::info("Returning next chunk!"); + return $this->nextChunk(); + } + + return $data; + } + + //endregion + + //region Properties + + public function __get($name) { + if ($name == 'stateName') { + if ($this->state == self::STATE_WAITING) { + $state = 'waiting'; + } else if ($this->state == self::STATE_RUNNING) { + $state = 'running'; + } else if ($this->state == self::STATE_COMPLETE) { + $state = 'complete'; + } else if ($this->state == self::STATE_ERROR) { + $state = 'error'; + } else if ($this->state == self::STATE_CANCELLED) { + $state = 'cancelled'; + } else { + $state = 'unknown'; + } + + return $state; + } else if ($name == 'memoryPerString') { + $size = size_format($this->memoryPer, 1); + return empty($size) ? '0 MB' : $size; + } + + + return parent::__get($name); + } + + public function updateTiming() { + if ($this->state >= self::STATE_COMPLETE) { + if ($this->endTime == null) { + $this->endTime = time(); + $this->duration = floatval($this->endTime - $this->startTime); + } + } else { + $this->duration = floatval(time() - $this->startTime); + } + + $this->timePer = (($this->duration > 0) && ($this->currentItem > 0)) ? ($this->duration / floatval($this->currentItem)) : 0; + } + + /** + * @param callable $outputHandler + * @param callable $errorHandler + */ + public function setHandlers($outputHandler, $errorHandler) { + $this->outputHandler = $outputHandler; + $this->errorHandler = $errorHandler; + } + + //endregion + + //region Handlers + + protected function info($message, $newLine = false) { + if (!empty($this->outputHandler)) { + call_user_func($this->outputHandler, $message, $newLine); + } + } + + + protected function error($message) { + if (!empty($this->errorHandler)) { + call_user_func($this->errorHandler, $message); + } + } + //endregion + + //region Locks + + /** + * Creates a lock to prevent other instances of the task from running + */ + public function lock() { + if (($this->id == null) || ($this->modelState == self::MODEL_DELETED)) { + return; + } + + $maxTime = 60; + + if ($this->lastTime > 0) { + $maxTime = max(30, $this->lastTime * 2); + } + + $maxTime = apply_filters('media-cloud/batch/lock-expiration', $maxTime); + + Logger::info("Locking for $maxTime seconds."); + + global $wpdb; + $wpdb->update(static::table(), ['locked' => time() + $maxTime], ['id' => $this->id], ['%f']); + } + + /** + * Unlocks the task + */ + public function unlock() { + if (($this->id == null) || ($this->modelState == self::MODEL_DELETED)) { + return; + } + + global $wpdb; + $wpdb->update(static::table(), ['locked' => null], ['id' => $this->id]); + } + + /** + * Determins if the task is locked + * @return bool + * @throws \Exception + */ + public function locked() { + if (($this->id == null) || ($this->modelState == self::MODEL_DELETED)) { + Logger::info("Missing ID or model is deleted."); + return true; + } + + global $wpdb; + $table = static::table(); + $query = $wpdb->prepare("select locked from {$table} where id = %d", [$this->id]); + $locked = $wpdb->get_var($query); + if (empty($locked)) { + Logger::info("Lock is empty."); + return false; + } + + $left = $locked - time(); + Logger::info("Lock ($locked) expires in $left seconds."); + + return (time() < $locked); + } + + //endregion + + //region Cancelling + + public function cancel() { + if (empty($this->id) || ($this->modelState == self::MODEL_DELETED)) { + return; + } + + global $wpdb; + $wpdb->update(static::table(), ['shouldCancel' => 1], ['id' => $this->id]); + } + + public function isCancelled() { + if (empty($this->id)) { + return false; + } + + if ($this->modelState == self::MODEL_DELETED) { + return true; + } + + global $wpdb; + $table = static::table(); + return ($wpdb->get_var("select shouldCancel from {$table} where id = {$this->id}") == 1); + } + + //endregion + + //region Data + + /** + * Prepares a new task with data. + * + * @param array $options + * @param array $selectedItems + * + * @return bool + */ + abstract public function prepare($options = [], $selectedItems = []); + + /** + * Adds an arbitrary item to the task's data. + * + * @param mixed $item + */ + public function addItem($item) { + if (($this->currentData == null) || $this->currentData->full()) { + $this->currentData = new TaskData($this, null); + $this->data[] = $this->currentData; + } + + $this->currentData->addItem($item); + $this->totalItems++; + } + + //endregion + + //region JSON + + public function jsonSerialize() { + if ($this->state >= self::STATE_COMPLETE) { + $remaining = 0; + } else { + $remaining = ($this->timePer * $this->totalItems) - $this->duration; + } + + if (!empty($this->startTime)) { + $now = Carbon::instance(\DateTime::createFromFormat('U.u', number_format($this->startTime, 6, '.', ''))); + $startTimeFormat = $now->toIso8601ZuluString(); + } else { + $startTimeFormat = null; + } + + if (!empty($this->endTime)) { + $now = Carbon::instance(\DateTime::createFromFormat('U.u', number_format($this->endTime, 6, '.', ''))); + $endTimeFormat = $now->toIso8601ZuluString(); + } else { + $endTimeFormat = null; + } + + $data = [ + 'id' => $this->id, + 'title' => $this::title(), + 'identifier' => $this::identifier(), + 'stateName' => $this->stateName, + 'startTimeFormat' => $startTimeFormat, + 'endTimeFormat' => $endTimeFormat, + 'memoryPerString' => $this->memoryPerString, + ]; + + foreach($this->modelProperties as $prop => $format) { + if (!in_array($prop, $this->serializedProperties)) { + if ($format == '%d') { + $data[$prop] = intval($this->{$prop}); + } else if ($format == '%f') { + $data[$prop] = floatval($this->{$prop}); + } else { + $data[$prop] = $this->{$prop}; + } + } + } + + $data['remaining'] = $remaining; + + return $data; + } + + //endregion + + //region Queries + /** + * Returns a task with the given ID + * + * @param $id + * + * @return Task|null + * @throws \Exception + */ + public static function instance($id) { + global $wpdb; + + $table = static::table(); + $rows = $wpdb->get_results($wpdb->prepare("select * from {$table} where id = %d", $id)); + + foreach($rows as $row) { + $taskClass = TaskManager::taskClass($row->type); + if (!empty($taskClass)) { + return new $taskClass($row); + } + } + + return null; + } + + public static function scheduledTaskIsRunning($tuid) { + global $wpdb; + + $table = static::table(); + $query = $wpdb->prepare("select id from {$table} where tuid = %s and state < 100 limit 1", $tuid); + $id = $wpdb->get_var($query); + + return (!empty($id)); + } + + /** + * The currently running tasks + * + * @return Task[] + * @throws \Exception + */ + public static function runningTasks() { + global $wpdb; + + $results = []; + + $table = static::table(); + $state = self::STATE_COMPLETE; + $rows = $wpdb->get_results("select * from {$table} where state < {$state} order by id desc"); + foreach($rows as $row) { + $taskClass = TaskManager::taskClass($row->type); + if (!empty($taskClass)) { + $results[] = new $taskClass($row); + } + } + + return $results; + } + + /** + * The currently running task (most recent) + * + * @param string $identifier + * @return Task|null + * @throws \Exception + */ + public static function currentRunningTask($identifier) { + global $wpdb; + + $table = static::table(); + $state = self::STATE_COMPLETE; + $sql = $wpdb->prepare("select * from {$table} where state < %d and type=%s order by id desc limit 1", $state, $identifier); + $rows = $wpdb->get_results($sql); + + foreach($rows as $row) { + $taskClass = TaskManager::taskClass($row->type); + if (!empty($taskClass)) { + return new $taskClass($row); + } + } + + return null; + } + + /** + * The completed tasks + * + * @return Task[] + * @throws \Exception + */ + public static function completeTasks() { + global $wpdb; + + $results = []; + + $table = static::table(); + $state = self::STATE_COMPLETE; + $rows = $wpdb->get_results("select * from {$table} where state >= {$state} order by endTime desc, id desc limit 20"); + foreach($rows as $row) { + $taskClass = TaskManager::taskClass($row->type); + if (!empty($taskClass)) { + $results[] = new $taskClass($row); + } + } + + return $results; + } + + //endregion + + //region Scheduling + + /** + * Schedule this task type to run on a recurring schedule. + * + * @param array $options + * @param array $selection + * + * @return RecurringTaskScheduler + * @throws \Exception + */ + public static function scheduleRecurring($options = [], $selection = []) { + return new RecurringTaskScheduler(static::identifier(), $options, $selection); + } + + /** + * Schedules this task type to run once sometime in the future + * @param int|string $time + * @param array $options + * @param array $selection + * @return TaskSchedule + * @throws \Exception + */ + public static function schedule($time, $options = [], $selection = []) { + if (is_string($time)) { + $dt = new \DateTime($time); + $time = $dt->getTimestamp(); + } + + $schedule = new TaskSchedule(); + $schedule->taskType = static::identifier(); + $schedule->recurring = false; + $schedule->nextRun = $time; + $schedule->options = $options; + $schedule->selection = $selection; + $schedule->save(); + + return $schedule; + } + + /** + * Schedules this task type to run once in a number of minutes in the future + * @param int $minutes + * @param array $options + * @param array $selection + * @return TaskSchedule + * @throws \Exception + */ + public static function scheduleIn($minutes, $options = [], $selection = []) { + return static::schedule(time() + ($minutes * 60), $options, $selection); + } + //endregion +} \ No newline at end of file diff --git a/classes/Tasks/TaskData.php b/classes/Tasks/TaskData.php new file mode 100755 index 00000000..8ce1d3bb --- /dev/null +++ b/classes/Tasks/TaskData.php @@ -0,0 +1,178 @@ + '%d', + 'current' => '%d', + 'complete' => '%d', + 'data' => '%s' + ]; + + protected $serializedProperties = [ + 'data' + ]; + + //endregion + + //region Static + + public static function table() { + global $wpdb; + return "{$wpdb->base_prefix}mcloud_task_data"; + } + + //endregion + + //region Constructor + + /** + * TaskData constructor. + * + * @param Task $task + * @param null $data + */ + public function __construct($task, $data = null) { + parent::__construct($data); + + $this->task = $task; + if (!empty($this->task->id())) { + $this->taskId = $this->task->id(); + } + } + + //endregion + + //region Data + + public function addItem($item) { + $this->data[] = $item; + } + + public function full() { + $maxItems = apply_filters('media-cloud/batch/max-chunk-items', 30); + return count($this->data) >= $maxItems; + } + + public function complete() { + if ($this->current >= count($this->data)) { + return true; + } + + return false; + } + + public function nextItem() { + if ($this->complete()) { + return false; + } + + $result = $this->data[$this->current]; + $this->current++; + $this->save(); + + return $result; + } + + //endregion + + //region Saving/Loading + + public function delete() { + parent::delete(); + } + + public function save() { + if (!empty($this->task->id())) { + $this->taskId = $this->task->id(); + } + + if (empty($this->taskId)) { + return false; + } + + return parent::save(); + } + + //endregion + + //region Queries + + /** + * @param Task $task + * + * @throws \Exception + */ + public static function dataForTask($task) { + global $wpdb; + + $result = []; + + $dataTable = static::table(); + $results = $wpdb->get_results("select * from {$dataTable} where complete != 1 and taskId = {$task->id()} order by id asc"); + if (!empty($results)) { + foreach($results as $taskData) { + $result[] = new TaskData($task, $taskData); + } + } + + return $result; + } + //endregion + +} \ No newline at end of file diff --git a/classes/Tasks/TaskDatabase.php b/classes/Tasks/TaskDatabase.php new file mode 100755 index 00000000..a0e9d268 --- /dev/null +++ b/classes/Tasks/TaskDatabase.php @@ -0,0 +1,147 @@ +base_prefix.'mcloud_task'; + $charset = $wpdb->get_charset_collate(); + + $sql = "CREATE TABLE {$tableName} ( + id BIGINT AUTO_INCREMENT, + tuid VARCHAR(12) NOT NULL, + type VARCHAR(255) NOT NULL, + locked BIGINT NULL, + cli INT DEFAULT 0 NOT NULL, + shouldCancel INT DEFAULT 0 NOT NULL, + state INT DEFAULT 0 NOT NULL, + currentItem INT DEFAULT 0 NOT NULL, + totalItems INT DEFAULT 0 NOT NULL, + lastTime FLOAT NULL, + startTime bigint NULL, + endTime bigint NULL, + lastRun bigint NULL, + duration FLOAT NULL, + timePer FLOAT NULL, + memoryPer bigint NULL, + currentItemID VARCHAR(512) NULL, + currentTitle VARCHAR(512) NULL, + currentFile VARCHAR(512) NULL, + currentThumb VARCHAR(512) NULL, + isIcon INT DEFAULT 0 NOT NULL, + errorMessage TEXT NULL, + options TEXT NULL, + PRIMARY KEY (id) +) {$charset};"; + + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); + dbDelta($sql); + + $exists = ($wpdb->get_var("SHOW TABLES LIKE '$tableName'") == $tableName); + if ($exists) { + update_site_option('mcloud_task_table_db_version', self::DB_VERSION); + } + } + + protected static function installDataTable() { + $currentVersion = get_site_option('mcloud_task_data_db_version'); + if (!empty($currentVersion) && version_compare(self::DB_VERSION, $currentVersion, '<=')) { + return; + } + + global $wpdb; + + $tableName = $wpdb->base_prefix.'mcloud_task_data'; + $charset = $wpdb->get_charset_collate(); + + $sql = "CREATE TABLE {$tableName} ( + id BIGINT AUTO_INCREMENT, + taskId BIGINT NOT NULL, + current INT NOT NULL DEFAULT 0, + complete INT NOT NULL DEFAULT 0, + data TEXT NULL, + PRIMARY KEY (id) +) {$charset};"; + + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); + dbDelta($sql); + $exists = ($wpdb->get_var("SHOW TABLES LIKE '$tableName'") == $tableName); + if ($exists) { + update_site_option('mcloud_task_data_db_version', self::DB_VERSION); + } + } + + protected static function installScheduleTable() { + $currentVersion = get_site_option('mcloud_task_schedule_db_version'); + if (!empty($currentVersion) && version_compare(self::DB_VERSION, $currentVersion, '<=')) { + return; + } + + global $wpdb; + + $tableName = $wpdb->base_prefix.'mcloud_task_schedule'; + $charset = $wpdb->get_charset_collate(); + + $sql = "CREATE TABLE {$tableName} ( + id BIGINT AUTO_INCREMENT, + tuid VARCHAR(12) NOT NULL, + recurring INT NOT NULL DEFAULT 0, + lastRun BIGINT, + nextRun BIGINT, + schedule VARCHAR(256) NOT NULL, + taskType VARCHAR(256) NOT NULL, + options TEXT, + selection TEXT, + PRIMARY KEY (id) +) {$charset};"; + + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); + dbDelta($sql); + $exists = ($wpdb->get_var("SHOW TABLES LIKE '$tableName'") == $tableName); + if ($exists) { + update_site_option('mcloud_task_schedule_db_version', self::DB_VERSION); + } + } + + //endregion +} \ No newline at end of file diff --git a/classes/Tasks/TaskManager.php b/classes/Tasks/TaskManager.php new file mode 100755 index 00000000..3e704f11 --- /dev/null +++ b/classes/Tasks/TaskManager.php @@ -0,0 +1,582 @@ +runningTasks = Task::runningTasks(); + $this->setupHooks(); + } + + /** + * The static TaskManager instance + * @return TaskManager|null + */ + public static function instance() { + if (empty(static::$instance)) { + static::$instance = new TaskManager(); + } + + return static::$instance; + } + //endregion + + //region Properties + + /** + * @return Task[] + */ + public function runningTasks() { + return $this->runningTasks; + } + + //endregion + + //region hooks + + /** + * Setup any required hooks + */ + private function setupHooks() { + add_filter( 'cron_schedules', function($schedules) { + $schedules['mcloud_batch_interval'] = [ + 'interval' => 60, + 'display' => 'Media Cloud Batch Interval' + ]; + + return $schedules; + }); + + add_action('mcloud_run_batch', [$this, 'handleCron']); + add_action('wp_ajax_mcloud_task_heartbeat', [$this, 'handleHeartbeat']); + + if (!wp_next_scheduled('mcloud_run_batch')) { + wp_schedule_event(time(), 'mcloud_batch_interval', 'mcloud_run_batch'); + } + + add_action('wp_ajax_nopriv_mcloud_run_task', [$this, 'actionRunTask']); + add_action('wp_ajax_mcloud_run_task', [$this, 'actionRunTask']); + + if (is_admin()) { + add_action('wp_ajax_mcloud_start_task', [$this, 'actionStartTask']); + add_action('wp_ajax_mcloud_cancel_task', [$this, 'actionCancelTask']); + add_action('wp_ajax_mcloud_cancel_all_tasks', [$this, 'actionCancelAllTasks']); + add_action('wp_ajax_mcloud_task_status', [$this, 'actionTaskStatus']); + add_action('wp_ajax_mcloud_all_task_statuses', [$this, 'actionAllTaskStatuses']); + + + add_action('wp_ajax_mcloud_delete_scheduled_task', [$this, 'actionDeleteScheduledTask']); + add_action('wp_ajax_mcloud_execute_scheduled_task', [$this, 'actionExecuteScheduledTask']); + + add_action('wp_ajax_mcloud_clear_task_history', [$this, 'actionClearTaskHistory']); + } + + add_action('wp_ajax_testTaskStart', [$this, 'testTaskStart']); + + add_action('admin_init', function() { + add_filter('bulk_actions-upload', function($actions) { + foreach(static::$registeredTasks as $identifier => $taskClass) { + if (empty($taskClass::bulkActionTitle())) { + continue; + } + + $actions[$identifier] = $taskClass::bulkActionTitle(); + } + + return $actions; + }); + + add_filter('handle_bulk_actions-upload', function($redirect_to, $action_name, $post_ids) { + if (in_array($action_name, array_keys(static::$registeredTasks))) { + $taskClass = static::$registeredTasks[$action_name]; + + $task = new $taskClass(); + $task->prepare([], $post_ids); + $this->queueTask($task); + + $redirect_to = admin_url('admin.php?page=mcloud-task-'.$taskClass::identifier()); + } + + return $redirect_to; + }, 1000, 3); + }); + } + //endregion + + //region actions + + private function closeClientConnection() { + session_write_close(); + ignore_user_abort(true); + + if (function_exists('fastcgi_finish_request') && version_compare(phpversion(), '7.0.16', '>=')) { + header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' ); + header( 'Cache-Control: no-cache, must-revalidate, max-age=0' ); + fastcgi_finish_request(); + } + } + + public function actionRunTask() { + Logger::info("Run Task Ajax"); + $this->closeClientConnection(); + + check_ajax_referer('mcloud_run_task', 'nonce'); + + $taskId = arrayPath($_REQUEST, 'taskId', null); + if (empty($taskId)) { + Logger::info("Task is not defined. Dying."); + wp_die(); + } + + $token = arrayPath($_REQUEST, 'token', null); + if (!empty($token)) { + $tokenVal = arrayPath($_REQUEST, 'tokenVal', null); + if (!empty($tokenVal)) { + Logger::info("Sending ACK"); + + update_site_option($token, $tokenVal); + } + } + + Logger::info("Running task {$taskId}"); + $this->runTask($taskId); + } + + /** + * Runs the cron job + * @throws \Exception + */ + public function handleCron() { + update_site_option('mcloud_last_cron', time()); + + foreach($this->runningTasks as $task) { + if (!empty($task->cli)) { + continue; + } + + $this->runTask($task); + } + + /** @var TaskSchedule[] $scheduled */ + $scheduled = TaskSchedule::scheduledTasks(); + foreach($scheduled as $item) { + $item->runIfNeeded(); + } + } + + /** + * Handles heartbeat + * + * @param $response + * @param $screen_id + * + * @throws \Exception + */ + public function handleHeartbeat() { + $this->closeClientConnection(); + + foreach($this->runningTasks as $task) { + if (!empty($task->cli)) { + continue; + } + + $this->runTask($task); + } + + $lastCron = get_site_option('mcloud_last_cron', 0); + if (($lastCron > 0) && (time() - $lastCron < 120)) { + return; + } + + /** @var TaskSchedule[] $scheduled */ + $scheduled = TaskSchedule::scheduledTasks(); + foreach($scheduled as $item) { + $item->runIfNeeded(); + } + } + + /** + * Checks the status of a specific task + */ + public function actionStartTask() { + Logger::info("Starting Task ... "); + check_ajax_referer('mcloud_start_task', 'nonce'); + Logger::info("Nonce verified."); + + $taskId = arrayPath($_REQUEST, 'taskId', null); + if (empty($taskId)) { + wp_send_json(['status' => 'error', 'message' => 'Invalid task ID']); + } + + if (!isset(static::$registeredTasks[$taskId])) { + wp_send_json(['status' => 'error', 'message', "Unknown task type '{$taskId}'"]); + } + + $options = arrayPath($_REQUEST, 'options', []); + + $taskClass = static::$registeredTasks[$taskId]; + /** @var Task $task */ + $task = new $taskClass(); + $result = $task->prepare($options); + if (!$result) { + wp_send_json(['status' => 'error', 'message' => 'There are no items to process.']); + } + + $this->queueTask($task); + wp_send_json(['status' => 'ok', 'task' => $task]); + } + + /** + * Checks the status of a specific task + */ + public function actionCancelTask() { + Logger::info("Cancelling Task ... "); + check_ajax_referer('mcloud_cancel_task', 'nonce'); + Logger::info("Nonce verified."); + + $taskId = arrayPath($_REQUEST, 'taskId', null); + if (empty($taskId)) { + wp_send_json(['status' => 'error', 'message' => 'Invalid task ID']); + } + + $task = Task::instance($taskId); + if (empty($task)) { + Logger::info("No running task with task id $taskId"); + wp_send_json(['status' => 'error', 'message', 'Unknown task.']); + } + + Logger::info("Cancelling task {$taskId} ..."); + $task->cancel(); + + if (!empty($task->cli)) { + $task->state = Task::STATE_CANCELLED; + $task->updateTiming(); + $task->save(); + } + + wp_send_json(['status' => 'ok', 'message', 'Task cancelled.']); + } + + /** + * Cancels all running tasks + */ + public function actionCancelAllTasks() { + Logger::info("Cancelling All Tasks ... "); + check_ajax_referer('mcloud_cancel_all_tasks', 'nonce'); + Logger::info("Nonce verified."); + + $tasks = static::runningTasks(); + foreach($tasks as $task) { + Logger::info("Cancelling task {$task->id()} ..."); + $task->cancel(); + + if (!empty($task->cli)) { + $task->state = Task::STATE_CANCELLED; + $task->updateTiming(); + $task->save(); + } + } + + wp_send_json(['status' => 'ok', 'message', 'Tasks cancelled.']); + } + + + public function actionClearTaskHistory() { + Logger::info("Clearing Task History ... "); + check_ajax_referer('mcloud_clear_task_history', 'nonce'); + Logger::info("Nonce verified."); + + global $wpdb; + $query = "delete from {$wpdb->base_prefix}mcloud_task where state >= 100"; + $wpdb->query($query); + + wp_send_json(['status' => 'ok', 'message', 'History cleared.']); + } + + + /** + * Checks the status of a specific task + */ + public function actionTaskStatus() { + check_ajax_referer('mcloud_task_status', 'nonce'); + + $taskId = arrayPath($_REQUEST, 'taskId', null); + if (empty($taskId)) { + wp_send_json(['status' => 'error', 'message' => 'Invalid task ID']); + } + + $task = Task::instance($taskId); + if (empty($task)) { + wp_send_json(['status' => 'error', 'message', 'Unknown task.']); + } + + wp_send_json(['status' => 'ok', 'task' => $task]); + } + + public function actionAllTaskStatuses() { + check_ajax_referer('mcloud_task_status', 'nonce'); + + $completeTasks = []; + $newTasks = []; + $currentTasks = []; + + $runningTasks = Task::runningTasks(); + $currentTaskIds = arrayPath($_REQUEST, 'currentTaskIds', []); + $runningTaskIds = []; + foreach($runningTasks as $runningTask) { + $runningTaskIds[] = $runningTask->id(); + if (!in_array($runningTask->id(), $currentTaskIds)) { + $newTasks[] = $runningTask; + } else { + $currentTasks[] = $runningTask; + } + } + + $completeTaskIds = array_diff($currentTaskIds, $runningTaskIds); + foreach($completeTaskIds as $completeTaskId) { + $task = Task::instance($completeTaskId); + if (!empty($task)) { + $completeTasks[] = $task; + } + } + + $newScheduled = []; + $currentScheduled = []; + + $runningScheduled = TaskSchedule::scheduledTasks(); + $currentScheduledIds = arrayPath($_REQUEST, 'currentScheduledIds', []); + $runningScheduledIds = []; + foreach($runningScheduled as $scheduled) { + $runningScheduledIds[] = $scheduled->id(); + if (!in_array($scheduled->id(), $currentScheduledIds)) { + $newScheduled[] = $scheduled; + } else { + $currentScheduled[] = $scheduled; + } + } + + $deletedScheduledIds = array_values(array_diff($currentScheduledIds, $runningScheduledIds)); + + + wp_send_json([ + 'status' => 'ok', + 'currentTasks' => $currentTasks, + 'newTasks' => $newTasks, + 'completeTasks' => $completeTasks, + 'newScheduled' => $newScheduled, + 'currentScheduled' => $currentScheduled, + 'deletedScheduledIds' => $deletedScheduledIds + ]); + + } + + public function actionDeleteScheduledTask() { + check_ajax_referer('mcloud_delete_scheduled_task', 'nonce'); + + $taskId = arrayPath($_REQUEST, 'taskId', null); + if (empty($taskId)) { + wp_send_json(['status' => 'error', 'message' => 'Invalid task ID']); + } + + $task = TaskSchedule::instance($taskId); + if (empty($task)) { + wp_send_json(['status' => 'error', 'message', 'Unknown task.']); + } + + $task->delete(); + wp_send_json(['status' => 'ok']); + } + + public function actionExecuteScheduledTask() { + check_ajax_referer('mcloud_execute_scheduled_task', 'nonce'); + + $taskId = arrayPath($_REQUEST, 'taskId', null); + if (empty($taskId)) { + wp_send_json(['status' => 'error', 'message' => 'Invalid task ID']); + } + + $task = TaskSchedule::instance($taskId); + if (empty($task)) { + wp_send_json(['status' => 'error', 'message', 'Unknown task.']); + } + + $task->runNow(); + wp_send_json(['status' => 'ok']); + } + + //endregion + + + //region Registration + + /** + * Registers a background task class + * + * @param string $taskClass + * @throws \Exception + */ + public static function registerTask($taskClass) { + static::$registeredTasks[$taskClass::identifier()] = $taskClass; + } + + /** + * Returns the registered class for a task identifier + * @param $taskIdentifier + * + * @return string|null + */ + public static function taskClass($taskIdentifier) { + if (isset(static::$registeredTasks[$taskIdentifier])) { + return static::$registeredTasks[$taskIdentifier]; + } + + return null; + } + + /** + * Returns the list of registered tasks + * + * @return string[] + */ + public static function registeredTasks() { + return static::$registeredTasks; + } + + + //endregion + + //region Running Tasks + + /** + * Queues a task to run + * + * @param Task $task + * + * @throws \Exception + */ + public function queueTask($task) { + Logger::info("Queueing task ..."); + $task->save(); + TaskRunner::dispatch($task); + } + + /** + * Runs a task with the given identifier + * + * @param Task|int $taskOrId + * + * @throws \Exception + */ + public function runTask($taskOrId) { + if (count($this->runningTasks) == 0) { + Logger::info("No running tasks."); + return; + } + + $task = null; + + if ($taskOrId instanceof Task) { + $task = $taskOrId; + } else if (is_numeric($taskOrId) || is_string($taskOrId)) { + foreach($this->runningTasks as $runningTask) { + if ($runningTask->id() == $taskOrId) { + $task = $runningTask; + break; + } + } + } + + if (empty($task)) { + Logger::info("No task with with id '{$taskOrId}'."); + return; + } + + if ($task->locked()) { + Logger::info("Task already running, exiting."); + return; + } + + if ($task->state >= Task::STATE_COMPLETE) { + Logger::info("Task is already completed, exiting."); + return; + } + + Logger::info("Running task."); + $result = $task->run(); + Logger::info("Result: $result"); + $complete = false; + if (intval($result) >= Task::TASK_COMPLETE) { + Logger::info("Result: $result >= ".Task::TASK_COMPLETE."?"); + $task->cleanup(); + Logger::info("Task complete."); + $complete = true; + } + + if (empty($complete)) { + Logger::info("Dispatching again."); + TaskRunner::dispatch($task); + } + } + + //endregion + + //region Test Tasks + + public function testTaskStart() { + $task = new TestTask(); + + for($i = 0; $i < 25000; $i++) { + $task->addItem(['item' => $i]); + } + + $this->queueTask($task); + + wp_send_json(['status' => 'waiting', 'taskId' => $task->id()]); + } + + //endregion +} \ No newline at end of file diff --git a/classes/Tasks/TaskRunner.php b/classes/Tasks/TaskRunner.php new file mode 100755 index 00000000..582fd475 --- /dev/null +++ b/classes/Tasks/TaskRunner.php @@ -0,0 +1,432 @@ +verifySSL = Environment::Option('mcloud-tasks-verify-ssl', null, 'no'); + $this->connectTimeout = Environment::Option('mcloud-tasks-connect-timeout', null, 0.01); + $this->timeout = Environment::Option('mcloud-tasks-timeout', null, 0.01); + $this->skipDNS = Environment::Option('mcloud-tasks-skip-dns', null, false); + $this->skipDNSHost = Environment::Option('mcloud-tasks-skip-dns-host', null, 'ip'); + $this->httpClientName = Environment::Option('mcloud-tasks-http-client', null, 'wordpress'); + + if (is_admin()) { + add_action('wp_ajax_task_runner_test', [$this, 'testTaskRunner']); + } + } + + /** + * @return TaskRunner|null + */ + private static function instance() { + if (empty(static::$instance)) { + static::$instance = new static(); + } + + return static::$instance; + } + + public static function init() { + static::instance(); + } + + //endregion + + //region Requests + + /** + * Makes the async call via Guzzle + * + * @param $url + * @param $args + * @param bool $timeoutOverride + * + * @return bool|\Exception|\Psr\Http\Message\ResponseInterface + */ + protected function postRequestGuzzle($url, $args, $timeoutOverride = false) { + if ($this->skipDNS) { + $ip = null; + + if ($this->skipDNSHost == 'ip') { + $ip = getHostByName(getHostName()); + if (empty($ip)) { + $ip = $_SERVER['SERVER_ADDR']; + } + } + + if (empty($ip)) { + $ip = '127.0.0.1'; + } + + $host = parse_url($url, PHP_URL_HOST); + $url = str_replace($host, $ip, $url); + + $headers = [ + 'Host' => $host + ]; + + if (isset($args['headers'])) { + $args['headers'] = array_merge($args['headers'], $headers); + } else { + $args['headers'] = $headers; + } + + $cookies = CookieJar::fromArray($args['cookies'], $ip); + } else { + $cookies = CookieJar::fromArray($args['cookies'], $_SERVER['HTTP_HOST']); + } + + if ($this->verifySSL == 'default') { + $verifySSL = apply_filters( 'https_local_ssl_verify', false); + } else { + $verifySSL = ($this->verifySSL == 'yes'); + } + + $rawUrl = esc_url_raw( $url ); + + $options = [ + 'synchronous' => !empty($args['blocking']), + 'cookies' => $cookies, + 'verify' => $verifySSL + ]; + + if (isset($args['body'])) { + if (is_array($args['body'])) { + $options['form_params'] = $args['body']; + } else { + $options['body'] = $args['body']; + } + } + + if (!empty($headers)) { + $options['headers'] = $headers; + } + + if ($timeoutOverride !== false) { + $options['timeout'] = $timeoutOverride; + $options['connect_timeout'] = $timeoutOverride; + } else { + $options['timeout'] = max(0.01, $this->timeout); + $options['connect_timeout'] = max(0.01, $this->connectTimeout);; + } + + $client = new Client(); + try { + if (empty($options['synchronous'])) { + Logger::info("Async call to $rawUrl"); + $options['synchronous'] = true; + $client->postSync($rawUrl, $options); + Logger::info("Async call to $rawUrl complete."); + return true; + } else { + Logger::info("Synchronous call to $rawUrl"); + $result = $client->post($rawUrl, $options); + Logger::info("Synchronous call to $rawUrl complete."); + return $result; + } + } catch (\Exception $ex) { + if (!empty($args['blocking'])) { + return $ex; + } else { + Logger::info("Async exception: ".$ex->getMessage()); + } + } + + return true; + } + + protected function postRequestWordPress($url, $args, $timeoutOverride = false) { + if ($this->skipDNS) { + $ip = null; + + if ($this->skipDNSHost == 'ip') { + $ip = getHostByName(getHostName()); + if (empty($ip)) { + $ip = $_SERVER['SERVER_ADDR']; + } + } + + if (empty($ip)) { + $ip = '127.0.0.1'; + } + + $host = parse_url($url, PHP_URL_HOST); + $url = str_replace($host, $ip, $url); + + $headers = [ + 'Host' => $host + ]; + + if (isset($args['headers'])) { + $args['headers'] = array_merge($args['headers'], $headers); + } else { + $args['headers'] = $headers; + } + } + + if ($this->verifySSL == 'default') { + $verifySSL = apply_filters( 'https_local_ssl_verify', false); + } else { + $verifySSL = ($this->verifySSL == 'yes'); + } + + $rawUrl = esc_url_raw( $url ); + + $args['sslverify'] = $verifySSL; + + if ($timeoutOverride !== false) { + $args['timeout'] = $timeoutOverride; + } else { + $args['timeout'] = max(0.01, $this->timeout); + } + + $result = wp_remote_post($rawUrl, $args); + if (is_wp_error($result)) { + return new \Exception($result->get_error_message()); + } + + return true; + } + + //endregion + + + //region Dispatching + + /** + * Dispatches a background task + * + * @param Task $task + * @throws \Exception + */ + public static function dispatch($task) { + $url = admin_url('admin-ajax.php'); + + $token = '__mcloud_token_'.uniqid(8); + $tokenVal = uniqid(8); + + $queryArgs = [ + 'action' => 'mcloud_run_task', + 'taskId' => $task->id(), + 'taskType' => $task::identifier(), + 'token' => $token, + 'tokenVal' => $tokenVal, + 'nonce' => wp_create_nonce('mcloud_run_task') + ]; + + if (isset($_COOKIE['XDEBUG_SESSION'])) { + $queryArgs['XDEBUG_SESSION'] = $_COOKIE['XDEBUG_SESSION']; + } + + $url = add_query_arg($queryArgs, $url); + + Logger::info("Dispatching to {$url}."); + + $loops = 0; + while(true) { + $loops++; + if ($loops > 1) { + Logger::info("Loop #{$loops}!"); + } + + if ($loops == 21) { + break; + } + + if (static::instance()->httpClientName == 'guzzle') { + static::instance()->postRequestGuzzle($url, [ + 'blocking' => false, + 'cookies' => $_COOKIE + ]); + } else { + static::instance()->postRequestWordPress($url, [ + 'blocking' => false, + 'cookies' => $_COOKIE + ]); + } + + sleep(3); + + $val = Environment::WordPressOption($token); + if ($val == $tokenVal) { + Logger::info("ACK acknowledge!"); + delete_site_option($token); + break; + } + } + } + + //endregion + + //region Testing Connectivity + + /** + * Performs the actual test request + * + * @param $which + * @param $url + * + * @return bool|\Exception + */ + private static function postTestRequest($which, $url) { + try { + if ($which === 'guzzle') { + static::instance()->postRequestGuzzle($url, ['blocking' => false, 'cookies' => $_COOKIE]); + } else { + static::instance()->postRequestWordPress($url, ['blocking' => false, 'cookies' => $_COOKIE]); + } + } catch (\Exception $ex) { + return $ex; + } + + $loops = 1; + while ($loops < 10) { + $testVal = Environment::WordPressOption('mcloud_connection_test'); + if ($testVal === 'test_value') { + Logger::info("Connectivity test value fetched for '$which'."); + return true; + } + + Logger::info("Connectivity test value not found for '$which'. Try #{$loops} ... trying again in 2 seconds."); + sleep(2); + $loops++; + } + + Logger::info("Unable to get test value for '$which'."); + + return false; + } + + /** + * Tests the connectivity for guzzle and wordpress in a specific order. + * + * @param $first + * @param $second + * + * @return string[]|bool + */ + private static function doTestConnectivity($first, $second) { + delete_site_option('mcloud_connection_test'); + + $url = admin_url('admin-ajax.php'); + $queryArgs = [ + 'action' => 'task_runner_test', + 'nonce' => wp_create_nonce('task_runner_test') + ]; + + if (isset($_COOKIE['XDEBUG_SESSION'])) { + $queryArgs['XDEBUG_SESSION'] = $_COOKIE['XDEBUG_SESSION']; + } + + $url = add_query_arg($queryArgs, $url); + + $errors = []; + + Logger::info("Testing connectivity using first '$first'"); + $result = static::postTestRequest($first, $url); + if ($result instanceof \Exception) { + Logger::info("Connectivity error using first '$first' => ".$result->getMessage()); + if (!in_array($result->getMessage(), $errors)) { + $errors[] = $result->getMessage(); + } + } else if (empty($result)) { + Logger::info("Connectivity error using first '$first' => Could not dispatch background task."); + $message = 'Unable to dispatch background task.'; + if (!in_array($message, $errors)) { + $errors[] = $message; + } + } else { + Logger::info("Testing connectivity first success"); + delete_site_option('mcloud_connection_test'); + return true; + } + + if (!empty($errors)) { + Logger::info("Testing Connectivity using second '$second'"); + $result = static::postTestRequest($second, $url); + if ($result instanceof \Exception) { + Logger::info("Connectivity error using second '$second' => ".$result->getMessage()); + if (!in_array($result->getMessage(), $errors)) { + $errors[] = $result->getMessage(); + } + } else if (empty($result)) { + Logger::info("Connectivity error using second '$second' => Could not dispatch background task."); + if (!in_array($message, $errors)) { + $errors[] = $message; + } + } else { + Logger::info("Testing connectivity second success"); + delete_site_option('mcloud_connection_test'); + Environment::UpdateOption('mcloud-tasks-http-client', $second); + return true; + } + } + + return $errors; + } + + /** + * Performs a background connection test + * + * @return bool|string[] + */ + public static function testConnectivity() { + if (static::instance()->httpClientName === 'guzzle') { + return static::doTestConnectivity('guzzle', 'wordpress'); + } + + return static::doTestConnectivity('wordpress', 'guzzle'); + } + + /** + * Ajax test endpoint + */ + public function testTaskRunner() { + Logger::info("Test Task Runner"); + check_ajax_referer('task_runner_test', 'nonce'); + + Logger::info("Updating test option."); + Environment::UpdateOption('mcloud_connection_test', 'test_value'); + } + + //endregion +} \ No newline at end of file diff --git a/classes/Tasks/TaskSchedule.php b/classes/Tasks/TaskSchedule.php new file mode 100755 index 00000000..647b341c --- /dev/null +++ b/classes/Tasks/TaskSchedule.php @@ -0,0 +1,397 @@ + '%d', + 'tuid' => '%s', + 'lastRun' => '%d', + 'nextRun' => '%d', + 'taskType' => '%s', + 'schedule' => '%s', + 'options' => '%s', + 'selection' => '%s' + ]; + + protected $serializedProperties = [ + 'options', + 'selection' + ]; + + //endregion + + //region Static + + public static function table() { + global $wpdb; + return "{$wpdb->base_prefix}mcloud_task_schedule"; + } + + //endregion + + //region Init + public function __construct($data = null) { + parent::__construct($data); + + if (empty($this->tuid)) { + $this->tuid = gen_uuid(12); + } + } + //endregion + + //region Properties + + /** + * Description of this task schedule in English + * + * @return string + */ + public function description() { + if ($this->recurring && !empty($this->schedule)) { + try { + return CronTranslator::translate($this->schedule); + } catch (CronParsingException $ex) { + return 'Invalid cron format'; + } + } else if ($this->nextRun > 0) { + return 'Run once on '.date('F jS, Y', $this->nextRun).' at '.date('g:i a', $this->nextRun); + } else { + return 'Not configured.'; + } + } + + /** + * Returns the next run date. + * + * @return Carbon|null + * @throws \Exception + */ + public function nextRunDate() { + if ($this->recurring && !empty($this->schedule)) { + $cron = CronExpression::factory($this->schedule); + $date = $cron->getNextRunDate(); + if (!empty($date)) { + return Carbon::instance($date); + } + + return null; + } else if ($this->nextRun > 0) { + return Carbon::createFromTimestamp($this->nextRun); + } else { + return null; + } + } + + public function nextRunDateDescription() { + if ($this->nextRun > 0) { + $nextRunDate = Carbon::createFromTimestamp($this->nextRun); + $nextRun = $nextRunDate->diffForHumans(Carbon::now(), true, false, 2); + + if ($this->nextRun >= time()) { + $nextRun = "In {$nextRun}"; + } else { + $nextRun = "{$nextRun} ago"; + } + } else { + $nextRun = ''; + } + + return $nextRun; + } + + /** + * Returns the last run date. + * + * @return Carbon|null + * @throws \Exception + */ + public function lastRunDate() { + if ($this->lastRun > 0) { + return Carbon::createFromTimestamp($this->lastRun); + } + + return null; + } + + public function lastRunDateDescription() { + if ($this->lastRun > 0) { + $lastRunDate = Carbon::createFromTimestamp($this->lastRun); + $lastRun = $lastRunDate->diffForHumans(Carbon::now(), true, false, 2).' ago'; + } else { + $lastRun = ''; + } + + return $lastRun; + } + + /** + * The last date this task should have been run, if recurring + * + * @return Carbon|null + */ + public function lastScheduledRunDate() { + if ($this->recurring && !empty($this->schedule)) { + $cron = CronExpression::factory($this->schedule); + $date = $cron->getPreviousRunDate(); + if (!empty($date)) { + return Carbon::instance($date); + } + } + + return null; + } + + /** + * Returns the class name for the Task this schedule will trigger + * + * @return string|null + */ + public function taskClass() { + return TaskManager::taskClass($this->taskType); + } + + /** + * The title of the task that this schedule will trigger + * + * @return string|null + */ + public function taskTitle() { + $taskClass = TaskManager::taskClass($this->taskType); + if (!empty($taskClass)) { + return $taskClass::title(); + } + + return null; + } + + //endregion + + + //region Running + /** + * Determines if the task should be run + * + * @return bool + */ + public function shouldRun() { + if (Task::scheduledTaskIsRunning($this->tuid)) { + return false; + } + + if ($this->recurring) { + if (empty($this->schedule)) { + return false; + } + + if (time() >= $this->nextRun) { + return true; + } + } else { + if (empty($this->nextRun)) { + return false; + } + + if (time() >= $this->nextRun) { + return true; + } + } + + return false; + } + + /** + * Runs the task if it's time to run it. + * @return bool + * @throws \Exception + */ + public function runIfNeeded() { + if (!$this->shouldRun()) { + return false; + } + + $this->runNow(); + } + + /** + * Runs the task now, regardless of schedule + * + * @return bool + * @throws \Exception + */ + public function runNow() { + if ($this->recurring) { + $cron = CronExpression::factory($this->schedule); + $this->nextRun = $cron->getNextRunDate('now')->getTimestamp(); + $this->lastRun = time(); + $this->save(); + } + + $taskClass = TaskManager::taskClass($this->taskType); + if (empty($taskClass)) { + return false; + } + + $task = new $taskClass(); + $task->tuid = $this->tuid; + $task->prepare($this->options, $this->selection); + TaskManager::instance()->queueTask($task); + + if (!$this->recurring) { + $this->delete(); + } + } + + //endregion + + //region Queries + + /** + * Fetches all of the scheduled tasks + * @return TaskSchedule[] + */ + public static function scheduledTasks() { + global $wpdb; + + $results = []; + $table = "{$wpdb->base_prefix}mcloud_task_schedule"; + $rows = $wpdb->get_results("select * from {$table}"); + foreach($rows as $row) { + $results[] = new static($row); + } + + return $results; + } + + /** + * @param $type + * @param int $safetyMargin + * + * @return TaskSchedule|null + */ + public static function nextScheduledTaskOfType($type, $safetyMargin = 1) { + global $wpdb; + + $table = "{$wpdb->base_prefix}mcloud_task_schedule"; + $sql = $wpdb->prepare("select * from {$table} where taskType = %s and nextRun >= %d order by nextRun asc limit 1", $type, time() + ($safetyMargin * 60)); + $rows = $wpdb->get_results($sql); + foreach($rows as $row) { + return new static($row); + } + + return null; + } + + /** + * @param $type + * + * @return bool + */ + public static function hasScheduledTaskOfType($type) { + global $wpdb; + + $table = "{$wpdb->base_prefix}mcloud_task_schedule"; + $sql = $wpdb->prepare("select count(id) from {$table} where taskType = %s", $type); + $count = $wpdb->get_var($sql); + + return ($count > 0); + } + + //endregion + + //region JSON + public function jsonSerialize() { + return [ + 'id' => $this->id, + 'tuid' => $this->tuid, + 'recurring' => boolval($this->recurring), + 'lastRun' => $this->lastRunDateDescription(), + 'nextRun' => $this->nextRunDateDescription(), + 'taskType' => $this->taskType, + 'taskTitle' => $this->taskTitle(), + 'description' => $this->description(), + 'cron' => $this->schedule, + 'statusNonce' => wp_create_nonce('mcloud_scheduled_task_status') + ]; + } + //endregion +} \ No newline at end of file diff --git a/classes/Tasks/TestTask.php b/classes/Tasks/TestTask.php new file mode 100755 index 00000000..2d0f92fc --- /dev/null +++ b/classes/Tasks/TestTask.php @@ -0,0 +1,113 @@ + [ + "title" => "Number of Items", + "description" => "The number of simulated items to process for the task.", + "type" => "number", + "min" => 1, + "max" => 20000, + "step" => 1, + "default" => 10 + ], + 'sleep' => [ + "title" => "Sleep", + "description" => "Sleeps the task for 1 second per item to simulate processing time.", + "type" => "checkbox", + "default" => false + ], + 'memory' => [ + "title" => "Test Memory", + "description" => "Allocates a block of memory to test the task manager's memory handling when running tasks.", + "type" => "checkbox", + "default" => false + ], + 'errors' => [ + "title" => "Random Errors", + "description" => "Generates a random error during processing.", + "type" => "checkbox", + "default" => false + ], + 'exceptions' => [ + "title" => "Random Exceptions", + "description" => "Generates a random exception during processing.", + "type" => "checkbox", + "default" => false + ], + ]; + } + + public function prepare($options = [], $selectedItems = []) { + $this->options = $options; + + $itemCount = arrayPath($options, 'items', 150); + for($i = 0; $i < $itemCount; $i++) { + $this->addItem(['item' => $i]); + } + + return true; + } + + public function performTask($item) { + $tuid = arrayPath($this->options, 'tuid', null); + Logger::info("Processing test item {$this->currentItem} ($tuid)"); + + if (arrayPath($this->options, 'sleep', false)) { + Logger::info("Sleeping ..."); + sleep(1); + } + + if (arrayPath($this->options, 'memory', false)) { + Logger::info("Testing Memory ..."); + $this->stuff[] = str_repeat("0", 1048576 * rand(1, 2)); + } + + if (arrayPath($this->options, 'errors', false)) { + if (rand(1,5) == 2) { + Logger::info("Throwing an error ..."); + return false; + } + } + + if (arrayPath($this->options, 'exceptions', false)) { + if (rand(1,4) == 2) { + Logger::info("Throwing an exception..."); + throw new \Exception('Random exception'); + } + } + + return true; + } +} \ No newline at end of file diff --git a/classes/Tools/BatchTool.php b/classes/Tools/BatchTool.php deleted file mode 100755 index fe9290cd..00000000 --- a/classes/Tools/BatchTool.php +++ /dev/null @@ -1,553 +0,0 @@ -owner = $ownerTool; - - $this->mediaListIntegration = Environment::Option('mcloud-storage-display-media-list', null, true); - - if(is_admin()) { - - add_action('wp_ajax_'.$this->startActionName(), [$this, 'startAction']); - add_action('wp_ajax_'.$this->progressActionName(), [$this, 'progressAction']); - add_action('wp_ajax_'.$this->nextBatchActionName(), [$this, 'nextBatchAction']); - add_action('wp_ajax_'.$this->manualActionName(), [$this, 'manualAction']); - add_action('wp_ajax_'.$this->cancelActionName(), [$this, 'cancelAction']); - } - } - - /** - * Performs any additional setup - */ - public function setup () { - if ($this->enabled()) { - BatchManager::instance()->displayAnyErrors(static::BatchIdentifier()); - - if ($this->mediaListIntegration) { - add_action('admin_init', function() { - add_filter('bulk_actions-upload', function($actions) { - return $this->registerBulkActions($actions); - }); - - add_filter('handle_bulk_actions-upload', function($redirect_to, $action_name, $post_ids) { - return $this->handleBulkActions($redirect_to, $action_name, $post_ids); - }, 1000, 3); - }); - } - } - } - - //endregion - - //region Properties - - /** - * Determines if this tool is enabled - * @return bool - */ - public function enabled() { - return $this->owner->enabled(); - } - - /** - * Name/ID of the batch - * @return string|null - */ - static public function BatchIdentifier() { - return null; - } - - /** - * Name/ID of the batch - * @return string|null - */ - static public function BatchType() { - return 'posts'; - } - - /** - * Title of the batch - * @return string - */ - abstract public function title(); - - /** - * The prefix to use for action names - * @return string - */ - abstract public function batchPrefix(); - - /** - * Fully qualified class name for the BatchProcess class - * @return string|null - */ - static public function BatchProcessClassName() { - return null; - } - - /** - * The view to render for instructions - * @return string - */ - abstract public function instructionView(); - - /** - * The page title for the importer page - * @return string - */ - function pageTitle() { - return $this->title(); - } - - /** - * The menu title for the importer page - * @return string - */ - function menuTitle() { - return $this->title(); - } - - /** - * The user's required capabilities to use the importer - * @return string - */ - function capabilityRequirement() { - return 'manage_options'; - } - - /** - * The menu slug for the tool - * @return string - */ - abstract function menuSlug(); - - /** - * The name identifier for the start action - * @return string - */ - public function startActionName() { - return $this->batchPrefix().'_start'; - } - - /** - * The name identifier for the progress action - * @return string - */ - public function progressActionName() { - return $this->batchPrefix().'_progress'; - } - - /** - * The name identifier for the next batch fetch action - * @return string - */ - public function nextBatchActionName() { - return $this->batchPrefix().'_next-batch'; - } - - /** - * The name identifier for the manual (client side batch processing) action - * @return string - */ - public function manualActionName() { - return $this->batchPrefix().'_manual'; - } - - /** - * The name identifier for the cancel action - * @return string - */ - public function cancelActionName() { - return $this->batchPrefix().'_cancel'; - } - - //endregion - - //region Bulk Actions - /** - * Registers any bulk actions for integeration into the media list - * @param $actions array - * @return array - */ - public function registerBulkActions($actions) { - return $actions; - } - - /** - * Called to handle a bulk action - * - * @param $redirect_to - * @param $action_name - * @param $post_ids - * @return string - */ - public function handleBulkActions($redirect_to, $action_name, $post_ids) { - return $redirect_to; - } - - protected function processBulkSelection($post_ids, $validateS3 = false, $requireImage = false) { - if ($validateS3) { - $posts_to_import = []; - if(count($post_ids) > 0) { - foreach($post_ids as $post_id) { - $meta = wp_get_attachment_metadata($post_id); - if(!empty($meta) && isset($meta['s3'])) { - continue; - } - - if ($requireImage) { - $mime = get_post_mime_type($post_id); - if (!in_array($mime, ['image/jpeg', 'image/jpg', 'image/png'])) { - continue; - } - } - - $posts_to_import[] = $post_id; - } - } - - $post_ids = $posts_to_import; - } - - if(count($post_ids) > 0) { - set_site_transient($this->batchPrefix().'_post_selection', $post_ids, 60); - return 'admin.php?page='.$this->menuSlug(); - } - - return false; - } - //endregion - - //region Batch Actions - /** - * Gets the post data to process for this batch. Data is paged to minimize memory usage. - * @param $page - * @param bool $forceImages - * @param bool $allInfo - * - * @return array - */ - protected function getImportBatch($page, $forceImages = false, $allInfo = false) { - $total = 0; - $pages = 1; - $shouldRun = false; - $fromSelection = false; - - if (isset($_POST['selection'])) { - $postIds = $_POST['selection']; - $total = count($postIds); - $shouldRun = true; - } else { - $postIds = get_site_transient($this->batchPrefix().'_post_selection'); - if (!empty($postIds)) { - delete_site_transient($this->batchPrefix().'_post_selection'); - $total = count($postIds); - $shouldRun = true; - $fromSelection = true; - } else { - $args = [ - 'post_type' => 'attachment', - 'post_status' => 'inherit', - 'posts_per_page' => 100, - 'fields' => 'ids', - 'paged' => $page - ]; - - if ($page == -1) { - unset($args['posts_per_page']); - unset($args['paged']); - $args['nopaging'] = true; - } - - $args = $this->filterPostArgs($args); - $args['post_mime_type'] = StorageSettings::allowedMimeTypes(); - - $query = new \WP_Query($args); - - $postIds = $query->posts; - - $total = (int)$query->found_posts; - $pages = $query->max_num_pages; - } - } - - - $posts = []; - $first = true; - foreach($postIds as $post) { - if ($first || $allInfo) { - $thumb = wp_get_attachment_image_src($post, 'thumbnail', true); - - $thumbUrl = null; - $icon = null; - if (!empty($thumb)) { - $thumbUrl = $thumb[0]; - $icon = (($thumb[1] != 150) && ($thumb[2] != 150)); - } - - $posts[] = [ - 'id' => $post, - 'title' => pathinfo(get_attached_file($post), PATHINFO_BASENAME), - 'thumb' => $thumbUrl, - 'icon' => $icon - ]; - - $first = false; - } else { - $posts[] = [ - 'id' => $post, -// 'title' => pathinfo(get_attached_file($post), PATHINFO_BASENAME), - ]; - } - } - - return [ - 'posts' => $posts, - 'total' => $total, - 'pages' => $pages, - 'options' => [], - 'shouldRun' => $shouldRun, - 'fromSelection' => $fromSelection - ]; - } - - /** - * Subclass to filter the args used to query posts. - * @param $args - * @return array - */ - protected function filterPostArgs($args) { - return $args; - } - - /** - * Renders the batch tool - */ - public function renderBatchTool() { - $data = BatchManager::instance()->stats(static::BatchIdentifier()); - - $shouldRun = false; - $fromSelection = false; - - $total = 0; - $postIds = []; - if (isset($_POST['selection'])) { - $shouldRun = true; - } else { - $postIds = get_site_transient($this->batchPrefix().'_post_selection'); - if (!empty($postIds)) { - $total = count($postIds); - $shouldRun = true; - $fromSelection = true; - } - } - - $background = Environment::Option('mcloud-storage-batch-background-processing', null, true); - $commandLine = Environment::Option('mcloud-storage-batch-command-line-processing', null, false); - - - - $data['status'] = ($data['running']) ? 'running' : 'idle'; - $data['batchType'] = static::BatchType(); - $data['shouldRun'] = $shouldRun; - $data['total'] = $total; - $data['enabled'] = $this->enabled(); - $data['title'] = $this->title(); - $data['instructions'] = View::render_view($this->instructionView(), ['background' => $background]); - $data['fromSelection'] = $fromSelection; - $data['disabledText'] = 'enable Storage'; - $data['commandLine'] = null; - $data['commandTitle'] = 'Run Tool'; - $data['cancelCommandTitle'] = 'Cancel Tool'; - - $data['totalTime'] = arrayPath($data, 'totalTime', 0); - $data['postsPerMinute'] = arrayPath($data, 'postsPerMinute', 0); - $data['eta'] = arrayPath($data, 'eta', -1); - - - $data['cancelAction'] = $this->cancelActionName(); - $data['startAction'] = $this->startActionName(); - $data['manualAction'] = $this->manualActionName(); - $data['progressAction'] = $this->progressActionName(); - $data['nextBatchAction'] = $this->nextBatchActionName(); - $data['background'] = $background || $commandLine; - - $data = $this->filterRenderData($data); - - Tracker::trackView("Batch - ".$data['title'], "/batch/".static::BatchIdentifier()); - echo View::render_view('importer/importer.php', $data); - } - - /** - * Allows subclasses to filter the data used to render the tool - * @param $data - * @return array - */ - protected function filterRenderData($data) { - return $data; - } - - protected function extractPostIds($posts) { - $postIDs = []; - - foreach($posts as $post) { - $postIDs[] = $post['id']; - } - - return $postIDs; - } - - /** - * The action that starts a batch in motion - */ - public function startAction() { - Logger::info('Starting batch.'); - Logger::info('Getting posts for batch.'); - $posts = $this->getImportBatch(-1); - Logger::info('Found '.$posts['total'].' posts for batch.'); - - if($posts['total'] > 0) { - try { - $postIDs = $this->extractPostIds($posts['posts']); - Logger::info('Adding posts to batch to run.'); - BatchManager::instance()->addToBatchAndRun(static::BatchIdentifier(), $postIDs, $posts['options']); - Logger::info('Finished adding posts to batch to run.'); - } catch (\Exception $ex) { - json_response(["status"=>"error", "error" => strip_tags($ex->getMessage())]); - } - } else { - BatchManager::instance()->reset(static::BatchIdentifier()); - json_response(['status' => 'finished']); - } - - - Tracker::trackView("Batch - Start ".$this->title(), "/batch/".static::BatchIdentifier()."/start"); - Logger::info('Sending JSON response.'); - $data = [ - 'status' => 'running', - 'total' => $posts['total'], - 'index' => 0, - 'post' => $posts['posts'][0] - ]; - - wp_send_json($data, 200); - } - - /** - * Reports progress on a batch - */ - public function progressAction() { - $data = BatchManager::instance()->stats(static::BatchIdentifier()); - - if (!$data['running']) { - Tracker::trackView("Batch - Finish ".$this->title(), "/batch/".static::BatchIdentifier()."/finish"); - } - - $response = [ - 'status' => ($data['running']) ? 'running' : 'idle', - 'enabled' => $this->enabled(), - 'shouldCancel' => $data['shouldCancel'], - 'lastUpdate' => $data['lastUpdate'], - 'lastRun' => $data['lastRun'], - 'index' => intval($data['current']), - 'total' => intval($data['total']), - 'post' => [ - 'id' => (static::BatchType() == 'posts') ? $data['currentID'] : null, - 'key' => (static::BatchType() == 'keys') ? $data['currentKey'] : null, - 'thumb' => $data['thumb'], - 'icon' => $data['icon'], - 'title' => $data['currentFile'] - ], - 'timingInfo' => [ - 'totalTime' => floatval($data['totalTime']), - 'postsPerSecond' => floatval($data['postsPerSecond']), - 'postsPerMinute' => floatval($data['postsPerMinute']), - 'eta' => floatval($data['eta']) - ] - ]; - - json_response($response); - } - - /** - * Fetches the next group of posts to process - */ - public function nextBatchAction() { - $page = isset($_POST['page']) ? (int)$_POST['page'] : 1; - - $postData = $this->getImportBatch($page, false, true); - - json_response($postData); - } - - /** - * Process the import manually. $_POST will contain a field `post_id` for the post to process - */ - abstract public function manualAction(); - - /** - * Cancels the batch - */ - public function cancelAction() { - $background = Environment::Option('mcloud-storage-batch-background-processing', null, true); - if (!$background) { - BatchManager::instance()->reset(static::BatchIdentifier()); - } - - BatchManager::instance()->setShouldCancel(static::BatchIdentifier(), true); - - call_user_func([static::BatchProcessClassName(), 'cancelAll']); - - Tracker::trackView("Batch - Cancel ".$this->title(), "/batch/".static::BatchIdentifier()."/cancel"); - - json_response(['status' => 'ok']); - } - - //endregion - - //region BatchToolInterface - public function toolInfo() { - return []; - } - //endregion -} \ No newline at end of file diff --git a/classes/Tools/Crop/CropTool.php b/classes/Tools/Crop/CropTool.php index e3facaa6..d77b4c5b 100755 --- a/classes/Tools/Crop/CropTool.php +++ b/classes/Tools/Crop/CropTool.php @@ -13,6 +13,7 @@ namespace ILAB\MediaCloud\Tools\Crop; +use ILAB\MediaCloud\Storage\StorageSettings; use ILAB\MediaCloud\Tools\Storage\StorageTool; use ILAB\MediaCloud\Tools\Tool; use ILAB\MediaCloud\Tools\ToolsManager; @@ -458,11 +459,20 @@ private function doPerformCrop($post_id, $size, $crop_x, $crop_y, $crop_width, $ $img_subpath=apply_filters('media-cloud/storage/process-file-name',$parsed_path['dirname']); $upload_dir=wp_upload_dir(); - $save_path=$upload_dir['basedir'].$img_subpath; - @mkdir($save_path,0777,true); + $save_path=$upload_dir['basedir'].$img_subpath; + + if (!file_exists($save_path)) { + if(!mkdir($save_path, 0777, true) && !is_dir($save_path)) { + json_response([ + 'status'=>'error', + 'message'=> "Path '$save_path' cannot be created." + ]); + } + } } - else - $save_path=$save_path_parts['dirname']; + else { + $save_path = $save_path_parts['dirname']; + } $extension=$save_path_parts['extension']; $filename=preg_replace('#^(IL[0-9-]*)#','',$save_path_parts['filename']); @@ -518,6 +528,15 @@ private function doPerformCrop($post_id, $size, $crop_x, $crop_y, $crop_width, $ $attrs = wp_get_attachment_image_src($post_id, $size); list($full_src,$full_width,$full_height,$full_cropped)=$attrs; + if ($storageTool->enabled()) { + if(StorageSettings::deleteOnUpload() && !StorageSettings::queuedDeletes()) { + $toDelete = trailingslashit($save_path).$filename; + if (file_exists($toDelete)) { + @unlink($toDelete); + } + } + } + json_response([ 'status'=>'ok', 'src'=>$full_src, diff --git a/classes/Tools/Debugging/DebuggingTool.php b/classes/Tools/Debugging/DebuggingTool.php index 36bd1267..373e98d1 100755 --- a/classes/Tools/Debugging/DebuggingTool.php +++ b/classes/Tools/Debugging/DebuggingTool.php @@ -53,6 +53,11 @@ public function __construct( $toolName, $toolInfo, $toolManager ) { } + + public function hasSettings() { + return true; + } + public function registerHelpMenu($top_menu_slug, $networkMode = false, $networkAdminMenu = false) { parent::registerHelpMenu($top_menu_slug); diff --git a/classes/Tools/Debugging/System/Batch/TestBatchProcess.php b/classes/Tools/Debugging/System/Batch/TestBatchProcess.php deleted file mode 100755 index ddc1d1bc..00000000 --- a/classes/Tools/Debugging/System/Batch/TestBatchProcess.php +++ /dev/null @@ -1,96 +0,0 @@ -shouldCancel('system-testing'); - } - - public function task($item) { - $startTime = microtime(true); - - Logger::info( 'Start Task', $item); - if (!$this->shouldHandle()) { - Logger::info( 'Task cancelled', $item); - return false; - } - - $index = $item['index']; - $post_id = $item['post']; - - BatchManager::instance()->setLastUpdateToNow('system-testing'); - BatchManager::instance()->setCurrentID('system-testing', $post_id); - BatchManager::instance()->setCurrent('system-testing', $index + 1); - - sleep(1); - - $endTime = microtime(true) - $startTime; - BatchManager::instance()->incrementTotalTime('system-testing', $endTime); - - return false; - } - - protected function complete() { - Logger::info( 'Task complete'); - BatchManager::instance()->reset('system-testing'); - parent::complete(); - } - - public function cancel_process() { - Logger::info( 'Cancel process'); - - parent::cancel_process(); - - BatchManager::instance()->reset('system-testing'); - } - - public static function cancelAll() { - Logger::info( 'Cancel all processes'); - - wp_clear_scheduled_hook('wp_mcloud_system_test_process_cron'); - - global $wpdb; - - $res = $wpdb->get_results("select * from {$wpdb->options} where option_name like 'wp_mcloud_system_test_process_batch_%'"); - foreach($res as $batch) { - Logger::info( "Deleting batch {$batch->option_name}"); - delete_option($batch->option_name); - } - - $res = $wpdb->get_results("select * from {$wpdb->options} where option_name like '__wp_mcloud_system_test_process_batch_%'"); - foreach($res as $batch) { - delete_option($batch->option_name); - } - - BatchManager::instance()->reset('system-testing'); - - Logger::info( "Current cron", get_option( 'cron', [])); - Logger::info( 'End cancel all processes'); - } -} diff --git a/classes/Tools/Debugging/System/Batch/TestBatchTool.php b/classes/Tools/Debugging/System/Batch/TestBatchTool.php deleted file mode 100755 index 2f78d1d0..00000000 --- a/classes/Tools/Debugging/System/Batch/TestBatchTool.php +++ /dev/null @@ -1,104 +0,0 @@ - 'ok']); - } - //endregion - - - /** - * Gets the post data to process for this batch. Data is paged to minimize memory usage. - * @param $page - * @param bool $forceImages - * @param bool $allInfo - * - * @return array - */ - protected function getImportBatch($page, $forceImages = false, $allInfo = false) { - return [ - 'total' => 15, - 'posts' => [ - 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, - ], - 'options' => [] - ]; - } -} \ No newline at end of file diff --git a/classes/Tools/Debugging/System/SystemCompatibilityTool.php b/classes/Tools/Debugging/System/SystemCompatibilityTool.php index 492b3cb1..48fde5a0 100755 --- a/classes/Tools/Debugging/System/SystemCompatibilityTool.php +++ b/classes/Tools/Debugging/System/SystemCompatibilityTool.php @@ -15,21 +15,15 @@ use Carbon\CarbonInterval; use FasterImage\FasterImage; -use GuzzleHttp\Psr7\Response; use ILAB\MediaCloud\Storage\StorageSettings; -use ILAB\MediaCloud\Tasks\BatchManager; -use ILAB\MediaCloud\Tools\Debugging\System\Batch\TestBatchProcess; -use ILAB\MediaCloud\Tools\Debugging\System\Batch\TestBatchTool; +use ILAB\MediaCloud\Tasks\TaskRunner; use ILAB\MediaCloud\Tools\Imgix\ImgixTool; use ILAB\MediaCloud\Tools\Storage\StorageTool; use ILAB\MediaCloud\Tools\Tool; use ILAB\MediaCloud\Tools\ToolsManager; -use function ILAB\MediaCloud\Utilities\arrayPath; -use ILAB\MediaCloud\Utilities\Environment; use ILAB\MediaCloud\Utilities\Logging\ErrorCollector; use ILAB\MediaCloud\Utilities\Tracker; use ILAB\MediaCloud\Utilities\View; -use Psr\Http\Message\ResponseInterface; if (!defined( 'ABSPATH')) { header( 'Location: /'); die; } @@ -45,32 +39,28 @@ class SystemCompatibilityTool extends Tool { const STEP_TEST_ACL = 4; const STEP_TEST_DELETE = 5; const STEP_TEST_BACKGROUND_CONNECTIVITY = 6; - const STEP_TEST_BACKGROUND_TASK = 7; - const STEP_TEST_IMGIX = 8; + const STEP_TEST_IMGIX = 7; public function __construct( $toolName, $toolInfo, $toolManager ) { parent::__construct( $toolName, $toolInfo, $toolManager ); - new TestBatchProcess(); - if ($this->enabled()) { add_action('wp_ajax_ilab_media_cloud_start_troubleshooting', [$this, 'startTroubleshooting']); - add_action('wp_ajax_ilab_media_cloud_wait_troubleshooting', [$this, 'waitTroubleshooting']); } + if (is_admin()) { + TaskRunner::init(); + } } - public function registerHelpMenu($top_menu_slug, $networkMode = false, $networkAdminMenu = false) { - parent::registerHelpMenu($top_menu_slug); - - if($this->enabled() && (($networkMode && $networkAdminMenu) || (!$networkMode && !$networkAdminMenu))) { - ToolsManager::instance()->insertHelpToolSeparator(); - add_submenu_page($top_menu_slug, 'Media Cloud System Compatibility Test', 'System Test', 'manage_options', 'media-tools-troubleshooter', [ - $this, - 'renderTroubleshooter' - ]); - } - } + public function registerMenu($top_menu_slug, $networkMode = false, $networkAdminMenu = false) { + if($this->enabled() && (($networkMode && $networkAdminMenu) || (!$networkMode && !$networkAdminMenu))) { + add_submenu_page($top_menu_slug, 'Media Cloud System Compatibility Test', 'System Check', 'manage_options', 'media-tools-troubleshooter', [ + $this, + 'renderTroubleshooter' + ]); + } + } public function enabled() { return true; @@ -119,13 +109,6 @@ private function stepInfo($step) { 'status' => 'Running tests ... This may take several minutes ...' ]; break; - case self::STEP_TEST_BACKGROUND_TASK: - return [ - 'index' => $step, - 'title' => 'Background Tasks', - 'status' => 'Running tests ... This may take several minutes ... ' - ]; - break; case self::STEP_TEST_IMGIX: return [ 'index' => $step, @@ -179,41 +162,18 @@ public function startTroubleshooting() { } else if ($step == self::STEP_TEST_BACKGROUND_CONNECTIVITY) { // Step 5 - Verify that the bulk importer process can work $this->testBackgroundConnectivity(); - } else if ($step == self::STEP_TEST_BACKGROUND_TASK) { - // Step 5 - Verify that the bulk importer process can work - $this->testBackgroundTasks(); - } else if ($step == self::STEP_TEST_IMGIX) { + } else if ($step == self::STEP_TEST_IMGIX) { // Step 6 - Test Imgix $this->testImgix(); } } - public function waitTroubleshooting() { - if (!is_admin()) { - wp_send_json(['error' => 'Not an admin.']); - } - - if (empty($_POST['step'])) { - wp_send_json(['error' => 'Missing step.']); - } - - $step = (int)$_POST['step']; - - if (($step < self::STEP_ENVIRONMENT) || ($step > self::STEP_TEST_IMGIX)) { - wp_send_json(['error' => 'Invalid step.']); - } - - if ($step == self::STEP_TEST_BACKGROUND_TASK) { - $this->waitBackgroundTasks(); - } else { - wp_send_json(['error' => 'Missing step.']); - } - } - private function calcTimeDrift() { if (function_exists('socket_create')) { $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); - socket_connect($sock, '0.pool.ntp.org', 123); + socket_connect($sock, 'time.google.com', 123); + + socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]); /* Send request */ $msg = "\010" . str_repeat("\0", 47); @@ -327,6 +287,28 @@ private function testEnvironment() { ]; } + if (defined('DISABLE_WP_CRON') && !empty(constant('DISABLE_WP_CRON'))) { + $warnings = true; + $info[] =[ + 'type' => 'warning', + 'message' => "DISABLE_WP_CRON is enabled, which is often a good thing so long that WordPress's Cron is being triggered by the system's crontab or something like WPEngine's WP Engine Alternate Cron is enabled. If WordPress's Cron is not being triggered, running background tasks will be slow and get 'stuck' a lot. Read more about the best way of setting up WordPress Cron." + ]; + } else { + $warnings = true; + $info[] =[ + 'type' => 'warning', + 'message' => "WordPress Cron is enabled. For better performance, consider disabling WordPress Cron and running it from the system crontab. Read more about the best way of setting up WordPress Cron." + ]; + } + + if (function_exists('xdebug_is_debugger_active') && xdebug_is_debugger_active()) { + $warnings = true; + $info[] =[ + 'type' => 'warning', + 'message' => "XDebug is currently active, which may inhibit background processing from running properly." + ]; + } + $html = View::render_view('debug/system-info', [ 'title' => 'System Compatibility', 'description' => 'Various aspects of your system that might have compatibility issues with Media Cloud', @@ -336,12 +318,12 @@ private function testEnvironment() { ]); $data = [ - 'html' => $html + 'html' => $html, + 'next' => $this->stepInfo(self::STEP_VALIDATE_CLIENT) ]; if (!$errors) { Tracker::trackView("System Test - Environment - Success", "/system-test/environment/success"); - $data['next'] = $this->stepInfo(self::STEP_VALIDATE_CLIENT); } else { Tracker::trackView("System Test - Environment - Error", "/system-test/environment/error"); } @@ -506,47 +488,8 @@ private function testDeletingFiles() { private function testBackgroundConnectivity($attempts = 0, $mode = 'ssl', $timeoutOverride = false) { Tracker::trackView("System Test - Background Connectivity", "/system-test/background-connection"); - $errorCollector = new ErrorCollector(); - - $result = BatchManager::instance()->testConnectivity($errorCollector, $timeoutOverride); - if ($result !== true) { - foreach($errorCollector->errors() as $error) { - if (strpos($error, ' 60: SSL') !== false) { - if ($attempts == 0) { - Environment::UpdateOption('mcloud-storage-batch-verify-ssl', 'no'); - $this->testBackgroundConnectivity($attempts + 1, 'ssl'); - } - - return; - } else if (strpos($error, ' 28: ') !== false) { - if (in_array($mode, ['ssl', 'timeout'])) { - if ($timeoutOverride === false) { - $timeoutOverride = floatval(Environment::Option('mcloud-storage-batch-timeout', null, 0.01)); - } - if ($timeoutOverride > 3) { - Environment::UpdateOption('mcloud-storage-batch-skip-dns', 0.01); - Environment::UpdateOption('mcloud-storage-batch-skip-dns-host', 'ip'); - - $this->testBackgroundConnectivity(0, 'dns'); - } else { - $timeoutOverride += 0.25; - $this->testBackgroundConnectivity($attempts + 1, 'timeout', $timeoutOverride); - } - } else if ($mode == 'dns') { - if ($timeoutOverride === false) { - $timeoutOverride = floatval(Environment::Option('mcloud-storage-batch-timeout', null, 0.01)); - } - - if ($timeoutOverride < 5) { - $timeoutOverride += 0.1; - $this->testBackgroundConnectivity($attempts + 1, 'dns', $timeoutOverride); - } - } - } - } - } - - if ($errorCollector->hasErrors()) { + $result = TaskRunner::testConnectivity(); + if (is_array($result)) { Tracker::trackView("System Test - Background Connectivity - Error", "/system-test/background-connection/error"); } else { Tracker::trackView("System Test - Background Connectivity - Success", "/system-test/background-connection/success"); @@ -554,124 +497,28 @@ private function testBackgroundConnectivity($attempts = 0, $mode = 'ssl', $timeo $batchSettings = admin_url('admin.php?page=media-cloud-settings&tab=batch-processing'); $html = View::render_view('debug/trouble-shooter-step.php', [ - 'success' => !$errorCollector->hasErrors(), + 'success' => !is_array($result), 'title' => 'Background Connectivity', 'success_message' => "Your WordPress server configuration supports loopback connections.", 'error_message' => "Your WordPress server configuration does not support background processing. The bulk importer will not work. Try changing the Connection Timeout setting in Batch Processing Settings to a higher value like 0.1 or 0.5. Some plugins also can cause issues.", - 'errors' => $errorCollector->errors(), + 'errors' => (is_array($result)) ? $result : [], 'hints' => [ + "Try changing the HTTP Client to Guzzle.", "Try changing the Connection Timeout and Timeout settings in the Batch Processing Settings", "Some managed host providers have a misconfigured openssl and/or curl installations. Try disabling Verify SSL in the Batch Processing Settings", "DNS is also sometimes a problem on managed hosting providers. Try turning off Skip DNS in the Batch Processing Settings", ] ]); - $data = [ - 'html' => $html, - 'next' => $this->stepInfo(self::STEP_TEST_BACKGROUND_TASK) - ]; - - wp_send_json($data); - } - - private function testBackgroundTasks() { - Tracker::trackView("System Test - Background Tasks", "/system-test/background-tasks"); - - BatchManager::instance()->setShouldCancel(TestBatchTool::BatchIdentifier(), true); - call_user_func([TestBatchTool::BatchProcessClassName(), 'cancelAll']); - - - $ajaxurl = admin_url('admin-ajax.php'); - $data = [ - 'action' => 'mcloud_system_testing_start' - ]; - - $result = BatchManager::postRequest($ajaxurl,[ - 'cookies' => $_COOKIE, - 'blocking' => true, - 'body' => $data - ],15); - - if (($result instanceof ResponseInterface) && ($result->getStatusCode() == 200)) { - wp_send_json([ - 'title' => 'Background Tasks', - 'status' => 'Waiting for background test task to start ...', - 'wait' => self::STEP_TEST_BACKGROUND_TASK - ]); + if (!is_array($result)) { + Tracker::trackView("System Test - Environment - Success", "/system-test/background-connection/success"); } else { - if (is_wp_error($result)) { - /** @var \WP_Error $result */ - $msg = $result->get_error_message(); - } else if ($result instanceof \Exception) { - /** @var \Exception $result */ - $msg = $result->getMessage(); - } else if ($result instanceof ResponseInterface) { - $msg = 'General server error.'; - } - - Tracker::trackView("System Test - Background Tasks - Error", "/system-test/background-tasks/error"); - - $batchSettings = admin_url('admin.php?page=media-cloud-settings&tab=batch-processing'); - $html = View::render_view('debug/trouble-shooter-step.php', [ - 'success' => false, - 'title' => 'Background Tasks', - 'error_message' => "Your WordPress server configuration does not support background tasks. The bulk importer will not work. Try changing the Connection Timeout setting in Batch Processing Settings to a higher value like 0.1 or 0.5. Some plugins also can cause issues.", - 'errors' => [$msg], - 'hints' => [ - "Try changing the Connection Timeout and Timeout settings in the Batch Processing Settings", - "Some managed host providers have a misconfigured openssl and/or curl installations. Try disabling Verify SSL in the Batch Processing Settings", - "DNS is also sometimes a problem on managed hosting providers. Try turning off Skip DNS in the Batch Processing Settings", - ] - ]); - - $data = [ - 'html' => $html - ]; - - wp_send_json($data); - } - } - - private function waitBackgroundTasks() { - $data = BatchManager::instance()->stats(TestBatchTool::BatchIdentifier()); - - if (!empty($data['running'])) { - $lastUpdate = arrayPath($data, 'lastUpdate', 0); - if (!empty($lastUpdate) && ($lastUpdate > 45)) { - Tracker::trackView("System Test - Background Tasks - Error", "/system-test/background-tasks/error"); - - $batchSettings = admin_url('admin.php?page=media-cloud-settings&tab=batch-processing'); - $html = View::render_view('debug/trouble-shooter-step.php', [ - 'success' => false, - 'title' => 'Background Tasks', - 'error_message' => "Your WordPress server configuration does not support background tasks. The bulk importer will not work with your current configuration. Try changing the Connection Timeout setting in Batch Processing Settings to a higher value like 0.1 or 0.5. Some plugins can also cause issues.", - ]); - - wp_send_json([ - 'html' => $html - ]); - } - - wp_send_json([ - 'status' => "Running test background task ... processing {$data['current']} of {$data['total']} sample items.", - 'wait' => self::STEP_TEST_BACKGROUND_TASK - ]); + Tracker::trackView("System Test - Environment - Error", "/system-test/background-connection/error"); } - Tracker::trackView("System Test - Background Tasks - Success", "/system-test/background-tasks/success"); - - $html = View::render_view('debug/trouble-shooter-step.php', [ - 'success' => true, - 'title' => 'Test Background Tasks', - 'success_message' => "Your WordPress server configuration supports background tasks.", - ]); - - - $data = [ - 'html' => $html - ]; - - wp_send_json($data); + wp_send_json([ + 'html' => $html + ]); } private function testImgix() { diff --git a/classes/Tools/Imgix/ImgixTool.php b/classes/Tools/Imgix/ImgixTool.php index 58026df3..60b2d138 100755 --- a/classes/Tools/Imgix/ImgixTool.php +++ b/classes/Tools/Imgix/ImgixTool.php @@ -297,8 +297,12 @@ public function buildSizedImage($id, $size) { $imgix->setSignKey($this->signingKey); } + if (isset($size['crop'])) { + $is_crop = !empty($size['crop']); + } else { + $is_crop = ((count($size) >= 3) && ($size[2] == 'crop')); + } - $is_crop = ((count($size) >= 3) && ($size[2] == 'crop')); if (!$is_crop && $this->shouldCrop) { $this->shouldCrop = false; $is_crop = true; diff --git a/classes/Tools/Storage/CLI/StorageCommands.php b/classes/Tools/Storage/CLI/StorageCommands.php index 1d1fa364..64ae0519 100755 --- a/classes/Tools/Storage/CLI/StorageCommands.php +++ b/classes/Tools/Storage/CLI/StorageCommands.php @@ -17,18 +17,18 @@ namespace ILAB\MediaCloud\Tools\Storage\CLI; use GuzzleHttp\Client ; -use GuzzleHttp\Exception\BadResponseException ; use GuzzleHttp\Exception\ClientException ; -use GuzzleHttp\Exception\RequestException ; use ILAB\MediaCloud\CLI\Command ; use ILAB\MediaCloud\Storage\StorageSettings ; -use ILAB\MediaCloud\Tasks\BatchManager ; -use ILAB\MediaCloud\Tools\Storage\DefaultProgressDelegate ; +use ILAB\MediaCloud\Tools\Browser\Tasks\ImportFromStorageTask ; +use ILAB\MediaCloud\Tools\Integrations\PlugIns\Elementor\Tasks\UpdateElementorTask ; use ILAB\MediaCloud\Tools\Storage\StorageTool ; +use ILAB\MediaCloud\Tools\Storage\Tasks\MigrateTask ; +use ILAB\MediaCloud\Tools\Storage\Tasks\RegenerateThumbnailTask ; +use ILAB\MediaCloud\Tools\Storage\Tasks\UnlinkTask ; use ILAB\MediaCloud\Tools\ToolsManager ; -use ILAB\MediaCloud\Utilities\Environment ; +use function ILAB\MediaCloud\Utilities\arrayPath ; use ILAB\MediaCloud\Utilities\Logging\Logger ; -use Illuminate\Support\Facades\Storage ; if ( !defined( 'ABSPATH' ) ) { header( 'Location: /' ); @@ -43,7 +43,7 @@ class StorageCommands extends Command { private $debugMode = false ; /** - * Imports the media library to the cloud. + * Migrates the media library to the cloud. * * ## OPTIONS * @@ -56,7 +56,7 @@ class StorageCommands extends Command * [--page=] * : The starting offset to process. Page numbers start at 1. Cannot be used with offset. * - * [--paths=] + * [--path-handling=] * : Controls the upload path. 'preserve' will preserve the files current path, 'replace' will replace it with the custom prefix defined in cloud storage settings. 'prepend' will prepend the custom prefix with the existing upload directory. * --- * default: preserve @@ -66,7 +66,7 @@ class StorageCommands extends Command * - prepend * --- * - * [--skip-existing] + * [--skip-imported] * : Skips images that have already been migrated to storage. * * [--skip-thumbnails] @@ -94,8 +94,48 @@ class StorageCommands extends Command * * @param $args * @param $assoc_args + * + * @throws \Exception + */ + public function migrateToCloud( $args, $assoc_args ) + { + /** @var \Freemius $media_cloud_licensing */ + global $media_cloud_licensing ; + self::Error( "Only available in the Premium version. To upgrade: https://mediacloud.press/pricing/" ); + } + + /** + * Imports media from the cloud to WordPress. + * + * ## OPTIONS + * + * [--import-path=] + * : The path on cloud storage to import from + * + * [--import-only] + * : Don't download, import to database only. + * + * [--skip-thumbnails] + * : Skips any images that look like they might be thumbnails. If this option is on, you may import images that are thumbnails but they will be treated as individual images. Default is true. + * + * [--preserve-paths=] + * : When downloading images, maintain the directory structure that is on cloud storage. + * --- + * default: preserve + * options: + * - preserve + * - replace + * - prepend + * --- + * + * @when after_wp_load + * + * @param $args + * @param $assoc_args + * + * @throws \Exception */ - public function import( $args, $assoc_args ) + public function importFromCloud( $args, $assoc_args ) { /** @var \Freemius $media_cloud_licensing */ global $media_cloud_licensing ; @@ -116,10 +156,30 @@ public function import( $args, $assoc_args ) * [--page=] * : The starting offset to process. Page numbers start at 1. Cannot be used with offset. * + * [--order-by=] + * : The field to sort the items to be imported by. Valid values are 'date', 'title' and 'filename'. + * --- + * options: + * - date + * - title + * - filename + * --- + * + * [--order=] + * : The sort order. Valid values are 'asc' and 'desc'. + * --- + * default: asc + * options: + * - asc + * - desc + * --- + * * @when after_wp_load * * @param $args * @param $assoc_args + * + * @throws \Exception */ public function regenerate( $args, $assoc_args ) { @@ -142,65 +202,75 @@ public function regenerate( $args, $assoc_args ) * [--page=] * : The starting offset to process. Page numbers start at 1. Cannot be used with offset. * + * [--order-by=] + * : The field to sort the items to be imported by. Valid values are 'date', 'title' and 'filename'. + * --- + * options: + * - date + * - title + * - filename + * --- + * + * [--order=] + * : The sort order. Valid values are 'asc' and 'desc'. + * --- + * default: asc + * options: + * - asc + * - desc + * --- + * * @when after_wp_load * * @param $args * @param $assoc_args + * + * @throws \Exception */ public function unlink( $args, $assoc_args ) { - $postArgs = [ - 'post_type' => 'attachment', - 'post_status' => 'inherit', - ]; - - if ( isset( $assoc_args['limit'] ) ) { - $postArgs['posts_per_page'] = $assoc_args['limit']; - - if ( isset( $assoc_args['offset'] ) ) { - $postArgs['offset'] = $assoc_args['offset']; - } else { - if ( isset( $assoc_args['page'] ) ) { - $postArgs['offset'] = max( 0, ($assoc_args['page'] - 1) * $assoc_args['limit'] ); - } - } - - } else { - $postArgs['nopaging'] = true; - } - - $q = new \WP_Query( $postArgs ); Command::Out( "", true ); Command::Warn( "%WThis command only unlinks media attachments from cloud storage, \nit will not download any media from cloud storage. If the attachments \nyou are unlinking do not exist on your server, you will have broken \nimages on your site.%n" ); Command::Out( "", true ); \WP_CLI::confirm( "Are you sure you want to continue?", $assoc_args ); - Command::Out( "", true ); - Command::Info( "Found %W{$q->post_count}%n attachments.", true ); - Command::Info( "Processing ..." ); - foreach ( $q->posts as $post ) { - $meta = wp_get_attachment_metadata( $post->ID ); + $options = $assoc_args; + if ( isset( $options['limit'] ) ) { - if ( isset( $meta['s3'] ) ) { - unset( $meta['s3'] ); - - if ( isset( $meta['sizes'] ) ) { - $sizes = $meta['sizes']; - foreach ( $sizes as $size => $sizeData ) { - if ( isset( $sizeData['s3'] ) ) { - unset( $sizeData['s3'] ); - } - $sizes[$size] = $sizeData; - } - $meta['sizes'] = $sizes; - } - - update_post_meta( $post->ID, '_wp_attachment_metadata', $meta ); + if ( isset( $options['page'] ) ) { + $options['offset'] = max( 0, ($assoc_args['page'] - 1) * $assoc_args['limit'] ); + unset( $options['page'] ); } - - Command::Info( '.' ); + } - Command::Info( ' %GDone.%n', true ); - Command::Out( "", true ); + + if ( isset( $assoc_args['order-by'] ) ) { + $orderBy = $assoc_args['order-by']; + $dir = arrayPath( $assoc_args, 'order', 'asc' ); + unset( $assoc_args['order-by'] ); + unset( $assoc_args['order'] ); + $assoc_args['sort-order'] = $orderBy . '-' . $dir; + } + + /** @var UnlinkTask $task */ + $task = new UnlinkTask(); + $this->runTask( $task, $options ); + } + + /** + * Updates Elementor's data with the correct URLs. + * + * + * @when after_wp_load + * + * @param $args + * @param $assoc_args + * + * @throws \Exception + */ + public function updateElementor( $args, $assoc_args ) + { + global $media_cloud_licensing ; + self::Error( "Only available in the Premium version. To upgrade: https://mediacloud.press/pricing/" ); } /** diff --git a/classes/Tools/Storage/StorageTool.php b/classes/Tools/Storage/StorageTool.php index a9097442..6295edb9 100755 --- a/classes/Tools/Storage/StorageTool.php +++ b/classes/Tools/Storage/StorageTool.php @@ -18,14 +18,20 @@ use ILAB\MediaCloud\Storage\StorageInterface ; use ILAB\MediaCloud\Storage\StorageManager ; use ILAB\MediaCloud\Storage\StorageSettings ; -use ILAB\MediaCloud\Tasks\BatchManager ; +use ILAB\MediaCloud\Tasks\TaskManager ; +use ILAB\MediaCloud\Tasks\TaskSchedule ; +use ILAB\MediaCloud\Tools\Storage\Tasks\CleanUploadsTask ; +use ILAB\MediaCloud\Tools\Storage\Tasks\DeleteUploadsTask ; +use ILAB\MediaCloud\Tools\Storage\Tasks\MigrateTask ; +use ILAB\MediaCloud\Tools\Storage\Tasks\RegenerateThumbnailTask ; +use ILAB\MediaCloud\Tools\Storage\Tasks\UnlinkTask ; use ILAB\MediaCloud\Tools\Tool ; use ILAB\MediaCloud\Utilities\Environment ; use ILAB\MediaCloud\Utilities\Logging\Logger ; use ILAB\MediaCloud\Utilities\NoticeManager ; +use ILAB\MediaCloud\Utilities\Prefixer ; use ILAB\MediaCloud\Utilities\View ; use Smalot\PdfParser\Parser ; -use WP_CLI\Iterators\Exception ; use function ILAB\MediaCloud\Utilities\arrayPath ; if ( !defined( 'ABSPATH' ) ) { @@ -96,7 +102,6 @@ public function __construct( $toolName, $toolInfo, $toolManager ) foreach ( StorageManager::drivers() as $key => $driver ) { $driverConfigs[$key] = $driver['config']; } - global $media_cloud_licensing ; $toolInfo = $this->mergeSettings( $toolInfo, $driverConfigs ); parent::__construct( $toolName, $toolInfo, $toolManager ); $this->displayBadges = Environment::Option( 'mcloud-storage-display-badge', null, true ); @@ -112,13 +117,31 @@ public function __construct( $toolName, $toolInfo, $toolManager ) require_once ABSPATH . 'wp-admin/includes/image.php'; } - if ( StorageSettings::deleteOnUpload() ) { - add_filter( 'wp_die_ajax_handler', [ $this, 'hookDieHandler' ] ); - add_filter( 'wp_die_json_handler', [ $this, 'hookDieHandler' ] ); - add_filter( 'wp_die_jsonp_handler', [ $this, 'hookDieHandler' ] ); - add_filter( 'wp_die_xmlrpc_handler', [ $this, 'hookDieHandler' ] ); - add_filter( 'wp_die_xml_handler', [ $this, 'hookDieHandler' ] ); - add_filter( 'wp_die_handler', [ $this, 'hookDieHandler' ] ); + if ( is_admin() ) { + + if ( StorageSettings::deleteOnUpload() ) { + add_filter( 'wp_die_ajax_handler', [ $this, 'hookDieHandler' ] ); + add_filter( 'wp_die_json_handler', [ $this, 'hookDieHandler' ] ); + add_filter( 'wp_die_jsonp_handler', [ $this, 'hookDieHandler' ] ); + add_filter( 'wp_die_xmlrpc_handler', [ $this, 'hookDieHandler' ] ); + add_filter( 'wp_die_xml_handler', [ $this, 'hookDieHandler' ] ); + add_filter( 'wp_die_handler', [ $this, 'hookDieHandler' ] ); + } + + $migratedFrom = get_option( 'mcloud-other-plugins-did-migrate' ); + + if ( !empty($migratedFrom) ) { + $settingsUrl = admin_url( 'admin.php?page=media-cloud-settings&tab=storage' ); + $systemCheck = admin_url( 'admin.php?page=media-tools-troubleshooter' ); + NoticeManager::instance()->displayAdminNotice( + 'info', + "Media Cloud noticed you were using {$migratedFrom} and has migrated your settings automatically. Everything should be working as before, but make sure to double check your Cloud Storage settings. You may also want to run a System Check to make sure everything is running properly.", + true, + 'mcloud-migrated-other-plugin', + 'forever' + ); + } + } } @@ -139,13 +162,22 @@ public function hasSettings() return true; } + public function activate() + { + $provider = Environment::Option( 'mcloud-storage-provider', 'ILAB_CLOUD_STORAGE_PROVIDER', null ); + if ( empty($provider) ) { + StorageSettings::migrateFromOtherPlugin(); + } + } + public function setup() { parent::setup(); + TaskManager::registerTask( UnlinkTask::class ); if ( $this->enabled() ) { - BatchManager::instance()->displayAnyErrors( 'storage' ); - BatchManager::instance()->displayAnyErrors( 'thumbnails' ); + TaskManager::registerTask( CleanUploadsTask::class ); + TaskManager::registerTask( DeleteUploadsTask::class ); foreach ( $this->toolInfo['compatibleImageOptimizers'] as $key => $plugin ) { if ( is_plugin_active( $plugin ) ) { @@ -346,24 +378,15 @@ function ( $filename ) { } return $sizes; } ); - add_action( 'admin_init', function () { - add_filter( 'bulk_actions-upload', function ( $actions ) { - $actions['mcloud_unlink_media'] = 'Unlink from Cloud Storage'; - return $actions; - } ); - add_filter( - 'handle_bulk_actions-upload', - function ( $redirect_to, $action_name, $post_ids ) { - if ( $action_name == 'mcloud_unlink_media' ) { - return $this->handleUnlinkAction( $redirect_to, $post_ids ); - } - return $redirect_to; - }, - 1000, - 3 - ); - } ); $this->hookupUI(); + } else { + + if ( !empty($this->client) && $this->client->settingsError() ) { + $adminUrl = admin_url( 'admin.php?page=media-cloud-settings&tab=storage' ); + $testUrl = admin_url( 'admin.php?page=media-tools-troubleshooter' ); + NoticeManager::instance()->displayAdminNotice( 'error', "Your cloud storage settings are incorrect. Please verify your settings or run the systems test to troubleshoot the issue." ); + } + } } @@ -524,7 +547,7 @@ public function updateAttachmentMetadata( } $oldSizeFile = $size['file']; - if ( $preserveFilePaths ) { + if ( $preserveFilePaths == 'preserve' ) { $size['prefix'] = $old_path_base; $size['file'] = str_replace( $old_path_base, '', $size['file'] ); } @@ -598,6 +621,7 @@ public function updateAttachmentMetadata( unset( $data['prefix'] ); $data['file'] = $old_file; + Prefixer::nextVersion(); return $data; } @@ -686,11 +710,21 @@ public function getUploadDir( $uploads ) if ( !empty($job_manager_upload) && !empty($job_manager_uploading_file) ) { return $uploads; } + if ( empty(StorageSettings::prefixFormat()) ) { + return $uploads; + } $prefix = trim( StorageSettings::prefix( null ), '/' ); if ( is_multisite() && !is_main_site() ) { - $root = WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'uploads'; - $rootUrl = rtrim( content_url(), '/' ) . '/uploads'; + + if ( defined( 'UPLOADS' ) ) { + $root = trailingslashit( ABSPATH ) . constant( 'UPLOADS' ); + $rootUrl = rtrim( home_url( '/' . constant( 'UPLOADS' ) ), '/' ); + } else { + $root = WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'uploads'; + $rootUrl = rtrim( content_url(), '/' ) . '/uploads'; + } + $sitePrefix = ltrim( str_replace( $root, '', $uploads['basedir'] ), DIRECTORY_SEPARATOR ); $prefix = $sitePrefix . '/' . $prefix; $uploads['subdir'] = '/' . $prefix; @@ -1274,32 +1308,21 @@ public function getAttachmentURL( $url, $post_id ) } if ( empty($new_url) ) { - $meta = get_post_meta( $post_id, 'ilab_s3_info', true ); - if ( $meta ) { - $new_url = $this->getAttachmentURLFromMeta( $meta ); + $s3Info = get_post_meta( $post_id, 'ilab_s3_info', true ); + if ( !empty($s3Info) ) { + $new_url = $this->getAttachmentURLFromMeta( $s3Info ); } - if ( !$new_url ) { - $meta = get_post_meta( $post_id, 'amazonS3_info' ); + if ( empty($new_url) ) { + $offloadS3Info = get_post_meta( $post_id, 'amazonS3_info', true ); - if ( $meta ) { - $new_url = $this->getOffloadS3URL( $post_id, $meta ); - $s3Data = $meta[0]; - $s3Data['url'] = $new_url; - $s3Data['privacy'] = 'public-read'; - $this->skipUpdate = true; - $imageMeta = wp_get_attachment_metadata( $post_id ); - - if ( $imageMeta ) { - $imageMeta['s3'] = $s3Data; - wp_update_attachment_metadata( $post_id, $imageMeta ); - } else { - update_post_meta( $post_id, 'ilab_s3_info', [ - 's3' => $s3Data, - ] ); + if ( !empty($offloadS3Info) ) { + $new_url = $this->importOffloadMetadata( $post_id, $meta, $offloadS3Info ); + } else { + $statelessInfo = get_post_meta( $post_id, 'sm_cloud', true ); + if ( !empty($statelessInfo) ) { + $new_url = $this->importStatelessMetadata( $post_id, $meta, $statelessInfo ); } - - $this->skipUpdate = false; } } @@ -1394,28 +1417,198 @@ private function getAttachmentURLFromMeta( $meta ) } /** - * For compatibility with Offload S3. + * Imports metadata from WP-Stateless * - * @param int $post_id - * @param array $info + * @param $post_id + * @param $meta + * @param $statelessData * - * @return null|string + * @return mixed|null + * @throws StorageException + */ + private function importStatelessMetadata( $post_id, $meta, $statelessData ) + { + $provider = 'google'; + $key = arrayPath( $statelessData, 'name', null ); + $bucket = arrayPath( $statelessData, 'bucket', null ); + if ( empty($bucket) || empty($key) ) { + return null; + } + $mime = get_post_mime_type( $post_id ); + $hasMeta = !empty($meta); + if ( empty($meta) ) { + $meta = []; + } + $s3Info = [ + 'url' => $this->getStatelessURL( $bucket, $key ), + 'provider' => $provider, + 'bucket' => $bucket, + 'privacy' => 'public-read', + 'v' => MEDIA_CLOUD_INFO_VERSION, + 'mime-type' => $mime, + ]; + $meta['s3'] = $s3Info; + $sizes = $meta['sizes']; + $statelessSizes = arrayPath( $statelessData, 'sizes', [] ); + $meta['sizes'] = []; + foreach ( $statelessSizes as $statelessSize => $statelessSizeData ) { + $sizeKey = arrayPath( $statelessSizeData, 'name' ); + if ( !isset( $sizes[$statelessSize] ) || empty($sizeKey) ) { + continue; + } + $sizeData = $sizes[$statelessSize]; + $sizeS3Info = $s3Info; + $sizeS3Info['url'] = $this->getStatelessURL( $bucket, $sizeKey ); + $sizeS3Info['key'] = $sizeKey; + $sizeS3Info['mime-type'] = $sizeData['mime-type']; + $sizeData['s3'] = $sizeS3Info; + $meta['sizes'][$statelessSize] = $sizeData; + } + + if ( $hasMeta ) { + update_post_meta( $post_id, '_wp_attachment_metadata', $meta ); + } else { + update_post_meta( $post_id, 'ilab_s3_info', [ + 's3' => $s3Info, + ] ); + } + + return $s3Info['url']; + } + + /** + * Imports metadata from WP Offload + * + * @param $post_id + * @param $meta + * @param $offloadS3Data + * + * @return mixed|null + * @throws StorageException */ - private function getOffloadS3URL( $post_id, $info ) + private function importOffloadMetadata( $post_id, $meta, $offloadS3Data ) { - if ( !is_array( $info ) && count( $info ) < 1 ) { + $provider = arrayPath( $offloadS3Data, 'provider', null ); + $bucket = arrayPath( $offloadS3Data, 'bucket', null ); + $region = arrayPath( $offloadS3Data, 'region', null ); + $key = arrayPath( $offloadS3Data, 'key', null ); + if ( empty($provider) || empty($bucket) || empty($key) || !in_array( $provider, [ 'aws', 'do', 'gcp' ] ) ) { return null; } - $region = ( isset( $info[0]['region'] ) ? $info[0]['region'] : null ); - $bucket = $info[0]['bucket']; - $file = $info[0]['key']; + $providerMap = [ + 'aws' => 's3', + 'do' => 'do', + 'gcp' => 'google', + ]; + $provider = $providerMap[$provider]; + $mime = get_post_mime_type( $post_id ); + $hasMeta = !empty($meta); + if ( empty($meta) ) { + $meta = []; + } + $s3Info = [ + 'url' => $this->getOffloadS3URL( + $provider, + $region, + $bucket, + $key + ), + 'provider' => $provider, + 'bucket' => $bucket, + 'privacy' => 'public-read', + 'v' => MEDIA_CLOUD_INFO_VERSION, + 'mime-type' => $mime, + ]; + if ( $provider !== 'google' ) { + $s3Info['region'] = $region; + } + $meta['s3'] = $s3Info; + + if ( isset( $meta['sizes'] ) ) { + $baseKey = ltrim( pathinfo( '/' . $key, PATHINFO_DIRNAME ), '/' ); + $newSizes = []; + foreach ( $meta['sizes'] as $size => $sizeData ) { + $sizeKey = trailingslashit( $baseKey ) . $sizeData['file']; + $sizeS3Info = $s3Info; + $sizeS3Info['url'] = $this->getOffloadS3URL( + $provider, + $region, + $bucket, + $sizeKey + ); + $sizeS3Info['key'] = $sizeKey; + $sizeS3Info['mime-type'] = $sizeData['mime-type']; + $sizeData['s3'] = $sizeS3Info; + $newSizes[$size] = $sizeData; + } + $meta['sizes'] = $newSizes; + } + - if ( empty($region) ) { - return "https://s3.amazonaws.com/{$bucket}/{$file}"; + if ( $hasMeta ) { + update_post_meta( $post_id, '_wp_attachment_metadata', $meta ); } else { - return "https://s3-{$region}.amazonaws.com/{$bucket}/{$file}"; + update_post_meta( $post_id, 'ilab_s3_info', [ + 's3' => $s3Info, + ] ); + } + + return $s3Info['url']; + } + + /** + * Generates a URL from a WP-Stateless Import + * + * @param $bucket + * @param $key + * + * @return string|null + * @throws StorageException + */ + private function getStatelessURL( $bucket, $key ) + { + if ( 'google' === StorageManager::driver() && $bucket === $this->client->bucket() ) { + return $this->client->url( $key ); } + return "https://storage.googleapis.com/{$bucket}/{$key}"; + } + /** + * Generates a URL from Offload import + * + * @param $provider + * @param $region + * @param $bucket + * @param $key + * + * @return string|null + * @throws StorageException + */ + private function getOffloadS3URL( + $provider, + $region, + $bucket, + $key + ) + { + if ( $provider === StorageManager::driver() && $bucket === $this->client->bucket() ) { + return $this->client->url( $key ); + } + + if ( $provider === 's3' ) { + if ( empty($region) ) { + return "https://s3.amazonaws.com/{$bucket}/{$key}"; + } + return "https://s3-{$region}.amazonaws.com/{$bucket}/{$key}"; + } + + if ( $provider === 'do' ) { + return "https://{$region}.digitaloceanspaces.com/{$bucket}/{$key}"; + } + if ( $provider === 'google' ) { + return "https://storage.googleapis.com/{$bucket}/{$key}"; + } + return null; } /** @@ -1626,34 +1819,6 @@ public function attachmentIdFromURL( $postId, $url ) return $postId; } - //endregion - //region Bulk Actions - protected function handleUnlinkAction( $redirect_to, $post_ids ) - { - foreach ( $post_ids as $post_id ) { - $meta = wp_get_attachment_metadata( $post_id ); - - if ( isset( $meta['s3'] ) ) { - unset( $meta['s3'] ); - - if ( isset( $meta['sizes'] ) ) { - $sizes = $meta['sizes']; - foreach ( $sizes as $size => $sizeData ) { - if ( isset( $sizeData['s3'] ) ) { - unset( $sizeData['s3'] ); - } - $sizes[$size] = $sizeData; - } - $meta['sizes'] = $sizes; - } - - update_post_meta( $post_id, '_wp_attachment_metadata', $meta ); - } - - } - return $redirect_to; - } - //endregion //region Crop Tool Related /** @@ -1675,7 +1840,13 @@ public function processCrop( { $upload_info = wp_upload_dir(); $subdir = trim( str_replace( $upload_info['basedir'], '', $upload_path ), '/' ); - $upload_path = rtrim( str_replace( $subdir, '', $upload_path ), '/' ); + + if ( strpos( $upload_info['basedir'], $upload_path ) !== false ) { + $upload_path = $upload_info['basedir']; + } else { + $upload_path = rtrim( substr( $upload_path, 0, strlen( $upload_path ) - strlen( $subdir ) ), '/' ); + } + if ( $this->client && $this->client->enabled() ) { $sizeMeta = $this->processFile( $upload_path, $subdir . '/' . $file, $sizeMeta ); } @@ -1729,29 +1900,51 @@ public function processFile( $shouldUseCustomPrefix = apply_filters( 'media-cloud/storage/should-use-custom-prefix', $shouldUseCustomPrefix ); $shouldUseCustomPrefix = !empty(StorageSettings::prefixFormat()) && $shouldUseCustomPrefix; - if ( $preserveFilePath == 'replace' && !isset( $data['prefix'] ) && !$shouldUseCustomPrefix ) { - $fpath = pathinfo( $data['file'], PATHINFO_DIRNAME ); - $fpath = str_replace( $upload_path, '', $fpath ); - $prefix = trailingslashit( ltrim( $fpath, DIRECTORY_SEPARATOR ) ); - if ( $prefix == './' ) { - $prefix = trailingslashit( pathinfo( $filename, PATHINFO_DIRNAME ) ); + if ( $preserveFilePath == 'replace' ) { + + if ( !isset( $data['prefix'] ) && !$shouldUseCustomPrefix ) { + $fpath = pathinfo( $data['file'], PATHINFO_DIRNAME ); + $fpath = str_replace( $upload_path, '', $fpath ); + $prefix = trailingslashit( ltrim( $fpath, DIRECTORY_SEPARATOR ) ); + + if ( $prefix == './' || $prefix == '/' ) { + $wpUpload = wp_upload_dir(); + $prefix = ltrim( trailingslashit( $wpUpload['subdir'] ), '/' ); + } + + } else { + $prefix = trailingslashit( StorageSettings::prefix( $id ) ); } + } else { if ( $preserveFilePath == 'preserve' ) { - $prefix = ( isset( $data['prefix'] ) ? trailingslashit( $data['prefix'] ) : StorageSettings::prefix( $id ) ); + + if ( isset( $data['prefix'] ) ) { + $prefix = trailingslashit( $data['prefix'] ); + } else { + $prefix = trailingslashit( str_replace( basename( $filename ), '', $filename ) ); + } + } else { if ( $preserveFilePath == 'prepend' ) { - $prefix = ( isset( $data['prefix'] ) ? trailingslashit( StorageSettings::prefix( $id ) ) . trailingslashit( $data['prefix'] ) : StorageSettings::prefix( $id ) ); - } else { - $prefix = StorageSettings::prefix( $id ); + + if ( isset( $data['prefix'] ) ) { + $prefix = trailingslashit( $data['prefix'] ); + } else { + $bn = basename( $filename ); + $prefix = trailingslashit( str_replace( $bn, '', $filename ) ); + } + + $prefix = trailingslashit( StorageSettings::prefix( $id ) ) . $prefix; } } } + Logger::info( "({$preserveFilePath}) Prefix => {$prefix} " ); $parts = explode( '/', $filename ); $bucketFilename = array_pop( $parts ); try { @@ -1806,9 +1999,12 @@ public function processFile( StorageSettings::expires(), 'image/webp' ); + if ( StorageSettings::deleteOnUpload() ) { - unlink( $webpPath ); + $this->deleteCache[] = $webpPath; + // unlink($webpPath); } + } } @@ -1879,8 +2075,8 @@ public function processFile( if ( file_exists( $upload_path . '/' . $filename ) ) { $fileToDelete = $upload_path . '/' . $filename; Logger::info( "Deleting {$fileToDelete}" ); - //$this->deleteCache[] = $fileToDelete; - unlink( $fileToDelete ); + $this->deleteCache[] = $fileToDelete; + //unlink($fileToDelete); } } @@ -1895,12 +2091,29 @@ public function hookDieHandler( $handler ) public function cleanUploads( $message, $title = '', $args = array() ) { - foreach ( $this->deleteCache as $file ) { - if ( file_exists( $file ) ) { - unlink( $file ); + + if ( count( $this->deleteCache ) > 0 ) { + Logger::info( "Cleaning uploads ..." ); + + if ( StorageSettings::queuedDeletes() ) { + $task = TaskSchedule::nextScheduledTaskOfType( DeleteUploadsTask::identifier() ); + + if ( !empty($task) ) { + $task->selection = array_merge( $task->selection, $this->deleteCache ); + $task->save(); + } else { + DeleteUploadsTask::scheduleIn( 2, [], $this->deleteCache ); + } + + } else { + foreach ( $this->deleteCache as $file ) { + @unlink( $file ); + } } + + $this->deleteCache = []; } - $this->deleteCache = []; + call_user_func( $this->dieHandler, $message, @@ -2538,7 +2751,7 @@ public function processImport( // $isDocument = false; $skipThumbnails = ( empty($options['skip-thumbnails']) ? false : true ); - $pathmode = ( empty($options['path-handling']) ? 'replace' : $options['path-handling'] ); + $pathmode = ( empty($options['path-handling']) ? 'preserve' : $options['path-handling'] ); $data = wp_get_attachment_metadata( $postId ); if ( empty($data) ) { @@ -2815,6 +3028,8 @@ public function importImageAttachmentFromStorage( $fileInfo, $thumbs = array() ) } } + $dir = wp_upload_dir(); + $guid = trailingslashit( $dir['baseurl'] ) . $fileInfo->key(); $post = wp_insert_post( [ 'post_author' => get_current_user_id(), 'post_title' => $filename, @@ -2836,10 +3051,7 @@ public function importImageAttachmentFromStorage( $fileInfo, $thumbs = array() ) $meta = apply_filters( 'media-cloud/vision/process-meta', $meta, $post ); add_post_meta( $post, '_wp_attached_file', $fileInfo->key() ); add_post_meta( $post, '_wp_attachment_metadata', $meta ); - $thumbUrl = image_downsize( $post, [ - 'width' => 128, - 'height' => 128, - ] ); + $thumbUrl = image_downsize( $post, [ 128, 128 ] ); if ( is_array( $thumbUrl ) ) { $thumbUrl = $thumbUrl[0]; } @@ -2850,6 +3062,157 @@ public function importImageAttachmentFromStorage( $fileInfo, $thumbs = array() ) ]; } + /** + * Once a file has been directly uploaded, it'll need to be "imported" into WordPress + * + * @param int|string $postId + * @param FileInfo $fileInfo + * @param string[] $thumbs + * + * @return array|bool + * @throws StorageException + */ + public function importExistingAttachmentFromStorage( $postId, $fileInfo, $thumbs = array() ) + { + if ( !$this->client || !$this->client->enabled() ) { + return null; + } + if ( $fileInfo->mimeType() && strpos( $fileInfo->mimeType(), 'image/' ) === 0 ) { + return $this->importExistingImageAttachmentFromStorage( $postId, $fileInfo, $thumbs ); + } + $url = $this->client->url( $fileInfo->key() ); + $s3Info = [ + 'url' => $url, + 'mime-type' => $fileInfo->mimeType(), + 'bucket' => $this->client->bucket(), + 'privacy' => StorageSettings::privacy(), + 'key' => $fileInfo->key(), + 'v' => MEDIA_CLOUD_INFO_VERSION, + 'options' => [ + 'params' => [], + ], + ]; + if ( !empty(StorageSettings::cacheControl()) ) { + $s3Info['options']['params']['CacheControl'] = StorageSettings::cacheControl(); + } + if ( !empty(StorageSettings::expires()) ) { + $s3Info['options']['params']['Expires'] = StorageSettings::expires(); + } + $meta = wp_get_attachment_metadata( $postId, true ); + $meta['s3'] = $s3Info; + update_post_meta( $postId, '_wp_attachment_metadata', $meta ); + return [ + 'id' => $postId, + 'url' => $url, + 'thumb' => wp_mime_type_icon( $postId ), + ]; + } + + /** + * Once a file has been directly uploaded, it'll need to be "imported" into WordPress + * + * @param int|string $postId + * @param FileInfo $fileInfo + * @param string[] $thumbs + * + * @return array|bool + * @throws StorageException + */ + public function importExistingImageAttachmentFromStorage( $postId, $fileInfo, $thumbs = array() ) + { + if ( !$this->client || !$this->client->enabled() ) { + return null; + } + if ( !is_array( $fileInfo->size() ) ) { + return null; + } + $url = $this->client->url( $fileInfo->key() ); + $s3Info = [ + 'url' => $url, + 'mime-type' => $fileInfo->mimeType(), + 'bucket' => $this->client->bucket(), + 'privacy' => StorageSettings::privacy(), + 'key' => $fileInfo->key(), + 'v' => MEDIA_CLOUD_INFO_VERSION, + 'options' => [ + 'params' => [], + ], + ]; + if ( !empty(StorageSettings::cacheControl()) ) { + $s3Info['options']['params']['CacheControl'] = StorageSettings::cacheControl(); + } + if ( !empty(StorageSettings::expires()) ) { + $s3Info['options']['params']['Expires'] = StorageSettings::expires(); + } + $meta = wp_get_attachment_metadata( $postId, true ); + $meta['s3'] = $s3Info; + $builtInSizes = []; + foreach ( [ + 'thumbnail', + 'medium', + 'medium_large', + 'large' + ] as $size ) { + $builtInSizes[$size] = [ + 'width' => get_option( "{$size}_size_w" ), + 'height' => get_option( "{$size}_size_h" ), + 'crop' => get_option( "{$size}_crop", 0 ), + ]; + } + $additional_sizes = wp_get_additional_image_sizes(); + $sizes = array_merge( $builtInSizes, $additional_sizes ); + $indexedThumbs = []; + foreach ( $thumbs as $thumb ) { + if ( preg_match( '/(-[0-9]+x[0-9]+){2,}\\.(?:.*)$/', $thumb, $matches ) ) { + continue; + } + if ( preg_match( '/([0-9]+x[0-9]+)\\.(?:.*)$/', $thumb, $matches ) ) { + if ( !isset( $indexedThumbs[$matches[1]] ) ) { + $indexedThumbs[$matches[1]] = $thumb; + } + } + } + $meta['sizes'] = []; + foreach ( $sizes as $sizeKey => $size ) { + $resized = image_resize_dimensions( + $fileInfo->size()[0], + $fileInfo->size()[1], + $size['width'], + $size['height'], + $size['crop'] + ); + + if ( $resized ) { + $sizeIndex = "{$resized[4]}x{$resized[5]}"; + + if ( isset( $indexedThumbs[$sizeIndex] ) ) { + $sizeS3Info = $s3Info; + $sizeS3Info['url'] = $this->client()->url( $indexedThumbs[$sizeIndex] ); + $sizeS3Info['key'] = $indexedThumbs[$sizeIndex]; + $meta['sizes'][$sizeKey] = [ + 'file' => basename( $indexedThumbs[$sizeIndex] ), + 'width' => $resized[4], + 'height' => $resized[5], + 'mime-type' => 'image/jpeg', + 's3' => $sizeS3Info, + ]; + } + + } + + } + update_post_meta( $postId, '_wp_attachment_metadata', $meta ); + $thumbUrl = image_downsize( $postId, [ 128, 128 ] ); + if ( is_array( $thumbUrl ) ) { + $thumbUrl = $thumbUrl[0]; + } + return [ + 'id' => $postId, + 'url' => $url, + 'thumb' => $thumbUrl, + ]; + } + /** * Once a file has been directly uploaded, it'll need to be "imported" into WordPress * @@ -3090,8 +3453,16 @@ private function doImportFile( $key, $thumbs ) $base = trailingslashit( $dir['basedir'] ); $destFile = $base . $key; $desturl = trailingslashit( $dir['baseurl'] ) . $key; + Logger::info( "DIRECT URL " . $desturl ); + Logger::info( "DIRECT BASE " . $dir['baseurl'] ); $query = $wpdb->prepare( "select ID from {$wpdb->posts} where guid = %s", $desturl ); $postId = $wpdb->get_var( $query ); + + if ( empty($postId) ) { + $query = $wpdb->prepare( "select ID from {$wpdb->posts} where guid = %s", $this->client()->url( $key ) ); + $postId = $wpdb->get_var( $query ); + } + $destDir = pathinfo( $destFile, PATHINFO_DIRNAME ); if ( !file_exists( $destDir ) ) { @mkdir( $destDir, 0777, true ); @@ -3108,6 +3479,33 @@ private function doImportFile( $key, $thumbs ) } } + $indexedThumbs = []; + foreach ( $thumbs as $thumb ) { + if ( preg_match( '/(-[0-9]+x[0-9]+){2,}\\.(?:.*)$/', $thumb, $matches ) ) { + continue; + } + if ( preg_match( '/([0-9]+x[0-9]+)\\.(?:.*)$/', $thumb, $matches ) ) { + + if ( !isset( $indexedThumbs[$matches[1]] ) ) { + $indexedThumbs[$matches[1]] = $thumb; + $thumbFile = $base . $thumb; + + if ( !file_exists( $thumbFile ) ) { + $url = $this->client()->presignedUrl( $thumb ); + $client = new Client(); + $response = $client->get( $url, [ + 'save_to' => $thumbFile, + ] ); + if ( $response->getStatusCode() != 200 ) { + unset( $indexedThumbs[$matches[1]] ); + } + } + + } + + } + } + require_once ABSPATH . 'wp-admin/includes/image.php'; if ( empty($postId) ) { $filetype = wp_check_filetype( basename( $destFile ), null ); @@ -3119,13 +3517,82 @@ private function doImportFile( $key, $thumbs ) 'post_status' => 'inherit', ]; $postId = wp_insert_attachment( $attachment, $destFile ); + add_filter( 'media-cloud/storage/upload-master', [ $this, 'uploadMaster' ] ); + $meta = wp_generate_attachment_metadata( $postId, $destFile ); + } else { + add_filter( 'media-cloud/storage/upload-master', [ $this, 'uploadMaster' ] ); + $meta = wp_get_attachment_metadata( $postId ); + $basefilename = basename( $key ); + foreach ( $meta['sizes'] as $size => $sizeData ) { + if ( $sizeData['file'] == $basefilename ) { + unset( $meta['sizes'][$size] ); + } + } } - require_once ABSPATH . 'wp-admin/includes/image.php'; - add_filter( 'media-cloud/storage/upload-master', [ $this, 'uploadMaster' ] ); - $attach_data = wp_generate_attachment_metadata( $postId, $destFile ); - wp_update_attachment_metadata( $postId, $attach_data ); + + if ( count( $indexedThumbs ) > 0 ) { + $builtInSizes = []; + foreach ( [ + 'thumbnail', + 'medium', + 'medium_large', + 'large' + ] as $size ) { + $builtInSizes[$size] = [ + 'width' => get_option( "{$size}_size_w" ), + 'height' => get_option( "{$size}_size_h" ), + 'crop' => get_option( "{$size}_crop", 0 ), + ]; + } + $additional_sizes = wp_get_additional_image_sizes(); + $sizes = array_merge( $builtInSizes, $additional_sizes ); + $meta['sizes'] = []; + $s3Info = [ + 'bucket' => $this->client->bucket(), + 'privacy' => StorageSettings::privacy(), + 'v' => MEDIA_CLOUD_INFO_VERSION, + 'options' => [ + 'params' => [], + ], + ]; + foreach ( $sizes as $sizeKey => $size ) { + $fileInfo = $this->client()->info( $key ); + $resized = image_resize_dimensions( + $fileInfo->size()[0], + $fileInfo->size()[1], + $size['width'], + $size['height'], + $size['crop'] + ); + + if ( $resized ) { + $sizeIndex = "{$resized[4]}x{$resized[5]}"; + + if ( isset( $indexedThumbs[$sizeIndex] ) ) { + $sizeS3Info = $s3Info; + $sizeS3Info['mime-type'] = $fileInfo->mimeType(); + $sizeS3Info['url'] = $this->client()->url( $indexedThumbs[$sizeIndex] ); + $sizeS3Info['key'] = $indexedThumbs[$sizeIndex]; + $meta['sizes'][$sizeKey] = [ + 'file' => basename( $indexedThumbs[$sizeIndex] ), + 'width' => $resized[4], + 'height' => $resized[5], + 'mime-type' => 'image/jpeg', + 's3' => $sizeS3Info, + ]; + } + + } + + } + } + + wp_update_attachment_metadata( $postId, $meta ); remove_filter( 'media-cloud/storage/upload-master', [ $this, 'uploadMaster' ] ); + if ( count( $meta['sizes'] ) == 0 ) { + $this->regenerateFile( $postId ); + } return true; } @@ -3137,10 +3604,13 @@ private function doImportDynamicFile( $key, $thumbs ) $info = $this->client()->info( $key ); $query = $wpdb->prepare( "select ID from {$wpdb->posts} where (guid = %s) or (guid = %s)", $desturl, $info->url() ); $postId = $wpdb->get_var( $query ); + if ( !empty($postId) ) { - return true; + $this->importExistingAttachmentFromStorage( $postId, $info, $thumbs ); + } else { + $this->importAttachmentFromStorage( $info, $thumbs ); } - $this->importAttachmentFromStorage( $info, $thumbs ); + return true; } @@ -3153,13 +3623,9 @@ public function importFileFromStorage( { $oldPreserve = $this->preserveFilePaths; $this->preserveFilePaths = ( $preservePaths ? 'preserve' : 'replace' ); - $dynamicEnabled = apply_filters( 'media-cloud/dynamic-images/enabled', false ); - if ( !empty($importOnly) ) { - $dynamicEnabled = true; - } try { - if ( $dynamicEnabled ) { + if ( $importOnly ) { $success = $this->doImportDynamicFile( $key, $thumbs ); } else { $success = $this->doImportFile( $key, $thumbs ); diff --git a/classes/Tools/Storage/Tasks/CleanUploadsTask.php b/classes/Tools/Storage/Tasks/CleanUploadsTask.php new file mode 100755 index 00000000..67041e3f --- /dev/null +++ b/classes/Tools/Storage/Tasks/CleanUploadsTask.php @@ -0,0 +1,246 @@ + [ + "title" => "Selected Media", + "description" => "If you want to process just a small subset of items, click on 'Select Media'", + "type" => "media-select" + ] + ]; + } + + //endregion + + //region Data + + protected function filterPostArgs($args) { + $args['meta_query'] = [ + 'relation' => 'OR', + [ + 'key' => '_wp_attachment_metadata', + 'value' => '"s3"', + 'compare' => 'LIKE', + 'type' => 'CHAR', + ], + [ + 'key' => 'ilab_s3_info', + 'compare' => 'EXISTS', + ], + ]; + + return $args; + } + + //endregion + + //region Execution + + public function prepare($options = [], $selectedItems = []) { + if (!parent::prepare($options, $selectedItems)) { + return false; + } + + $this->addItem(['id' => -1]); + return true; + } + + protected function cleanEmptyDirectories() { + if (defined('UPLOADS')) { + $root = trailingslashit(ABSPATH).UPLOADS; + } else { + $root = trailingslashit(WP_CONTENT_DIR).'uploads'; + } + + $root = trailingslashit($root); + + $folders = []; + + $rii = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($root)); + foreach($rii as $file) { + if ($file->isDir()) { + $path = trailingslashit($file->getPath()); + if (!in_array($path, $folders) && ($path != $root)) { + $folders[] = $path; + } + } + } + + usort($folders, function($a, $b) { + $countA = count(explode(DIRECTORY_SEPARATOR, $a)); + $countB = count(explode(DIRECTORY_SEPARATOR, $b)); + if ($countA > $countB) { + return -1; + } else if ($countA == $countB) { + return 0; + } + + return 1; + }); + + foreach($folders as $folder) { + $filecount = count(scandir($folder)); + if ($filecount <= 2) { + Logger::info("Removing directory $folder"); + @rmdir($folder); + } else if (($filecount == 3) && file_exists(trailingslashit($folder).'.DS_STORE')) { + Logger::info("Removing .DS_STORE"); + unlink(trailingslashit($folder).'.DS_STORE'); + + Logger::info("Removing directory $folder"); + @rmdir($folder); + } else { + Logger::info("NOT Removing directory $folder"); + } + } + + return true; + } + + /** + * Performs the actual task + * + * @param $item + * + * @return bool|void + * @throws \Exception + */ + public function performTask($item) { + $post_id = $item['id']; + if (!postIdExists($post_id)) { + return true; + } + + Logger::info("Processing $post_id"); + + if ($post_id == -1) { + return $this->cleanEmptyDirectories(); + } + + $this->updateCurrentPost($post_id); + + Logger::info("Processing $post_id"); + + $file = get_attached_file($post_id, true); + $meta = wp_get_attachment_metadata($post_id, true); + + $baseDir = pathinfo($file, PATHINFO_DIRNAME); + + $filesToDelete = [$file]; + foreach($meta['sizes'] as $size => $sizeData) { + if (empty($sizeData['file'])) { + continue; + } + + $filesToDelete[] = trailingslashit($baseDir).basename($sizeData['file']); + } + + foreach($filesToDelete as $file) { + Logger::info("Deleting $file"); + @unlink($file); + } + + Logger::info("Finished processing $post_id"); + + return true; + } + + //endregion +} \ No newline at end of file diff --git a/classes/Tools/Storage/Tasks/DeleteUploadsTask.php b/classes/Tools/Storage/Tasks/DeleteUploadsTask.php new file mode 100755 index 00000000..e0cf37a0 --- /dev/null +++ b/classes/Tools/Storage/Tasks/DeleteUploadsTask.php @@ -0,0 +1,189 @@ +addItem(['filepath' => $selectedItem]); + } + + $this->addItem(['filepath' => -1]); + return true; + } + + protected function cleanEmptyDirectories() { + if (defined('UPLOADS')) { + $root = trailingslashit(ABSPATH).UPLOADS; + } else { + $root = trailingslashit(WP_CONTENT_DIR).'uploads'; + } + + $root = trailingslashit($root); + + $folders = []; + + $rii = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($root)); + foreach($rii as $file) { + if ($file->isDir()) { + $path = trailingslashit($file->getPath()); + if (!in_array($path, $folders) && ($path != $root)) { + $folders[] = $path; + } + } + } + + usort($folders, function($a, $b) { + $countA = count(explode(DIRECTORY_SEPARATOR, $a)); + $countB = count(explode(DIRECTORY_SEPARATOR, $b)); + if ($countA > $countB) { + return -1; + } else if ($countA == $countB) { + return 0; + } + + return 1; + }); + + foreach($folders as $folder) { + $filecount = count(scandir($folder)); + if ($filecount <= 2) { + Logger::info("Removing directory $folder"); + @rmdir($folder); + } else if (($filecount == 3) && file_exists(trailingslashit($folder).'.DS_STORE')) { + Logger::info("Removing .DS_STORE"); + unlink(trailingslashit($folder).'.DS_STORE'); + + Logger::info("Removing directory $folder"); + @rmdir($folder); + } else { + Logger::info("NOT Removing directory $folder"); + } + } + + return true; + } + + /** + * Performs the actual task + * + * @param $item + * + * @return bool|void + * @throws \Exception + */ + public function performTask($item) { + $filepath = $item['filepath']; + Logger::info("Delete {$filepath}"); + + if ($filepath == -1) { + return $this->cleanEmptyDirectories(); + } + + + @unlink($filepath); + + return true; + } + + //endregion +} \ No newline at end of file diff --git a/classes/Tools/Storage/Tasks/UnlinkTask.php b/classes/Tools/Storage/Tasks/UnlinkTask.php new file mode 100755 index 00000000..cb1ec701 --- /dev/null +++ b/classes/Tools/Storage/Tasks/UnlinkTask.php @@ -0,0 +1,180 @@ + [ + "title" => "Selected Media", + "description" => "If you want to process just a small subset of items, click on 'Select Media'", + "type" => "media-select" + ] + ]; + } + + //endregion + + //region Data + + protected function filterPostArgs($args) { + $args['meta_query'] = [ + 'relation' => 'OR', + [ + 'key' => '_wp_attachment_metadata', + 'value' => '"s3"', + 'compare' => 'LIKE', + 'type' => 'CHAR', + ], + [ + 'key' => 'ilab_s3_info', + 'compare' => 'EXISTS', + ], + ]; + + return $args; + } + + //endregion + + //region Execution + + /** + * Performs the actual task + * + * @param $item + * + * @return bool|void + * @throws \Exception + */ + public function performTask($item) { + $post_id = $item['id']; + if (!postIdExists($post_id)) { + return true; + } + + $this->updateCurrentPost($post_id); + + Logger::info("Processing $post_id"); + + $meta = wp_get_attachment_metadata($post_id, true); + if (isset($meta['s3'])) { + unset($meta['s3']); + if(isset($meta['sizes'])) { + $sizes = $meta['sizes']; + foreach($sizes as $size => $sizeData) { + if(isset($sizeData['s3'])) { + unset($sizeData['s3']); + } + + $sizes[$size] = $sizeData; + } + + $meta['sizes'] = $sizes; + } + + update_post_meta($post_id, '_wp_attachment_metadata', $meta); + } + + Logger::info("Finished processing $post_id"); + + return true; + } + + //endregion +} \ No newline at end of file diff --git a/classes/Tools/Tasks/CLI/TasksCommands.php b/classes/Tools/Tasks/CLI/TasksCommands.php new file mode 100755 index 00000000..24ca7ec2 --- /dev/null +++ b/classes/Tools/Tasks/CLI/TasksCommands.php @@ -0,0 +1,154 @@ +] + * : The number of tasks to schedule. + * + * [--minutes=] + * : The time between tasks + * + * [--items=] + * : The number of items in each task + * + * [--sleep] + * : Configures the task to sleep when running + * + * [--memory] + * : Configures the task to use memory when running + * + * [--errors] + * : Configures the task to return false randomly + * + * [--exceptions] + * : Configures the task to throw an exception randomly + * + * @when after_wp_load + * + * @param $args + * @param $assoc_args + * + * @throws \Exception + */ + public function createTestSchedules($args, $assoc_args) { + + $count = arrayPath($assoc_args, 'count', 1); + $minutes = arrayPath($assoc_args, 'minutes', 1); + $items = arrayPath($assoc_args, 'items', 5); + $sleep = arrayPath($assoc_args, 'sleep', false); + $memory = arrayPath($assoc_args, 'memory', false); + $errors = arrayPath($assoc_args, 'errors', false); + $exceptions = arrayPath($assoc_args, 'exceptions', false); + + $currentTime = $minutes; + for($i = 0; $i < $count; $i++) { + TestTask::scheduleIn($currentTime, ['tuid' => gen_uuid(8), 'items' => $items, 'sleep' => $sleep, 'memory' => $memory, 'errors' => $errors, 'exceptions' => $exceptions]); + $currentTime++; + } + } + + /** + * Tests schedule + * + * @when after_wp_load + * + * @param $args + * @param $assoc_args + * + * @throws \Exception + */ + public function scheduled() { + $scheduled = TaskSchedule::scheduledTasks(); + + if (count($scheduled) == 0) { + self::Error("No scheduled tasks. Exiting."); + exit(0); + } + + foreach($scheduled as $item) { + self::Info($item->taskTitle().": ".$item->description().' ... ', false); + + $dt = $item->nextRunDate(); + self::Info("Will run in ".$dt->diffForHumans(Carbon::now(), true, false, 2), true); + } + } + + + /** + * Tests schedule + * + * @when after_wp_load + * + * @param $args + * @param $assoc_args + * + * @throws \Exception + */ + public function runScheduled() { + $scheduled = TaskSchedule::scheduledTasks(); + + if (count($scheduled) == 0) { + self::Info("No scheduled tasks. Exiting", true); + } + + foreach($scheduled as $item) { + if ($item->runIfNeeded()) { + self::Info("Running {$item->taskTitle()}", true); + } + } + } + + + /** + * Tests schedule + * + * @when after_wp_load + * + * @param $args + * @param $assoc_args + * + * @throws \GuzzleHttp\Exception\GuzzleException + */ + public function clearScheduled() { + global $wpdb; + $wpdb->query("delete from {$wpdb->base_prefix}mcloud_task_schedule"); + } + + public static function Register() { + \WP_CLI::add_command('taskmanager', __CLASS__); + } + +} \ No newline at end of file diff --git a/classes/Tools/Tasks/TasksTool.php b/classes/Tools/Tasks/TasksTool.php new file mode 100755 index 00000000..5e97e049 --- /dev/null +++ b/classes/Tools/Tasks/TasksTool.php @@ -0,0 +1,116 @@ +insertBatchToolSeparator(); + + if (!is_multisite() || is_network_admin() || empty(Environment::Option('media-cloud-task-manager-hide', null, true))) { + ToolsManager::instance()->addMultisiteTool($this); + + $this->options_page = 'media-cloud-task-manager'; + add_submenu_page($tool_menu_slug, 'Task Manager', 'Task Manager', 'manage_options', 'media-cloud-task-manager', [$this, 'renderTaskManager']); + } + + + if($networkMode && $networkAdminMenu) { + return; + } + + $hasBatchTool = false; + foreach(TaskManager::registeredTasks() as $identifier => $taskClass) { + if ($taskClass::userTask()) { + $hasBatchTool = true; + break; + } + } + + if($hasBatchTool) { + ToolsManager::instance()->insertBatchToolSeparator(); + + foreach(TaskManager::registeredTasks() as $identifier => $taskClass) { + if ($taskClass::userTask()) { + add_submenu_page($tool_menu_slug, $taskClass::title(), $taskClass::menuTitle(), 'manage_options', 'mcloud-task-'.$identifier, [$this, 'renderBatchTool']); + } + } + } + } + + public function enabled() { + return true; + } + + + + //region Views + + /** + * Render the manager page + */ + public function renderTaskManager() { + echo View::render_view('tasks.task-manager', ['title' => 'Task Manager', 'manager' => TaskManager::instance()]); + } + + /** + * Render the batch page + * + * @throws \Exception + */ + public function renderBatchTool() { + $identifier = str_replace('mcloud-task-', '', arrayPath($_REQUEST, 'page', null)); + if (empty($identifier)) { + wp_die("Not sure what happened here."); + } + + $taskClass = TaskManager::registeredTasks()[$identifier]; + $runningTask = Task::currentRunningTask($identifier); + + echo View::render_view('tasks.batch', ['title' => $taskClass::title(), 'task' => $runningTask, 'taskClass' => $taskClass, 'manager' => TaskManager::instance(), 'warning' => null]); + } + + //endregion + +} \ No newline at end of file diff --git a/classes/Tools/Tool.php b/classes/Tools/Tool.php index 518816fe..dedd1789 100755 --- a/classes/Tools/Tool.php +++ b/classes/Tools/Tool.php @@ -20,6 +20,7 @@ use ILAB\MediaCloud\Utilities\NoticeManager; use function ILAB\MediaCloud\Utilities\arrayPath; use ILAB\MediaCloud\Utilities\Tracker; +use function ILAB\MediaCloud\Utilities\vomit; if (!defined( 'ABSPATH')) { header( 'Location: /'); die; } @@ -53,9 +54,6 @@ abstract class Tool { /** @var bool Only display the settings page when the tool is enabled */ protected $only_when_enabled; - /** @var BatchTool[] List of batch tools for this tool */ - protected $batchTools = []; - protected $actions = []; /** @var bool Determines if settings did change. */ @@ -85,7 +83,11 @@ public function __construct($toolName, $toolInfo, $toolManager) { if (!method_exists($this, $action['method'])) { unset($this->actions[$key]); } else { - add_action('wp_ajax_'.str_replace('-', '_', $key), [$this, $action['method']]); + $actionKey = str_replace('-', '_', $key); + add_action('wp_ajax_'.$actionKey, function() use ($actionKey, $action) { + check_ajax_referer($actionKey, 'nonce'); + call_user_func([$this, $action['method']]); + }); } } @@ -114,12 +116,6 @@ public function __construct($toolName, $toolInfo, $toolManager) { require_once(ILAB_HELPERS_DIR.'/'.$helper); } } - - if (isset($toolInfo['batchTools'])) { - foreach($toolInfo['batchTools'] as $className) { - $this->batchTools[] = new $className($this); - } - } } //endregion @@ -236,9 +232,6 @@ private function generateDeactivateLink($pluginName, $plugin) { * Perform any setup */ public function setup() { - foreach($this->batchTools as $batchTool) { - $batchTool->setup(); - } } /** @@ -275,10 +268,22 @@ public function actions() { return $this->actions; } + /** + * Determines if the tool has user editable settings or not + * @return bool + */ public function hasSettings() { return false; } + /** + * Determines if this tool installs, or wants to install, items in the admin menu bar + * @return bool + */ + public function hasAdminBarMenu() { + return false; + } + /** * Determines if the plugin is set to enabled, regardless if it is really enabled or not * @@ -358,64 +363,20 @@ public function enabled() { //endregion - //region Batch Tools + //region Admin Menu Bar - /** - * Determines if this tool has any related batch tools + /** + * Allows a tool to add entries to the admin bar * - * @return bool - */ - public function hasBatchTools() { - return (count($this->batchTools) > 0); - } - - /** - * Determines if this tool has any related batch tools that are enabled - * @return bool - */ - public function hasEnabledBatchTools() { - /** @var BatchTool $batchTool */ - foreach($this->batchTools as $batchTool) { - if ($batchTool->enabled() && (!empty($batchTool->toolInfo()))) { - return true; - } - } - - return false; - } - - /** - * Returns information about related batch tools - * @return array - */ - public function batchToolInfo() { - $results = []; - - foreach($this->batchTools as $batchTool) { - $results[] = $batchTool->toolInfo(); - } - - return $results; - } - - /** - * Returns information about related batch tools that are enabled - * @return array - */ - public function enabledBatchToolInfo() { - $results = []; - - foreach($this->batchTools as $batchTool) { - if ($batchTool->enabled()) { - $results[] = $batchTool->toolInfo(); - } - } + * @param \WP_Admin_Bar $adminBar + */ + public function addAdminMenuBarItems($adminBar) { - return $results; } //endregion + //region Settings /** @@ -522,40 +483,6 @@ public function registerHelpMenu($top_menu_slug, $networkMode = false, $networkA * @param $top_menu_slug */ public function registerBatchToolMenu($tool_menu_slug, $networkMode = false, $networkAdminMenu = false) { - if($this->only_when_enabled && (!$this->enabled())) { - return; - } - - if(empty($this->batchTools)) { - return; - } - - if($networkMode && $networkAdminMenu) { - return; - } - - $hasBatchTool = false; - foreach($this->batchTools as $batchTool) { - if($batchTool->enabled()) { - $hasBatchTool = true; - break; - } - } - - if($hasBatchTool) { - ToolsManager::instance()->insertBatchToolSeparator(); - - foreach($this->batchTools as $batchTool) { - if($batchTool->enabled()) { - if(empty($batchTool->menuTitle())) { - continue; - } - - ToolsManager::instance()->addMultisiteBatchTool($batchTool); - add_submenu_page($tool_menu_slug, $batchTool->pageTitle(), $batchTool->menuTitle(), $batchTool->capabilityRequirement(), $batchTool->menuSlug(), [$batchTool, 'renderBatchTool']); - } - } - } } /** diff --git a/classes/Tools/ToolSettings.php b/classes/Tools/ToolSettings.php new file mode 100755 index 00000000..06904b45 --- /dev/null +++ b/classes/Tools/ToolSettings.php @@ -0,0 +1,111 @@ +settings[$name])) { + return $this->settings[$name]; + } + + list($setting, $envSetting, $default) = $this->settingsMap[$name]; + + if (empty($setting) && empty($envSetting)) { + return null; + } + + $this->settings[$name] = $val = Environment::Option($setting, $envSetting, $default); + Logger::info("SETTINGS $name = $val"); + return $val; + } + + /** + * @param $name + * @param $value + */ + public function __set($name, $value) { + if (isset($this->settingsMap[$name])) { + $setting = $this->settingsMap[$name][0]; + Environment::UpdateOption($setting, $value); + + $this->settings[$name] = $value; + } + } + + /** + * @param $name + * + * @return bool + */ + public function __isset($name) { + if (!isset($this->settings[$name])) { + return isset($this->settingsMap[$name]); + } + + return true; + } +} \ No newline at end of file diff --git a/classes/Tools/ToolsManager.php b/classes/Tools/ToolsManager.php index f356a52c..837c9282 100755 --- a/classes/Tools/ToolsManager.php +++ b/classes/Tools/ToolsManager.php @@ -12,9 +12,7 @@ // ********************************************************************** namespace ILAB\MediaCloud\Tools; -use ILAB\MediaCloud\Documentation\Docs ; -use ILAB\MediaCloud\Tasks\BatchManager ; -use ILAB\MediaCloud\Tools\Debugging\System\SystemCompatibilityTool ; +use ILAB\MediaCloud\Tasks\TaskManager ; use ILAB\MediaCloud\Tools\Network\NetworkTool ; use ILAB\MediaCloud\Utilities\Environment ; use ILAB\MediaCloud\Utilities\LicensingManager ; @@ -59,9 +57,6 @@ final class ToolsManager private $networkTool = null ; /** @var Tool[] */ private $multisiteTools = array() ; - /** @var BatchTool[] */ - private $multisiteBatchTools = array() ; - private $docs = null ; /** @var bool Determines if any media cloud settings have changed. */ private $settingsDidChange = false ; //endregion @@ -91,16 +86,6 @@ public function __construct() foreach ( static::$registeredTools as $toolName => $toolInfo ) { $className = $toolInfo['class']; $this->tools[$toolName] = new $className( $toolName, $toolInfo, $this ); - // Register Batch Tools - if ( !empty($toolInfo['batchTools']) ) { - foreach ( $toolInfo['batchTools'] as $batchToolClass ) { - $batchID = call_user_func( [ $batchToolClass, 'BatchIdentifier' ] ); - $processClass = call_user_func( [ $batchToolClass, 'BatchProcessClassName' ] ); - if ( !empty($processClass) && !empty($batchID) ) { - BatchManager::registerBatchClass( $batchID, $processClass ); - } - } - } // Register CLI Commands if ( !empty($toolInfo['CLI']) && defined( 'WP_CLI' ) && class_exists( '\\WP_CLI' ) ) { foreach ( $toolInfo['CLI'] as $cliClass ) { @@ -138,6 +123,7 @@ public function __construct() 'media-cloud' ); register_setting( 'ilab-media-features', "mcloud-network-mode" ); + $this->insertAccountSeparator(); } } ); @@ -151,6 +137,9 @@ public function __construct() } ); } + add_action( 'admin_bar_menu', function ( $adminBar ) { + $this->addAdminBarItems( $adminBar ); + }, 1000 ); $actionLinksPrefix = ( is_multisite() ? 'network_admin_' : '' ); add_filter( $actionLinksPrefix . 'plugin_action_links_' . ILAB_PLUGIN_NAME, function ( $links ) { $links[] = "Settings"; @@ -190,11 +179,18 @@ public function __construct() ); } add_action( 'admin_enqueue_scripts', function () { + wp_enqueue_script( + 'mcloud-admin-js', + ILAB_PUB_JS_URL . '/mcloud-admin.js', + [ 'jquery', 'wp-util' ], + MEDIA_CLOUD_VERSION, + true + ); wp_enqueue_script( 'ilab-settings-js', ILAB_PUB_JS_URL . '/ilab-settings.js', - [ 'jquery' ], - null, + [ 'jquery', 'wp-util' ], + MEDIA_CLOUD_VERSION, true ); wp_enqueue_style( 'ilab-media-cloud-css', ILAB_PUB_CSS_URL . '/ilab-media-cloud.css' ); @@ -210,12 +206,8 @@ public function __construct() 'status' => 'ok', ] ); } ); - if ( defined( 'PHP_MAJOR_VERSION' ) && PHP_MAJOR_VERSION >= 7 ) { - $this->docs = new Docs(); - } } - BatchManager::boot(); add_action( "updated_option", function ( $setting, $oldValue = null, $newValue = null ) { @@ -264,29 +256,45 @@ public static function instance() */ public static function Boot() { + global $media_cloud_licensing ; if ( static::$booted ) { return; } static::$booted = true; Environment::Boot(); - // Register Tools - ToolsManager::registerTool( "storage", include ILAB_CONFIG_DIR . '/storage.config.php' ); - ToolsManager::registerTool( "imgix", include ILAB_CONFIG_DIR . '/imgix.config.php' ); - ToolsManager::registerTool( "vision", include ILAB_CONFIG_DIR . '/vision.config.php' ); - ToolsManager::registerTool( "crop", include ILAB_CONFIG_DIR . '/crop.config.php' ); - ToolsManager::registerTool( "debugging", include ILAB_CONFIG_DIR . '/debugging.config.php' ); - ToolsManager::registerTool( "troubleshooting", include ILAB_CONFIG_DIR . '/troubleshooting.config.php' ); - ToolsManager::registerTool( "batch-processing", include ILAB_CONFIG_DIR . '/batch-processing.config.php' ); - if ( LicensingManager::CanTrack() ) { - ToolsManager::registerTool( "opt-in", include ILAB_CONFIG_DIR . '/opt-in.config.php' ); + if ( !is_multisite() && ($media_cloud_licensing->is_plan__premium_only( 'multisite_basic', true ) || $media_cloud_licensing->is_plan__premium_only( 'multisite_pro', true ) || $media_cloud_licensing->is_plan__premium_only( 'multisite_unlimited', true )) ) { + add_action( 'admin_notices', function () { + ?> +
    +

    contact us for assistance in selecting the correct license.", 'ilab-media-tools' ); + ?>

    +
    + tools as $toolId => $tool ) { + + if ( $tool->hasAdminBarMenu() ) { + $hasAdminBar = true; + break; + } + + } + + if ( $hasAdminBar ) { + $adminBar->add_menu( [ + 'id' => 'media-cloud-admin-bar', + 'href' => admin_url( 'admin.php?page=media-cloud' ), + 'title' => 'Media Cloud', + ] ); + foreach ( $this->tools as $toolId => $tool ) { + $tool->addAdminMenuBarItems( $adminBar ); + } + } + + } + public function addMenus( $networkMode, $networkAdminMenu ) { global $media_cloud_licensing ; @@ -398,31 +436,84 @@ public function addMenus( $networkMode, $networkAdminMenu ) ); } } + $this->tools['troubleshooting']->registerMenu( 'media-cloud', $networkMode, $networkAdminMenu ); + if ( $isLocal || $isNetworkModeAdmin ) { - + $this->insertSeparator( 'Settings' ); + $displayedSettings = []; if ( !empty($this->pinnedTools) ) { - $this->insertSeparator( 'Pinned Settings' ); foreach ( $this->pinnedTools as $pinnedTool => $value ) { if ( empty($this->tools[$pinnedTool]) ) { continue; } $tool = $this->tools[$pinnedTool]; + $displayedSettings[] = $pinnedTool; + + if ( $this->tools[$pinnedTool]->envEnabled() && $tool->hasSettings() ) { + $pinnedSlug = 'media-cloud-settings-' . $pinnedTool; + } else { + $pinnedSlug = 'media-cloud-settings-' . $pinnedTool . '&pinned=true'; + } + add_submenu_page( 'media-cloud', $tool->toolInfo['name'] . ' Settings', $tool->toolInfo['name'], 'manage_options', - 'media-cloud-settings&tab=' . $pinnedTool, + $pinnedSlug, [ $this, 'renderSettings' ] ); } } - + foreach ( $this->tools as $toolId => $tool ) { + + if ( $tool->envEnabled() && $tool->hasSettings() && !in_array( $toolId, $displayedSettings ) ) { + $displayedSettings[] = $toolId; + add_submenu_page( + 'media-cloud', + $tool->toolInfo['name'] . ' Settings', + $tool->toolInfo['name'], + 'manage_options', + 'media-cloud-settings-' . $toolId, + [ $this, 'renderSettings' ] + ); + } + + } + $hiddenMenus = []; + foreach ( $this->tools as $toolId => $tool ) { + + if ( $tool->hasSettings() && !in_array( $toolId, $displayedSettings ) ) { + $hiddenMenus[] = 'media-cloud-settings-' . $toolId; + add_submenu_page( + 'media-cloud', + $tool->toolInfo['name'] . ' Settings', + null, + 'manage_options', + 'media-cloud-settings-' . $toolId, + [ $this, 'renderSettings' ] + ); + } + + } + add_filter( 'submenu_file', function ( $submenu_file ) use( $hiddenMenus ) { + global $plugin_page ; + if ( $plugin_page && isset( $hidden_submenus[$plugin_page] ) ) { + $submenu_file = 'media-cloud-settings'; + } + foreach ( $hiddenMenus as $submenu ) { + remove_submenu_page( 'media-cloud', $submenu ); + } + return $submenu_file; + } ); } + foreach ( $this->tools as $key => $tool ) { register_setting( 'ilab-media-tools', "mcloud-tool-enabled-{$key}" ); register_setting( $tool->optionsGroup(), "mcloud-tool-enabled-{$key}" ); - $tool->registerMenu( 'media-cloud', $networkMode, $networkAdminMenu ); + if ( $key != 'troubleshooting' ) { + $tool->registerMenu( 'media-cloud', $networkMode, $networkAdminMenu ); + } $tool->registerSettings(); if ( !empty($tool->toolInfo['related']) ) { foreach ( $tool->toolInfo['related'] as $relatedKey ) { @@ -436,34 +527,39 @@ public function addMenus( $networkMode, $networkAdminMenu ) $tool->registerBatchToolMenu( 'media-cloud', $networkMode, $networkAdminMenu ); } } - + $this->insertHelpToolSeparator(); + add_submenu_page( + 'media-cloud', + 'Plugin Support', + 'Forums', + 'manage_options', + 'https://talk.mediacloud.press/' + ); + add_submenu_page( + 'media-cloud', + 'Documentation', + 'Documentation', + 'manage_options', + 'https://help.mediacloud.press/' + ); + foreach ( $this->tools as $key => $tool ) { + $tool->registerHelpMenu( 'media-cloud', $networkMode, $networkAdminMenu ); + } if ( $isLocal || $isNetworkModeAdmin ) { - $this->insertHelpToolSeparator(); - add_submenu_page( - 'media-cloud', - 'Plugin Support', - 'Support', - 'manage_options', - 'https://talk.mediacloud.press/' - ); - if ( defined( 'PHP_MAJOR_VERSION' ) && PHP_MAJOR_VERSION >= 7 ) { - $this->docs->registerAdminMenu( 'media-cloud' ); - } - foreach ( $this->tools as $key => $tool ) { - $tool->registerHelpMenu( 'media-cloud', $networkMode, $networkAdminMenu ); - } if ( LicensingManager::CanTrack() ) { add_submenu_page( 'media-cloud', 'Opt-In Settings', 'Opt-In Settings', 'manage_options', - admin_url( 'admin.php?page=media-cloud-settings&tab=opt-in' ) + 'media-cloud-settings-opt-in', + [ $this, 'renderSettings' ] ); } } - - $this->insertAccountSeparator(); + if ( !is_multisite() || is_network_admin() ) { + $this->insertAccountSeparator(); + } } public function insertSeparator( $title = '' ) @@ -601,14 +697,6 @@ public function addMultisiteTool( $tool ) $this->multisiteTools[] = $tool; } - /** - * @param BatchTool $batchTool - */ - public function addMultisiteBatchTool( $batchTool ) - { - $this->multisiteBatchTools[] = $batchTool; - } - /** * @return Tool[] */ @@ -617,14 +705,6 @@ public function multisiteTools() return $this->multisiteTools; } - /** - * @return BatchTool[] - */ - public function multisiteBatchTools() - { - return $this->multisiteBatchTools; - } - //endregion //region Processing public function updateNetworkOptions() @@ -666,52 +746,67 @@ public function updateNetworkOptions() */ public function renderSettings() { - global $wp_settings_sections, $wp_settings_fields ; + global $media_cloud_licensing ; - if ( !empty($_GET['tab']) && in_array( $_GET['tab'], array_keys( $this->tools ) ) ) { - $tab = $_GET['tab']; + if ( !is_multisite() && ($media_cloud_licensing->is_plan__premium_only( 'multisite_basic', true ) || $media_cloud_licensing->is_plan__premium_only( 'multisite_pro', true ) || $media_cloud_licensing->is_plan__premium_only( 'multisite_unlimited', true )) ) { + echo View::render_view( 'base/wrong-license', [ + 'title' => 'Media Cloud ' . MEDIA_CLOUD_VERSION, + ] ) ; } else { - $tab = array_keys( $this->tools )[0]; - } - - $selectedTool = $this->tools[$tab]; - $page = $selectedTool->optionsPage(); - $group = $selectedTool->optionsGroup(); - $sections = []; - foreach ( (array) $wp_settings_sections[$page] as $section ) { - if ( !isset( $wp_settings_fields ) || !isset( $wp_settings_fields[$page] ) || !isset( $wp_settings_fields[$page][$section['id']] ) ) { - continue; - } - $help = arrayPath( $selectedTool->toolInfo, "settings/groups/{$section['id']}/help", null ); + global $wp_settings_sections, $wp_settings_fields ; - if ( is_array( $help ) && !empty($help) ) { + if ( !empty($_GET['tab']) && in_array( $_GET['tab'], array_keys( $this->tools ) ) ) { + $tab = $_GET['tab']; + } else { - if ( !is_array( $help['data'] ) ) { - $data = $help['data']; - $help['data'] = $selectedTool->{$data}(); + if ( strpos( $_GET['page'], 'media-cloud-settings-' ) === 0 ) { + $tab = str_replace( 'media-cloud-settings-', '', $_GET['page'] ); + } else { + $tab = array_keys( $this->tools )[0]; } - } else { - $help = null; } - $sections[] = [ - 'title' => $section['title'], - 'id' => $section['id'], - 'help' => $help, - 'description' => arrayPath( $selectedTool->toolInfo, "settings/groups/{$section['id']}/description", null ), - ]; - } - echo View::render_view( 'base/settings', [ - 'title' => 'All Settings', - 'tab' => $tab, - 'tools' => $this->tools, - 'tool' => $selectedTool, - 'group' => $group, - 'page' => $page, - 'manager' => $this, - 'sections' => $sections, - ] ) ; + $selectedTool = $this->tools[$tab]; + $page = $selectedTool->optionsPage(); + $group = $selectedTool->optionsGroup(); + $sections = []; + foreach ( (array) $wp_settings_sections[$page] as $section ) { + if ( !isset( $wp_settings_fields ) || !isset( $wp_settings_fields[$page] ) || !isset( $wp_settings_fields[$page][$section['id']] ) ) { + continue; + } + $help = arrayPath( $selectedTool->toolInfo, "settings/groups/{$section['id']}/help", null ); + + if ( is_array( $help ) && !empty($help) ) { + + if ( !is_array( $help['data'] ) ) { + $data = $help['data']; + $help['data'] = $selectedTool->{$data}(); + } + + } else { + $help = null; + } + + $sections[] = [ + 'title' => $section['title'], + 'id' => $section['id'], + 'doc_beacon' => arrayPath( $selectedTool->toolInfo, "settings/groups/{$section['id']}/doc_beacon", null ), + 'help' => $help, + 'description' => arrayPath( $selectedTool->toolInfo, "settings/groups/{$section['id']}/description", null ), + ]; + } + echo View::render_view( 'base/settings', [ + 'title' => 'All Settings', + 'tab' => $tab, + 'tools' => $this->tools, + 'tool' => $selectedTool, + 'group' => $group, + 'page' => $page, + 'manager' => $this, + 'sections' => $sections, + ] ) ; + } } @@ -722,14 +817,23 @@ public function renderSupport() public function renderFeatureSettings() { - echo View::render_view( 'base/features', [ - 'title' => 'Media Cloud ' . MEDIA_CLOUD_VERSION, - 'group' => 'ilab-media-features', - 'page' => 'media-cloud', - 'networkMode' => Environment::NetworkMode(), - 'tools' => $this->tools, - 'manager' => $this, - ] ) ; + global $media_cloud_licensing ; + + if ( !is_multisite() && ($media_cloud_licensing->is_plan__premium_only( 'multisite_basic', true ) || $media_cloud_licensing->is_plan__premium_only( 'multisite_pro', true ) || $media_cloud_licensing->is_plan__premium_only( 'multisite_unlimited', true )) ) { + echo View::render_view( 'base/wrong-license', [ + 'title' => 'Media Cloud ' . MEDIA_CLOUD_VERSION, + ] ) ; + } else { + echo View::render_view( 'base/features', [ + 'title' => 'Media Cloud ' . MEDIA_CLOUD_VERSION, + 'group' => 'ilab-media-features', + 'page' => 'media-cloud', + 'networkMode' => Environment::NetworkMode(), + 'tools' => $this->tools, + 'manager' => $this, + ] ) ; + } + } public function renderNetworkSettings() diff --git a/classes/Tools/Vision/Batch/ImportVisionBatchProcess.php b/classes/Tools/Vision/Batch/ImportVisionBatchProcess.php deleted file mode 100755 index b6e938ae..00000000 --- a/classes/Tools/Vision/Batch/ImportVisionBatchProcess.php +++ /dev/null @@ -1,119 +0,0 @@ -shouldCancel('vision'); - } - - public function task($item) { - $startTime = microtime(true); - - Logger::info( 'Start Task', $item); - if (!$this->shouldHandle()) { - Logger::info( 'Task cancelled', $item); - return false; - } - - $index = $item['index']; - $post_id = $item['post']; - - BatchManager::instance()->setCurrentID('vision', $post_id); - - BatchManager::instance()->setCurrent('vision', $index + 1); - - $data = wp_get_attachment_metadata($post_id); - - if (empty($data)) { - Logger::info( 'Missing metadata', $item); - return false; - } - - if (!isset($data['s3'])) { - Logger::info( 'Missing s3 metadata', $item); - return false; - } - - $fileName = basename($data['file']); - BatchManager::instance()->setCurrentFile('vision', $fileName); - - - $visionTool = ToolsManager::instance()->tools['vision']; - $data = $visionTool->processImageMeta($data, $post_id); - wp_update_attachment_metadata($post_id, $data); - - - $endTime = microtime(true) - $startTime; - BatchManager::instance()->incrementTotalTime('vision', $endTime); - - return false; - } - - public function dispatch() { - Logger::info( 'Task dispatch'); - parent::dispatch(); - } - - protected function complete() { - Logger::info( 'Task complete'); - BatchManager::instance()->reset('vision'); - parent::complete(); - } - - public function cancel_process() { - Logger::info( 'Cancel process'); - - parent::cancel_process(); - - BatchManager::instance()->reset('vision'); - } - - public static function cancelAll() { - Logger::info( 'Cancel all processes'); - - wp_clear_scheduled_hook('wp_ilab_vision_import_process_cron'); - - global $wpdb; - - $res = $wpdb->get_results("select * from {$wpdb->options} where option_name like 'wp_ilab_vision_import_process_batch_%'"); - foreach($res as $batch) { - Logger::info( "Deleting batch {$batch->option_name}"); - delete_option($batch->option_name); - } - - $res = $wpdb->get_results("select * from {$wpdb->options} where option_name like '__wp_ilab_vision_import_process_batch_%'"); - foreach($res as $batch) { - delete_option($batch->option_name); - } - - BatchManager::instance()->reset('vision'); - - Logger::info( "Current cron", get_option( 'cron', [])); - Logger::info( 'End cancel all processes'); - } -} diff --git a/classes/Tools/Vision/Batch/ImportVisionBatchTool.php b/classes/Tools/Vision/Batch/ImportVisionBatchTool.php deleted file mode 100755 index 150db541..00000000 --- a/classes/Tools/Vision/Batch/ImportVisionBatchTool.php +++ /dev/null @@ -1,147 +0,0 @@ -processBulkSelection($post_ids, false, true); - if (!empty($result)) { - return $result; - } - } - - return $redirect_to; - } - //endregion - - //region Actions - /** - * Allows subclasses to filter the data used to render the tool - * @param $data - * @return array - */ - protected function filterRenderData($data) { - $data['disabledText'] = 'enable Vision'; - $data['commandLine'] = 'wp vision process'; - $data['commandTitle'] = 'Process Images'; - $data['cancelCommandTitle'] = 'Cancel Processing'; - - return $data; - } - - /** - * Process the import manually. $_POST will contain a field `post_id` for the post to process - */ - public function manualAction() { - if (!isset($_POST['id'])) { - BatchManager::instance()->setErrorMessage('storage', 'Missing required post data.'); - json_response(['status' => 'error']); - } - - $pid = $_POST['id']; - - $data = wp_get_attachment_metadata($pid); - if (!empty($data) && isset($data['s3'])) { - $data = $this->owner->processImageMeta($data, $pid); - wp_update_attachment_metadata($pid, $data); - } - - json_response(["status" => 'ok']); - } - //endregion - - //region BatchToolInterface - public function toolInfo() { - return [ - 'title' => 'Vision Importer', - 'link' => admin_url('admin.php?page='.$this->menuSlug()), - 'description' => 'Processes all of the media in your library through Amazon Rekognition or Google Cloud Vision to automatically tag and classify your media.' - ]; - } - //endregion -} \ No newline at end of file diff --git a/classes/Tools/Vision/CLI/VisionCLICommands.php b/classes/Tools/Vision/CLI/VisionCLICommands.php index 94fbabb9..a170ca83 100755 --- a/classes/Tools/Vision/CLI/VisionCLICommands.php +++ b/classes/Tools/Vision/CLI/VisionCLICommands.php @@ -17,10 +17,9 @@ namespace ILAB\MediaCloud\Tools\Vision\CLI; use ILAB\MediaCloud\CLI\Command; -use ILAB\MediaCloud\Tasks\BatchManager; use ILAB\MediaCloud\Tools\Rekognition\VisionTool; -use ILAB\MediaCloud\Tools\ToolsManager; -use ILAB\MediaCloud\Vision\VisionManager; +use ILAB\MediaCloud\Tools\Vision\Tasks\ProcessVisionTask; +use function ILAB\MediaCloud\Utilities\arrayPath; if (!defined('ABSPATH')) { header('Location: /'); die; } @@ -42,97 +41,54 @@ class VisionCLICommands extends Command { * [--page=] * : The starting offset to process. Page numbers start at 1. Cannot be used with offset. * + * [--order-by=] + * : The field to sort the items to be imported by. Valid values are 'date', 'title' and 'filename'. + * --- + * options: + * - date + * - title + * - filename + * --- + * + * [--order=] + * : The sort order. Valid values are 'asc' and 'desc'. + * --- + * default: asc + * options: + * - asc + * - desc + * --- + * * @when after_wp_load * * @param $args * @param $assoc_args + * + * @throws \Exception */ public function process($args, $assoc_args) { - /** @var VisionTool $tool */ - $tool = ToolsManager::instance()->tools['vision']; - - if (!$tool || !$tool->enabled()) { - Command::Error('Vision tool is not enabled in Media Cloud or the settings are incorrect.'); - return; - } - - global $wpdb; + $options = $assoc_args; - $sql = <<posts} posts - where - posts.post_type = 'attachment' - and - posts.post_status = 'inherit' - and - posts.post_mime_type in ('image/jpeg', 'image/jpg', 'image/png') - and - posts.ID in (select post_id from wp_postmeta where meta_key = '_wp_attachment_metadata' and meta_value like '%s:2:"s3";a:%') -SQL; - - if (isset($assoc_args['limit'])) { - $limit = $assoc_args['limit']; - $offset = 0; - if (isset($assoc_args['offset'])) { - $offset = $assoc_args['offset']; - } else if (isset($assoc_args['page'])) { - $offset = max(0,($assoc_args['page'] - 1) * $assoc_args['limit']); + if (isset($options['limit'])) { + if (isset($options['page'])) { + $options['offset'] = max(0,($assoc_args['page'] - 1) * $assoc_args['limit']); + unset($options['page']); } - $sql .= " limit $limit offset $offset"; } - $rows = $wpdb->get_results($sql); - - $posts = []; - foreach($rows as $row) { - $posts[] = $row->ID; - } - - $postCount = count($posts); - if($postCount > 0) { - BatchManager::instance()->reset('vision'); - + if (isset($assoc_args['order-by'])) { + $orderBy = $assoc_args['order-by']; + $dir = arrayPath($assoc_args, 'order', 'asc'); - BatchManager::instance()->setStatus('vision', true); - BatchManager::instance()->setTotalCount('vision', $postCount); - BatchManager::instance()->setCurrent('vision', 1); - BatchManager::instance()->setShouldCancel('vision', false); + unset($assoc_args['order-by']); + unset($assoc_args['order']); - Command::Info("Total posts found: %Y{$postCount}.", true); - - for($i = 1; $i <= $postCount; $i++) { - $postId = $posts[$i - 1]; - $upload_file = get_attached_file($postId); - $fileName = basename($upload_file); - - BatchManager::instance()->setCurrentFile('vision', $fileName); - BatchManager::instance()->setCurrent('vision', $i); - - Command::Info("%w[%C{$i}%w of %C{$postCount}%w] %NProcessing %Y$fileName%N %w(%N$postId%w)%N ... "); - - $data = wp_get_attachment_metadata($postId); - if (empty($data)) { - Command::info( 'Missing metadata, skipping.', true); - continue; - } - - if (!isset($data['s3']) && (VisionManager::driver() == 'rekognition')) { - Command::info( 'Missing cloud storage metadata, skipping.', true); - continue; - } - - $data = $tool->processImageMeta($data, $postId); - wp_update_attachment_metadata($postId, $data); - - Command::Info("%YDone%N.", true); - } - - BatchManager::instance()->reset('vision'); + $assoc_args['sort-order'] = $orderBy.'-'.$dir; } + + $task = new ProcessVisionTask(); + $this->runTask($task, $options); } public static function Register() { diff --git a/classes/Tools/Vision/Tasks/ProcessVisionTask.php b/classes/Tools/Vision/Tasks/ProcessVisionTask.php new file mode 100755 index 00000000..7db2a95c --- /dev/null +++ b/classes/Tools/Vision/Tasks/ProcessVisionTask.php @@ -0,0 +1,186 @@ + [ + "title" => "Selected Media", + "description" => "If you want to process just a small subset of items, click on 'Select Media'", + "type" => "media-select" + ], + 'sort-order' => [ + "title" => "Sort Order", + "description" => "Controls the order that items from your media library are migrated to cloud storage.", + "type" => "select", + "options" => [ + 'default' => 'Default', + 'date-asc' => "Oldest first", + 'date-desc' => "Newest first", + 'title-asc' => "Title, A-Z", + 'title-desc' => "Title, Z-A", + 'filename-asc' => "File name, A-Z", + 'filename-desc' => "File name, Z-A", + ], + "default" => 'default', + ] + ]; + + + + + return $options; + } + + //endregion + + //region Data + + protected function filterPostArgs($args) { + $args['meta_query'] = [ + 'relation' => 'OR', + [ + 'key' => '_wp_attachment_metadata', + 'value' => '"s3"', + 'compare' => 'LIKE', + 'type' => 'CHAR', + ], + [ + 'key' => 'ilab_s3_info', + 'compare' => 'EXISTS', + ], + ]; + + return $args; + } + + //endregion + + //region Execution + + /** + * Performs the actual task + * + * @param $item + * + * @return bool|void + * @throws \Exception + */ + public function performTask($item) { + $post_id = $item['id']; + if (!postIdExists($post_id)) { + return true; + } + + $this->updateCurrentPost($post_id); + + + Logger::info("Processing $post_id"); + + /** @var VisionTool $visionTool */ + $visionTool = ToolsManager::instance()->tools['vision']; + $data = wp_get_attachment_metadata($post_id); + $data = $visionTool->processImageMeta($data, $post_id); + update_post_meta($post_id, '_wp_attachment_metadata', $data); + + Logger::info("Finished processing $post_id"); + + return true; + } + + //endregion +} \ No newline at end of file diff --git a/classes/Tools/Vision/VisionTool.php b/classes/Tools/Vision/VisionTool.php index 4b06fa28..49cab69a 100755 --- a/classes/Tools/Vision/VisionTool.php +++ b/classes/Tools/Vision/VisionTool.php @@ -12,12 +12,13 @@ // ********************************************************************** namespace ILAB\MediaCloud\Tools\Vision; -use ILAB\MediaCloud\Tasks\BatchManager ; +use ILAB\MediaCloud\Tasks\TaskManager ; +use ILAB\MediaCloud\Tasks\TaskSchedule ; use ILAB\MediaCloud\Tools\Tool ; -use ILAB\MediaCloud\Tools\Vision\Batch\ImportVisionBatchProcess ; -use ILAB\MediaCloud\Tools\Vision\Batch\ImportVisionBatchTool ; +use ILAB\MediaCloud\Tools\Vision\Tasks\ProcessVisionTask ; use function ILAB\MediaCloud\Utilities\arrayPath ; use ILAB\MediaCloud\Utilities\Environment ; +use ILAB\MediaCloud\Utilities\Logging\Logger ; use ILAB\MediaCloud\Utilities\NoticeManager ; use ILAB\MediaCloud\Vision\VisionDriver ; use ILAB\MediaCloud\Vision\VisionManager ; @@ -69,11 +70,7 @@ public function __construct( $toolName, $toolInfo, $toolManager ) } $toolInfo = $this->mergeSettings( $toolInfo, $driverConfigs ); parent::__construct( $toolName, $toolInfo, $toolManager ); - new ImportVisionBatchProcess(); $this->driver = VisionManager::visionInstance(); - if ( is_admin() ) { - BatchManager::instance()->displayAnyErrors( 'rekognizer' ); - } add_filter( 'media-cloud/vision/detect-faces', function ( $enabled ) { return $this->enabled() && ($this->driver->config()->detectFaces() || $this->driver->config()->detectCelebrities()); } ); @@ -90,6 +87,7 @@ public function setup() $this->testForUselessPlugins(); if ( $this->enabled() ) { + TaskManager::registerTask( ProcessVisionTask::class ); if ( VisionManager::driver() == 'rekognition' ) { add_filter( @@ -97,6 +95,7 @@ public function setup() function ( $data, $id ) { if ( $this->alwaysBackground ) { + $this->addToBackgroundTask( $id ); return $data; } else { return $this->processImageMeta( $data, $id ); @@ -112,6 +111,7 @@ function ( $data, $id ) { function ( $data, $id ) { if ( $this->alwaysBackground ) { + $this->addToBackgroundTask( $id ); return $data; } else { return $this->processImageMeta( $data, $id ); @@ -126,6 +126,7 @@ function ( $data, $id ) { function ( $data, $id ) { if ( $this->alwaysBackground ) { + $this->addToBackgroundTask( $id ); return $data; } else { return $this->processImageMeta( $data, $id ); @@ -152,14 +153,34 @@ function ( $maxUploads ) { 1 ); add_action( 'media-cloud/direct-uploads/process-batch', function ( $postIds ) { + if ( $this->alwaysBackground ) { - BatchManager::instance()->addToBatchAndRun( ImportVisionBatchTool::BatchIdentifier(), $postIds, [] ); + $task = new ProcessVisionTask(); + $task->prepare( [], $postIds ); + TaskManager::instance()->queueTask( $task ); } + } ); } } + private function addToBackgroundTask( $postId ) + { + $task = TaskSchedule::nextScheduledTaskOfType( ProcessVisionTask::identifier() ); + + if ( !empty($task) ) { + Logger::info( "ADDING TO EXISTING VISION TASK" ); + $task->selection = array_merge( $task->selection, [ $postId ] ); + Logger::info( "SELECTION LENGTH: " . count( $task->selection ) ); + $task->save(); + } else { + Logger::info( "CREATING VISION TASK" ); + ProcessVisionTask::scheduleIn( 2, [], [ $postId ] ); + } + + } + private function settingsChanged() { if ( !$this->driver->enabled() ) { diff --git a/classes/Utilities/Environment.php b/classes/Utilities/Environment.php index fe4e5c61..e8e78f92 100755 --- a/classes/Utilities/Environment.php +++ b/classes/Utilities/Environment.php @@ -186,4 +186,35 @@ public static function CopyOptions($options) { } } } + + /** + * Fetches a wordpress option directly from the database. + * @param $name + * @param $default + * + * @return mixed + */ + public static function WordPressOption($name, $default = null) { + global $wpdb; + + if (is_multisite()) { + $network_id = get_current_network_id(); + + $row = $wpdb->get_row( $wpdb->prepare( "SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d", $name, $network_id ) ); + if (!is_object($row)) { + $val = $default; + } else { + $val = maybe_unserialize($row->meta_value); + } + } else { + $row = $wpdb->get_row($wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $name)); + if (!is_object($row)) { + $val = $default; + } else { + $val = maybe_unserialize($row->option_value); + } + } + + return $val; + } } \ No newline at end of file diff --git a/classes/Utilities/Helpers.php b/classes/Utilities/Helpers.php index ca03f7e7..524362ee 100755 --- a/classes/Utilities/Helpers.php +++ b/classes/Utilities/Helpers.php @@ -127,5 +127,57 @@ function unsetArrayPath(&$array, $path) $config = &$config[$part]; } } + + + /** + * Fetches a value from an object or array using a path, eg 'some/setting/name' + * + * @param array|object $object + * @param string $path + * @param mixed|null $default + * + * @return mixed|null + */ + function objectPath($object, $path, $default = null) { + $pathArray = explode('/', $path); + + $currentObject = $object; + for($i = 0; $i < count($pathArray); $i++) { + $part = $pathArray[$i]; + + if (is_object($currentObject)) { + if (!property_exists($currentObject, $part)) { + return $default; + } + + if ($i === count($pathArray) - 1) { + return $currentObject->{$part}; + } + + $currentObject = $currentObject->{$part}; + } else { + if (!isset($currentObject[$part])) { + return $default; + } + + if ($i === count($pathArray) - 1) { + return $currentObject[$part]; + } + + $currentObject = $currentObject[$part]; + } + } + } + + /** + * Determines if a postIdExists + * + * @param $postId + * + * @return bool + */ + function postIdExists($postId) { + return is_string(get_post_status($postId)); + } } diff --git a/classes/Utilities/Logging/DatabaseLogger.php b/classes/Utilities/Logging/DatabaseLogger.php index cf15a8ae..b67e014b 100755 --- a/classes/Utilities/Logging/DatabaseLogger.php +++ b/classes/Utilities/Logging/DatabaseLogger.php @@ -70,7 +70,7 @@ public function log($channel, $level, $message, $context = '') { protected function insureTable() { global $wpdb; - $this->table = $wpdb->prefix.'ilab_mc_logging'; + $this->table = $wpdb->base_prefix.'ilab_mc_logging'; $tableSchema = <<table} ( diff --git a/classes/Utilities/Logging/Logger.php b/classes/Utilities/Logging/Logger.php index 2104679b..1604a9f0 100755 --- a/classes/Utilities/Logging/Logger.php +++ b/classes/Utilities/Logging/Logger.php @@ -44,7 +44,7 @@ public function __construct() { $enabled = ($this->useWPCLI) ?: Environment::Option("mcloud-tool-enabled-debugging", 'ILAB_MEDIA_DEBUGGING_ENABLED', false); if ($enabled) { - $level = Environment::Option('mcloud-debug-logging-level', null, ($this->useWPCLI) ? 'info' : 'none'); + $level = Environment::Option('mcloud-debug-logging-level', null, 'info'); if ($level != 'none') { $realLevel = MonologLogger::INFO; @@ -108,6 +108,11 @@ protected function doLogInfo($message, $context=[]) { } if ($this->logger) { + $pid = getmypid(); + if (!empty($pid)) { + $message = "[$pid] ".$message; + } + $this->logger->addInfo($message, array_merge($this->context, $context)); } } @@ -118,6 +123,11 @@ protected function doLogWarning($message, $context=[]) { } if ($this->logger) { + $pid = getmypid(); + if (!empty($pid)) { + $message = "[$pid] ".$message; + } + $this->logger->addWarning($message, array_merge($this->context, $context)); } } @@ -128,13 +138,24 @@ protected function doLogError($message, $context=[]) { } if ($this->logger) { - $this->logger->addError($message, array_merge($this->context, $context)); + $pid = getmypid(); + if (!empty($pid)) { + $message = "[$pid] ".$message; + } + + $this->logger->addError($message, array_merge($this->context, $context)); } } protected function doStartTiming($message, $context=[]) { if ($this->logger) { $this->time[] = microtime(true); + + $pid = getmypid(); + if (!empty($pid)) { + $message = "[$pid] ".$message; + } + $this->logger->addInfo($message, array_merge($this->context, $context)); } } @@ -144,6 +165,11 @@ protected function doEndTiming($message, $context=[]) { $time = array_pop($this->time); $context['time'] = microtime(true) - $time; + $pid = getmypid(); + if (!empty($pid)) { + $message = "[$pid] ".$message; + } + $this->logger->addInfo($message, array_merge($this->context, $context)); } } diff --git a/classes/Utilities/Prefixer.php b/classes/Utilities/Prefixer.php index ff3fd00f..ffee7da9 100755 --- a/classes/Utilities/Prefixer.php +++ b/classes/Utilities/Prefixer.php @@ -26,10 +26,13 @@ final class Prefixer { /** @var array */ private $versionedIds = []; + + private $currentVersion = null; //endregion //region Constructor/Static Instance private function __construct() { + $this->updateVersion(); } /** @@ -84,30 +87,16 @@ private function genUUIDPath() { } /** - * Gets an Offload S3 compatible object version string. - * - * @param int $id - * - * @return string|null + * Updates the current version */ - private function getObjectVersion($id = null) { - - if(!empty($id) && !empty($this->versionedIds[$id])) { - return $this->versionedIds[$id]; - } - + private function updateVersion() { $date_format = 'dHis'; // Use current time so that object version is unique $time = current_time('timestamp'); $object_version = date($date_format, $time).'/'; $object_version = apply_filters('as3cf_get_object_version_string', $object_version); - - if(!empty($id)) { - $this->versionedIds[$id] = $object_version; - } - - return $object_version; + $this->currentVersion = $object_version; } /** @@ -127,10 +116,7 @@ private function parsePrefix($prefix, $id = null) { $userName = sanitize_title($user->display_name); } - if($id) { - $prefix = str_replace("@{versioning}", $this->getObjectVersion($id), $prefix); - } - + $prefix = str_replace("@{versioning}", $this->currentVersion, $prefix); $prefix = str_replace("@{site-id}", sanitize_title(strtolower(get_current_blog_id())), $prefix); $prefix = str_replace("@{site-name}", sanitize_title(strtolower(get_bloginfo('name'))), $prefix); $prefix = str_replace("@{site-host}", $host, $prefix); @@ -162,8 +148,13 @@ public static function Parse($prefixFormat, $id = null) { if (!empty($prefixFormat)) { return self::instance()->parsePrefix($prefixFormat, $id); } else { - return date('Y/m').'/'; + $wpUpload = wp_upload_dir(); + return ltrim(trailingslashit($wpUpload['subdir']), '/'); } } + + public static function nextVersion() { + self::instance()->updateVersion(); + } //endregion } \ No newline at end of file diff --git a/classes/Utilities/View.php b/classes/Utilities/View.php old mode 100644 new mode 100755 index 8a0d3634..3dd79d28 --- a/classes/Utilities/View.php +++ b/classes/Utilities/View.php @@ -87,6 +87,10 @@ private static function bladeInstance() { return ""; }); + static::$bladeInstance->directive('elsetrack', function($expression) { + return ""; + }); + static::$bladeInstance->directive('endtrack', function($expression) { return ''; }); diff --git a/composer.json b/composer.json index c5e09b47..56cf5e79 100755 --- a/composer.json +++ b/composer.json @@ -28,8 +28,6 @@ "superbalist/flysystem-google-storage": "^7.1", "google/cloud-vision": "^0.19.0", "nesbot/carbon": "^1.21", - "michelf/php-markdown": "^1.8", - "teamtnt/tntsearch": "^1.4.0", "ilab/b2-sdk-php": "^1.4", "psr/http-message-implementation": "*", "mikey179/vfsstream": "*", diff --git a/config/batch-processing.config.php b/config/batch-processing.config.php index 3b632ee5..48b608b4 100755 --- a/config/batch-processing.config.php +++ b/config/batch-processing.config.php @@ -20,9 +20,6 @@ "exclude" => true, "dependencies" => [], "env" => "ILAB_MEDIA_BATCH_PROCESSING_ENABLED", // this is always enabled btw - "batchTools" => [ - \ILAB\MediaCloud\Tools\Debugging\System\Batch\TestBatchTool::class - ], "settings" => [ "options-page" => "media-tools-batch-processing", "options-group" => "ilab-media-batch-processing", @@ -32,18 +29,28 @@ "dynamic" => true, "description" => "The following options control how tasks like importer, thumbnail regeneration and Rekognition work. You should only change these settings if you are having issues or if the system compatibility tool directed you to.", "options" => [ - "mcloud-storage-batch-verify-ssl" => [ + "mcloud-tasks-http-client" => [ + "title" => "HTTP Client", + "description" => "Controls which HTTP client to use for background processing.", + "type" => "select", + "default" => "wordpress", + "options" => [ + "wordpress" => "WordPress HTTP Client", + "guzzle" => "Guzzle HTTP Client", + ] + ], + "mcloud-tasks-verify-ssl" => [ "title" => "Verify SSL", "description" => "Determines if SSL is verified when making the remote connection for the background process.", "type" => "select", - "default" => "none", + "default" => "no", "options" => [ "default" => "System Default", "yes" => "Yes", "no" => "No", ] ], - "mcloud-storage-batch-connect-timeout" => [ + "mcloud-tasks-connect-timeout" => [ "title" => "Connection Timeout", "description" => "The number of seconds to wait for a connection to occur. If you are having issues with the batch importer process, or the system compatibility tool is complaining about cURL error 2x, try setting this to 5 to 10 seconds.", "type" => "number", @@ -52,7 +59,7 @@ "min" => 0.01, "max" => 300 ], - "mcloud-storage-batch-timeout" => [ + "mcloud-tasks-timeout" => [ "title" => "Timeout", "description" => "The number of seconds to wait for a response before the request times out. If you are having issues with the batch importer process, or the system compatibility tool is complaining about cURL error 2x, try setting this to 0.1 or even 10.", "type" => "number", @@ -61,13 +68,13 @@ "min" => 0.01, "max" => 30 ], - "mcloud-storage-batch-skip-dns" => [ + "mcloud-tasks-skip-dns" => [ "title" => "Skip DNS", "description" => "When this is selected, the background process request will connect to localhost, passing in the host name in an HTTP header. Some managed hosting/VPS providers have DNS issues, turning this off might help.", "type" => "checkbox", "default" => false ], - "mcloud-storage-batch-skip-dns-host" => [ + "mcloud-tasks-skip-dns-host" => [ "title" => "Host IP Address", "description" => "When skipping DNS, select the IP address to use to resolve to.", "type" => "select", @@ -77,12 +84,6 @@ 'local' => '127.0.0.1', ] ], - "mcloud-storage-batch-background-processing" => [ - "title" => "Process In Background", - "description" => "When this is selected, batch processing happens asynchronously in the background on your WordPress server. However, some server configuration and hosting setups do not support this type of background processing. If you set this to false/off, the import is processed in your browser via ajax. This client-side ajax method is can be slower (though sometimes it can be faster) and requires that the importer page be open during the entire import process.", - "type" => "checkbox", - "default" => true - ], ] ], ] diff --git a/config/crop.config.php b/config/crop.config.php index fd649797..099621b6 100755 --- a/config/crop.config.php +++ b/config/crop.config.php @@ -25,6 +25,7 @@ "groups" => [ "ilab-media-crop-settings" => [ "title" => "Crop Settings", + "doc_beacon" => '51', "options" => [ "mcloud-crop-quality" => [ "title" => "Crop Quality", diff --git a/config/debugging.config.php b/config/debugging.config.php index 85c7fa16..96d1df2e 100755 --- a/config/debugging.config.php +++ b/config/debugging.config.php @@ -31,7 +31,7 @@ "title" => "Logging Level", "description" => "The logging level to use. To disable logging for Media Cloud, set it to None.", "type" => "select", - "default" => "none", + "default" => "info", "options" => [ "none" => "None", "info" => "Info", @@ -43,6 +43,9 @@ "title" => "Maximum Database Entries", "description" => "The maximum number of log entries to keep in the database. The default is 1000.", "type" => "number", + "step" => 1, + "min" => 100, + "max" => 10000, "default" => 1000 ], ] diff --git a/config/image-optimizers.config.php b/config/image-optimizers.config.php index 93ea100f..2d81f46b 100755 --- a/config/image-optimizers.config.php +++ b/config/image-optimizers.config.php @@ -15,7 +15,7 @@ return [ "shortpixel" => "shortpixel-image-optimiser/wp-shortpixel.php", "smush" => "wp-smushit/wp-smush.php", - "smush_pro" => "wp-smush-pro/wp-smush.php", + "smush_pro" => "wp-smush-pro/wp-smush.php", "ewww" => "ewww-image-optimizer/ewww-image-optimizer.php", "imagify" => "imagify/imagify.php", "kraken" => "kraken-image-optimizer/kraken-image-optimizer.php", diff --git a/config/imgix.config.php b/config/imgix.config.php index 930a8671..dbf06c66 100755 --- a/config/imgix.config.php +++ b/config/imgix.config.php @@ -50,6 +50,7 @@ "groups" => [ "ilab-media-imgix-settings" => [ "title" => "Imgix Settings", + "doc_beacon" => '88', "description" => "Required settings for getting the Imgix integration working.", "options" => [ "mcloud-imgix-domains" => [ @@ -72,6 +73,7 @@ ], "ilab-media-imgix-image-settings" => [ "title" => "Imgix Image Settings", + "doc_beacon" => '89', "options" => [ "mcloud-imgix-default-quality" => [ "title" => "Lossy Image Quality", diff --git a/config/migrations/migrations.php b/config/migrations/migrations.php index aef06375..350bf164 100755 --- a/config/migrations/migrations.php +++ b/config/migrations/migrations.php @@ -93,11 +93,6 @@ 'ilab-media-backblaze-account-id' => 'mcloud-storage-backblaze-account-id', 'ilab-media-backblaze-bucket-url' => 'mcloud-storage-backblaze-bucket-url', 'ilab-media-backblaze-key' => 'mcloud-storage-backblaze-key', - 'ilab-media-s3-batch-background-processing' => 'mcloud-storage-batch-background-processing', - 'ilab-media-s3-batch-connect-timeout' => 'mcloud-storage-batch-connect-timeout', - 'ilab-media-s3-batch-skip-dns' => 'mcloud-storage-batch-skip-dns', - 'ilab-media-s3-batch-timeout' => 'mcloud-storage-batch-timeout', - 'ilab-media-s3-batch-verify-ssl' => 'mcloud-storage-batch-verify-ssl', 'ilab-media-s3-cache-control' => 'mcloud-storage-cache-control', 'ilab-media-s3-cdn-base' => 'mcloud-storage-cdn-base', 'ilab-media-s3-delete-from-s3' => 'mcloud-storage-delete-from-server', diff --git a/config/storage.config.php b/config/storage.config.php index ed330da8..acad2fe7 100755 --- a/config/storage.config.php +++ b/config/storage.config.php @@ -48,7 +48,7 @@ 'config' => '/storage/s3.config.php', 'help' => [ [ 'title' => 'Watch Tutorial', 'url' => 'https://www.youtube.com/watch?v=kjFCACrPRtU' ], - [ 'title' => 'Read Documentation', 'url' => admin_url('admin.php?page=media-cloud-docs&doc-page=cloud-storage/setup/amazon-s3') ], + [ 'title' => 'Read Documentation', 'url' => 'https://help.mediacloud.press/article/38-setting-up-amazon-s3', 'beacon_id' => '38' ], ] ], 'google' => [ @@ -56,7 +56,7 @@ 'class' => "\\ILAB\\MediaCloud\\Storage\\Driver\\GoogleCloud\\GoogleStorage", 'config' => '/storage/google.config.php', 'help' => [ - [ 'title' => 'Read Documentation', 'url' => admin_url('admin.php?page=media-cloud-docs&doc-page=cloud-storage/setup/google-cloud-storage')], + [ 'title' => 'Read Documentation', 'url' => 'https://help.mediacloud.press/article/45-setting-up-google-cloud-storage', 'beacon_id' => '45' ], ] ], 'do' => [ @@ -64,7 +64,7 @@ 'class' => "\\ILAB\\MediaCloud\\Storage\\Driver\\S3\\DigitalOceanStorage", 'config' => '/storage/do.config.php', 'help' => [ - [ 'title' => 'Read Documentation', 'url' => admin_url('admin.php?page=media-cloud-docs&doc-page=cloud-storage/setup/do-spaces') ], + [ 'title' => 'Read Documentation', 'url' => 'https://help.mediacloud.press/article/44-setting-up-digital-ocean-spaces', 'beacon_id' => '44' ], ] ], 'minio' => [ @@ -79,7 +79,7 @@ 'class' => "\\ILAB\\MediaCloud\\Storage\\Driver\\S3\\WasabiStorage", 'config' => '/storage/wasabi.config.php', 'help' => [ - [ 'title' => 'Read Documentation', 'url' => admin_url('admin.php?page=media-cloud-docs&doc-page=cloud-storage/setup/wasabi') ], + [ 'title' => 'Read Documentation', 'url' => 'https://help.mediacloud.press/article/46-setting-up-wasabi', 'beacon_id' => '46' ], ] ], 'other-s3' => [ @@ -94,7 +94,7 @@ 'class' => \ILAB\MediaCloud\Storage\Driver\Backblaze\BackblazeStorage::class, 'config' => '/storage/backblaze.config.php', 'help' => [ - [ 'title' => 'Read Documentation', 'url' => admin_url('admin.php?page=media-cloud-docs&doc-page=cloud-storage/setup/backblaze') ], + [ 'title' => 'Read Documentation', 'url' => 'https://help.mediacloud.press/article/43-setting-up-backblaze', 'beacon_id' => '43' ], ] ], ], @@ -133,6 +133,7 @@ "ilab-media-cloud-upload-handling" => [ "title" => "Upload Handling", "dynamic" => true, + "doc_beacon" => '39', "description" => "The following options control how the storage tool handles uploads.", "options" => [ "mcloud-storage-prefix" => [ @@ -181,16 +182,24 @@ "display-order" => 10, "type" => "checkbox" ], - "mcloud-storage-delete-from-server" => [ - "title" => "Delete From Storage", - "description" => "When you delete from the media library, turning this on will also delete the file from cloud storage.", - "display-order" => 10, - "type" => "checkbox" - ], + "mcloud-storage-queue-deletes" => [ + "title" => "Queue Deletes", + "description" => "When this option is enabled, uploads won't be deleted right away, they will be queued for deletion two to five minutes later. This allows other plugins the ability to process any uploads before they are deleted from your WordPress server. If Delete From Storage is disabled, this setting is ignored.", + "display-order" => 10, + "type" => "checkbox", + "default" => true + ], + "mcloud-storage-delete-from-server" => [ + "title" => "Delete From Storage", + "description" => "When you delete from the media library, turning this on will also delete the file from cloud storage.", + "display-order" => 10, + "type" => "checkbox" + ], ] ], "ilab-media-cloud-cdn-settings" => [ "title" => "CDN Settings", + "doc_beacon" => '40', "description" => "If you are using CloudFront, Fastly or another CDN, enter the CDN domain here. If you are using Imgix, the CDN Base URL setting is ignored, but the Document CDN Base URL is not. If both are left blank, Media Tools will use the cloud storage URLs.", "options" => [ "mcloud-storage-cdn-base" => [ @@ -207,6 +216,7 @@ ], "ilab-media-cloud-display-settings" => [ "title" => "Display Settings", + "doc_beacon" => '41', "description" => "", "options" => [ "mcloud-storage-display-badge" => [ diff --git a/config/storage/google.config.php b/config/storage/google.config.php index a862f806..868b65dd 100755 --- a/config/storage/google.config.php +++ b/config/storage/google.config.php @@ -42,14 +42,14 @@ "display-order" => 15, "type" => "number", "default" => 10, - ], - "mcloud-storage-bucket-policy-only" => [ - "title" => "Use a bucket with 'Bucket policy only' set", - "description" => "Set to true to use a bucket which has the 'Bucket Policy Only' flag enabled. See this documentation for more information. Also, make sure to make the bucket public, as specified in this documentation.", - "display-order" => 16, - "type" => "checkbox", - "default" => false, - ], + ], + "mcloud-storage-bucket-policy-only" => [ + "title" => "Use Bucket Policy Only", + "description" => "Set to true to when using a bucket which has the 'Bucket Policy Only' flag enabled. See this documentation for more information. Also, make sure to make the bucket public, as specified in this documentation.", + "display-order" => 16, + "type" => "checkbox", + "default" => false, + ], ] ], "ilab-media-cloud-upload-handling" => [ @@ -59,8 +59,8 @@ "options" => [ "mcloud-storage-privacy" => [ "title" => "Upload Privacy ACL", - "description" => "This will set the privacy for each upload. You should leave it as public-read unless you are using Imgix. If you set the 'Bucket Policy Only' flag, this will have no effect.", - "display-order" => 1, + "description" => "This will set the privacy for each upload. You should leave it as public-read unless you are using Imgix. If you set the Bucket Policy Only flag, this will have no effect.", + "display-order" => 1, "type" => "select", "options" => [ "public-read" => "public-read", diff --git a/config/storage/s3.config.php b/config/storage/s3.config.php index e4557424..dd455824 100755 --- a/config/storage/s3.config.php +++ b/config/storage/s3.config.php @@ -16,6 +16,7 @@ "ilab-media-cloud-provider-settings" => [ "title" => "Provider Settings", "dynamic" => true, + "doc_beacon" => '38', "options" => [ "mcloud-storage-s3-access-key" => [ "title" => "Access Key", diff --git a/classes/Tools/BatchToolInterface.php b/config/tasks.config.php similarity index 54% rename from classes/Tools/BatchToolInterface.php rename to config/tasks.config.php index 960a245a..ed98c0c5 100755 --- a/classes/Tools/BatchToolInterface.php +++ b/config/tasks.config.php @@ -4,24 +4,23 @@ // Released under the GPLv3 license // http://www.gnu.org/licenses/gpl-3.0.html // -// Uses code from: -// Persist Admin Notices Dismissal -// by Agbonghama Collins and Andy Fragen -// // ********************************************************************** // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // ********************************************************************** -namespace ILAB\MediaCloud\Tools; - -if (!defined( 'ABSPATH')) { header( 'Location: /'); die; } +if (!defined('ABSPATH')) { header('Location: /'); die; } -interface BatchToolInterface { - /** - * Information about this tool - * @return array - */ - public function toolInfo(); -} \ No newline at end of file +return [ + "id" => "tasks", + "name" => "Task Manager", + "description" => "Tool for managing background tasks.", + "class" => "ILAB\\MediaCloud\\Tools\\Tasks\\TasksTool", + "exclude" => true, + "dependencies" => [], + "CLI" => [ + "\\ILAB\\MediaCloud\\Tools\\Tasks\\CLI\\TasksCommands" + ], + "env" => "ILAB_MEDIA_TASKS_ENABLED", // this is always enabled btw +]; \ No newline at end of file diff --git a/config/vision.config.php b/config/vision.config.php index 1449ea7b..85212599 100755 --- a/config/vision.config.php +++ b/config/vision.config.php @@ -20,9 +20,6 @@ "class" => "ILAB\\MediaCloud\\Tools\\Vision\\VisionTool", "env" => "ILAB_VISION_ENABLED", "dynamic-config-option" => "mcloud-vision-provider", - "batchTools" => [ - "\\ILAB\\MediaCloud\\Tools\\Vision\\Batch\\ImportVisionBatchTool" - ], "CLI" => [ "\\ILAB\\MediaCloud\\Tools\\Vision\\CLI\\VisionCLICommands" ], @@ -32,7 +29,7 @@ 'class' => "\\ILAB\\MediaCloud\\Vision\\Driver\\Rekognition\\RekognitionDriver", 'config' => '/vision/rekognition.config.php', 'help' => [ - [ 'title' => 'Read Documentation', 'url' => admin_url('admin.php?page=media-cloud-docs&doc-page=vision#configuring-amazon-rekognition') ], + [ 'title' => 'Read Documentation', 'url' => 'https://help.mediacloud.press/article/59-setting-up-amazon-rekognition', 'beacon_id' => '59' ], ] ], ], @@ -67,6 +64,7 @@ ], "ilab-vision-options" => [ "title" => "Vision Options", + "doc_beacon" => '96', "dynamic" => true, "options" => [ "mcloud-vision-detect-faces" => [ diff --git a/docs/advanced/command-line.md b/docs/advanced/command-line.md deleted file mode 100755 index 7b05cb0b..00000000 --- a/docs/advanced/command-line.md +++ /dev/null @@ -1,82 +0,0 @@ -# Command Line -Media Cloud provides a variety of commands that you can use with [WP CLI](https://wp-cli.org) command line tool. - -  -## Cloud Storage Commands -### Import -```bash -wp mediacloud import [--limit=] [--offset=] [--page=] [--paths=preserve|replace|prepend] [--skip-thumbnails] [--order-by=date|title|filename] [--order=asc|desc] -``` -This command will import items in your media library to cloud storage. **Premium version only.** - -#### Arguments -Argument | Type | Optional | Description --------- | ---- | -------- | ----------- -limit | number | yes | Limits the number of items to be processed, used with `offset` or `page` to process batches. -offset | number | yes | The starting index to return a range of results, cannot be used with `page`. -page | number | yes | The starting index to return a range of results in terms of pages, cannot be used with `offset`. The page index start at 1. For example, specify a `limit` of `100` and a `page` of `2` would return results 100-200. -paths | string | yes | Controls the upload path. `preserve` will preserve the files current path, `replace` will replace it with the custom prefix defined in cloud storage settings. `prepend` will prepend the custom prefix with the existing upload directory. -skip-thumbnails | switch | yes | Skips uploading thumbnails. Requires Imgix or Dynamic Images. -order-by | string | yes | The field to sort the items to be imported by. Valid values are `date`, `title` and `filename`. -order | string | yes | The sort order. Valid values are `asc` and `desc`. - -  - -### Regenerate -```bash -wp mediacloud regenerate [--limit=] [--offset=] [--page=] -``` -This command will regenerate thumbnails for items in the media library. **Premium version only.** - -#### Arguments -Argument | Type | Optional | Description --------- | ---- | -------- | ----------- -limit | number | yes | Limits the number of items to be processed, used with `offset` or `page` to process batches. -offset | number | yes | The starting index to return a range of results, cannot be used with `page`. -page | number | yes | The starting index to return a range of results in terms of pages, cannot be used with `offset`. The page index start at 1. For example, specify a `limit` of `100` and a `page` of `2` would return results 100-200. - -  - -### Unlink -```bash -wp mediacloud unlink [--limit=] [--offset=] [--page=] -``` -This command will unlink items in the media library from cloud storage. Note that this does not copy media down from cloud storage, it simply removes the cloud metadata. - -#### Arguments -Argument | Type | Optional | Description --------- | ---- | -------- | ----------- -limit | number | yes | Limits the number of items to be processed, used with `offset` or `page` to process batches. -offset | number | yes | The starting index to return a range of results, cannot be used with `page`. -page | number | yes | The starting index to return a range of results in terms of pages, cannot be used with `offset`. The page index start at 1. For example, specify a `limit` of `100` and a `page` of `2` would return results 100-200. - -  - -### Migrate Human Made S3 Uploads -```bash -wp mediacloud migrateS3Uploads [--limit=] [--offset=] [--page=] [--order-by=date|title|filename] [--order=asc|desc] -``` -This command will generate the required metadata for any media uploads that were uploaded with Human Made's S3 Uploads plugin. You must have S3 Uploads installed and activated. - -#### Arguments -Argument | Type | Optional | Description --------- | ---- | -------- | ----------- -limit | number | yes | Limits the number of items to be processed, used with `offset` or `page` to process batches. -offset | number | yes | The starting index to return a range of results, cannot be used with `page`. -page | number | yes | The starting index to return a range of results in terms of pages, cannot be used with `offset`. The page index start at 1. For example, specify a `limit` of `100` and a `page` of `2` would return results 100-200. -paths | string | yes | Controls the upload path. `preserve` will preserve the files current path, `replace` will replace it with the custom prefix defined in cloud storage settings. `prepend` will prepend the custom prefix with the existing upload directory. -skip-thumbnails | switch | yes | Skips uploading thumbnails. Requires Imgix or Dynamic Images. -order-by | string | yes | The field to sort the items to be imported by. Valid values are `date`, `title` and `filename`. -order | string | yes | The sort order. Valid values are `asc` and `desc`. - -  - -## Dynamic Image Commands -### Clear Cache -```bash -wp dynamicImages clearCache -``` -Clears the dynamic images file cache. - -  - diff --git a/docs/advanced/environment-variables.md b/docs/advanced/environment-variables.md deleted file mode 100755 index e3c010b8..00000000 --- a/docs/advanced/environment-variables.md +++ /dev/null @@ -1,238 +0,0 @@ -# Environment Variables -Every setting in Media Cloud can be set using environment variables. For example, if you are using Root's [Trellis](https://roots.io/trellis) and/or [Bedrock](https://roots.io/bedrock), these variables would be defined in a `.env` file located in your project's root. -  - -## Enabled Features Environment Variables -Variable | Type | Description --------- | ---- | ----------- -MCLOUD_TOOL_ENABLED_STORAGE | boolean | Cloud storage is enabled. -MCLOUD_TOOL_ENABLED_IMGIX | boolean | Imgix is enabled. -MCLOUD_TOOL_ENABLED_GLIDE | boolean | Dynamic Images is enabled. -MCLOUD_TOOL_ENABLED_MEDIA_UPLOAD | boolean | Direct Upload is enabled. -MCLOUD_TOOL_ENABLED_CROP | boolean | Crop tool is enabled. -MCLOUD_TOOL_ENABLED_VISION | boolean | Vision is enabled. -MCLOUD_TOOL_ENABLED_ASSETS | boolean | Asset feature is enabled. -MCLOUD_TOOL_ENABLED_BROWSER | boolean | Storage browser is enabled. -MCLOUD_TOOL_ENABLED_DEBUGGING | boolean | Debugging is enabled. -MCLOUD_TOOL_ENABLED_IMAGE_SIZES | boolean | Image size editor is enabled. -MCLOUD_VIEW_CACHE | path | File path to store intermediate views that Media Cloud renders when displaying the admin UI. - -  - -## Cloud Storage Environment Variables -Variable | Type | Description --------- | ---- | ----------- -MCLOUD_STORAGE_PROVIDER | string | The cloud storage provider to use. Valid values: `s3`, `google`, `do`, `minio`, `wasabi`, `other-s3` and `backblaze`. -MCLOUD_STORAGE_S3_ACCESS_KEY | string | The access key for S3 and S3-compatible services. -MCLOUD_STORAGE_S3_SECRET | string | The secret key for S3 and S3-compatible services. -MCLOUD_STORAGE_S3_USE_CREDENTIAL_PROVIDER | boolean | When this is enabled, Media Cloud will load your S3 credentials from the environment, `~/.aws/credentials` or `~/.aws/config`. When this is enabled, the **Access Key** and **Secret** values specified in these settings will be ignored. This is an advanced option and ***should only be enabled if you know what you are doing***. -MCLOUD_STORAGE_S3_REGION | string | The region name, valid values are service dependent. -MCLOUD_STORAGE_S3_BUCKET | string | The name of the bucket to use for S3 and S3-compatible services. -MCLOUD_STORAGE_S3_ENDPOINT | host | The end point host for S3-compatible services. For example, DigitalOcean NYC-3 would be `nyc3.digitaloceanspaces.com` -MCLOUD_STORAGE_S3_USE_PATH_STYLE_ENDPOINT | boolean | Sends request to an S3 path style endpoint, for S3-compatible services only. -MCLOUD_STORAGE_S3_USE_TRANSFER_ACCELERATION | boolean | Enables transfer acceleration for Amazon S3 only. -MCLOUD_STORAGE_GOOGLE_BUCKET | string | The name of the bucket to use for Google Cloud Storage. -MCLOUD_STORAGE_GOOGLE_CREDENTIALS_FILE | path | The file path for the Google json credentials file. -MCLOUD_STORAGE_BACKBLAZE_ACCOUNT_ID | string | Backblaze account ID. -MCLOUD_STORAGE_BACKBLAZE_BUCKET_URL | url | URL for the backblaze bucket. -MCLOUD_STORAGE_BACKBLAZE_KEY | string | The application key to use for Backblaze. -MCLOUD_STORAGE_PRIVACY | string | Privacy ACL for uploads, valid values are `public-read` or `authenticated-read`. -MCLOUD_STORAGE_PREFIX | string | The prefix for file upload paths. -MCLOUD_STORAGE_UPLOAD_IMAGES | boolean | Upload image files to cloud storage. -MCLOUD_STORAGE_UPLOAD_VIDEOS | boolean | Upload video files to cloud storage. -MCLOUD_STORAGE_UPLOAD_AUDIO | boolean | Upload audio files to cloud storage. -MCLOUD_STORAGE_UPLOAD_DOCUMENTS | boolean | Allow non-media files to be uploaded to cloud storage. -MCLOUD_STORAGE_IGNORED_MIME_TYPES | string | MIME types of files that should not be uploaded to cloud storage. -MCLOUD_STORAGE_CDN_BASE | url | Base URL for CDN. -MCLOUD_STORAGE_DOC_CDN_BASE | url | Base URL for document (non-media) CDN. -MCLOUD_STORAGE_CACHE_CONTROL | string | Default cache control for uploads. -MCLOUD_STORAGE_EXPIRES | number | Cache expiration for uploaded files. -MCLOUD_STORAGE_DELETE_FROM_SERVER | boolean | Delete from cloud storage when deleted from media library. -MCLOUD_STORAGE_DELETE_UPLOADS | boolean | Delete uploads after uploaded to cloud storage. -MCLOUD_STORAGE_DISPLAY_BADGE | boolean | Display cloud icon in media library for uploaded media. -MCLOUD_STORAGE_DISPLAY_MEDIA_LIST | boolean | Add extra column to media library in list view mode. -MCLOUD_STORAGE_USE_PRESIGNED_URLS | boolean | Use pre-signed URLs. -MCLOUD_STORAGE_PRESIGNED_EXPIRATION | number | Number of minutes pre-signed URLs are valid for. - -  - -## Imgix Environment Variables -Variable | Type | Description --------- | ---- | ----------- -MCLOUD_IMGIX_DOMAINS | url | List of imgix domains to use. -MCLOUD_IMGIX_SIGNING_KEY | string | The signing key for securing Imgix URLs. -MCLOUD_IMGIX_USE_HTTPS | boolean | Use HTTPS. -MCLOUD_IMGIX_DEFAULT_QUALITY | number | Default quality for lossy images. -MCLOUD_IMGIX_AUTO_FORMAT | boolean | Allow Imgix to choose the most appropriate image format. -MCLOUD_IMGIX_AUTO_COMPRESS | boolean | Allow Imgix to automatically compress your images. -MCLOUD_IMGIX_ENABLE_ALT_FORMATS | boolean | Enable alternative formats usch as PSD, TIFF and Illustrator. -MCLOUD_IMGIX_GENERATE_THUMBNAILS | boolean | Allow WordPress to generate thumbnails, ignored if Direct Upload enabled. -MCLOUD_IMGIX_DETECT_FACES | boolean | Use Imgix face detection on uploads. Ignored if Vision detect faces is enabled. -MCLOUD_IMGIX_RENDER_PDF_FILES | boolean | Render the first page of a PDF file as an image. -MCLOUD_IMGIX_ENABLE_GIFS | boolean | Enable animated GIF support, required Imgix premium account. -MCLOUD_IMGIX_SKIP_GIFS | boolean | If enabled, GIFs will be served from cloud storage. -MCLOUD_IMGIX_NO_GIF_SIZES | boolean | List of image sizes that disallow animated GIFs. - -  - -## Dynamic Images Environment Variables -Variable | Type | Description --------- | ---- | ----------- -MCLOUD_GLIDE_IMAGE_PATH | string | The base path for the generated image URLs. -MCLOUD_GLIDE_SIGNING_KEY | string | The signing key used to create secure URLs. -MCLOUD_GLIDE_CACHE_REMOTE | boolean | This option will cache any master images that are fetched from remote storage. -MCLOUD_GLIDE_CDN | url | Base URL for the CDN. -MCLOUD_GLIDE_CACHE_TTL | number | The number of minutes to cache the rendered image in the user's browser. -MCLOUD_GLIDE_DEFAULT_QUALITY | number | The image quality for JPEG compression. -MCLOUD_GLIDE_MAX_SIZE | number | The max width or height for a generated image. -MCLOUD_GLIDE_CONVERT_PNG | boolean | Convert all PNG to JPEGs. -MCLOUD_GLIDE_PROGRESSIVE_JPEG | boolean | Use progressive JPEGs. -MCLOUD_GLIDE_GENERATE_THUMBNAILS | boolean | Allow WordPress to generate thumbnails, ignored if Direct Upload enabled. - -  - -## Direct Upload Environment Variables -Variable | Type | Description --------- | ---- | ----------- -MCLOUD_DIRECT_UPLOADS_INTEGRATION | boolean | Integrated with the WordPress media library so that all uploads done through the library are direct uploads. -MCLOUD_DIRECT_UPLOADS_UPLOAD_IMAGES | boolean | Enables direct uploads for image files. You will need to have Imgix or Dynamic Images enabled. -MCLOUD_DIRECT_UPLOADS_UPLOAD_VIDEOS | boolean | Enables direct uploads for video files. Important! WordPress will be unable to extract metadata about the video such as length and audio attributes without the FFProbe option enabled. -MCLOUD_DIRECT_UPLOADS_UPLOAD_AUDIO | boolean | Enables direct uploads for audio files. -MCLOUD_DIRECT_UPLOADS_UPLOAD_DOCUMENTS | boolean | Enables direct uploads for non-image files such as Word documents, PDF files, zip files, etc. -MCLOUD_DIRECT_UPLOADS_SIMULTANEOUS_UPLOADS | number | The maximum number of simultaneous direct uploads. -MCLOUD_DIRECT_UPLOADS_MAX_UPLOAD_SIZE | number | The maximum upload size allowed for direct uploads in MB. Set to 0 to use whatever PHP is set to. -MCLOUD_DIRECT_UPLOADS_DETECT_FACES | boolean | Uses browser based javascript machine learning to detect faces in the image. If Vision is enabled, this setting is ignored in favor of Vision's results. -MCLOUD_DIRECT_UPLOADS_USE_FFPROBE | boolean | When enabled, uses FFProbe to extract video metadata such as length, size, codecs, etc. You must have `fffprobe` installed on your server and have the PHP function `shell_exec` enabled. -MCLOUD_DIRECT_UPLOADS_FFPROBE_PATH | path | The path, on the webserver, to the ffprobe binary, eg. `/usr/bin/ffprobe`. - -  - -## Vision Environment Variables -Variable | Type | Description --------- | ---- | ----------- -MCLOUD_VISION_PROVIDER | string | Which Vision provider to use. Valid values are: `rekognition` or `google`. -MCLOUD_VISION_DETECT_LABELS | boolean | Detects instances of real-world labels within an image such as flower, tree, table, desk, etc. -MCLOUD_VISION_DETECT_LABELS_TAX | string | The taxonomy to use for applying labels as tags. -MCLOUD_VISION_DETECT_LABELS_CONFIDENCE | number | The minimum confidence required to apply the label as a tag. -MCLOUD_VISION_DETECT_MODERATION_LABELS | boolean | Detects explicit or suggestive adult content in an image. -MCLOUD_VISION_DETECT_MODERATION_LABELS_TAX | string | The taxonomy to use for applying labels as tags. -MCLOUD_VISION_DETECT_MODERATION_LABELS_CONFIDENCE | number | The minimum confidence required to apply the label as a tag. -MCLOUD_VISION_DETECT_CELEBRITY | boolean | Detect celebrities faces in images. -MCLOUD_VISION_DETECT_CELEBRITY_TAX | string | The taxonomy to use for celebrity tagging. -MCLOUD_VISION_DETECT_FACES | boolean | Detect faces in images. -MCLOUD_VISION_ALWAYS_BACKGROUND | boolean | If enabled, all Vision processing occurs in the background, otherwise processing occurs during an upload. -MCLOUD_VISION_IGNORED_TAGS | string | Comma separated list of tags to ignore. - -  - -## Asset Environment Variables -Variable | Type | Description --------- | ---- | ----------- -MCLOUD_ASSETS_STORE_CSS | boolean | If enabled, **Push** mode is used to upload CSS assets to cloud storage. Disable for **Pull** mode. -MCLOUD_ASSETS_STORE_JS | boolean | If enabled, **Push** mode is used to upload javascript assets to cloud storage. Disable for **Pull** mode. -MCLOUD_ASSETS_PROCESS_LIVE | boolean | Assets will be uploaded to cloud storage as pages are browsed on the live site, but only if they don't already exist on cloud storage or their version number has changed. -MCLOUD_ASSETS_CACHE_CONTROL | string | Sets the Cache-Control metadata for uploaded assets. -MCLOUD_ASSETS_EXPIRES | number | Sets the Expire metadata for uploaded assets. -MCLOUD_ASSETS_CDN_BASE | url | The base URL for the CDN. -MCLOUD_ASSETS_USE_BUILD_VERSION | boolean | Assets that have been enqueued in WordPress without a specified version will normally be skipped when pushing/pulling assets. When this option is enabled, this tool will use a custom build number for the version. -MCLOUD_ASSETS_LOG_WARNINGS | boolean | When enabled and Media Cloud Debugging is enabled, this will log warnings about files that couldn't be uploaded to the error log. - -  - -## Crop Environment Variables -Variable | Type | Description --------- | ---- | ----------- -MCLOUD_CROP_QUALITY | number | The JPEG compression to use for cropped images. This will supercede the WordPress default. Ignored if using Dynamic Images or Imgix. - -  - -## Multisite Environment Variables -Variable | Type | Description --------- | ---- | ----------- -MCLOUD_NETWORK_MODE | boolean | When enabled, Media Cloud settings apply to all sites in the network. When disabled, each site has its own settings. -MCLOUD_NETWORK_HIDE_BATCH | boolean | When enabled, batch processing tools are hidden from individual sites. -MCLOUD_NETWORK_BROWSER_ALLOW_DELETING | boolean | When enabled, the storage browser allows deleting files from cloud storage. -MCLOUD_NETWORK_BROWSER_ALLOW_UPLOADS| boolean | When enabled, the storage browser allows uploads. -MCLOUD_NETWORK_BROWSER_HIDE | boolean | When enabled, the storage browser is hidden from individual sites in the network. -MCLOUD_NETWORK_BROWSER_LOCK_TO_ROOT | boolean | When enabled, the storage browser is locked to the root directory of the site in the network. - -  - -## Batch Processing Environment Variables -Variable | Type | Description --------- | ---- | ----------- -MCLOUD_STORAGE_BATCH_VERIFY_SSL | string | Determines if SSL is verified when making the remote connection for the background process. Valid values are: `default`, `yes`, `no`. -MCLOUD_STORAGE_BATCH_CONNECT_TIMEOUT | number | The number of seconds to wait for a connection to occur. -MCLOUD_STORAGE_BATCH_TIMEOUT | number | The number of seconds to wait for a response before the request times out. -MCLOUD_STORAGE_BATCH_SKIP_DNS | boolean | Skip DNS resolution by making the background request to localhost but setting the HTTP_HOST header. -MCLOUD_STORAGE_BATCH_BACKGROUND_PROCESSING | boolean | Enables background processing. - -  - -## Integrations Environment Variables -Variable | Type | Description --------- | ---- | ----------- -MCLOUD_WOO_COMMERCE_USE_PRESIGNED_URLS | boolean | Enable to generate signed URLs for downloadable products that will expire within a specified time period. -MCLOUD_WOO_COMMERCE_PRESIGNED_EXPIRATION | The number of minutes the signed URL is valid for. -MCLOUD_EDD_USE_PRESIGNED_URLS | boolean | Enable to generate signed URLs for downloadable products that will expire within a specified time period. -MCLOUD_EDD_PRESIGNED_EXPIRATION | number | The number of minutes the signed URL is valid for. -MCLOUD_MASTER_SLIDER_IMAGE_RESIZE | boolean | Determines if the images should be resized or not. -MCLOUD_MASTER_SLIDER_IMAGE_WIDTH | number | Override the slider's specified image width. -MCLOUD_MASTER_SLIDER_IMAGE_HEIGHT | number | Override the slider's specified image height. -MCLOUD_MASTER_SLIDER_THUMB_CROP | boolean | Determines if the thumbnail should be cropped or not. -MCLOUD_MASTER_SLIDER_THUMB_WIDTH | number | Override the slider's specified thumb width. -MCLOUD_MASTER_SLIDER_THUMB_HEIGHT | number | Override the slider's specified thumb height. -MCLOUD_SMART_SLIDER_PATH_PREFIX | string | When Smart Slider 3 resizes an image, Media Cloud will upload it to cloud storage. This will prepend a prefix to any file uploaded to cloud storage. For dynamically created prefixes, you can use the following variables: `@{site-name}`, `@{site-host}`, `@{site-id}`. -MCLOUD_NGG_USE_URL_CACHE | boolean | Due to the way NGG works, to speed up things Media Cloud will cache the URLs for next gen gallery images. - -  - -## Debug Environment Variables -Variable | Type | Description --------- | ---- | ----------- -MCLOUD_DEBUG_LOGGING_LEVEL | string | The debugging level. Valid values are: `none`, `info`, `warning`, `error`. -MCLOUD_DEBUG_MAX_DATABASE_ENTRIES | number | The maximum number of log entries to keep in the database. - -  -  - - -## Deprecated Environment Variables -The following environment variables from previous versions of Media Cloud have been deprecated. When you upgrade to the latest, you will be warned if you are using any deprecated variables. - -Old Environment Variable | New Environment Variable ------------------------- | ------------------------ -ILAB_AWS_S3_CACHE_CONTROL | MCLOUD_STORAGE_CACHE_CONTROL -ILAB_AWS_S3_CDN_BASE | MCLOUD_STORAGE_CDN_BASE -ILAB_AWS_S3_DOC_CDN_BASE | MCLOUD_STORAGE_DOC_CDN_BASE -ILAB_AWS_S3_EXPIRES | MCLOUD_STORAGE_EXPIRES -ILAB_CLOUD_GOOGLE_BUCKET | MCLOUD_STORAGE_GOOGLE_BUCKET -ILAB_AWS_S3_BUCKET | MCLOUD_STORAGE_S3_BUCKET -ILAB_CLOUD_BUCKET | MCLOUD_STORAGE_S3_BUCKET -ILAB_CLOUD_STORAGE_PROVIDER | MCLOUD_STORAGE_PROVIDER -ILAB_AWS_S3_ACCESS_KEY | MCLOUD_STORAGE_S3_ACCESS_KEY -ILAB_CLOUD_ACCESS_KEY | MCLOUD_STORAGE_S3_ACCESS_KEY -ILAB_AWS_S3_USE_CREDENTIAL_PROVIDER | MCLOUD_STORAGE_S3_USE_CREDENTIAL_PROVIDER -ILAB_CLOUD_USE_CREDENTIAL_PROVIDER | MCLOUD_STORAGE_S3_USE_CREDENTIAL_PROVIDER -ILAB_AWS_S3_ENDPOINT | MCLOUD_STORAGE_S3_ENDPOINT -ILAB_CLOUD_ENDPOINT | MCLOUD_STORAGE_S3_ENDPOINT -ILAB_AWS_S3_REGION | MCLOUD_STORAGE_S3_REGION -ILAB_CLOUD_REGION | MCLOUD_STORAGE_S3_REGION -ILAB_AWS_S3_ACCESS_SECRET | MCLOUD_STORAGE_S3_SECRET -ILAB_CLOUD_ACCESS_SECRET | MCLOUD_STORAGE_S3_SECRET -ILAB_AWS_S3_ENDPOINT_PATH_STYLE | MCLOUD_STORAGE_S3_USE_PATH_STYLE_ENDPOINT -ILAB_CLOUD_ENDPOINT_PATH_STYLE | MCLOUD_STORAGE_S3_USE_PATH_STYLE_ENDPOINT -ILAB_AWS_S3_TRANSFER_ACCELERATION | MCLOUD_STORAGE_S3_SECRET -ILAB_CLOUD_GOOGLE_CREDENTIALS | MCLOUD_STORAGE_GOOGLE_CREDENTIALS_FILE -ILAB_MEDIA_CLOUD_VIEW_CACHE | MCLOUD_VIEW_CACHE -ILAB_MEDIA_DEBUGGING_ENABLED | MCLOUD_TOOL_ENABLED_DEBUGGING -ILAB_VISION_PROVIDER | MCLOUD_VISION_PROVIDER -ILAB_AWS_REKOGNITION_DETECT_LABELS | MCLOUD_VISION_DETECT_LABELS -ILAB_AWS_REKOGNITION_DETECT_LABELS_TAX | MCLOUD_VISION_DETECT_LABELS_TAX -ILAB_AWS_REKOGNITION_DETECT_LABELS_CONFIDENCE | MCLOUD_VISION_DETECT_LABELS_CONFIDENCE -ILAB_AWS_REKOGNITION_MODERATION_LABELS | MCLOUD_VISION_DETECT_MODERATION_LABELS -ILAB_AWS_REKOGNITION_MODERATION_LABELS_TAX | MCLOUD_VISION_DETECT_MODERATION_LABELS_TAX -ILAB_AWS_REKOGNITION_MODERATION_LABELS_CONFIDENCE | MCLOUD_VISION_DETECT_MODERATION_LABELS_CONFIDENCE -ILAB_AWS_REKOGNITION_DETECT_CELEBRITY | MCLOUD_VISION_DETECT_CELEBRITY -ILAB_AWS_REKOGNITION_DETECT_CELEBRITY_TAX | MCLOUD_VISION_DETECT_CELEBRITY_TAX -ILAB_AWS_REKOGNITION_DETECT_FACES | MCLOUD_VISION_DETECT_FACES diff --git a/docs/advanced/hooks.md b/docs/advanced/hooks.md deleted file mode 100755 index 7f11bee8..00000000 --- a/docs/advanced/hooks.md +++ /dev/null @@ -1,293 +0,0 @@ -# Filters - - -## Imgix/Dynamic Images Filters -###`media-cloud/dynamic-images/enabled` -Returns if either dynamic images feature (either Imgix or Dynamic Images) is enabled. -```php -$enabled = apply_filters('media-cloud/dynamic-images/enabled', false); -``` -  - -###`media-cloud/imgix/enabled` -Returns if the Imgix, specifically, is enabled. -```php -$enabled = apply_filters('media-cloud/imgix/enabled', false); -``` -  - -###`media-cloud/glide/enabled` -Returns if the Dynamic Images, specifically, is enabled. -```php -$enabled = apply_filters('media-cloud/glide/enabled', false); -``` -  - -###`media-cloud/imgix/alternative-formats/enabled` -Returns if alternative formats are enabled for Imgix. -```php -$enabled = apply_filters('media-cloud/imgix/alternative-formats/enabled', false); -``` -  - -###`media-cloud/imgix/detect-faces` -Returns if Imgix face detection is enabled. -```php -$enabled = apply_filters('media-cloud/imgix/detect-faces', false); -``` -  - -###`media-cloud/imgix/render-pdf` -Returns if Imgix PDF rendering is enabled. -```php -$enabled = apply_filters('media-cloud/imgix/render-pdf', false); -``` -  - -###`media-cloud/dynamic-images/filter-parameters` -Allows dynamic image parameters (Imgix or Dynamic Images) to be changed. -```php -add_filter('media-cloud/dynamic-images/filter-parameters', function($parameters, $imageSize, $attachmentId, $attachmentMeta) { - if ($imageSize == 'some-size') { - $parameters['fit'] = 'crop'; - } - - return $parameters; -}, 1000, 4); -``` -  - -## Cloud Storage Filters -###`media-cloud/storage/after-upload` -This filter allows for filtering of an attachment's metadata after it has been uploaded to cloud storage. -```php -add_filter('media-cloud/storage/after-upload', function($attachmentMeta, $attachmentId) { - // do something here - return $attachmentMeta; -}, 1000, 2); -``` -  - -###`media-cloud/storage/can-calculate-srcset` -Determines if Media Cloud should calculate the `srcset` for an image. -```php -add_filter('media-cloud/storage/can-calculate-srcset', function($canCalculateSrcSet) { - return $canCalculateSrcSet; -}); -``` -  - -###`media-cloud/storage/can-filter-content` -Controls if Media Cloud should filter a post's content. -```php -add_filter('media-cloud/storage/can-filter-content', function($canFilterContent) { - return $canFilterContent; -}); -``` -  - -###`media-cloud/storage/ignore-metadata-update` -This filter can be used to temporarily suspend Media Cloud's processing of attachment metadata. -```php -add_filter('media-cloud/storage/ignore-metadata-update', function($shouldIgnore, $attachmentId) { - return $shouldIgnore; -}, 1000, 2); -``` -  - -###`media-cloud/storage/ignore-existing-s3-data` -Forces Media Cloud to ignore an attachment's existing cloud storage metadata when processing an attachment. -```php -add_filter('media-cloud/storage/ignore-existing-s3-data', function($shouldIgnore, $attachmentId) { - return $shouldIgnore; -}, 1000, 2); -``` -  - -###`media-cloud/storage/ignore-optimizers` -Forces Media Cloud to ignore the fact that image optimizer plugins are installed and activated. -```php -add_filter('media-cloud/storage/ignore-optimizers', function($shouldIgnore, $attachmentId) { - return $shouldIgnore; -}, 1000, 2); -``` -  - -###`media-cloud/storage/process-file-name` -Filters a given filename, removing any storage related parts from the path, eg the bucket name. -```php -$filename = apply_filters('media-cloud/storage/process-file-name', $filename); -``` -  - - -###`media-cloud/storage/should-handle-upload` -Controls if Media Cloud should process a WordPress upload. -```php -add_filter('media-cloud/storage/should-handle-upload', function($shouldHandle, $uploadData) { - return $shouldHandle; -}, 1000, 2); -``` -  - - -###`media-cloud/storage/should-override-attached-file` -Media Cloud will typically intercept `get_attached_file()` and return the storage URL if that file is no longer present on the local filesystem. If the file is on the local filesystem, `get_attached_file()` will return the file path to it. This filter allows you to override this behavior. -```php -add_filter('media-cloud/storage/should-override-attached-file', function($shouldOverride, $attachment_id) { - return $shouldOverride; -}, 1000, 2); -``` -  - - -###`media-cloud/storage/should-use-custom-prefix` -Allows the use of custom prefixes on uploads to be overridden from whatever the setting currently is. -```php -add_filter('media-cloud/storage/should-use-custom-prefix', function($shouldUseCustomPrefix) { - return $shouldUseCustomPrefix; -}); -``` -  - -###`media-cloud/storage/upload-master` -Controls if the master/main image is uploaded to cloud storage. -```php -add_filter('media-cloud/storage/upload-master', function($shouldUpload) { - return $shouldUpload; -}); -``` -  - - -## Vision Filters -###`media-cloud/vision/detect-faces` -Returns if Vision is enabled and set to detect faces. -```php -$detectingFaces = apply_filters('media-cloud/vision/detect-faces', false); -``` -  - -###`media-cloud/vision/process-meta` -Processes an attachment's metadata with Vision. If Vision is setup to process in background, this processing will then take place later. -```php -$attachmentMeta = apply_filters('media-cloud/vision/process-meta', $attachmentMeta, $attachmentId); -``` -  - -## Direct Upload Filters -###`media-cloud/direct-uploads/max-uploads` -Overrides the setting for the maximum number of uploads. -```php -add_filter('media-cloud/direct-uploads/max-uploads', function($maxUploads) { - return min(4, $maxUploads); -}); -``` -  - - -# Actions -###`media-cloud/imgix/setup` -This action is triggered once the Imgix feature is configured and ready to use. This will not be triggered if the tool is not enabled. -```php -add_action('media-cloud/imgix/setup', function() { - // Imgix is setup and ready -}); -``` -  - -###`media-cloud/direct-uploads/process-batch` -After files have been uploaded with Direct Upload, this action is called with the attachment IDs so that other tools can process the attachments. -```php -add_action('media-cloud/direct-uploads/process-batch', function($postIds) { - // Do something with the post IDs. -}); -``` -  - -###`media-cloud/storage/register-drivers` -Registers any additional or custom cloud storage drivers. -```php -add_action('media-cloud/storage/register-drivers', function() { - StorageManager::registerDriver('my-storage-driver-key', 'My Storage Driver', MyNamespace\MyStorageDriver::class, [], []); -}); -``` -  - -###`media-cloud/storage/uploaded-attachment` -This is fired once an upload has been added. -```php -add_action('media-cloud/storage/uploaded-attachment', function($attachmentId, $fileName, $uploadData) { - // Do something -}, 1000, 3); -``` -  - -###`media-cloud/tools/register-tools` -Register any custom tool with Media Cloud. -```php -add_action('media-cloud/tools/register-tools', function() { - ToolsManager::registerTool('my-tool', []); -}); -``` -  - -###`media-cloud/vision/register-drivers` -Register any additional vision drivers. This action is only called with the paid version. -```php -add_action('media-cloud/vision/register-drivers', function() { - VisionManager::registerDriver('my-vision-driver', 'My Vision Driver', MyNamespace\MyVisionDriver::class, [], []); -}); -``` -  - - -## Ultimate Member Integration Filters -###`media-cloud/integrations/ultimate-member/glide-params` -Allows any Dynamic Image image parameters to be supplied when creating urls for Ultimate Member. This action is only called with the pro version. -```php -add_filter('media-cloud/integrations/ultimate-member/glide-params', function($umKey, $params) { - // Add a blur to cover photos - if ($umKey == 'cover_photo') { - $params['blur'] = 20; - } - - return $params; -}, 1000, 2); -``` -  - -###`media-cloud/integrations/ultimate-member/imgix-params` -Allows any Imgix image parameters to be supplied when creating urls for Ultimate Member. This action is only called with the pro version. -```php -add_filter('media-cloud/integrations/ultimate-member/imgix-params', function($umKey, $params) { - // Add a blur to cover photos - if ($umKey == 'cover_photo') { - $params['blur'] = 20; - } - - return $params; -}, 1000, 2); -``` -  -  - -# Deprecated Filters and Actions -## Filters - -Deprecated Filter | New Filter ------------------ | ---------- -ilab_s3_after_upload | media-cloud/storage/after-upload -ilab_s3_should_handle_upload | media-cloud/storage/should-handle-upload -ilab_s3_can_calculate_srcset | media-cloud/storage/can-calculate-srcset -ilab_media_cloud_filter_content | media-cloud/storage/can-filter-content -ilab_storage_should_use_custom_prefix | media-cloud/storage/should-use-custom-prefix -ilab-imgix-filter-parameters | media-cloud/dynamic-images/filter-parameters - -  -## Actions -Deprecated Action | New Action ------------------ | ---------- -ilab_imgix_setup | media-cloud/imgix/setup - -  diff --git a/docs/advanced/index.md b/docs/advanced/index.md deleted file mode 100755 index 15a37628..00000000 --- a/docs/advanced/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Advanced Topics - -@toc() \ No newline at end of file diff --git a/docs/assets.md b/docs/assets.md deleted file mode 100755 index d728e4bc..00000000 --- a/docs/assets.md +++ /dev/null @@ -1,42 +0,0 @@ -# Assets -Enabling the Assets feature will allow you to serve your theme's javascript and CSS from cloud storage or a CDN. - -This features works in one of two modes: *Push* or *Pull*. In *Push* mode, Media Cloud will upload your assets to cloud storage. In *Pull* mode, your asset URLs will be rewritten to use a CDN host that will fetch those assets from your server automatically. - -For best performance we recommend *Pull* mode. *Push* mode requires Media Cloud to upload these assets and it will only upload them the first time they are used in your front-end. This upload will only happen once, of course, so subsequent requests will be fast as they will come directly from cloud storage. - -## Push Settings -The default operating mode for the Assets feature is *Pull* mode. If you want to enable *Push* make sure that the **Push CSS Assets** and **Push Javascript Assets** options are enabled. - -### Push CSS Assets -When this is enabled, theme and WordPress related CSS files will be copied to cloud storage and served from there. - -### Push Javascript Assets -When this is enabled, theme and WordPress related javascript files will be copied to cloud storage and served from there. - -### Live Push Processing -When enabled, assets will be uploaded to cloud storage as pages are browsed on your page, but only if they don't already exist or their version number has changed. - -Initial uploads have a performance impact, however, most theme and WordPress assets will be uploaded on the first time a handful of pages are browsed. After the assets have been uploaded there is negligible performance impact. - -You can turn this option off if you are satisfied that all of your assets have been uploaded to cloud storage, but there really isn't a very compelling reason to disable it. - -### Cache Control -This sets the browser caching rules for uploaded assets. - -### Content Expiration -This sets the content expiration for uploaded assets in minutes. - -## CDN Settings -For *Pull* mode you must specify a CDN URL. For *Push*, not specifying a CDN will use the cloud storage URL. - -### CDN Base URL -This is the base URL for your CDN for serving assets, including the scheme (meaning the http/https part). - -## Versioning Settings -### Use Build Version -Assets that have been enqueued in WordPress without a specified version will normally be skipped when pushing/pulling assets. When this option is enabled, this tool will use a custom build number for the version. You can update this version by clicking on **Update Build Version** button at the bottom of the assets settings page. - -## Debug Settings -### Log Warnings -When set to true and Media Cloud Debugging is enabled, this will log warnings about files that couldn't be uploaded to the error log. \ No newline at end of file diff --git a/docs/batch-processing.md b/docs/batch-processing.md deleted file mode 100755 index 838aa8b8..00000000 --- a/docs/batch-processing.md +++ /dev/null @@ -1,24 +0,0 @@ -# Batch Processing -Media Cloud can perform a variety of tasks asynchronously in the background. The tasks include uploading media to cloud storage, processing media with computer vision, rebuilding thumbnails and a variety of other things. - -However, due to the wide variety of different hosting configurations used in the WordPress world, background processing may have to be done in different ways for it to work. While WordPress does offer a system for running tasks, called WP-Cron, it's not very robust and isn't guaranteed to work on every WordPress install. In fact, most modern WordPress installs disable it because it's a pretty poorly designed system. - -The background processing Media Cloud employs is mostly a kludgey hack. However, this kludgey hack is used by a lot of WordPress plugins to accomplish the same goal of being able to schedule and run tasks in the background. But, as mentioned before, each hosting setup is different. To that end, Media Cloud has a separate set of settings for Batch Processing that will allow you to tweak it to work on your system. - -## Batch Processing Settings -### Verify SSL -This is probably the most common issue on managed hosting and VPS setups. Setting this to **Off** is the first step we recommend. - -Technically speaking, what happens is that when Media Cloud runs a batch, it will attempt to make a background ajax call from your WordPress server to your WordPress server. A lot of managed hosting providers will have mapped your domain to 127.0.0.1, or to localhost, and the SSL certificates are further up their network stack at the reverse proxy level. Because your server is actually HTTP (at the localhost level), trying to verify SSL will fail because SSL verification actually happens at the reverse-proxy level. - -### Connection Timeout -This is the number of section to wait for a connection to occur. If you use the System Compatibility Tool and see an error complaining about `cURL error 2x`, try setting to 5 to 10 seconds or more. - -### Timeout -This is the number of seconds to wait for a response once a connection has happened. Similar to **Connection Timeout** if you see `cURL error 2x` and you've changed the **Connection Timeout** setting, set this anything from 0.2 up to 10 to see if it helps. - -### Skip DNS -DNS is sometimes a big issue on cheaper managed hosting providers. Enabling this option will skip DNS resolution all together. - -### Process in Background -If all else fails, you can disable background processing altogether. You will still be able to perform many batch related tasks, but you will be required to keep the page running the tasks open in your browser for the duration of the process. \ No newline at end of file diff --git a/docs/cloud-storage/index.md b/docs/cloud-storage/index.md deleted file mode 100755 index 4a396e7b..00000000 --- a/docs/cloud-storage/index.md +++ /dev/null @@ -1,86 +0,0 @@ -# Cloud Storage -There are a lot of cloud storage providers to choose from and we support nearly all of them. You've probably already picked one, but if you haven't, there are a few things to consider when shopping around: - -- Features -- Speed -- Price - -Choosing a provider is also a *commitment* because once you've selected one and have used it for a length of time, switching to another one is going to be difficult and time consuming. So while you might be prioritizing price over the other features and speed, I'd encourage you to prioritize features first. - -We've tested and used nearly every cloud storage provider under the sun and our top choices are the obvious ones: Amazon S3, Google Cloud Storage, DigitalOcean Spaces and, in certain cases, Minio. These providers offer a nice balance of features, performance and price. - -## Setup -Follow these guides to get your storage provider setup: - -- [Amazon S3](cloud-storage/setup/amazon-s3.md) -- [Google Cloud Storage](cloud-storage/setup/google-cloud-storage.md) -- [DigitalOcean Spaces](cloud-storage/setup/do-spaces.md) -- [Wasabi](cloud-storage/setup/wasabi.md) -- [Backblaze](cloud-storage/setup/backblaze.md) - -## Pre-Signed URLs -Pre-signed URLs will generate secure signed URLs for your uploaded media that expire after a specified amount of time. We don't generally recommend that you use these for general images that you use on the site, but instead relegate their use to WooCommerce or Easy Digital Downloads for digital downloads. However, if you were doing an image licensing type site, pre-signed URLs might be a useful deterrent - but be aware that any downstream caching of your site, either via caching plugins or something like CloudFlare, will cache these URLs and this might cause your site to show what appears to be broken images. - -## Upload Handling -When configuring your cloud storage you have a variety of options to control how uploads are handled by WordPress and Media Cloud. - -Note that not all options are available for every storage provider. For example, Backblaze doesn't allow you to set the privacy of your uploads. - -### Upload Privacy -By default, Media Cloud will upload your media to your storage provider and set the access of that upload to be publically readable. If this were set to private, your media would not be viewable and appear to be broken. - -However, if you are using Imgix or a CDN that reads directly from your cloud storage (Amazon CloudFront in the case of Amazon S3), you can set the privacy to be authenticated-read which would mean the public would not be able to access it. - -### Cache Control -Setting the Cache Control and Content Expiration will control how this item is cached at the cloud storage provider level and beyond. For example, setting these will control how the end user's browser will cache the media when they view it. It will also inform most CDNs that are reading the media how to cache it on their end. - -### Upload File Prefix -This allows you to control the directory structure for your uploads. The default WordPress method is using the structure `year/month` which isn't granular enough for some use cases. - -Media Cloud allows you to create dynamic upload file prefixes using tokens. For example, setting the upload file prefix to `@{date:Y/m/d}` would yield upload directories that included the full date: `2019/12/26`. The following prefixes are available: - -- `@{date:format}` - Uses the current date to create the prefix. You can use any format specifiers available to the PHP [date()](https://www.php.net/manual/en/function.date.php) function. -- `@{site-name}` - The current site's name -- `@{site-host}` - The current site's domain/host -- `@{site-id}` - The numeric ID of the site (when using WordPress multisite) -- `@{versioning}` - Basically the timestamp of the upload. This is provided for Offload Media compatibility. -- `@{user-name}` - The name of the current user -- `@{unique-id}` - A unique identifier, note that this is unique for every upload. -- `@{unique-path}` - A unique identifier split into two character paths. For example: `/26/68/09/c7/c0/62/62/d4/` - -### Upload Non-image Files -When this option is enabled, non-image files such as Word Documents, PDF Files, Zip Files, etc. will be uploaded to cloud storage. - -If you are using Imgix and want to render PDF file thumbnails, you will need this option enabled. - -### Ignored MIME Types -If you don't want certain file types to be uploaded to cloud storage, list their mime types here. - -### Delete Uploaded Files -This option will delete the file from your local storage after Media Cloud has transferred it to your Cloud Storage provider. - -If you are using Dynamic Images, it's recommended that this option be turned *off* as Dynamic Images would have to download the image from cloud storage if it can't find a local copy. - -### Delete From Storage -When this option is enabled, Media Cloud will delete the file from your cloud storage provider when the file is deleted from the media library. - - -## CDN Settings -If you aren't using Imgix, it's recommended that you use some sort of CDN to deliver your media to your end users. - -If you are using Imgix or Dynamic Images, this setting will be ignored. - -### CDN Base URL -This is the base URL for your CDN and when Media Cloud rewrites the URL for images, it'll use this value to replace the default cloud storage host. - -### Document CDN Base URL -If you want to use a different CDN for non-image files, specify the CDN base URL here. - -## Display Settings -These options control how Media Cloud integerates with the WordPress UI. - -### Display Cloud Icon -Turning this on will display a cloud icon on media in the media library. This cloud icon indicates that the media has been uploaded, and is being served from, cloud storage. Mousing over the cloud icon will show you a pop-up with more information about the media. - -### Media List Integration -This option controls integration with the media library when viewing the media items in the list mode. Turning it on will add a column to the list that links to the media on cloud storage and will also add additional actions to the Bulk Actions drop down. \ No newline at end of file diff --git a/docs/cloud-storage/setup/amazon-s3.md b/docs/cloud-storage/setup/amazon-s3.md deleted file mode 100755 index 2c064883..00000000 --- a/docs/cloud-storage/setup/amazon-s3.md +++ /dev/null @@ -1,140 +0,0 @@ -# Amazon S3 -Before we can use Media Cloud, you'll first need to go through some basic steps to create a bucket on S3 and a user account we can use to access that bucket. - -Using the Amazon console can be a little intimidating at first, but if you stick to these steps you should be able to breeze right through it. - -## Step 1. Create an S3 Bucket -The first thing we'll need to do is create the bucket we're going to use for storing our media and files. If you haven't already, log into your Amazon AWS account: [Amazon AWS Console](https://console.aws.amazon.com/). - -Once you've logged in, select the S3 service. When the S3 Console has loaded, select **Create Bucket** to get started: - -![image.png](https://i.imgur.com/21AuEHf.png){.responsive} - -### Step 1.1 - Bucket Name/Region -When you click on **Create Bucket**, you'll be presented with a multi-step wizard dialog. On the first step of this wizard, enter in the following information: - -- Bucket Name -- Region - -![image.png](https://i.imgur.com/wMsuAkZ.png){.responsive} - -You should select a region that is closest geographically to either your server or to yourself (if using Direct Uploads). - -Once you've specified the name and region, click on **Next** to continue to the next screen. - -### Step 1.2 - Bucket Properties -Generally speaking, you can skip this page by clicking **Next**. - -### Step 1.3 - Bucket Permissions -For this screen, it's important that you uncheck the following options: - -- Uncheck **Block new public ACLs and uploading public objects** -- Uncheck **Remove public acess granted through public ACLs** -- Uncheck **Block public and cross-account access if bucket has public policies** -- Uncheck **Block new public bucket policies** - -![image.png](https://i.imgur.com/thfCIhv.png){.responsive} - -Click on **Create Bucket** to create your bucket. - -### Step 1.4 - Transfer Acceleration (Optional) -It's highly recommended that you enable transfer acceleration on your bucket to improve upload and download speeds. There will be an extra charge incurred for having it enabled, however. - -To enable Transfer Acceleration, select your bucket in the S3 console and select the **Properties** tab. Scroll down until you find a panel named **Transfer acceleration**. Click on it to expand it and select the **Enabled** option. - -![image.png](https://i.imgur.com/gfYcp2H.png){.responsive} - -Click on **Save** to save the setting. - -## Step 2 - Create Policy -For our next step, we'll be creating a policy that controls how the AWS user account we'll be creating in Step 3 accesses our bucket. We want to define the narrowest set of permissions possible to keep things secure. - -Select **IAM** from the services menu in the AWS Console. Once the IAM console has loaded, click on **Policies** on the left hand side of the page and then click on **Create Policy** to get started. - -![image.png](https://i.imgur.com/sV4BLCZ.png){.responsive} - -### Step 2.1 - Define the Policy -When you click on **Create Policy** a wizard dialog will appear. - -![image.png](https://i.imgur.com/kDC5D7G.png){.responsive} - -Click on the **JSON** tab and paste the following JSON into it: - -https://gist.github.com/jawngee/9cc2031f5ad154558b14e1fb395414cf - -**IMPORTANT!** Make sure you replace *YOURBUCKET* with the name of the bucket you created in Step 1. - -Click on **Review Policy** to continue. - -### Step 2.2 - Name the Policy -On the next screen, give the policy a name and description that is meaningful to you. - -![image.png](https://i.imgur.com/cQsurjz.png){.responsive} - -Click on **Create Policy** to create the policy. - -## Step 3 - Create IAM User -While still in the IAM console, select **Users** on the left hand side of the page and then click on **Add user**. - -![image.png](https://i.imgur.com/X63N89o.png){.responsive} - -### Step 3.1 - User Properties - -In the create user wizard: - -- Give the user a name -- Check the **Programmatic access** checkbox and make sure that **AWS Management Console access** is unchecked - -![image.png](https://i.imgur.com/muZpBtl.png){.responsive} - -Click on **Next: Permissions** - -### Step 3.2 - Permissions -On the Permissions step, select **Attach existing policies directly**. In the list of policies directly below, find the policy we created in the previous step and check the checkbox next to it. - -![image.png](https://i.imgur.com/yd8cDre.png){.responsive} - -Click on **Next: Tags** and then click on **Next: Review** on the screen that follows. Make sure everything is correct and click on **Create user**. - -### Step 3.3 - Download Credentials - -Once you've clicked on **Create user** you'll see a screen that will allow you to download your credentials as a CSV file. - -![image.png](https://i.imgur.com/wjqrCGV.png){.responsive} - -Download them and keep them in a safe place. We will need them for configuring Media Cloud. - -# Step 4 - CORS Configuration (Optional) -If you intend to use Direct Upload functionality, you'll need to set the CORS policy on your bucket. - -## Step 4.1 - Bucket Properties -Log into the Amazon S3 Console and select your bucket. Click on the **Permissions** tab and then select **CORS Configuration** - -![image.png](https://i.imgur.com/UwXWGCU.png){.responsive} - -## Step 4.2 - Set the CORS Configuration -Copy and paste the example CORS configration found below into the CORS configration editor in the S3 console. - -https://gist.github.com/jawngee/6fc89497e10d0915ab2dfac807aa01e1 - -![image.png](https://i.imgur.com/9q4P1RW.png){.responsive} - -Click **Save**. - -Your CORS configuration has now been set and you should be able to perform direct uploads when you've enabled that feature. - -# Step 5 - Configure Media Cloud -Now that everything has been set up with Amazon, it's time to setup Media Cloud. - -Navigate to **Settings** in the Media Cloud admin menu and select **Cloud Storage**. - -## Step 5.1 - Provider Settings -In the **Provider** panel, set the **Storage Provider** to Amazon S3. - -In the **Provider Settings** section, supply the **Access Key** and **Secret** from the CSV file we downloaded in Step 3.3. - -For the **Region** you can set this **Automatic** or select the region you created the S3 bucket in, if you remember it. - -If you turned on **Transfer Acceleration** for your bucket, toggle this to on. - -At this point, these are the basic settings you need to get S3 working with Media Cloud. Save the settings and run the Troubleshooter to verify that everything is working correctly. \ No newline at end of file diff --git a/docs/cloud-storage/setup/backblaze.md b/docs/cloud-storage/setup/backblaze.md deleted file mode 100755 index 386ccf46..00000000 --- a/docs/cloud-storage/setup/backblaze.md +++ /dev/null @@ -1,57 +0,0 @@ -# Backblaze Setup - -> Even though we support Backblaze, it's really recommended that you consider a different cloud storage provider. Backblaze is really only good for archival and lacks the features necessary for things like pre-signed URLs (important for WooCommerce or Easy Digital Downloads), direct uploads, etc. Additionally, in our testing, Backblaze is consistently has the worst performance in terms of upload and download speeds. Caveat emptor. - -## Step 1 - Create Bucket -To get started, log into your Backblaze account and click on the **Buckets** section. When the page had loaded, click on **Create a Bucket**. - -![image.png](https://i.imgur.com/ylatxL7.png){.responsive} - -### Step 1.1 - Bucket Properties -In the pop-up dialog, give your bucket a name and **make sure Files in Bucket is set to Public**. If **Files in Bucket** is set to Private, it will not work. - -![image.png](https://i.imgur.com/bXfUlgg.png){.responsive} - -Finally, click on **Create a Bucket** - -## Step 2 - Create Application Key -After the bucket has been created, click on the **Show Account ID and Application Key**. - -![image.png](https://i.imgur.com/HnjrNiq.png){.responsive} - -### Step 2.1 - Key Properties -In the dialog that appears, set the following values: - -- Give the key a name -- Set **Allow acces to bucket(s)** to **All**. Due to the Backblaze PHP library being used, this must be set to **All**. -- For **Type of Access** set this to **Read and Write** -- **DO NOT** set a File name prefix -- Leave **Duration** blank - -![image.png](https://i.imgur.com/fVhVhTM.png){.responsive} - -When finished, click on **Create Application Key**. - -### Step 2.2 - Copy Key ID and Key -Once you click on **Create Application Key** a little blue box will appear underneath the key's settings. You may need to scroll to see it. - -![image.png](https://i.imgur.com/3ljerVs.png){.responsive} - -Copy the **key** and the **keyId** values. - -## Step 3 - Configure Media Cloud -Now that everything has been set up, it's time to set up Media Cloud. - -Navigate to **Settings** in the Media Cloud admin menu and select **Cloud Storage**. - -## Step 3.1 - Provider Settings - -![image.png](https://i.imgur.com/iTMlW6G.png){.responsive} - -In the **Provider** panel, set the **Storage Provider** to Backblaze B2 Cloud Storage. - -- In **Account Id or Key Id** enter the key id value we generated in Step 2.2 -- In **Key** enter the key we generated in Step 2.2 -- For **Bucket** enter the name of the bucket - -At this point, these are the basic settings you need to get DigitalOcean Spaces working with Media Cloud. Save the settings and run the System Compatibility to verify that everything is working correctly. \ No newline at end of file diff --git a/docs/cloud-storage/setup/do-spaces.md b/docs/cloud-storage/setup/do-spaces.md deleted file mode 100755 index 518f5bbb..00000000 --- a/docs/cloud-storage/setup/do-spaces.md +++ /dev/null @@ -1,81 +0,0 @@ -# DigitalOcean Spaces -Before you can use DigitalOcean Spaces with Media Cloud, you'll first need to go through some basic steps to get going. Thankfully, DigitalOcean is the easiest to setup of the major cloud storage providers. However, there are a few gotchas, so if you follow this guide you'll have everything up and running correctly very quickly. - -## Step 1 - Create Space -Log into your DigitalOcean account and from the **Create** drop-down, select **Spaces**. - -![image.png](https://i.imgur.com/6d6bw7W.png){.responsive} - -### Step 1.1 - Configuring the Space -On the next screen you'll have various options you'll need to set to propertly configure your space. - -![image.png](https://i.imgur.com/xppVKhH.png){.responsive} - -In the **Choose a datacenter region** you'll want to select a region closest to you (if using Direct Upload functionality) or closest to where your servers are geographically hosted. If you are hosting with DigitalOcean, then you'll likely select the same datacenter as your servers, if Spaces is available at that datacenter. - -You should enabled the CDN and select a cache timing that works best for your situation. - -You should enable **Restrict File Listing** to prevent people from listing the contents of your Space. - -Finally, give the Space a name and click **Create a Space** - -### Step 1.2 - Determining the Endpoint -Media Cloud needs to know the endpoint for your Space for it to work properly. After you've created your space, click on the **Settings** tab and look for the **Endpoint** section. Make note of this value as we will be using it later when setting up Media Cloud. - -![image.png](https://i.imgur.com/d6Zt0Hb.png){.responsive} - -## Step 2 - Create API Key -We'll need to generate an API Key so that Media Cloud can access the Space. Navigate to the **API** section, scroll down to **Space access keys** and click on **Generate New Key**. - -![image.png](https://i.imgur.com/gyG1EEW.png){.responsive} - -### Step 2.1 - Key Properties -Once you click **Generate New Key**, you'll need to give the key a name and click on the checkmark next to it. - -![image.png](https://i.imgur.com/3PvUVEP.png){.responsive} - -DigitalOcean will then generate a new key and display it to you. It will only display this to you once, so you should copy down the Key and the Secret now as we will be using it later. - -![image.png](https://i.imgur.com/9CfZMRo.png){.responsive} - -## Step 3 - CORS Configuration (Optional) -If you intend to use Direct Upload, you'll need to configure CORS on your Space to allow it. - -Navigate to your Space, click on the **Settings** tab and then click on the **Add** button in the **CORS Configurations** section. - -![image.png](https://i.imgur.com/iGyc2vO.png){.responsive} - -### Step 3.1 - CORS Properties -In the pop-up dialog, you'll need to specify the following: - -- For the **Origin**, enter in the base URL for your site here. If you have a development and/or staging environment, you'll create separate CORS configurations for each. -- For **Allowed Methods**, check the checkboxes for GET, PUT, POST and HEAD. DELETE is optional but not needed for Direct Uploads. -- For **Allowed Headers**, set this to `*` - -![image.png](https://i.imgur.com/pOQPXfk.png){.responsive} - -Click on **Save Options** to save this configuration. Repeat this procedure for your development and staging environments. - -### Step 3.2 - Verify CORS -After you've saved the options, verify that the CORS Configuration is set and correct. - -![image.png](https://i.imgur.com/Q2unTUw.png){.responsive} - -## Step 4 - Configure Media Cloud -Now that everything has been set up, it's time to set up Media Cloud. - -Navigate to **Settings** in the Media Cloud admin menu and select **Cloud Storage**. - -## Step 4.1 - Provider Settings - -![image.png](https://i.imgur.com/D7NlGMx.png){.responsive} - -In the **Provider** panel, set the **Storage Provider** to DigitalOcean Spaces. - -- In **Access Key** enter the key we generated in Step 2.1 -- In **Secret** enter the secret we generated in Step 2.1 -- For **Bucket** enter the name of the Space -- For **Custom Endpoint** enter the value we copied down in Step 1.2 -- Make sure the **Path Style Endpoint** is ON - -At this point, these are the basic settings you need to get DigitalOcean Spaces working with Media Cloud. Save the settings and run the Troubleshooter to verify that everything is working correctly. \ No newline at end of file diff --git a/docs/cloud-storage/setup/google-cloud-storage.md b/docs/cloud-storage/setup/google-cloud-storage.md deleted file mode 100755 index 5e9da9f7..00000000 --- a/docs/cloud-storage/setup/google-cloud-storage.md +++ /dev/null @@ -1,157 +0,0 @@ -# Google Cloud Storage -Before you can use Google Cloud Storage with Media Cloud, you'll first need to go through some basic steps to get going. It looks complicated, but if you stick with the steps outlined, you should be able to get through the process in about 10-15 minutes. - -## Step 1 - Create Role -The very first thing we need to do is create a role that defines what capabilities are going to be granted to the user of the bucket. - -Log into your Google Cloud Platform console, navigate to the IAM section and select **Roles** from the side navigation. When the Roles page has loaded, click on **Create Role**. - -![image.png](https://i.imgur.com/KRufzYn.png){.responsive} - -### Step 1.1 - Role Properties -On the *Create Role* page, give the role a name and, optionally, set it's ID to something that is going to be more clear for you. Set the *Role launch stage* to *General Availability*. - -When you've done all that, click on *Add Permissions* - -![image.png](https://i.imgur.com/w4IAAYl.png){.responsive} - -### Step 1.2 - Role Permissions -A dialog window will appear that will allow us to assign the relevant permissions to our new role. To make it easier, filter the list of permissions to any role that has *Storage* in the title. - -Once you've filtered the permissions, add the following permissions to our new role by click on the checkbox next to it. You will want to add the following: - -- storage.buckets.get -- storage.buckets.update -- storage.objects.create -- storage.objects.delete -- storage.objects.get -- storage.objects.getIamPolicy -- storage.objects.list -- storage.objects.setIamPolicy -- storage.objects.update - -![image.png](https://i.imgur.com/0IwMIUu.png){.responsive} - -### Step 1.3 - Create the Role -Verify that the correct permissions have been assigned and click on **Create**. - -![image.png](https://i.imgur.com/V2k4cCz.png){.responsive} - -## Step 2 - Service Account -In this next step, we'll need to create a service account that allows Media Cloud to interact with Google Cloud Storage. - -In the left hand navigation of the Google Cloud console, select **Service accounts**. - -![image.png](https://i.imgur.com/Fb49LqB.png){.responsive} - -When the Service Accounts page has loaded, click on **Create Service Account**. - -![image.png](https://i.imgur.com/XgSVTyn.png){.responsive} - -### Step 2.1 - Account Details -The **Create service account** page is a multi-step wizard. On the first step of the wizard, enter the following information for the account: - -- The name of the account -- An ID for the account -- A description for the account - -![image.png](https://i.imgur.com/jNxKF7v.png){.responsive} - -Click on **Create** to move to the next step. - -![image.png](https://i.imgur.com/CEeqfgg.png){.responsive} - -On the next step, you can simply click **Continue**. - -### Step 2.3 - Generate Key -On the third step of the **Create service account** wizard we'll be creating the key we'll use in Media Cloud. - -![image.png](https://i.imgur.com/nY2wZp4.png){.responsive} - -Clicking on **Create Key** will display a pop-up modal, giving you two options for generating a key. Select the **JSON** option and then click on **Create**. - -![image.png](https://i.imgur.com/puMQ2iu.png){.responsive} - -At that point a JSON file will be downloaded to your computer that contains all of the information you need to access Google Cloud Storage with Media Cloud. Store this file in a safe and secure place. - -![image.png](https://i.imgur.com/KLxolb8.png){.responsive} - -## Step 3 - Create the Bucket -The final step is to create the bucket we'll be using with Media Cloud. - -In the Google Cloud console, navigate to the Storage Browser. - -![image.png](https://i.imgur.com/Ffrg3KY.png){.responsive} - -When the Storage Browser loads, click on **Create Bucket**. - -## Step 3.1 - Bucket Properties -In the **Creat a bucket** screen, give the bucket a name, determine the storage class and select the location of the bucket. Recommended to pick a location that is close to you (if using Direct Uploading) or close to your server. - -![image.png](https://i.imgur.com/5wKMGKW.png){.responsive} - -When done, click **Create**. - -## Step 3.2 - Bucket Permissions -Once the bucket has been created, you'll be viewing the bucket in the storage browser. We'll need to assign the service account to the bucket to give it access. - -Click on **Permissions** and then click on **Add members**. - -![image.png](https://i.imgur.com/okPjE6h.png){.responsive} - -## Step 3.3 - Assign User -In the modal dialog that appears, simply enter the name of the user we created in Step 2 and then select the role we created in Step 1. Click on **Add** to finish. - -![image.png](https://i.imgur.com/uG6v9Ft.png){.responsive} - -## Step 3.4 - Allow public access (Optional) -If you are using a bucket with the 'Bucket Policy Only' option set, you need to grant permission to access the items publicly. - -Click on **Permissions** and then click on **Add members**. - -In the modal dialog that appears, enter `allUsers`, and select the `Storage Object Viewer` option. Click **Save** - -We are now done setting things up in Google Cloud. The next step is setting up Media Cloud. - -# Step 4 - CORS Configuration (Optional) -If you are planning on using the Direct Upload feature, you'll need to set a CORS policy on your bucket in Google Cloud Storage. - -To do this, you'll need to install the `gsutil` command line tool. You can download and install that from here: [Download and Install gsutil](https://cloud.google.com/storage/docs/gsutil_install). Be sure to follow the steps to setup authentication. - -## Step 4.1 - Create the CORS JSON file -You'll need to define your CORS policy in a JSON file. Use this sample policy as a starting point: - -https://gist.github.com/jawngee/e5a2bdfccf460b8969746ed42e1e9529 - -Be sure to change `https://yourdomain.com` to your actual domain, and possibly add more domains for your dev or staging environments. - -## Step 4.2 - Set the CORS Policy -Crack open a terminal and type the following: - -```bash -gsutil cors set yourjsonfile.json gs://your-bucket-name -``` - -Obviously replace `yourjsonfile.json` with the name of the JSON file you created in the previous step and change `gs://your-bucket-name` to the name of your bucket. - -Verify the CORS policy has been set correctly with: - -```bash -gsutil cors get gs://your-bucket-name -``` - -That's it, CORS has been set and you now are capable of performing Direct Uploads with Media Cloud. - -# Step 5 - Configure Media Cloud -Now that everything has been set up with Google Cloud Storage, it's time to setup Media Cloud. - -Navigate to **Settings** in the Media Cloud admin menu and select **Cloud Storage**. - -## Step 5.1 - Provider Settings -In the **Provider** panel, set the **Storage Provider** to Google Cloud Storage. - -Open up the JSON file we downloaded in Step 2.3 and copy it's contents. Paste this into the **Credentials** field. - -Set the **Bucket** to the name of the bucket we created earlier. - -At this point, these are the basic settings you need to get Google Cloud Storage working with Media Cloud. Save the settings and run the Troubleshooter to verify that everything is working correctly. \ No newline at end of file diff --git a/docs/cloud-storage/setup/wasabi.md b/docs/cloud-storage/setup/wasabi.md deleted file mode 100755 index 2b818f65..00000000 --- a/docs/cloud-storage/setup/wasabi.md +++ /dev/null @@ -1,70 +0,0 @@ -# Wasabi - -## Step 1. Create IAM User -The first thing we need to do when setting up Wasabi is to create a set of credentials that Media Cloud can use to access Wasabi. - -### Step 1.1 Create User -Navigate to the IAM section of the [Wasabi console](https://console.wasabisys.com/#/users). Click on **Users** in the left hand navigation and then click on **Create User**. - -![Step 1.1 - Create User](https://i.imgur.com/On3nJQQ.jpg){.responsive} - -### Step 1.2 User Name and Access -In the **Add User** pop up, set the user name to anything you like and make sure that the **Programmatic (create API key)** option is checked. - -![Step 1.2 - User Name and Access](https://i.imgur.com/NArfvrQ.png){.responsive} - -Click **Next** and on the **Groups** section click **Next** again. - -### Step 1.3 Policies -In this section of **Add User** make sure to select **WasabiReadOnlyAccess** and **WasabiWriteOnlyAccess** by clicking on the + sign. Click on **Next** when you've done this. - -![Step 1.3 Policies](https://i.imgur.com/PKvxjyl.jpg){.responsive} - -### Step 1.4 Review -Finally, review your choices and click on **Create User** when everything looks OK. - -![Step 1.4 Review](https://i.imgur.com/tJsaQvI.png){.responsive} - -Once the user is created you will be shown the Access and Secret Key. Click obn **Download CSV** to download these keys to your computer. Keep this file in a safe and secure place. We will be referring to this CSV file in later steps. - -![Step 1.4 Review](https://i.imgur.com/LLdV7TS.png){.responsive} - -## Step 2. Create Bucket -Once the user has been created, the next step is creating the bucket to store your media in. Click on the **Create Bucket** button in the upper right corner of the Wasabi console. - -![Step 2. Create Bucket](https://i.imgur.com/QH5wTpP.png){.responsive} - -### Step 2.1 Bucket Name and Region -In the pop up, **Create Bucket**, give your bucket a name and then select which region to create the bucket in. As of this writing, Wasabi only has 3 regions, so you should pick the region closest to you. - -![Step 2.1 Bucket Name and Region](https://i.imgur.com/jFi0F4v.png){.responsive} - -Once you've set the bucket name and region, click **Next**. - -### Step 2.2 Bucket Properties -These options are entirely up to you if you enable or not, they have no impact on Media Cloud or how it functions. - -![Step 2.2 Bucket Properties](https://i.imgur.com/PtRc9Pq.png){.responsive} - -When you have this setup as you like, click on **Next**. - -### Step 2.3 Review -Review your settings and if everything is copacetic, click on **Create Bucket**. - -![Step 2.3 Review](https://i.imgur.com/Z0vMZQV.png){.responsive} - -At this point, you are done with the Wasabi console and should navigate back to you WordPress admin. - -## Step 3. Media Cloud Setup -Now that everything has been set up with Wasabi, it's time to setup Media Cloud. - -Navigate to **Settings** in the Media Cloud admin menu and select **Cloud Storage**. - -## Step 3.1 Provider Settings -In the **Storage Provider** drop down, select **Wasabi**. - -Next, supply the **Access Key** and **Secret** from the CSV file we downloaded in Step 1.4. - -Next, set **Bucket** to the name of the bucket you created and for **Region** set this to whatever region you selected when creating the bucket. - -At this point, these are the basic settings you need to get Wasabi working with Media Cloud. Save the settings and run the System Compatibility Tool to verify that everything is working correctly. diff --git a/docs/config.json b/docs/config.json deleted file mode 100755 index 01852be2..00000000 --- a/docs/config.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "id": "media-cloud", - "title": "Media Cloud", - "menu": "Media Cloud", - "toolbar": "Media Cloud", - "standalone": true, - "logo": { - "src": "images\/logo.svg", - "width": 53, - "height": 64 - }, - "toc": [ - { - "title": "Working With Images", - "src": "images" - }, - { - "title": "Publishing", - "src": "publishing" - }, - { - "title": "Creating and Managing Pages", - "src": "pages", - "children": [ - { - "title": "Content Blocks", - "src": "pages\/content-blocks", - "children": [ - { - "title": "Carousel", - "src": "pages\/content-blocks\/carousel" - }, - { - "title": "Post List", - "src": "pages\/content-blocks\/post-list" - }, - { - "title": "Text Block", - "src": "pages\/content-blocks\/text-block" - }, - { - "title": "Information Panel", - "src": "pages\/content-blocks\/information-panel" - }, - { - "title": "Hero", - "src": "pages\/content-blocks\/hero" - }, - { - "title": "Video", - "src": "pages\/content-blocks\/video" - }, - { - "title": "Two Column Text Block", - "src": "pages\/content-blocks\/two-column-text-block" - }, - { - "title": "Bookmarks", - "src": "pages\/content-blocks\/bookmarks" - }, - { - "title": "Image Block", - "src": "pages\/content-blocks\/image-block" - }, - { - "title": "Callout", - "src": "pages\/content-blocks\/callout" - }, - { - "title": "Leadership Team Grid", - "src": "pages\/content-blocks\/leadership-grid" - }, - { - "title": "Links", - "src": "pages\/content-blocks\/link" - }, - { - "title": "Links", - "src": "pages\/content-blocks\/links" - }, - { - "title": "Contact Form", - "src": "pages\/content-blocks\/contact-form" - }, - { - "title": "Text Header", - "src": "pages\/content-blocks\/text-header" - } - ] - } - ] - }, - { - "title": "Custom Content Types", - "src": "content-types", - "children": [ - { - "title": "Managing Case Studies", - "src": "content-types\/case-studies" - }, - { - "title": "Managing News", - "src": "content-types\/news" - }, - { - "title": "Managing Bios", - "src": "content-types\/bios" - } - ] - }, - { - "title": "Menus", - "src": "menus" - }, - { - "title": "Plugin Documentation", - "src": "index" - } - ] -} \ No newline at end of file diff --git a/docs/crop-tool.md b/docs/crop-tool.md deleted file mode 100755 index 4345b919..00000000 --- a/docs/crop-tool.md +++ /dev/null @@ -1,6 +0,0 @@ -# Crop Tool -Media Cloud provides a modern crop tool for creating different crops for each of your image sizes that is far superior to WordPress's default. - -The crop tool can work standalone, it doesn't require any other features of Media Cloud to be activated to use! - -@[Image Editor Tutorial](https://www.youtube.com/watch?v=blFUKzOsbXs&t=325s) \ No newline at end of file diff --git a/docs/direct-uploads/index.md b/docs/direct-uploads/index.md deleted file mode 100755 index e64076cf..00000000 --- a/docs/direct-uploads/index.md +++ /dev/null @@ -1,33 +0,0 @@ -# Direct Uploads -Normally, with Media Cloud activated and working, uploads go to WordPress first and then Media Cloud will upload to cloud storage. When you enable Direct Uploads, those uploads will now skip WordPress completely, and are sent straight to your cloud storage provider. - -For most upload types this works great, but when uploading images you will need to be using Imgix or Dynamic Images. The reason being is that because your WordPress server never handles an upload, no additional image sizes will be generated from your images - a function that WordPress normally handles. With Imgix and Dynamic Images, those additional image sizes are generated on the fly on an as-needed basis. - -For Videos, direct uploads will not generate additional metadata that you may or may not need. However, if you install FFProbe on your server, Media Cloud will generate this additional metadata after the upload to cloud storage is complete. - -## Upload Settings - -### Integrate with Media Library -When this option is enabled, performing any uploads through WordPress's media library will perform direct uploads. If this option is off you will have to use the [Cloud Upload](admin:upload.php?page=media-cloud-upload) page to do direct uploads. - -### Direct Upload Images/Video Files/Audio Files/Documents -These next set of options control what get directly uploaded and what gets uploaded to WordPress. - -### Number of Simultaneous Uploads -This is the number of simulataneous uploads you'll be able to perform if **Integrate with Media Library** is enabled. The max value is 8. - -### Maximum Upload Size -This sets the maximum allowed upload size for direct uploads. Set to 0 to use the default PHP setting. - -## Direct Upload Image Settings - -### Detect Faces -Enabling this will use browser based javascript machine learning to detect faces in your uploads. Detected faces will be stored as additional metadata for the image. If you are using Imgix or Dynamic Images, you can use this for cropping images centered on a face. - -If you are relying on this functionality, the better option would be to use the Vision tool. It is more accurate with less false positives. If Vision is enabled, this setting is ignored in favor of Vision's results. - -## Direct Upload Video Settings - -### Use FFProbe for Videos -When this option is enabled, Media Cloud will use a command line tool called FFProbe to fetch the metadata about the video. FFProbe must be installed on your server and the PHP function `shell_exec` must be enabled. - diff --git a/docs/direct-uploads/installing-ffprobe.md b/docs/direct-uploads/installing-ffprobe.md deleted file mode 100755 index dee0e904..00000000 --- a/docs/direct-uploads/installing-ffprobe.md +++ /dev/null @@ -1,58 +0,0 @@ -# Installing FFProbe -Installing FFProbe on your server is not a particularly trivial endevour. Each server setup is going to be different and there is no way for us to document each different way. Instead, we will document how we do it on WordPress sites we build for clients. You will need to make adjustments based on what OS you are using, what web server, PHP setup, etc. - -If you are on managed hosting, installing FFProbe might not even be a possibility and you will need to contact your hosting provider for help on getting it setup. - -And, just to reiterate, this document is not a HOW-TO, it's simply *how we do it*. - -Our typical server setup: - -- Ubuntu 16.04 or 18.04 -- Nginx -- PHP 7.3 with PHP-FPM - -## Install FFMpeg -The first step is installing the `ffmpeg` package which contains `ffprobe` and related libraries. - -```bash -sudo apt-get install ffmpeg -``` - -## Isolate FFProbe -We need to stick the `ffprobe` binary in a location that we can safely give PHP access to. For us, we make directory in `/srv/www` called `bin` and then we copy the `ffprobe` binary to that location. - -```bash -sudo mkdir /srv/www/bin -sudo chown web:www-data /srv/www/bin -cp /usr/bin/ffprobe /srv/www/bin/ -``` - -In the above bit, we create the directory to hold the binary, we change the owner to the user and group that PHP runs in and then we copy the `ffprobe` binary to the directory. - -## Configure PHP-FPM -We'll now need to make some changed to PHP-FPM's config to allow PHP to have access to that binary. Our PHP-FPM config is found in `/etc/php/7.3/fpm/pool.d/wordpress.conf`. - -As a standard practive, we use `open_basedir` to enforce the directories on the web server that PHP has access to. In the config for PHP-FPM it looks like: - -```ini -php_admin_value[open_basedir] = /srv/www/:/tmp -``` - -So in our FPM config, PHP has access to the root web server directory and to `/tmp`. We don't need to change this line because we copied `ffprobe` to a subdirectory of `/srv/www`. - -We do, however, need to add that path to the PATH environment variable. Further down in our PHP-FPM config, we'll add this line: - -```ini -env[PATH] = /srv/www/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -``` - -You'll notice our binary directory `/srv/www/bin` is the first in the list. The other directories come from: - -```bash -cat /etc/environment -``` - -At this point we can save our config. - -## Restart PHP-FPM -To finish up, we'll restart PHP-FPM and now PHP has access to `ffprobe`. diff --git a/docs/docs.css b/docs/docs.css deleted file mode 100755 index 0853c275..00000000 --- a/docs/docs.css +++ /dev/null @@ -1,23 +0,0 @@ -.ilab-docs-body .property, .ilab-docs-body .size { - white-space: nowrap; -} - -.ilab-docs-body .property { - width: 84px; - min-width: 84px; -} -.ilab-docs-body .description { - width: 100%; -} - -.ilab-docs-body .callout { - width: 32px; - min-width: 32px; - max-width: 32px; -} - -.ilab-docs-body hr { - background-color: transparent; - padding: 15px; - border: 0px none; -} \ No newline at end of file diff --git a/docs/docs.index b/docs/docs.index deleted file mode 100755 index 415f66cd0f755afe34efd7a32e4094c31aa7524f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52224 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 E9}*E&pa1{> diff --git a/docs/dynamic-images.md b/docs/dynamic-images.md deleted file mode 100755 index 2e1a5c9e..00000000 --- a/docs/dynamic-images.md +++ /dev/null @@ -1,59 +0,0 @@ -# Dynamic Images -Dynamic Images provides a lot of the functionality of Imgix such as on the fly resizing, cropping and effects - but it's built into the plugin and doesn't require an external account with a service. - -Imgix will always perform better and have better quality, but Dynamic Images fits the bill for sites that have less media or are smaller such as a personal blog or a one pager type site. Upgrading to Imgix is also a relatively seamless process, as is downgrading from Imgix. - -With Dynamic Images you can: - -- Crop and size images on the fly. This is great for theme development or sites with frequent visual updates. -- Add effects to images -- Watermark images - -While it's not necessary, Dynamic Images produces the best results when you have the `php-imagick` extension installed. - -## Performance Notes -For the best performance with Dynamic Images, you will want to keep the images you upload on your WordPress server by making sure the option *Delete Uploaded Files* is turned off in [Cloud Storage settings](admin:admin.php?page=media-cloud-settings&tab=storage). - -When an image is requested, Media Cloud will perform the necessary manipulations, cache the result and then send the result to the end user. Subsequent requests for the same image will return the cached version. Therefore, the first request for an image is much slower than later requests will be. If you are deleting your uploads from your local server, Media Cloud will have to fetch the image from cloud storage before performing the image manipulations. - -## General Settings - -### Image Path -This is the base URL path that the plugin will use to intercept image requests. This can be any arbitrary path but it shouldn't collide with any paths you might be using on your site. - -### Signing Key -The signing key will sign any image URL to make it more secure. Not having a signing key would open you up to image resizing attacks, so it is obviously recommended that you have a signing key. - -The default signing key is unique to your plugin installation so you typically don't need to change it. - -## Performance Settings - -### Cache Master Images -When Dynamic Images renders an image, it will first look for the master image on the local file system. If it can't be found, it will then copy the master image from cloud storage. Turning this option on will cache any images fetched from cloud storage to local storage. - -Unless you are tight on disk space, there isn't any good reason to turn this option off. - -### CDN -This is the base URL for your CDN and when Media Cloud rewrites the URL for any dynamically generated images, it'll use this value to replace the default your site's host name. - -For example, you might use CloudFlare to set up a cache at `https://images.yourdomain.com/` that points to your webserver. You would then set the value of this setting to `https://images.yourdomain.com/` and Media Cloud will rewrite all of your images to use this CDN host. - -### Cache TTL -This is the number of minutes to cache the rendered image in the user's browser. The default value of `525600` equates to 1 year. - -## Image Settings - -### Lossy Image Quality -This is the default JPEG compression level (1-100) to use when generating resized, cropped or effected images. - -### Max. Image Width/Height -This value allows you to clamp the maximim image width and height for any generated images. - -### Convert PNG to JPEG -Turning this on will convert all PNG uploads to JPEGs. - -### Use Progressive JPEG -When rendering an image and the output is JPEG, turning this on will generate a progressive JPEG file. - -### Keep WordPress Thumbnails -Because Dynamic Images can dynamically create new sizes for existing images, having WordPress create thumbnails is potentially pointless, a probable waste of space and definitely slows down uploads. However, if you plan to stop using Dynamic Images, having those thumbnails on S3 or locally will save you having to regenerate thumbnails later. **IMPORTANT:** Thumbnails will not be generated when you perform a direct upload because those uploads are sent directly to S3 without going through your WordPress server. \ No newline at end of file diff --git a/docs/image-editor.md b/docs/image-editor.md deleted file mode 100755 index 71508bdf..00000000 --- a/docs/image-editor.md +++ /dev/null @@ -1,6 +0,0 @@ -# Image Editor -The default image editor that ships with WordPress leaves a lot to be desired. Media Cloud completely replaces that antiquity with an image editor that allows you to apply effects, make image adjustments, arbitrary rotations, set focal points for focused crops and much much more. - -You must be using Imgix or Dynamic Images to be able to use the image editor. - -@[Image Editor Tutorial](https://www.youtube.com/watch?v=blFUKzOsbXs) \ No newline at end of file diff --git a/docs/image-size-manager.md b/docs/image-size-manager.md deleted file mode 100755 index db44acba..00000000 --- a/docs/image-size-manager.md +++ /dev/null @@ -1,69 +0,0 @@ -# Image Size Manager -The image size manager is a tool that allows you to view all of the defined image sizes in your WordPress application, as well as to create new ones. - -In addition to this, if Imgix or Dynamic Images is enabled, you can apply dynamic image parameters to specific sizes. For example, if you wanted the hero image on your posts page to be a blurred monochrome, you can use the Image Size Manager to easily do this. - -## The Image Sizes Grid -This grid displays all of the defined image sizes and the attributes of that size. For WordPress and Theme sizes you can only view information about the size and (if Imgix or Dynamic Images is enabled) edit the filter parameters for that size. You can't delete or change any of their properties. - -![Image sizes grid](https://i.imgur.com/cE5K8dX.png){.responsive} - -### Type -This shows you where this image size is being defined. - -- **WordPress** - This is a system defined size -- **Theme** - This is being defined in the theme -- **Custom** - This size was defined with this Image Size Manager tool - -### Title -The title of the size - -### Size -The idenfier for the size. - -### Width/Height -The dimensions for the size. - -### Crop -If the size is cropped or fit to size. - -### Crop Axis -This control where the crop center point is. - -### Actions -The trash icon ![Trash](img/icon-ism-trash.png) will delete the size. The gear icon ![Gear](img/icon-ism-gear.png) will allow you to adjust filter parameters for that size. - - -## Adding a New Image Size -You may want to define a new image size for embedding into posts or for use with Guttenberg. To add a new image size, click on the **Add New Image Size** button in the top right corner. In the pop up dialog, set the properties of the size and click on **Create Image Size**. - -## Image Size Filter Parameters -In the example we mentioned above, we'd like to make the hero image for our post page always be monochrome and slightly blurred. - -Without Imgix or Dynamic Images, we'd need to do this kind of image treatment before uploading to WordPress using Photoshop or similar. The problem with this should be fairly apparent, but to enumerate: - -- You have to do this image treatment in Photoshop for every post. -- Changing the image treatment six months down the road when your site's design is updated will require significant effort to redo all of the images for all of the posts. -- The "recipe" of Photoshop edits will have to be noted and shared with any other people contributing posts to the site. -- Changing the size of the hero image will require you to redo all of the previous images if that size change is significant. - -By using Imgix (or Dynamic Images) and the Image Size Manager, we can create these image treatments in a non-destructive manner that can be changed or removed on a whim. - -Another example, possible more practical, is adding a watermark to specific image sizes. Again, normally you'd have to do this before uploading anything to WordPress and if your logo changed or you wanted to try a different position out, you'd have the same problems enumerated above. - -### Editing Image Size Filter Parameters -To edit the filter parameters for an image size, click on the gear icon ![Gear](img/icon-ism-gear.png) next to the size. An alert will pop up to notify you that you have to select an image to use as a sample image for editing. - -Once you've selected the sample image, the Image Editor will appear. - -![Image Editor](https://i.imgur.com/lADuasv.png){.responsive} - -Consult the [Image Editor](image-editor.md) documentation for more help with regards to actual image editing. - -Once you've made the edits you want, click on **Save Adjustments** to save those parameters. Click on the close button in the upper right of the image editor to close the editor. - -Now that you've saved these adjustments, any time any image is displayed on the front end of your site using that specific size, those filter parameters will be applied to it. - -## Tutorial Video -@[Image Size Manager](https://www.youtube.com/watch?v=blFUKzOsbXs&t=1095s) - diff --git a/docs/img/bio.jpg b/docs/img/bio.jpg deleted file mode 100755 index 9891dd7fa96a341707c8b2843085ff840eb069e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51763 zcmeHw2|Sct|MxYMcam~5TIoDaf=lA=a@A;i`O{@miNA4Em zFmDeCvb2QI5Cri;JP1(;2|@_)4?-+}xY%I`A|Mt{hqob?Pv+qOc`y*TLh|5`f>33L z#X&gnfH%ZB`D`xuZh-hkcR`TC+^KJUcQSz_W8+1pl7qa+0WyY$GO8*VZJFhkZbWZ? zI8qUUBXlq-I;xs7AfTb8gHZ=XLCAB6A8kCxF;x#2bPhQcM#8;;Kiml9WM1x{`-52a zqd$mMKlg_NF;xaaljBF(*%QS)fjM&oMELpmMNq;50>UUsF)@^wn52jR`!o49ar4J3LXe+dP)KmDkkDLl zAt51g_#z}e@rcM@DS&kw65)kN03C!Z#36z}iXd2TK_~fG_YhdnN-hNZ0~!o}kPw1{ zlZ%^&cMcyv5Q1M55fBG*Dse7^;6xxfI61g@xOusd0%{;p1j)HX6vL&z(M?P?aJMSA zcwAb6ft)^(yECuSDif6>yfW$NG=df;SMaYg;-0TGCU1GJWt z-6kGxE)8}QmS99VK??$9#kf>=$BDx&xMTaQQ%#=mkrEwmXon&Osdp{qh8w`MOyh11 zXhixvcVoOJmDD)hgn!-wg&$2|y@CXg>^emtEYwzGE`K~D-h8Q|e7yO3bNP7N_Zaw745^Vq49U5WXT0n#bW$G^&FJJfB#V9pLdy0%($;U;R*8Z8#& z?Rc-s-)^&^CHdlO--~ae;}bIWss=vDAHGP7I-}OReR~~+qPup5s`rwokE%oEY`Ixb z1!cWed=>r8_1yC9g;s`?YMt~3Nuk)*^@TcnKV4qJ*V5vEw7x| zobuk}#WTFstRd zCYMQccm8&0r+-w>?!D0Wg8`KF+wh@zr)zUx&A(pw^uX4t6 zO>Q8iUbW`>GoFrnSF3y+U_mKahY#B;d0cO|WB+XbuMOY*+P9x=I`(0p^j>tW(#!VYEn4=b_FRdDD{9rxw+Sazuy8W9%s+s9s$@FK~^9|b!emrcqm^0%;qVTXHUC8@##f>rWSUnhqR+-~ksn9k%!o#2-Kb zGm~{NH6WM@ZsDmBvI(Nv5y)g;b`EoYDv9JD><1^nVffq7mjd4lv!Au|4uf+TcvInL z;N*!iNfawLKN8N^5eK3~A!En}vV*K4D@X>ifYcxj@J|NBkRS@=4X#1(laoc-P{?Et zI}$ZGz?!g)2%-hR!xV@N{&`G3M1_K(0QMt%0n@p`J-f{YzEuCoHVY7fy?v?P{_G+_ z`W$v{LrbR(6L_tG%ivG~mmipj{)CBj0M(o94>xWeoYOFX>Oa*@00V(CePinxWI26f zNbxuPapO<@abrR74Vq4|@}!1L-x&M(8cp8-q<<7`K=kpP1cKc?2(mRbFa)iENeyJ{ zE+gYk4koN4e}HegJ*?0g|4B9%-ra-+JzJzzJ|#?vNfN^amVoEdz>&4w&U9uvj&v($N>&sBrv!@hQ0kgr{EKU6Kp}749HX}+0U2k?>YI1z*Gv{grDLC zr{ZnBJ-vQT;GaqWZJW*yYZJ14q79Sm2{HA}*0g2pG@;2#!54NHG$C(->^PW3O0jd! z|Mec(!@i%xzJd#a{S;uB@P}_wXF)W(1%2#TGf3IP1ElzZE8v6RgP4p-JC!^gqsoqV z2G^-P8tfQY@+V{1We$RS2-YmtpMH>E;N(9|V*NX5Y%F-;vZwTrV;#^-@HdH@6dYo+ z*a;jLz_&u-Glz1okS`Iq``v>!6H2^H{kvcat9eq%jZNhY^TMK-4X5}UvDBQ$llii zRv^SL^>DG%K(r|M<6+;J8~s!lk0*s39PmpNH<{w?={;>5jqTvlt=Vy)3_-VGD%q6e zPolU{N$wy5!i5J+8GpWs%y0~xV(#ZD1HS%G_a7Nd@tvGPCPxhh|JNAHAkV33W+D%_ zn=cjT=J`u5AtDJpM+&2w2btk4EvC#A?^N_Jndf+sDG~a<-kwuP2~Tw1Y$_V`oX4Hy z;TFs`n{z@)6zZR3x1WmsH9J4S(~#^-ru+o1$VB-Drqc=F5y*<{4`V%tN)7-MbP(xh zyTs=U4A?)!3J}-^?;qm%!4P}>F*{r5mctc+`4xyWwv!#6&@XXz7#3k9J0F|_;<^Ve zFvjP=A7~ol0|edN3gWXNNw6}UT{+IK9A{UKvn$8hmE&LYm;7H^IkN5f5@5k0$OZf% zV1q6U=|k>-FcE-RmjR0{FA%1JzaVx9&_S^L`PVsQAVcs^22zDoAPl4p7d$bOOz<u?#RId3l>fP)K$WRybmW4{^1-ELKluZJ17&Uw|Kp>LwHB=j$J& z6Q(Q6E?ftM;b>)98Fm(`kFG4+pDE*LX(MAurjTSbR%t2`G3qKZTB}!KG*#3!Fe_od zt(LNihO&yLk_tvgMO#M|BQyDt1+`J!J#=i1OeX6Bce=8ZoeB*NT@|XficIlT#;jhw zT3JO^SyfdD&`deFvH%@J3ds$uC2?RKIW`v72AXEI@K(D?1+&oFj+X6_QvNF?P>ackos2Ma*?dN!NLqp)1@bLBp2|-|0 zFJo?OsEJvvsi~y83d3%%rKOI!e-PEppGYz{(v<}et@8GE*TIm~Jun`cDoR96HH?z_ zYNEOl0Ygw%awn10-PK8}Rabiurk*z<6N6zvfS;ex33oCPl<}i^9-3|#paI%SBo8$$ zB{ht?y3%R_X0;NDfbk#_G)V4R8Xi-nO)MAOe19$#Zk0PIQCnSgwWg{HL5WDvbXQVW zb#qs8TkWByq@t>Z@la9KR@YGTfQ6qePdaAaL13iAC)LT06gV03^_F3akd7M>cE0G! z5@DGjxyw#Qd;bX@f2rol=R<+Z;9rW#MD0Oj4{E3zg{1EZu={JWsQgcRK=y|h2|xM} z;6?%7F)E1?q$}$|A^XWp$W4I1rwo-mdBYZ>e_CXaTgZ>%{tS}8CL$Ak{ZmMOR)@b0 z$t31PFE@Wr5-{S*vT%=-VRJVz;>v#%26oy{rg17eu(xn<+R*Dw8RXgTSp;Sgm_=X~ zfmsA*5%@1c;Kx#tiMw&m9im1L1=q!LaWhX#v9fL%d0$AY2E+^1i`--XIKb@QC}7+`xVU zC+yUfr;>WY7{1m1FCpyRr8Il9S*=}W-en9^cj8%68(o|4m*0{@-GvA%J;8=@YqhI_iSX3 z8A77^N8FDmf5ef`gH0x|nT9;}BaUzif{OP+kmRc$aq{PYqhv1x6+QW>KN7IK{IvG> zCJ|S`fKGq@w;85${`0_3^{s;In_eQy7)|U#$iPxf1iK2s6qz94J|W2{{ZWYj_Jcn) z>!)_Cv?Y0vC?v2fm9Ym>26kV;aQnM^!z(r!Z~tEwvOksZHy`_{1UNV$*B~I4F%F5l zu7c)15r>fN)exr`KZM+T7Nj7i$IW7nJ@9Bjkc0H+3AqPhkj}pTa^Z*tw;VyyFeDDmhom4mXgQ<=yj@z*8fYCj-LM{pc7CslnP})InX7j5GsaBp*zrhs0w-tJ%?UHAD~arH>eZphep7$ zH6DZ@LJTn&nccqo=-f3y!^bbA8T}IiKc?@QLs#@agj5__p!w=1bzc#K+`& z!`H*l&o9frntvm|H~%jFB>sH<2mBxThXh0g&;o`6n+1XejtXQ6+!lB#&?6`)xJ+=J zptB%V@Tg#pV7cHs!9gK0p;bcWLheFQLZ^j_gldF3gy#q^71kHtA{-%{D12G?iE!K8 zIdhlIHJs}I4j^Nr{G%#WL2Jpb(i z&IRZN8yAEwIJ5Hlt^(~fKY`QpL@u|h- zi`%3mq}EAolR7SSOX{n%n6#d>xAbx8GU-+sl#ITNuS}B6J({~fLIc+%)x#Mzo4lGkx=CJI* zvf^c56eJbQ6(STE3U8JRF2^npTz-Ceog%lQwxW;X8O5h)4zvc^3w;{>WCh0x%@y7& z&a8O0l56GamHsQwudG)RP|{ZlQDP{4TqUu}Vpa62;#D2W^2*N2amp3S<0={|zA70i zuQ8&S^_XbPbxgM^T9v4JTD4A1P|ZXwO07h#OMQhpN&T#PgNB%frN#k`yBcGfTACEi zOPXJ`ZsMFtA}(nb*MUpI^WkQt?^kyU-MlUwJ$E_2;yeMS9k`nmcY1}X*=gR2Gu zhB}5j4R0GEjZBSbMvsj}jq%3G#_vpIO*~B)CY`1lrrS+#n{k?4j!s@A1V`*E7NMs~6TQ(W}kd z&^y_?Yn$1&)NKPk);?K2EMEuTJU?E)t$x@1Mg4vJ?~$d*VdQ54D+2Zhd5#!t`_Ri_B4Pev)#2#yL*btzOd>99=iE-* zes{-`9lLjY+^N4aEfNt)h`bvm7qvI)(=O9p*}M66`|N%ctr8s{-MhzO&-J~F_wL%; zw9j-OW53XT%KrKTYYwCyz_xr7liAoH~5Y`&>hsXk3@`LkR3$_-#DBMtZ_p&)w_o?AVC_5%N+p?-7yhX(hCFE4#xcD)LDHS&7b8?HCBw{zbnzFYL}{Cmas zc^@=C-2705J9^XR9&ErKnHpQS(Nd{O;U`qkv?)7DL`pS}fr8)@6$ zF4CUTvApBT_jTW^I~_Yeby2!l-A8)n_hj{|_ulQZ>3i4j*FQ2q8=OCwJ)}KUG3+q> zc_eg{XEbR{aqRl|hVeHnKXByf$3b|Q3rrk@=jP<(* z`S=9p3a~$uUlTWfyduCHCnz8&Id`t)zi|*AiROZk2yk-z$3ggW;2=Dpwcy z{%~?3Ik*wf81xxMq3RjNqE(T{D7fmUqnvu36qSBe-UH z*Notr81xxc<|;i#{*3KjiSk7W|PAo}3}XHKuL&=%=mwlu)o)9TLCFPpk)(3u#a=Bh{8Zel7tCyv8mqNC=8bP-I$l--uOvAg{dBZB z1)n?dDoxIN)bZ_Oivt}}FN5D?lfS&6K-XNG;rK&YtV%CtUoAQ(LmWAsx;K_* z4E&!93mS7@|BaEMTetXG=CCaVYA31D)GdtMy60Q6LMVXRx4qhnTnn$-(D*zD2L)TZ*+uS5vD_t@4#QyAJsv zE%`KGV|L1<2>X3by27xPcO#)3S%n6{@zTelfWybkeRIEY|D3klhZYu_`p zUW#N5)2+WLpltQLUOX8o6^>WvWo~j+|F%B#)TWlhqY!gr;=7=0wp`V`-`=F5qof=e zGPPH?FYFsDA0>tyDst9| zISagILC?;NjHPuR+-riQMR)4nN2jJ|99%4^szT4#;M~z=|BE>Oxpj5KCSS66b@@W1 zBu;khIrb3Kb_W=aB~M2SSDoL)D72S&r(I7dzjwAAr1IIU1Z#*IkIOno+~HZ z_I_BEv#>$nQ;zl01YzrRlv@o`-d3HW=wN_9-Y8^Kn_m>pI=LmxW)(Heow&5OUndsYNd5ibDq|^ZF=E8_}T(TXIJe z4b#0cN(`W}y2s>-rO}7&oYsvPd(%%hty;(5*_SjrYx2!EUa`@o3-^9Xm2un`E;f8^ zj4xKSYLtI_D^&m=yLss0P~}{sIOQRH$T+f-X_NJ6!AtD>-R*ac5-8qWP9}v^WFhTdgRe~8S2&tcj>q5M0%K;e$%UrtlzYrDqumF zZv*yr{F}C-ULw`AC}^`mQ>zAs_}P}mk3&!7%-*du9}A-=PQH7Y_9Z&mGHaCJ`ka;? z2pcWOveSJFkDprEM2J)6i9aooBYWVrFaB`jk5@K#sBI8nthBH-(y(7_f_`$v#WI+G zY0}g6WdigyDjm8<(XmWNg;Nbh#epA6Ar`btl8y%o7NL1Ul$rVJe6NV&uvrc;7WSY8 zhlXn8=SkGW7PUTnzf?B0Yb8DgRJ0{7v%WX@V#F|}ew>q#eFU%2BUIeSYh;uBc0IbR zIj<+`kv3yaXegzFc_zl`XmbMX;^ZJCe~D;*wd2mBlUImcS>5&hCsCeeUu9RM2^>M# zFXq)|g#DNS{>jUyXSP*uvb#YXACD@*NYcenn-5n$-(e;liSDg4Ho|Q*wn3TZzebUP zblu(YT6EbZr-;f0mv;=f4%Va01M!txe5|gDGq;?fUAW#)9}YfWwSXt?b#(U^&1G2~ zOh=cNtes)^-dH@=*?UoZ$8kSe8XIyKS|JNs8r!S*WONglhmPQnO`>f+T7GfNKtz05 zu`MlcXvOIJ9xL=+m$z?j6nGNtiPz*C8I#XvUYEM2nW|#Cv|V!4d-Uqq1*TJtjv4KX zp&W!iU?7Bk_dDLS&13zhHEef6R|#A-iM6S%^1b z&*!=UffdNH!9Fw`<0s^nqqe^DK9YHPg;YFRg$3>A2lgW!4B(T|GHS7o1*bGkLqxk% zvA8vjX}1VeDA2RBrYbuZy-jA_!ZD9Gb)1*fk=W#L>iBcHjBQcR8(2`e18M^XXS~>Fyu_$q7{ifK0r%K|>Z;@I8p2VQYG z9(uPOP~ngI-kdy1*=*jQp@F;|BE61@!#EJKM_l;v*N7p~vo@?_Mf0%eqWAVXn;*^_F@STNJkgnlsjOpQs}M$%UL z`CX8AK5WB6(7iiV>@2TH&8=WTb0z5t?9o*05sF)uE+8v<-tj%dS37_3`i}kReOJ1J z;~{@i_~{bY-BE{tnSLQCyEVUAibekBl0|;POB{$wO{A7hjL`NO#82E|=nu3_W~MXc%_B6dSsv ze@$M~W;_kZik+^o<4&Cq3HHVD(Kuia4wNvR>eP(YH>|XPmn@5UnKsF{awN`pk+#j> zqika5#R)$*gyEOs5WXe0b6K zXSJMYuiAXq{uS58B^i8Rgfq{&)V>(lh(Bg8c_2ro&HL%jLB?8+(?Usf*Gpf&ZO<}G z@j-KRNsaFBWkIA`RQNbhA(f~8F+~jjzVnwO$lW{3ict~VliJDu&FIGE#FxWnS9oss z@c9F+ziQXH4qZN4^uAM^X)6FE9{ZHaf^xi{rSol2_`Z|{Ira~8H_(Zb=JLSM z-3Jw6C%5U%IeA#RyPiCF6kXBfK*)K2GWdOVWncIsKX;A1Zp`=YE~eA@!ovNwd~r4= zANJ5LL~eZ{aknAEa}2%FtfD)%1q+O13B!@T{nH9L&2#>eksWWh2@m<@kFKCyUW<2s zTA{8i9-Sk5!mTZYX&bg9{er^lzNOet8a$)RCFvM-!Nq!y=+b?_lE?4SI!m1#Q`YQ5>Lj!~17&AfvH&01L_tCAQ`;2!Va zL-o75DfA-hbZt~Z`&bF%DKG?6hUD-6%tRFHw|dq-JLg==31>m`!FuS>BK#bf7g_GQ z5R>0|2-_%!a`@Huq~B1b|V_PKgx??}2pG(D7NRbBSE9;FZKn3CM)YqgI1q%s8i&o7I< zCDYHesUH}aS1-7>-F^+Ev%C|DG9+B2CoaL^51m8iXfxJyk0%W4J!z8uDz@=Lf2V6Y z$`S+S;?-4K?g)D|ed@i&f=&n8>w-Rz-ff6ZEEcN`4cGd{DsiH58Oq|7wt*UcI%}zGQa@BLzT~hw7!m?c=h(&pn`am zr)w+59t)QqX;GRRc>YFHr5t+63(DxWii2 z$&K_dy3ePZ*l)@4iKzX;@36b&+F~;rbHB5V9xQa4=|ogt`s=EEzvnj?LI+UcW1mv` zLj^g%G3z_z3Zxq7@O-IRQ_2i=<2Te_N!3d(7!hnAw;s}_y95SlR6kO$-eRiZp$$0n zElE-`p0-p;E*X8axiL?_hT2@)7SHu|yzXLS#U=ES$?+^NZH{`AVmPkoI(V9p16z&c zp>=lVdfmlf_6=q0^1Zd6SNk+9X}fjCXjysshAiTSa-^?d?(hpFM26a~S^(JieMv&;g8jwZdT_g^&t_^>RT zwYa=Opx##xEc`1&$rUK~BzQ#AvR=DxO7e6*N-w9UiqP_195$p{mGoX%a-ukA=a-8+}`}LJ7sv9VNqi2e6+AIk26N4nJ!ZQP)(+wGsTU zqr%^qwz&XD?e6n|&(g7vJKo1&_oGwbafr&xTTJ*8b<(vINxLuzkUsDA%17dpV5DH_(j%fF9$v;x+T$nK12AV9~Ol z(-OY=o88d|DAQ41Y#wSoEVE4y4^@~PVL@wdM5>QV(gVR`;p4YTgAb>TyF_*hp-(mf z=nkc0bgo3gF6A%MBJflKB{*zz&QU%jX1 zYoF1_Y-?M)G*&5yzouse_4ZEi3;OF#RY8G^MEEL~@Ril0B9zYLh7=WSs^}-$oEscW z&1j?p{BU`jUo_RGHD1}C!_!flFJ1kvfx%N!lHBN#?5QjlOr+%itXyaeXBSKFfRl5R z&Gw(a5gP|cO#(wd`}J_#sOqYkdl5O~NpvmH#Gbc-*R~CKj<1yKc#T>Io^<-2xKDk9 zTU*8V5N*0Az$Wc6kmZ>9@+V|E(-OVw5thsE->#u7F zxh&|1U|wR{TC0Tba#AcRmU*l4_WE8Pcmd}gzxL?kHm8Q?Ny+hn_!79*?3-#EPg`Gi zYD{bU5}|rF9pzaxuYcghx3%2#5Rxu#a1mZ)T1@zQfKQR~etG?1W6mJEJ10>c{~iEi(+rE?0}brT^!avMvPe zLK1l9T=)v`lESief(d1{kAmP6^@}z6eD@$4-u#qTD6H;);LdL2kQzNkZGXhOo2cUzuCNLxVM*mp@UX#67Yu z&L1MswHaGQ*KuUDK}7zQS6?lWd zOwZ5XK=!k3R4!}^?%-{Ox$c%=#)8(9sa?s|gK|wX#PdweOL}U0T(=?{ZzQvxiO4w^BLt%#*h^)hQ`SeB2ed{^8+k)~QF)#~Uv(H@>pU z(L6(4x<2W(H?gg1%+wd3dS|WO-2|gI>BqS3+5+)|6B6WTdRj1ef4>p1B9=gwJtG~& zpUDg;vmh~Tx({2pdoDWG<4VE*bX^k#gm5qD=4BS7996NPe$0*qiE6WnKTuc$#bd#q zh7>=qsHtIkWPQ|cH6Jf%*a_U{jzFkfKb;YDJ4C)DaalVT9YwN^>N|>l054Bm5Kdc$ zpL;bmp2fTgb^AUFoTC8gtao;G7V|QnKk2xnvt9e^KrhoN5#4ihvmO2h7?3Ay_=Q1h zo{ZjPL5rr~J_m6TW7GJ_#%5zBE2>iPWwmgzTTt&lili=hRBMU-q`_ zyBsp#|Ghrb79`UZETa{_w|_iQa=!y9O%~3|ME3@OpI%(2Bk)7FZ=l?^_})}&)!T)= zQM_m!3tHY$F-QQ$uYogJu<{GWKJe3+$VwT}hlm@;c9;$!#^PWSo^uO*Z*Ao{{)l(Z z7iAO%3St`+N?4Erir4_)+1T7}^kM_g8nQgLD}P*@0V^;3n|yal>wI#n+JL5sNYXdL za(c^I{FzeOOJEpZqb$1MaoZBgplvIT>N>@OfWpGd3nvzIvaD%ZLouMRd|{R3Z(6S3 z5ChBE9c4Vdvcyuhb{umAznERqPuTp89|Qbd4)cksTLiY<1KcMUzr&#LT$kH0*rWly znn0utPYcg-?vrfTRD3&Yplwau2-b85J_g{hF~UDpW9-!(spoIs7v=@gZgSMTSh$HA zjcQuJC)^qtM!&?KKb{0%yXoirb-2bLy*X7FY&dAswM?(fi%6NPLYH8~cH<~ulQu$X zBJb538dvH*@8gooTV64=a)otzCVCgsfw_W-Ucdk7k@?mo8j_5f#yIyFdDp@ZDnlZh z@t=nqGB1W;8}DNy2kAVph?bW4oPRZXx-*ED2{ggstdC`t{S9oFk8nvXN*^A-n2fx| ztDZ$Q9?z>e*O;9K!Xd;dU;ylR?#vXF^>uN!cl279~FUyd$oAW?NVF}{w(Z5t2*d{hEQ^MY8@Ems$f94nU z9NQ&F%hZM~Z=UW8riKsL7?Hq?3;^(f@bCOo?jlj&{C-agUKKQ;w8z=s`6`g`!;U-e zCjqY}V0?Z{!@h(g3t)!g$S4YNLLa10Alnc7dWE5*5B5U|`>1 z-?F6f8<5!x(=vN}=zxQSM5!G1s~v|N3z82df2HLU%r({|)HPltFw$e1gJZ-mUqj%6 zZ&ZYd3&eeXxHmFsJqwbn?O;0H zV#CkhvrGDd{TYi5t~U#Cv25U$CtP?XR{tz^Toz+Lzs2a|#m$4Fxq2rg=`iO6v);BZ z`NE%8VLw)mPt1Ga7n{#sc+(xV_Q?C~VqmZIVjoz_az>_LDn@DZI>ea{)4hrdFJeJY z3nU&yg$H=;JQh4MOvqK6l!GPR;LyqiYQKNvoCjtQ|Z9aaibF(FYYni2&j9Q1~fQX%+@U= zc;*GPV(w=AN>K7m9)0m=?NN2(3MkWwGL%&n1h;*@eZs9bn`v7ODq7Qh!@+o0lpldewPOt zmbD_H+2%pTF-JyqpaX&4FI!yHbl(UtF#-Hnwt`(^;yM&)?|72!?rY!iz^=r9PLAm< zt_Obk=dpLo9;TmT+5nxgclutdtIG#s)!Am(ZyM z`htD8iwn+ftF1MW`)paZ2;Tyli?ct8NZnXOJ0U1r-z;eTk#=+8bYls5dN00@-^{LB zt`QT-TlU=bTYmwL8=d4eOxz}Fv1hDaOqB)YJu`hzJBP6^z;{0Ed>DV`GeqWl9$oUn z1TSq4C*UtP3U^qTg8^Gk0B_DI-&tx1ScVxsq zx4Jl{L_XY(#T z7)Cv5-Hcz~RQ*cLP&T*uvLX}^nX&x{eh&~Bd~UPZcbT|HBJw80`mMK9@X1j$s_Q@( z*xQc!O1rY-dAd-1!H`^(2(6gsRBvU6T=WvTwYezkxm?yUR_N1&T)RiZr@STZs&!si zuq~AQ(lz}O`aTTSVXiAa+2ci{N_TSia+o8F-f1&1u4-SlrP4j`&BK1%fT{qe*(zl;RN-vdb4Q^e)IGpujod!S2elXLjxaz8Los z25*l`&H=nPG^k+H)S@RgT!1?b#`^))TJ5xB;;XiK`$CQyzdar%@`jM}rALb9aPq}E zDK6)-U<@wRp~tyWOn)nH^YYrF`>D;bO|*g(z*N=Du4qLZnOj45oCj7`q1au(lS3=` zzS{ZZ<^3N7KTp{eI0pFW+&W4E8H=m6u@rmy!7g{pZ!NgV~>_ph4&*Epv`Ug)knm39{~27*kUQJtem^24aFF+Lz!umsVyvd_3HWhb+66ZFROHBxzRG< z{=cr0*xzIyb8t{5H>TIOth0fk!^CCXxLS-li#sTl(!e)1NEaMsp3mEKVHhc0Cxp%) zN(Cl0k;a1ZqrgV4+wj$U4mwAA?uDDQa*$(ORO7qIzb0Qz+9!M8=e?fo_qSeX^H(ie@P zXTz86d}p%qy{gZoFAkm!0qLY?NWZTb&mRk8)M9XqYG=1w1$s%jouh%V(k-r8sI51F z)&D^et9RsF&?x2Z-e~SAenhJBMOj+`@G_w`-n_bjVea?7?Lmga?S8C2b4$=#ReiPc zQ|-xDrbgtxwgegPVAc4)hmrZa^>vsC^rFNOM|x0~(M zny510Rc)K}rn*zO7b~LPW>xP@A85?60=b_w6rZo2kI3(b?WpmA=m=o^eCCM=| zozjJ6Cg|jXa|-3C@RXjawHH_BPHd^1h0*=-T!dxpNI97WNhZKt^1GjHYt5$65miN0 zr*7<1ut0etaLl6fp?2kbbomPMYl#H6`kXRDYfhu!k@4D+U%j%I5F%s1vGo1Y4w> zjk)h_^S*qe2lu*Xjm}|iAx~0=NzgVf*x|9^TUdpC9M7lmKIR$q#n>-;_<-q%BB`T8WTp=!6}qkp53jn|-WX{7 zPBO{g+C#3q97O^HG$Eqrf`LyZ`)f_LpuF5(*KbYd zbHT9K$oOtuJq;ryfND z)!JAFj`EC736kTbYo9`e>NWW*g}y_r*t&kU3&bKfgTW!`tIytt0qEf$#LDe8UfEul zjglYTkFHV|R+60WpSMmmrs+VoYX}QkfpT|b#9H86IBkwafFnykDR>+HRtck4#&D5H zS}TnK4hAv0aEGfS=9Ef17fF9b>#2_iV4K`%`7QRqJ;_i^vn$|1ZJHdo_@SVx$1Y^D z7;RPOy>iNSjFgllW5sWP3)Uts#7Sw6Zg47!?u^{fRQQyHr z`$NLGH`8TYu!aS_2R_a_3gDfB8>0&^u%I$e78DJiWeOeC+Q5P$f#;1g6&!qvsipD@ z>KU$F`_5pwl))V2t6hZbArbeObaLSb#*TxT=r|Vi+baA1*Sd$ZPyKXL=V9R59nEo( zmB;q19}wrKWhTL5PM;Sd5$bcl1(k3+u4G80glT(d^i0<3TwC*bR}F>lIdm~?Dk@jJ z>WobZhEKrZ9ZOGc6aMbMxFUL2SzaPK`K8xzaAKzc5&*KWkzCpf&eQl$8HQ{nLzCL? z#b11RkeRN5tsd^@pm z+#qpmM7@~k-+i^w!D8TfLFU*aP{)xnxZ2nd+TZ`*4NfF(gy(p0?X(s=bi0U zo6TzEk3d`Zty34j)EWq0bopgeKQ_0ojC@lu7SDpf*)y!wGhg+7&tkhr2SnS<)xTK_ z{Ol^kDYbx8JyAF3GKzb8$%9J_X&2POHSZk4SjtD{Lwo;++nJG9ZktGp9ib=XqiawAQnH%+TaTm@C29$0xZe2V7<&gxAd+|txsD5qw z`@c5$|Bh_qi@GyUa#kw2A4}t0am+qF%UF^g#I^|0b?Sb4BjHUMso(1cUB7?tZOoA$ zU$3!@|ICe*he!2+tOVjP-5wWQGWVwfW}6&{_u6q{HTKpuymYf7xxNBrwQ}u^%$NBA z`<+ZpUnc&)Hyi&B`uSU%@q2yL|MTJcO$Ur8 zS^EEY>H1BFO#fTp`mIO#{^u*>fBGfa|L3gtjE4C49zdE=)&DvCg8gZ>}O{JZw<{#$73Ebp3;GX53^{C^LTnEg?> z8A;b~Jqi0CGr9k_Dw^e8GeZ7%o(KGIAQH3wt{K^`S%24z;F{%KGlFZDcg+Z{S>81x zxMq3RjNtlBKOXhpvc#VCcg;w;W_j0);F{%KGlFZDcg+Z{S>81xxMq3RjNqE(T{D7f zmUqnvu36qSBe-UH*Notr)YqAvtl zTSI6Fg18_~gb2h6TnO+FLM(#VnQjQeAr{ZLHzSm$(y)Lu7zn%}Iq(;bP-nWufID?B z5n`Lln+JYdAfB=95TqzH{kz5|1V=#G`iGE0BK$)_QO3q7bv2AGO3B(APYi|wmqBoV zK1NMnT^j`)S~~g|El?E1dJgfUjptaV>tTn^u}-^Ly5NN1;XtrXrRA92AB4h>{vcFl z_lE^BT?Rs%Wu|PlvB}~f3-Ak&nfzt6Fup*1%${sCwuTUlZb*RXgM7Bb=@_lhZitVI zi;J6!kDHrMn3soF7%9ldCy0~~6-A1QN(l2YpQ)co&+p#|eqLUF0e&F?0USB9n3Zj*2!?%)owuk=*ba3Lv80T` zwX$+Z`#U%d&G4P|#+>rW4n1#r@ex|$=ZkhJn4~!Rm{w$xv==mB+X>%_ci(M{eA{QH zcr0T6|^cEKqE32 z_?Tj~Nrd*9Cj9djDE?>y<2l5~%B)iuGJ-xgSjrvEO16|=CYNlv&QdPfKKY*o7%?8t zDRupi)Up}7GFA$7tY|B4v~kUDWLr@9ePyyow6w!uvcq``VL9%03obpqvZ4F{`v8RL>iPrITMJpnY-%IX*o=V?$8u4)s_A(%+U2Ll_ zy)F5wZDiT9n{c!k9lC{g%oU6lPE?r9+yz^g5 zHQyLEz@FyYN)&$)l8w{xbt2x?0NX<==Uzeeh1{7q7xt->)Iri`~7xjwp>| z>w?*DAmn@Qvsj51NV5l_EZ&+N-C3)jNB7m(AKStcQTgLe?Y(bUBe z1c^YVkS*i@*+3g06l4WyKw97*3WN}#aEJ)r5pd3_B5lJ%LVO(vq{vVk+-5uo<^!3- zp%C!TcPbMJiiAR$S$INcQUgD;&1(Zm!BcJK!$lGUNyK1gkszL%ncCReb^Rn>25=cH z%HZ__6Omb%*o2aZA;ECt7QiWuLrKBY-2^b;!e>18ei7C)9^>#};~$=2(hrXnE-+#y zW`iFoYQ|$46lgNz0Z9KSdM!S{Zwd%z_aMmLe62BP4NMdudmj|aCnOTLI^;F%Wj^NN z!T%7pHt-+Qtqu2a#0HbhWbFgt(VuzN2Ku1>DBM0Gki-nPjR{0jndQ((pkOjQbgjJ89Q^2W~$gPEBWGv&gc{j7aVKR5FYUI=C` zz}n!4XKK!ZU}g&jn4uPss;@7I2?TGzvA~0v3duN`HWQ-G40i+X=`=8vLqM?PPlYhc z90Gm_o>`1Pd{{rh(SI1l_&ae-EV$sZr{^KdYA`Rs-xO|Au#3qICvjW^ds(sIHQ9RD z3&E_DslkLGJmd`pf`1`EPmn+_{eg<{hI~K>5ef!wxbOe?%nF0cnPIUrDQ6{^3HzZq zpy0?rSOda@oC6mU8SE4ByLpQzVL%)_{17bcGZF>-zmrI4?TqA3Hp6~KFqvKChzKO& z2@y_#R`Aq9{8SG+GY$lcfIm*A$I@h0U7UX5A(5d!1#yIg6a9!YTGP}4F5QM12Fl>~ zjwFSc6M_lh-Xww#2!I@8L#LMop2@^;2pnS>Os!mcQ0~CIV!EHiQJjSaXv? zLc!7^?a+WbCkexEkKPy7FHpT^XYOMzBo>O}|v zD@j3U4WJ?+5DpL#6xiDM12+l$MKE1}e1XlzpQk`U#^4_cQis$a45SNkOfp5bNjAhe zX+uLmj5h+F{v=YUzN%_)go-z8^Hafx1gXY&hpJ*!)KsCBMlqq@_y7V4g(HCV-%#f3 zjdB?j(Z^86S<70@I@FlpPqf$)PH@<=!4bbD0I%mGW3&pjGDbfpC^U#b@~2ntEhFZQ(w?`t~MfQ*{BKq0CgLqNAf#qBT@P!u?b+dU|@Q zYU--$>dGL6aztz}$vZ|lI6`*11QS98KAgzh&!ONF!CobjWGDk#I@yJw(3xWY5Uc5g zKKPk*p@4)iEBC>x5&{W9gkVwxz!d{`pIK<=w0(6Z%TGnmL^B6tIun4_+WL<(OpjYo z&`cE(B-1F+jXxXZ2$)c)+7lu|BE#_n(aW({DDb$ zRxSeA?hy=SU>mVAMon2=+Yz=AYwD}3EmzagS5uozY8~Q3^o{+)q_8>pr=&n`e83j+ zUncg!>-&a;2YG{D6N9|{2&$Vy34SuD88G#kTnW?+nx`>4+|t+>*a3WrfgmCR?4ePX zrpDSBJ#B4ebrlS=z1G(HmcbDu?_fN^(!@{(K%_z>`si!J&c~RrnWX- z8Rz4ptE}#=qwcGR@zK-9;imJOgy17#L4fm5&Iz9oJSgKw^E7n5)xGf=n#$T5+P=zq zKAJkpy6V0f$^@LAIzdfa!$;RwYr3>a3ho^^yHvPUKA=Qxb(}W=qwcM&p$mjw)7zJz ztgEM^sjNxR^VRXz)YaC+=)uCzlqY=)VgwlJ*s1B{KnR<11rkwA5z_a@!=?^H89Xc# z1Rt5HVB#O(@t10z${!6j=zl6EleI^L_>!W%!wGBr0Cs;(7FGXg4?==r;{Br!q2A%Z z7DXb2M;OZZhKB^9CgmnH*bhYtnes4&=${rD;T`p(xIcpAuZhTHU;hx2+0)_QhGYtJ zyuWv_9|0(FRT;QPs<6779C6j(3j;H5mTH_%4)iVToKf_vrWNx1?>qwY2+SiekH93gbh= z!D$x47Npnk0h>PH-VNM=(WFo~95!Z(;R0Yc3v7uO3kMAZZrFq=<~QkH!AvvhUJbi_ zf`WnFn+0xjs85g&?5+gveNmCHJ)G4FxD%p?glOPy0&cm$$RHwc!^bINK?HALqi2H+ zrE(+!-XFNtfSWJe(HpjDcgemyLY$`*j)#OdI!fs&}5(CT#(2=Y;%~wldnIGoR#j+obcFA#`oDV#|$A} z`y=c}&L3eR=fRN&Pllj4$-U$NNl4DB=krO zV*OGJv5E3RtR81U3}R;7thk+kMGJzQr9V!}J#d3~=KH4?OCs>HL=c&$MUb(*BMKiG z9yOVS4gO&V2cCkE7_<Ar2st5ow4FL@uHbaSd??QH`ia zJVU%ebRfPVMp#%`_*lePBv}+#R9SRc*08K+ab)pi@nZ>N*}}4$af*vfH`;|xau$8C;!j<*~G zoSd8sIhS)9a@ufubCNg{I8Sosah7v7aK7gp;^O6!=2GV}<8tE)=Gw`X%0=b+jjMs{ zBiAUm5Vt(HKDQ0G4|gngB6k+|b?!&p@3}{Lgn1Ns40#-RHuLP@Il+_9L+5$H)5pup zE5obDYsX9E-OhW0_cHH&-Z#9%d?I{kK4U%)zDT~qeA#@r`JVCh@$>U5@UP}~<0tVS z=FjE7%m0dhNI+CTMZi+PM}RDFN}xobL7-cZTTotbji8s{7Qs}(V!=m(pM|)E6oib0 zyoKV0P6=HTdMY#^EGmoH;B?FRDlID`3k|!naN`96Sms%~g zS?Z|NZ&Dr7qSC9RiPA@<%cVO}NYolsAnF9F64kSG$x@4@kxMg{)-4^CQIx^T?35{x zc`3^yt1Ig(dsMbUwnt7{&RQ-`jwbh9o?Bj5-e3N>e3ks5f}(=6!d`_^g-?nSik6C7 z6lsbtl=zj5l){wGD>W_SSf;xyVA+{vkI^h>Ewn%S6#CI}mgU;ZiObI{uV2BwLT^Rz zit{U;D)T9?QI1lkDZfz>SFuvrsZy%attzMLrkbQ$r8=Rer531`rPhiO!K}mV#9YUG zQ%9@g)laE6Y4B^9X^=I_G*Gq;p#5 zsjir=t?ohH`+DqpYxT%_H}!_~we?B*MfzV2lnnw5s0N=_Dy}4~%v$-@P{z>PFvIZm zD%7e?tIn-@ZM4+L+vvPe`)b+MKC3UT{e@kLedBG$w@p}0 z%uOgJb*3VwSkpAqS7tJ1er7bY9&;`8t>(8a*e%vuBw0MQl(fWK=34fw(^26X#^-*Dk6q+gxf~7r7E$%iK8K zoZK$D4Y-@SA9H{2q2-a_(d?<{8RJ>)wa6>b>()lWjourJH?ePW-bCFr=56DB-g^LN zi93z!!5ia`MTN<|`?#;F} z+cM%2@woU3vMhNw`TchD?KwMmb_DErxKnLs^3MKU&bzMfmfXF4_uD<@duRy)3E>G( z_ZsX?-^aF(xUX)%#{QH0Cn!FY2M5#+q#hVMh(Gw?5a!T{LyW_|hwBox6VD#uI1+rM zImsv~Cs{aoOY++k>y(nCsH2pl{l_*Qt4`HSO+U_aJo5PK6ILh6PRgA;a&j!qKkdn> zwWkVBFFC#c^xzqvGYw}~pUqE~Oh1r5a*lYeCBrGFRCckEzZ9pf93R5(W{gaL`iH(PpNoV7}`fKa1Ra`f?e)WdRjqICCZ=Sk^ zyp{MH&u_bbW0Y?xAGjTQ`|};YJ8vsCR)@j$3Jkoho_E_)n_4<|dzcm;&+-Wpvyw_yeRP$uR zllo?CbIVhYr>|RlT0T7seAfFs>iKBv_806gC@+OxroLM8>U`U>wu0B%uW!9Ec~jf& z(BAqM|F-L0#JjQgyFc)MNc|}NG53@Dr<)yS9gjQRJKuMOc8z{c_#*t}bhlFXm9MM6 z*7mscyzdR~Wqdo>x3Dj}U$ehrz;@u(_n_~igOs6#Lpj5`!&M{BBOgbj$2iAMj4vC% zKCyn{1tSPtF#2(o8|DI&SGhUZ*x1Up61S@=%n}d@TyjUU-EUdz85IeZby~d71)EnI87E@2k;6zSdrGBF! zj_Z*N-`Oi~tm%+^z6c*tp=F|&l3A?1z|n_vx1pU&VHY=##KPT2P0g~dI5lFG7JYl$ z2VdtVMD95@d8PZG-00S|aPg1XcOs|ke#@t!WqOvb#Mu2ObFWoD>ljAsuXEeHg_1_S z{@{7%$mG>;R(5u99i5Gfl{JWYybs?#U&C$(TFeo)BS}4@ut)4p{Ttb}NPAp(uZEna z@lNq%2l?~(q6*H42Ca6JT?-sjz(se7g$mlHixhoGSek{4${>)57%6zt7#stxxn>g9Il(n=@0t@_^So&xw zzY8Uoe0s`fkhmwluY61eomzhS>;CZ%J_x z9frk9-S_X5vn)Vv2#j>+t)EC#^6lR1E4_wp7c&*~JR z7x;tN!|2-s+k8LTok*2OIgFN>uj!6+N3QRkyi%Ee*! zZ{3l0TVwlDFX!t->0$Jl_W!DT;0%cIA7F!W2z!4{`!Gkj>m?_}A4Lku=J0WkCZIDW zRyS#4owSc#`~rfOP{;%dpxwjHomhxC#sL* z;KhWF`0X~G614Rnl#$mxRU0JY3n}L}H3h2hFD*ONGI8H~KTzps)ueBsa zdJm`GwwCdvem?9WFf7=mrDbQz?k-;Uii`J#?pu^m+#LKG#UP zgL0#PB9Q?pTMjWGD{NbKKY4hwP1Oi4f7~dO0oB;Y8#N-MJI19a+){ccPSDD2J~5zg zP3ejKbk7m8IRi?~8Y5psQ?A~+dSmVPZ`??0Zsdjd(^&V(uN0_K-zMtnRz<7tyYorl z-PraQ?YXXf3CA9sCddw#T{3ESp{h4-Y{);cB4STOy%d!!S?G8d>bK2k@($bXSyTU$5X-k?CUv(ZsDkN1s4+gB}Js;kz+$`8fs zzDX~@wG|-kfuI&YTEXL=`f7{;wFglyo`9u4FTlCao8nwrXzMB{ezFuP8I$;yQrLQC z-NdJKujo*+Pnzl&S1ZzZ>hlWgE9ID1&-C*S`jviNyy%EgwIb5D`Ki#0+bI<kM-&0D_at*SGe~o21OJ(RCI^ z3F!M*616QBdN-|-GvL1cf}F>JesJvAQS~E^l%4uQVgKq5dx72)vHT09>?@BLkccjI z!H*AbE^W6w_u}j>o}c7`Rm1=ZE^8v=hS=-b7)$Yq#)W zKMo#GdF7$mSE?9NCUAQzjw(TYHyY30-5lhD(&oFJ^z-W3w{b zyQ`Dq%^rNolD#7z2@_>B&0qHsP{FVLQfBQqU#bq~aDiyf@G)6rY{~R@N_nF-JJXa) ztION{kXE3>V1)g`F9gdwJn`K7A`H9oM~92Z3SK&Tc`Z+fo#%Q`+uQPRdD+O=3y)~YKKJh_55N9qbvEGb;l+oXu1H73$JjI){EYq?G%fvK~OI9fdU_|{Ou+w zz;43QXsakC^Vu=S;zejm@>T@pCIfPPB5iw9NsIt?$?id z=y||B<;%5=?HDJUf1w#JhiJO3Ty!PTW@o6RV7=K`m}BO2X<%r}Qv+9B&81z=b7DX@ zLr#p!exY{s{0X46`dB=ZH z-|GI({B!z=QVQ8UbQg|kSYZ}W%z#u|w%J%6lCXC*idB4gV;d{d>R(FsU*`|M`i`nd zdi7vP^s@bL*N0c$b4h#rbseG=>6BP)JpL@YA59hsb1e3%Z*N@0e%S2D1Bt>-?8|Hf z&!UgQN@2(QUh73q$2YczG1rLC*gc!KNRC~nSGZSrO5R#MzTj6(d32jsf3Cow_&#f#Dm@ANaEmVuBC%H=q0 z3pMurEq>KA*=204W-)sfhX-FN*iLuVOp{8HGt&rIL~%&Y0YbKOaeJPkQ)9Z#t*zm) zs?QJIbnJ)q@uf?5TVI&#Z_8;>8^Jhd(Pe5xED~}$VahQ@Ash>8lQ)`XFT5m&InlCE zcK{tV9zzqZZ_jkb4wAbl*%J;={8EWQ!33h~Ufq)|g{{6w zU77-{`P!d7vks5$fBJ^=hUC$0Lo}}AUQgcP?sYWZI@&9}2ZL2@c%D60V$FbL7mu{( zB|gB7gekwQ{Z=h8B^gesUBL7-NB%%a-SEs?QQI-)w=}-_`sz#isF<3Bs4WQ%HL#k^EgY4!eDT z?nZZgbnJ8drHd;LE|ahNx_Er!GwG-yY6x?NA019{7&*4XQS<2DHzJ5$qc z6dcT*xD3E(WX>zwFBdy%>1oX(RpIxvc zYs-DLq){B`iklB}#)HQy_YR5=m}akSyFyL?Gd=h4F8sj54N5Ien&a=%I}1XxzEFzC ze(1u#|Dor9;Kp>GLtXaZ_sp?`aXb?50{BFRKQ7HQdkil@HTa?S^6B>F8olG(VKrli zjaK22n*i~3eEOg_wfUUk5d-NV79&@>>nn6pY_??pEi96!Ifk>6(`iF_PZ^C5V4g|3 zW&d_V*#Pe4Vxp{}1bJf|_DJWdz*6x81L#xx&A$kCPsA%z3Ke{#R#X;aXrkBT+Arbq zc0JhQn)b1)NVVI0qWf0cL=fFI0bRNBeb|E$3B+@yVd+!ppE%G}K(Y$fJPxA&mJ)c* zwupQ22L`mD7f=k^!oDol#*#ADP&aKO!>UeQ8WPs8ZOV1N^_Qx(lz61S%k3C)Kw1Ia zkWY82S+st!S$ocFnxK%W0J`tgsCn_t)Mq32nm8*XIXfh%(nu2*Ppu2@ba*GaHd*va za*ddw`y&aFd>5$|=Z1Ds3e)voec?|#TYl?EJTC)UjLUOJZsfDKMw?2|?%#3Tnqr0h z)U2KK+|4vN-B;^EoJ~akY3#yER#D4nUUQF7Jx3AN@|ZkHaD_x}K`} z6jWs%a&SoLWjP=A(}N60GzC)Pyv!8nFci<(6SPMI4^7%O3o031x7n#WU{21?M;~v` z8Emw2({HmZwpOxm9!tY0_ctO}2^%!JiTh(8+*S+Tq3V&Y{NE7&S6>a!P89E>Z+5X z%pKc(zXc&89dUzvuZ)HUXcZnJ*O(l?QRrFs?Y5CfdEW*!z1NAU-5eyP&C>1CcIF0W z4;C>X#Do*N?#q`qrF)j{iMh9vl8JPryDT^*i^Z?z||3?4VteNFxw1n+m+tTX{sNytsU+2?wk0!sfSDiL1j?gZT zVH~B<_ituoj~o}=^7i%KH;LonI-|z{P({BR)?H7&?nzBw!GKCQC8~z4F9W*zh+8h% z+VaI|Y##PltoDNgT3!5)x-*CQTPE_bDa@v2z4C90r)8fw(%?=x*ULL&A1yb~v6Fpf??rkG=X_xY=($?Xm%2OUR; z5Pfv7=&iBJ@0*T`jOX$bTLf;$6=M0Yq_CSsEBy5gj!-kN82}}bMxZ=%p$FeMhK%aP zU(=;72g>G1?5NUr?NjsclnlM(e^tT(G&ibzFj0r-Dl6ewVPu z{1D~xpak_S`XtdU)7AY|mFGuF(x@SE(W9aJ+HpA%e4&5^r|O{Nuztm)+6yTw9Oax*`h7aNe$8Jue7f5 z!}FJQEjsM=IXa{YY0?hQtIPabZAZE@N!0f?>I0X35Z1lb4h{csNJpW>)kDbrL#7>omIR% zvH{%}D;FzAT=L{aD!$z^m+sV_x2yWQ*M+W^YD1gcR7W0`j+vFw)P88?U!h~m{{z<1 zJcBy(@oE#J_9O-*8i+-K7T=P!7Hhm@z8k}UD$SDG%8(H;e&~IGEEzj$faz8Fl_(ZWd z-bo?rY!<9`7GCU#cH8~x^m0?_VB_zOTia=>c`AW^YA;m9$5SOGVs=q73b8#8SE%O| zVl0K8xI}Uy{jMwIr5!rAZFfgc?b!+0miF8Pblf}TSjGuQ@&< zV{d(_dFfdbI_`sO>XF?07z3uZ_P2+}n?_N`PzGXUV1Y$f+CO*^W0u}4OrgyT zN!889OIt9f7DtWuCAO)JA2a+dh*HQ0wrhSFME;zYajOsbeuta&AK*OyT-lBds?W@l=J-$SGkW?mL_hBj-J3uZa_c!qKvvy z>VopZ6uh$8KS*~Rkko%Q@#3!9pt+>u&_V3>Hdku`>3g5xetqG`hk>4r!>TRARCHc>HGW(G z2swQhSY(`xnfe|q`qTy3D~G?@q%A~uRrO*6j0W=shwhj6E~VUp*EA+&aY7Wl+7^I4d55~RzwzCTc&662a|_D2 zQNFXS`11RSoR{SY$}I_qo#Qr1Vs`79*?)BA-|-gwS_?4~+`Q!vKU}~3eLvY1#-@eV zsJut{ycAbC4bVtq+}-M+jH4o*dkS8T3r-q`Ro(U5H$NncP+v|6LKe7Dp|)cN` z7?$|qB$*vgxm*iM(D)YaV3ky!<~zDGhwkuVTFUGCtdWKRwq3ubAK zr&CvF8mVuWnd3^MW&_ps$=T?tn4+xbVNJU0-y{>)8ZpF&O`Vy9pQq896pnw_TmEY; z$djTh`!M19-K{d<08If_yZTElj>IU9yHJ^p#HLs;!K^Hj!kk-C8wYgSxVwD{u;#Y< zjA9hO<#bTa6*}FPdmL=DhEklU@~OR|wdpANf)$zpy(=IvptM5AHl_{`%-KmAJ)(c& zY@IWIyC@NsRX(`90|3CPxQ~(dp7U;sPC8Ip9VNY=?s6DFcxKr5>Ei|&IlGH_mnLem z$CM$Sfa%65ayEj~GI(pV^xMUxF6)7grSPN+mvKm>IGr4%3jnx`5Zoe)wXkaBM|;@Otj|%Ov&s zS;zMQ>oh3u({&RCN%dxpVy>p7Zd02sx=Yn*)UsT;E6-i-O>|lq?ZG(i1<>?+D!ld} zmNe|L$0HJl*D1B_gRf?A_YoeSa_ny!Q$ra~6b>bJ(d|93H?bY!YTLXXa2edAWPjio zqQWzv1z72dYu)xX^*==uSCrpKtcssxi0)9znx{ycxVu>g)-PWuW=rL|nBBLHI{v

    $|B8V zsSWRnG2I(JB3;2KSO<;Oay6|=jIqo%h%#1E%TKscIB+SQbaFLvKdCr(gL z4X3!pm&%c;IYzd0$Kwu7zGpG=wRyZehkeh)VVpB?d7`zc3Qrx6?6CMa-Y%W~T)M}F ziiOM18+%A?MQsRB=ih!*#Jqt^mlo|se3CD8j<9D#RRf#!&E)vc*kxcU*f2&C* z;n=!wM;XwO8|md>fLCH=`nH`sW#hgF84#7rfUqS-iA%5vKs+2S@zyHZI3@U~yBEIG z9lv1M;epk<-goH4?r}FA;=ZBS?PAi~>d=*0N$--fBC21c`WjZhXs3laR;@15*^;$v zU6x-{%DWpAihLpdfZV@>18e(0EatKDs;ku7yRkweiQm9s zhbITRcHn?&KCy8%yGH@IXVvUk)ej6apueWX1^Uv`63#D}q`f2OcMY7LTuwfwp6e&Ypp_b&j3@4YVL-fA*y$tU zT}@YL)@JgSci8#u8g}eG{7$Nj>OR5Wz<}Do-t~^+SR>`e*y0NesN4^n9N7$KBcq3O z)-#}ZaN^CD4ro(V{8jv_Xf>0ZPL4V$nP51Y;X zj6NTN4}UekHA$5e@|!y8-zT>mDu0tpDX#rB*p{h&XuBTmYb@JCGjuZfX<#015#MEY+hJyG~U$inj+HA zjpMLp7tSZ+T55vBYXhZWT<%45iA%D}*=3w^q1e6q3~&X8Pe{*5qa}L=HxwH6sfK)E zUPFQ#0c-VZh8*a+m8Dsy7O(wA@p!oQ?XWX2oqAw(raA>1bPrD(bPt@_J3#k}v6M^R zyx|?p_)Dux;x?syN%$tkwe5HWxIt7I=44K}tcr0NcW^w4uy_v)1`3_467tb7@pLUX z`gNkvdmvgXxusX?Q~aZsjmQnX({OmN3QTW$^2}f@C7n!%4@3Y9ZecsZ@$NGRy8ph6 z(48gg8??Aqty@MZm<>2sMPwhQ_qK!#hz{U#wb2FmiSMlp=$;7!+RumW0Lv<%$C6QG zbBpWo?|B5jlLdR}URwc}KEJKoS?p0qCSbv4#U+{CE{i0@{NPbj`^4$i{kz_cj9+RA zJ~({btSLmbA;4vuNq8&>r$+BjO-LC5E)hNC=K(Heg$%_opbvT2 zwl`-YCS1$kyoK4XGdUsh(XcNA+M77BneO>lvpIgP(U*LA^qYsLlG*Y*A{mF@iCCiz za5?4b9Zz+dl~Swg9FOQM+HsZ35S*t!`t|ky+-$q+=BZc3$`jmkD(y_}JgUsI^t`>q z@++li4D3z??HX2GWy|X5O)N%#zS}`}dD52h^{rg1e%+ZJLyLP`Cl({uXFVPuX$Dvd zj$|GO_EYMU`T-|R@sw>!cLxq)rHSti?Qwi}f*P;k9R^j<)udYjH8#kD5ho~`51)RT zu%ld*UE0gL#Q_0{07SGKV+wDu~vZJe7@{zz)Zx z$6+UpcChRv4yRQ){g$kBDdT;J#5?z7o@?LbND@?wm4%nUEj>e{XW3&bw zd(oggZG=WC8eMMjMHyF;7o^UjGV(i$OVaOdE7^#99YHyxdAgOKM{Vlx=!Z?opzRrJl4*%G*{09u<(|f;v zAd-NL|6Sz+H$3*tUGcMKhORB(@{|MJ!A4n8d2{P+aij1h*t1g$(I4WnxQ`~i_Q}=- z_(8;Yn3EzX$?vSo2K^OMD?HMNG^Xwn{?f*8{7+mH{&}hRrR{~$_12kiZfZYSD?HMZ zysjw8ZR;*8EE_4vG4jgsPix6e=##?%Hoxt4vQ#Kd*5qjul||SuYdVNM@h8Aj9X=?_ z1ev`uTAk=5V&T*x^fGz`+#yofm1pMPoKJp|Nv;f_Y@3hytOIe)k0|A1xem&@*hS~nj2id)LJ~Js{b1k&-1Q1joLi#nj2j6ylYNGVxD)+ z39fnGH7B^{?Ok(%>(_rF_rICb&fB}@wle-t|MyA%-Lf~&yXGcc^So{9G~CC&fo9)9Uy=1 koxk7p=lJ|C_Sb$#_PfIW_j%{f8Rs;n^Y*T}!S(F_0M3x}WdHyG diff --git a/docs/img/callout-information-multiple.jpg b/docs/img/callout-information-multiple.jpg deleted file mode 100755 index ca3c77a041ce263905972f827e3cd04485b09264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52638 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 Gul^q@xIY^J diff --git a/docs/img/callout-information.jpg b/docs/img/callout-information.jpg deleted file mode 100755 index 9c6e6fb20b4a205ef3910b4555d3737c33ff2c11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45178 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 diff --git a/docs/img/footer-navigation.jpg b/docs/img/footer-navigation.jpg deleted file mode 100755 index eb74c0bad299ece50d58a3e7464ffbe2c486b932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21029 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 diff --git a/docs/img/hero-captioned.jpg b/docs/img/hero-captioned.jpg deleted file mode 100755 index c41e13d7f358c9354d2450ecb76818adac538cbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31871 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

    =Jbz@WxhKvCN*suz#00c&UN#= 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 diff --git a/docs/img/hero-simple.jpg b/docs/img/hero-simple.jpg deleted file mode 100755 index f0a32513eb8f997c0f0d55f7c06a8778add86881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26224 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 diff --git a/docs/img/icon-callout-1.png b/docs/img/icon-callout-1.png deleted file mode 100755 index 247fbea6f009fd8f041d757c724d568fa557a224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1033 zcmV+k1or!hP)Px&!%0LzR7efARa;0@Q50P>lhdT7HmR9CObAOYD=LE?KfMTg5JmXWPZk70KN0=Z zM+H59g6Ktk^dgCjrUyhN83k!kR#aprJv8YJ;*8p;q5Jbmxve+_3LG=j^lB zI{WN>&aok}*klUT9{H<2J;MeK8QQd&3Z3JLB5~l*t5~Ic*h0UH4-AVwctNIii!$1%5Zoy2_s7M? z%@|#9>W|5Y#0Aoq7{t*}kp!n}h{@FG(7HDXiX%GH zq@iOci6xpt2g2b<-I+MZkYy#ByZjo}u~{D)p>F8%^Q`oZ7_gZ`9>^ftTfg)To1p60 zEVZyA44|p*exDKQ*a0J9C$68qB@2kT+5gW11XII?94I|Pl60c-+#9@map(V#7*L2w zY;r`dHs+AGVJnVpJ&s_221^-UE9F+L>k+HW6N{L{);YrJDkEta%?;fcoasl=^cm8( zJSJkd7Mnc0o+JBFaiB^jeiPNUR1wmdTN{$6+2m6q&n&V; zvoURMJ{FbD!nl%&NOfl-Ih8ixhtCIJ%Xid2e1>Z$@8MBZgN(9_m@}Vf44L%f=7^+> zet;;!<#9rq=pa#!@gk;hH~gZ^kyn)4MPx(yh%hsR7ee_R$FY8MHK$F+tzItTDr7=AhyItD2qEiK!2+x~vv{QvCE z$}YutlG*>v%sJmT=ggUz4PkZ((L^mL_}acaJ*Uk$y5=&9oU@4~3FF=73Y1r`N5R}j zke6SMoZN-RX=ds&5|cfMUpa)HjxVt7p>B>(vsrRu=Kf?OR5W3{*|ZF+*1m#h@kY~k zJ+IZLF*f`ueme3RUV7pWPFvzM%S?nK%SS`!lel&H`v~Pk(>!MDcr#<@{cS5Yt^ACp zlWdAMDFSyz{hP4A`*~DU?fuVWLec`|D-2=zd#@QIE}N7{=XNf~n#Y>BOs(wyN(iw94`W{0=Qw_FkYK84Q||gInmPFD;%>xl z-k<@=>N!A3uCEVH0qvu{Zhwop+;zo34ejFGsS})U9s+2ZlEF*+@%ZAWIUsMdpNcLY z+qT!@m^a1d#g2Pk!+@72M~6I5bGF@g%JaJ8X(p!AI_!B%+fsH0Q`mlLLyF8NtgT;9 zJ-muF*--;LRmNTxi81O!)j)Z~Hz0gc>WYA-6{*y5A`Bl}dua$o8bRrjwenJW7IA8l z!Jmt3r0p8bDLumVCT^)q{L_s!|*(PaZz_eAZFlSdI571wTFpwqq@KX8FTbf!CUdM=Sa{mjvnTXs#kd4T7xfy9c&$^?;K z?g6%5up|5mQ`q95xe8HD+r5An_ZmLBdlAlai<(o}CCUiz=IwNqWWVr;B%B3cIx)`2 zcr#kRZY2VjhlDL~nR)0tJBgCAII8chW8Xa$>}D1b^s#FDxkG9D5n{LLy?4;KqlKO# zGby!%LX-UrpOSu5-WlN|dI$SAL@MVr5!ts*4R~YAhaCTtjdz#9=YdZby)08`X}o}F z(J-oNYmgHTZq0PVtUaZ%amP-)^~}e#>1E@CWnL_kY?n|2ic;k}fwseaINf>z%T~rv zx|lT>nk8CRV^{n4czyHR_;S|~Vu(zaiLQxcwljgS49wpGJ~S*OJ|0-T?sh!7<$kQV z=Pne*%1~IOIabQZ2u23~LRZ_*II!m!er!3*QC%R~GhXNEWb9|%Batfl0ycr`?&sSM z-76Zimzc7l6Q@1WTcPxcNMkxZ$;hZ1$rPbGXNmQA>ZquR%x;B1MXCx^Q~E5C*)#Uj sQpn!KUQI_Ku)Bq*8l(j07*qoM6N<$f}sI)zyJUM diff --git a/docs/img/icon-callout-11.png b/docs/img/icon-callout-11.png deleted file mode 100755 index 0dab38a001b718738ee5bdb2310c9f0560de74a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1118 zcmV-k1flzhP)Px(7)eAyR7efARb6b9MHD@|+t#IpLRX4dz(QigLclZ>OaxyL2nogzh#}Dz(8NT; zi!r|Vq9*>}iwQv?zE~tQ#2Ts+{z53hqyT0%97znH9G{Ewh3heC%39p+Vs6FmyCxHoK2UpwAuOAFd5rjkHnQq-n=rHd9hQUdbL;QyUwefi zES;7|8cQSSX!G#;j`>*rY#l#SUv{q&L1M;gOe_5wXO46eOcia)UH^(^G7en+9EpcF z%HSl~+uCePutMD|?9+Sxr6#Re-G@RiPnB zQ3I#T&Idtre~=@uwPgK?GeJ<(mE#Uh_GJBOoRq<~M;lROmauBgdXC)@XnSibJey~}WN zkdN_ZG#+duSQj+#oV@q>fM^ zI@%FFC7pP5ah#9nBF_IGsmQ*otHJwQ_7LN5DtnT_&o*lsBx+(Q)YtxjqT*guR8=Ax zOFuluKmL!7v3C0oeE9NSE^epxP=#x{o*$tMic;l!6HUiD@N?sjn71H->1DGS>^RY~ z8ZVwbh4(gZ!?&NEAcn})Ow^NvYa|RrcT-OZpIsIb9|bIZ<}s|>vI37UdjiFYQWO@; z2i)lELtpnlxY+a)4plec`}#|?s(~nHebgK>&d1D=NEQ7gs=)bJVJdYBRW?<%M5m$0 zNjd7J>i9$?n>tG-GLDUeMdBQiPTJV*YE&@I#&smR^f k?X%a(7KEa4a}LAh7QJU}n8%wc)Bpeg07*qoM6N<$g6GR0bN~PV diff --git a/docs/img/icon-callout-12.png b/docs/img/icon-callout-12.png deleted file mode 100755 index 16be48b7a1971d9b14946809ca29012306e2308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1252 zcmVPx(o=HSOR7ef2Ratk}{Z4^3@{4xLWhx$bq&Ju~Ox z)B$lP`<~Z6Yn}Z#_xO-sd}2cNyR8{>r(T@lpaPw?pNCJ5C;8Il9HKTa$gD5Pj zguh^++LWF?kEzrUCNA#B(9fS@>zYBCpAj|W%FO=EMo4c0c(r30?rwYmCG$3@vAy%3 z{TU?2KF0TlUc&Q_{wB+Y*khTCkYq*J-LoDyR_%b#U*g%3Z{Va8INjfZjkTYMX-bsd zW`y9jaC{xw2cN~#nq5~-MkF4Pdx=3ToqMh*u?e+jJAc@K^2!&b9PBk?e`PKA5`$Qb zmPHzH5g6J6Jl$G_)em>bF?q6U6(1sHYcW5%2S@jf2pB6`l{;H{GY5Nre;1KOk8y$$ zlw;f%79%&)y_bMtX2q3|>{=HAs*5Fd(m$01_6qd*DPtk+$k}$Rt9V>`?gPr~uYmI1xS^~Mv9b0+CoR)fT}<2?CG)=ps(TZh(1&op6uQ?v9{ zh@Ytdj;sJ`LNb#>78U|+RX~Ls_(?f;%B{taAndpqs1>hW2|!~rmx_?2L6qLmXe^rM z3$q+!P(qa8ZMsa>$oc{yrF18N@-84MIwba#0@-{2Jl$7cjUAM}zd%0pFooGOpCK$nQE-7a1)du4 z7KfQPZLg3}ZP``{-0Ft$f)v&s)};}R&6s2e18^K3Qi)xOW^T5Y`Dncf*s@4l(6dK+ zfw=9V#%7#U4z=avgncGGm*-n7Z0*%qvOncIto;e-;svn9!sY=P`5BClp0jQ8^-Cog zu{xmHO$6`Ys&3%ugKT?iEN&Ro09OeN(p-h|H2I|WR9#+13z%%g+h zlPO#uoj~0^t7M$HCepup@k!)5-hKmZ+heksWGbYFkbn$rTAq?~xMf999?{!n{NG4P z_I1Z@yt4Uy!8jv&QDMu+CX^wjmB!kBMM-!JHT8GGA7CY4xiE}v+gtJ46CcW^)1srI z#AOscgq)z4EZ<3V9T-M;=P@j+ji9t*u{fK@TdBsr?~dT*P22F6?A}I_ZL-H)br|-10Z-4V!}%%bh9! O0000Px(UP(kjR7ef2R$FXTWf193% zd{7c%RN|cn6T-#t0!XMp4doIH1}H&8r6NiIX`lh5fPxSkx)fTv-Ce)$oc-N%=sDdY zOfq}^%glWL%s(^#29TWs6cOj7zh*AYl!KFwvGzPk%6?=(f>?WK2ujOmqj$gQ2!%_L z)9YzVDcSiq;vG$ByYoGo&hEyt*DrHDK{nu)nDfUEP~HUbY0Xf)IQawQ=2u#Cr)Jl2 z0(V<>;Mc<|v0~02+%~{2NiRTwg;CWo7lX^bLLevCrIBrtO5Vkl^Gop7=x-_7L6*1w zk&HV@^Cz(L@;ewZYV$*b$&wBzUD=Q=`|h=4krUANY}3g~3@H7O>EPTm@;&=XS2koz z(Q<$W(-sukUU+*=879uE;W2fxN2LIwMN`nfa2M+LH`ACh+DdnQTG^J!R8kL@0Dc0Vh)#v z(c2wm)byud+P3a8AV6^h1;vy7bSepGXw@|!`ZGiOyIBFouyBe(nR%CyZJS49%ixbZ zj3Cm7K6ul*>%i7q_FnC6yQ2Sbc$s86+*6tRk!@Rm0RtF9IP#RA{J|FYPCf&_ad>8} ziic@+m3L;(8rilL11qHRFo;x2->g*3oA~iLU~FGowEhmT^kNn@+qUw<0<@*?x2aaT zrSjguu?nDqcP2VQ&!?Zw;++H?wv{j{$OKw%-_V{Py_yFcC0I$iC2VIHrxC2BySp>S zY}=Ad=?(=LM^nQw6qUSSWSrkQQD7TWKdj@CZn7mevhG$4vgi8!h6iY5O?r}S3&R1} zj{RRB!uY96TwzXY&t+K{FfA4F9^YppaMFoZKfqMdvJL1sDVh{&q*iCZWv@+de3RfFD@MK{d%3pqk z^B$E6<-94t$knX>64k3~DIhQ_qy|t*3T={4$qfvzi0~0*wf#>}f&EZZg-;f4p^ZPu ztX9i@mu9Vo)rs2bi^$Du!KiW1BPXa#?l~!p)vMRwv&CDfbcM`jXuV*Hq6<(9@>1!0 zAIA?|#p$}=Fm!Yj1p`?Cfh-|rHl9226Fy$>IreNgOdA4IGjaW|@iL;!)ln7MEgM!qx#dC@}j$uW|B=t1*!}b z%OeA1-5KXD>JHEdO2&YjvC*^3$!?GG#>|awm+!w3cSbUgm5qb|0000 CG&VB; diff --git a/docs/img/icon-callout-3.png b/docs/img/icon-callout-3.png deleted file mode 100755 index bfbfe75f2ce6e6040152e95e91d15d0c1a4af1ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1264 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 KY}?1qT<|Xvw>abg diff --git a/docs/img/icon-ism-trash.png b/docs/img/icon-ism-trash.png deleted file mode 100755 index 5aade01ac0a2be76677aafc15f23c67288c9e729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2213 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 diff --git a/docs/img/information-panel-horizontal.jpg b/docs/img/information-panel-horizontal.jpg deleted file mode 100755 index 17ead6bb3f6742bba3211be765d258e4894e138e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65526 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 diff --git a/docs/img/information-panel-vertical.jpg b/docs/img/information-panel-vertical.jpg deleted file mode 100755 index 2d93729023380138d258c58fbce1339d0aa20769..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77225 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

    M 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 diff --git a/docs/img/leadership-grid.jpg b/docs/img/leadership-grid.jpg deleted file mode 100755 index 30f52ac5a3d5e8b85cb8a869ccf21fa2b12ad948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68355 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 l3vm~eT!_1% - - - Group - Created with Sketch. - - - - - - - - - \ No newline at end of file diff --git a/docs/img/news-item.jpg b/docs/img/news-item.jpg deleted file mode 100755 index 9101e95ff248184e9d39a440e14da2a9e918a554..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24770 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 diff --git a/docs/img/post-list.jpg b/docs/img/post-list.jpg deleted file mode 100755 index 92af3972531d7f447572873c644c7be9828baa2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62056 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 diff --git a/docs/img/publish-notification.jpg b/docs/img/publish-notification.jpg deleted file mode 100755 index e96cde87f13cafe36eb1b1b051b102e9a91d0c18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35506 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 diff --git a/docs/img/site-publisher.jpg b/docs/img/site-publisher.jpg deleted file mode 100755 index 800a6cd4085f5b84bfbb969d47b57311ed4d7972..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45022 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 diff --git a/docs/img/text-block.jpg b/docs/img/text-block.jpg deleted file mode 100755 index 79cc1d33c064e59793664c9b79a8507c9ccc6cc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45160 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 diff --git a/docs/img/text-header.jpg b/docs/img/text-header.jpg deleted file mode 100755 index a4cef2503830e8c982d46eb7d1f980f2d6223801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26847 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 diff --git a/docs/img/top-navigation.jpg b/docs/img/top-navigation.jpg deleted file mode 100755 index 49b675192d4b1c3d39b843322680ca981dd0b1b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18317 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 - - - xandr-logo - Created with Sketch. - - - - - - - - - - - \ No newline at end of file diff --git a/docs/imgix.md b/docs/imgix.md deleted file mode 100755 index 91cbbe34..00000000 --- a/docs/imgix.md +++ /dev/null @@ -1,65 +0,0 @@ -# Imgix -Imgix is a real-time image processing proxy and CDN. It can resize, optimize, add filters and effects and do other amazing image processing tasks on the fly - and then deliver those processed images to your users through their blazing fast CDN. - -I know that sounds like a commercial, but I don't work for Imgix nor am I paid in any way by Imgix. I am, however, one of their biggest cheerleaders because I think the service is so amazing and so fundamental to a scaleable WordPress stack that I can't imagine not using it on any WordPress site my clients engage me to build. - -> Fun fact! If it weren't for Imgix, this plugin simply wouldn't exist. I was rebuilding a site for a client that had over 30,000 images, moving them from a custom rails based CMS to WordPress. On top of that, the design of the site was going to be changing again in the short term future, so I had to solve a lot of problems around media storage and handling with regards to WordPress. If the design was going to change in the future, requiring new image sizes to be recut and generated, doing that for 30,000 images was going to be a nightmare! But, because I knew Imgix could do all of this cropping and resizing on the fly, it was just a matter of writing a plugin to get Imgix integrated. And now here we are, four years later! - -## Configuring -Before you can configure Media Cloud to work with Imgix, you'll first need to setup a source on Imgix. That's a bit beyond the scope of this documentation, but [Imgix's own documentation](https://docs.imgix.com/setup) is very thorough and easy to get through. - -### Imgix Domains -Once you've created a source in Imgix, add the domains you've setup in the source here. - -The reason you can add multiple domains was to support domain sharding which in the good 'ol HTTP/1.1 days helped improve performance on image heavy websites. But Imgix now uses HTTP/2 which makes domain sharding irrelevant. We only allow multiple domains to be specified for backwards compatibility. - -### Imgix Signing Key -It's ***highly recommended*** that you set up image signing. You can read more about it [here](https://docs.imgix.com/setup/securing-images). - -Once you've enabled Secure URLs in your Imgix source, copy the token from Imgix and paste it in here. - -### Use HTTPS -This should always be turned on and I can't fathom why you'd want it turned off. But in whatever weird edge case you've found yourself tangled up in where you need to serve images from Imgix over http, you can disable https here. - -## Image Settings - -### Lossy Image Quality -This controls the output quality of lossy file formats such as JPEG, progressive JPEG, WebP and JPEG XR. - -### Auto Format -When this option is enabled, Imgix will determine if an image can be served in a better format using automatic content negotiation. For example, it may serve WebP images to Chrome users when this is enabled. - -### Auto Compress -Imgix will make a best effort to reduce the size of the image. This might include applying more aggressive image compression. For example, PNG images might be served as WebP with an alpha channel to Chrome users, but to everyone else they might be served as PNG8 images, if that conversion can happen without much quality loss. - -### Enable Alternative Formats -Enabling this option allows you to serve non-standard (non-standard in the WordPress sense) image files through Imgix, such as Photoshop documents, TIFF files and Adobe Illustrator files. - -Note that if you do use this feature and decide not to use Imgix in the future, any of these "alternative" images will no longer be viewable on your site. They will only be viewable as long as Imgix is enabled. - -### Keep WordPress Thumbnails -Because Imgix is dynamically generating all thumbnails and all of the various image sizes, having WordPress create those thumbnails is pointless. If you are only testing Imgix, you may want to keep this option turned on in case you decide not to use Imgix. - -Note that if you are using the Direct Upload feature, no thumbnails will be generated because uploads skip WordPress all together and go straight to cloud storage. - -### Render PDF Files -When this is enabled, Imgix will render the first page of an uploaded PDF file that you can use like any other image on your site. - -Like *Enable Alternative Formats*, if you disable Imgix in the future, however, these PDF previews will appear as broken images on your site. - -### Detect Faces -After each upload, Media Cloud will use Imgix's face detection API to locate all of the faces in your image. This information can then be used with the Focus Crop of the image editor to automatically center cropped images on faces or groups of faces. - -If you find yourself using this face feature a lot, you may want to consider using [Rekognition or Google Cloud Vision](vision/index.md) which will give better results. - -## GIF Settings -Imgix has amazing support for animated GIFs, including the ability to resize and crop them on the fly. However this functionality requires a [premium Imgix account](https://docs.imgix.com/apis/url/format/fm#gif). - -### Enable GIFs -When this is disabled, Imgix will convert animated GIFs to static non-animated images. As mentioned above, to have Imgix deliver animated GIFs requires a premium Imgix account. - -### Serve GIFs from Storage -When this option is turned on, all animated GIFs will be served from storage, skipping Imgix. This will only display the original size GIF as animated, as WordPress will convert any animated GIF to a static image when it generates its thumbnails and other sizes. - -### Disallow Animated GIFs for Sizes -When Imgix GIF support is enabled, it might be desirable to display the static version of the image at certain image sizes instead of the animated GIF. List those image sizes here. \ No newline at end of file diff --git a/docs/index.md b/docs/index.md deleted file mode 100755 index 5689304b..00000000 --- a/docs/index.md +++ /dev/null @@ -1,29 +0,0 @@ -# Media Cloud -For the most basic use case, Media Cloud will automatically copy your WordPress media library to a cloud storage provider such as Amazon S3, Google Cloud Storage, DigitalOcean Spaces and others. You can also integrate with Imgix to enable on-demand image resizing, real-time non-destructive image manipulations and content delivery through their CDN. - -Not interested in Imgix? No problem, you can configure Media Cloud to deliver your content through any other CDN such as Amazon Cloud Front, Fastly, Cloudflare and others. Media Cloud also has a built-in dynamic image sizing and manipulation feature similar to Imgix (though not as full-featured or as fast as Imgix). - -Media Cloud also allows you to automatically tag and moderate your images using machine learning computer vision via Amazon Rekognition and Google Cloud Vision. Automatically find faces in images to enable smart-cropping so that your cropped images are always focused! - -You can also setup Media Cloud to serve your theme assets such as javascript and css from a CDN in a push or pull mode. - -## Quick Start -If you want to jump in quickly, we advise that you do things in roughly this order: - -1. Configure your cloud storage provider -2. Configure [Imgix](imgix.md) or [Dynamic Images](dynamic-images.md) (if necessary) -3. Configure [Direct Uploads](direct-uploads.md) (if using Imgix or Dynamic Images) -4. Run the [troubleshooter](admin:admin.php?page=media-tools-troubleshooter) to make sure everything is copacetic - -Once the plugin is configured and the basics are working, explore the more advanced features to get the plugin working -the way you need it to. - -## Support - -You can reach our support forums are available here: - -[https://talk.mediacloud.press/](https://talk.mediacloud.press/) - -Our FAQs are also available here: - -[https://mediacloud.press/faqs](https://mediacloud.press/faqs) diff --git a/docs/integrations.md b/docs/integrations.md deleted file mode 100755 index b8457008..00000000 --- a/docs/integrations.md +++ /dev/null @@ -1,42 +0,0 @@ -# Integrations -Various integrations with other WordPress plugins have options that you can configure to customize how Media Cloud works with them. - -## WooCommerce and Easy Digital Downloads -### Use Pre-Signed URLs -When this is enabled, Media Cloud will generate signed URLs for downloadable products that will expire and become unusable within a specified time period. - -### Pre-Signed URL Expiration -The number of minutes that a signed URL is valid for. - -## Master Slider -Note that with Master Slider, if you are using Imgix or Dynamic Images, the images will be resized and cropped to exact sizes. If you aren't using either feature, than the closest pre-defined image size will be used. - -### Resize Image -If this option is enabled, images used in a slider will be resized, if using Imgix or Dynamic Images. If not using Imgix or Dynamic Images, the closest pre-defined image size will be used. - -### Override Image Width -Setting this will allow you to override the slider's default image width. - -### Override Image Height -Setting this will allow you to override the slider's default image height. - -### Crop Thumbnail -This controls if the thumbnail is cropped or if the thumbnail is scaled to fit. - -### Override Thumb Width -Setting this will allow you to override the slider's default thumbnail width. - -### Override Thumb Height -Setting this will allow you to override the slider's default thumbnail height. - -## Smart Slider 3 -### Upload Prefix -When Smart Slider 3 resizes an image, Media Cloud will automatically upload it to cloud storage. Normal prefixes that you would set in the Cloud Storage settings cannot be used and you are limited to using: - -- `@{site-name}` - The current site's name -- `@{site-host}` - The current site's domain/host -- `@{site-id}` - The numeric ID of the site (when using WordPress multisite) - -## Next Generation Gallery -### Use URL Cache -Due to the way NGG works, to speed up things Media Cloud will cache the URLs for next gen gallery images. If you are seeing issues where images aren't updating, turn this off. \ No newline at end of file diff --git a/docs/storage-browser.md b/docs/storage-browser.md deleted file mode 100755 index 8ce43f3e..00000000 --- a/docs/storage-browser.md +++ /dev/null @@ -1,20 +0,0 @@ -# Storage Browser -The Storage Browser is a tool that allows you to browse your cloud storage. You can upload, delete files or folders, create folders and import files or folders to your Media Library. - -![Storage Browser](https://i.imgur.com/l7cwwIa.png){.responsive} - -For the most part, everything should be relatively self-explanatory. However, a few things should be highlighted: - -### Uploads -Uploads only work if you have Direct Uploads enabled. In fact, when Direct Uploads are disabled you won't even see the **Upload** button. - -Everything you upload through the Storage Browser will be imported into your Media Library, however, just like with normal direct uploads, thumbnails will not be generated. - -Though you can drag and drop files to perform uploads, you currently cannot drag and drop folders. - -### Importing -Importing images will not import the related thumbnails. In fact, if you import a folder that contains images and their thumbnails, the thumbnails will be imported as separate images. - -### Deleting -You should be careful deleting items from cloud storage as Media Cloud will not attempt to match what you are deleting with items in your library. This could possibly lead to situations where items in your media library have no corresponding images on cloud storage, leading to broken images on your site. - diff --git a/docs/toc.md b/docs/toc.md deleted file mode 100755 index 246d8aa7..00000000 --- a/docs/toc.md +++ /dev/null @@ -1,47 +0,0 @@ - -- [Cloud Storage](cloud-storage/index.md) - - [Setup](cloud-storage/index.md#setup) - - [Amazon S3](cloud-storage/setup/amazon-s3.md) - - [Google Cloud Storage](cloud-storage/setup/google-cloud-storage.md) - - [DigitalOcean Spaces](cloud-storage/setup/do-spaces.md) - - [Wasabi](cloud-storage/setup/wasabi.md) - - [Backblaze](cloud-storage/setup/backblaze.md) - - [Pre-Signed URLs](cloud-storage/index.md#pre-signed-urls) - - [Upload Handling](cloud-storage/index.md#upload-handling) - - [CDN Settings](cloud-storage/index.md#cdn-settings) - - [Display Settings](cloud-storage/index.md#display-settings) -- [Imgix](imgix.md) -- [Dynamic Images](dynamic-images.md) -- [Direct Uploads](direct-uploads/index.md) - - [Installing FFProbe](direct-uploads/installing-ffprobe.md) -- [Vision](vision.md) - - [Setup](vision.md#setup) - - [Rekognition](vision.md#configuring-amazon-rekognition) - - [Google Cloud Vision](vision.md#configuring-google-cloud-vision) - - [Vision Options](vision.md#vision-options) -- [Assets](assets.md) -- [Batch Processing](batch-processing.md) -- [Crop Tool](crop-tool.md) -- [Image Editor](image-editor.md) -- [Image Size Manager](image-size-manager.md) -- [Storage Browser](storage-browser.md) -- [Integrations](integrations.md) - - [WooCommerce](integrations.md#woocommerce-and-easy-digital-downloads) - - [Easy Digital Downloads](integrations.md#woocommerce-and-easy-digital-downloads) - - [Master Slider](intergrations.md#master-slider) - - [Smart Slider 3](integrations.md#smart-slider-3) - - [Next Generation Gallery](integrations.md#next-generation-gallery) -- [Advanced Topics](advanced/index.md) - - [Environment Variables](advanced/environment-variables.md) - - [Hooks](advanced/hooks.md) - - [Command Line](advanced/command-line.md) - \ No newline at end of file diff --git a/docs/vision.md b/docs/vision.md deleted file mode 100755 index 20010343..00000000 --- a/docs/vision.md +++ /dev/null @@ -1,123 +0,0 @@ -# Vision -The Vision feature of Media Cloud enables automatic image tagging and classification using machine learning image classification services like Amazon Rekognition and Google Cloud Vision. In addition to image tagging, these services can be used to detect explicit images for moderation purposes, detect faces and detect celebrities (Amazon Rekognition only). - -  - -## Setup -Getting setup is easy and straight forward. - -### Configuring Amazon Rekognition -You must be using Amazon S3 as your cloud storage provider to use Rekognition for Vision processing. Rekognition will use all of the same connection info as cloud storage, so to get Rekognition working requires only a few added steps. - -If you haven't already setup Amazon S3 cloud storage, you can get started by reading [this documentation](cloud-storage/setup/amazon-s3.md). - -One important thing to note is that Rekognition is only available in a subset of regions. Consult [this chart](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/#Region_Table) to determine if your bucket is in one of those regions. If not, you'll need to create a new bucket in a region that Rekognition is in. - -If you followed the Amazon S3 cloud storage setup, you'll have created a policy specifically for use with Media Cloud. Navigate to your Amazon Console and then navigate to the [IAM service](https://console.aws.amazon.com/iam/home#/home). - -In the IAM service, select **Policies** on the left and then find the policy you created when setting up cloud storage. Click on it and you will be in a **Summary** screen for the policy. - -Click on the **Edit policy** button. - -Make the following adjustments to the policy so that it looks like this: - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": [ - "s3:DeleteObjectTagging", - "s3:ListBucketMultipartUploads", - "s3:DeleteObjectVersion", - "s3:ListBucket", - "s3:DeleteObjectVersionTagging", - "s3:GetBucketAcl", - "s3:ListMultipartUploadParts", - "s3:PutObject", - "s3:GetObjectAcl", - "s3:GetObject", - "s3:AbortMultipartUpload", - "s3:DeleteObject", - "s3:GetBucketLocation", - "s3:PutObjectAcl" - ], - "Resource": [ - "arn:aws:s3:::YOUR-BUCKET-NAME", - "arn:aws:s3:::YOUR-BUCKET-NAME/*", - ] - }, - { - "Effect": "Allow", - "Action": [ - "rekognition:DetectLabels", - "rekognition:GetCelebrityRecognition", - "rekognition:GetContentModeration", - "rekognition:DetectFaces", - "rekognition:DetectModerationLabels", - "rekognition:RecognizeCelebrities", - "rekognition:CompareFaces", - "rekognition:DetectText", - "rekognition:GetCelebrityInfo", - "s3:HeadBucket", - "rekognition:GetLabelDetection" - ], - "Resource": "*" - } - ] -} -``` - -Replace **YOUR-BUCKET-NAME** with the actual name of your bucket. - -Once done, click on **Review Policy** and then click on **Save Changes**. - -Rekognition is now configured and ready to use. - -  - -### Configuring Google Cloud Vision -Google Cloud Vision, unlike Rekognition, can be used with any cloud storage provider. - -If you've configured Google as your cloud storage provider, the only thing you need to do is [enable the Cloud Vision API](https://console.cloud.google.com/flows/enableapi?apiid=vision-json.googleapis.com) in Google Console. - -For other cloud storage providers, you'll need to follow the first four steps in [their quickstart guide](https://cloud.google.com/vision/docs/quickstart-client-libraries). You do not need to do step 5. Once you've downloaded the credentials JSON file, you will copy and paste the contents of that file into the **Credentials** text box in **Vision Provider Settings**. You are now done. - -Note that Google Vision is only available in the paid version of Media Cloud. - -  - -## Vision Options -### Detect Labels -Detects instances of real-world labels within an image (JPEG or PNG) provided as input. This includes objects like flower, tree, and table; events like wedding, graduation, and birthday party; and concepts like landscape, evening, and nature. - -### Detect Labels Taxonomy -The taxonomy to apply the detected labels to. - -### Detect Labels Confidence -The minimum confidence (0-100) required to apply the returned label as tags. Default is 70. - -### Detect Moderation Labels -Detects explicit or suggestive adult content in a specified JPEG or PNG format image. Use this to moderate images depending on your requirements. For example, you might want to filter images that contain nudity, but not images containing suggestive content. - -### Detect Moderation Labels Taxonomy -The taxonomy to apply the detected moderation labels to. - -### Detect Moderation Labels Confidence -The minimum confidence (0-100) required to apply the returned label as tags. Default is 70. - -### Detect Celebrity Faces (Rekognition only) -Detects celebrity faces in the image. This will also detect non-celebrity faces. If you use this option, you should not use the **Detect Faces** option as either will overwrite the other. Detected faces will be stored as additional metadata for the image. If you are using Imgix, you can use this for cropping images centered on a face. - -### Detect Celebrity Faces Taxonomy (Rekognition only) -The taxonomy to apply the detected moderation labels to. - -### Detect Faces -Detects faces in the image. If you use this option, you should not use the **Detect Celebrity Faces** option as either will overwrite the other. Detected faces will be stored as additional metadata for the image. If you are using Imgix, you can use this for cropping images centered on a face. - -### Always Process in Background -Controls if Vision tasks are processed during an upload or queued to a background task to be processed at a later time (usually within a few minutes). - -### Ignored Tags -A comma separated list of tags to ignore. diff --git a/helpers/ilab-media-tool-wordpress-helpers.php b/helpers/ilab-media-tool-wordpress-helpers.php index 45576a1e..e29af24d 100755 --- a/helpers/ilab-media-tool-wordpress-helpers.php +++ b/helpers/ilab-media-tool-wordpress-helpers.php @@ -109,4 +109,10 @@ function ilab_admin_url($path = '', $scheme = 'admin') { function mb_strpos($haystack, $needle, $offset = 0) { return strpos($haystack, $needle, $offset); } +} + +if (!function_exists('mb_strtolower')) { + function mb_strtolower($string) { + return strtolower($string); + } } \ No newline at end of file diff --git a/ilab-media-tools.php b/ilab-media-tools.php index 7c74967c..ad790056 100755 --- a/ilab-media-tools.php +++ b/ilab-media-tools.php @@ -5,7 +5,7 @@ Plugin URI: https://github.com/interfacelab/ilab-media-tools Description: Automatically upload media to Amazon S3 and integrate with Imgix, a real-time image processing CDN. Boosts site performance and simplifies workflows. Author: interfacelab -Version: 3.1.7 +Version: 3.2.0 Author URI: http://interfacelab.io */ // Copyright (c) 2016 Interfacelab LLC. All rights reserved. @@ -77,8 +77,23 @@ return; } + +if ( class_exists( '\\ILAB\\MediaCloud\\Tools\\ToolsManager' ) ) { + deactivate_plugins( plugin_basename( __FILE__ ) ); + add_action( 'admin_notices', function () { + ?> +

    + div{position:absolute;top:0;left:0;width:8px;height:8px;border-radius:8px;border:2px solid #fff;box-sizing:content-box}.minicolors-picker{position:absolute;top:0;left:0;width:18px;height:2px;background:#fff;border:1px solid #000;margin-top:-2px;box-sizing:content-box}.minicolors-swatches,.minicolors-swatches li{margin:5px 0 3px 5px;padding:0;list-style:none;overflow:hidden}[dir=rtl] .minicolors-swatches,[dir=rtl] .minicolors-swatches li{margin:5px 5px 3px 0}.minicolors-swatches .minicolors-swatch{position:relative;float:left;cursor:pointer;margin:0 4px 0 0}[dir=rtl] .minicolors-swatches .minicolors-swatch{float:right;margin:0 0 0 4px}.minicolors-with-opacity .minicolors-swatches .minicolors-swatch{margin-right:7px}[dir=rtl] .minicolors-with-opacity .minicolors-swatches .minicolors-swatch{margin-right:0;margin-left:7px}.minicolors-swatch.selected{border-color:#000}.minicolors-inline{display:inline-block}.minicolors-inline .minicolors-input{display:none!important}.minicolors-inline .minicolors-panel{position:relative;top:auto;left:auto;box-shadow:none;z-index:auto;display:inline-block}[dir=rtl] .minicolors-inline .minicolors-panel{right:auto}.minicolors-theme-default .minicolors-swatch{top:5px;left:5px;width:18px;height:18px}[dir=rtl] .minicolors-theme-default .minicolors-swatch{right:5px}.minicolors-theme-default .minicolors-swatches .minicolors-swatch{margin-bottom:2px;top:0;left:0;width:18px;height:18px}[dir=rtl] .minicolors-theme-default .minicolors-swatches .minicolors-swatch{right:0}.minicolors-theme-default.minicolors-position-right .minicolors-swatch{left:auto;right:5px}[dir=rtl] .minicolors-theme-default.minicolors-position-left .minicolors-swatch{right:auto;left:5px}.minicolors-theme-default.minicolors{display:inline-block}.minicolors-theme-default .minicolors-input{height:20px;width:auto;display:inline-block;padding-left:26px}[dir=rtl] .minicolors-theme-default .minicolors-input{text-align:right;unicode-bidi:-moz-plaintext;unicode-bidi:plaintext;padding-left:1px;padding-right:26px}.minicolors-theme-default.minicolors-position-right .minicolors-input{padding-right:26px;padding-left:inherit}[dir=rtl] .minicolors-theme-default.minicolors-position-left .minicolors-input{padding-right:inherit;padding-left:26px}.minicolors-theme-bootstrap .minicolors-swatch{z-index:2;top:3px;left:3px;width:28px;height:28px;border-radius:3px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-swatch{right:3px}.minicolors-theme-bootstrap .minicolors-swatches .minicolors-swatch{margin-bottom:2px;top:0;left:0;width:20px;height:20px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-swatches .minicolors-swatch{right:0}.minicolors-theme-bootstrap .minicolors-swatch-color{border-radius:inherit}.minicolors-theme-bootstrap.minicolors-position-right>.minicolors-swatch{left:auto;right:3px}[dir=rtl] .minicolors-theme-bootstrap.minicolors-position-left>.minicolors-swatch{right:auto;left:3px}.minicolors-theme-bootstrap .minicolors-input{float:none;padding-left:44px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-input{text-align:right;unicode-bidi:-moz-plaintext;unicode-bidi:plaintext;padding-left:12px;padding-right:44px}.minicolors-theme-bootstrap.minicolors-position-right .minicolors-input{padding-right:44px;padding-left:12px}[dir=rtl] .minicolors-theme-bootstrap.minicolors-position-left .minicolors-input{padding-right:12px;padding-left:44px}.minicolors-theme-bootstrap .minicolors-input.input-lg+.minicolors-swatch{top:4px;left:4px;width:37px;height:37px;border-radius:5px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-input.input-lg+.minicolors-swatch{right:4px}.minicolors-theme-bootstrap .minicolors-input.input-sm+.minicolors-swatch{width:24px;height:24px}.minicolors-theme-bootstrap .minicolors-input.input-xs+.minicolors-swatch{width:18px;height:18px}.input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input{border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .input-group .minicolors-theme-bootstrap .minicolors-input{border-radius:4px}[dir=rtl] .input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input{border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .input-group .minicolors-theme-bootstrap:not(:last-child) .minicolors-input{border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .input-group-addon,[dir=rtl] .input-group-btn>.btn,[dir=rtl] .input-group-btn>.btn-group>.btn,[dir=rtl] .input-group-btn>.dropdown-toggle,[dir=rtl] .input-group .form-control{border:1px solid #ccc;border-radius:4px}[dir=rtl] .input-group-addon:first-child,[dir=rtl] .input-group-btn:first-child>.btn,[dir=rtl] .input-group-btn:first-child>.btn-group>.btn,[dir=rtl] .input-group-btn:first-child>.dropdown-toggle,[dir=rtl] .input-group-btn:last-child>.btn-group:not(:last-child)>.btn,[dir=rtl] .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),[dir=rtl] .input-group .form-control:first-child{border-top-left-radius:0;border-bottom-left-radius:0;border-left:0}[dir=rtl] .input-group-addon:last-child,[dir=rtl] .input-group-btn:first-child>.btn-group:not(:first-child)>.btn,[dir=rtl] .input-group-btn:first-child>.btn:not(:first-child),[dir=rtl] .input-group-btn:last-child>.btn,[dir=rtl] .input-group-btn:last-child>.btn-group>.btn,[dir=rtl] .input-group-btn:last-child>.dropdown-toggle,[dir=rtl] .input-group .form-control:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.minicolors-theme-semanticui .minicolors-swatch{top:0;left:0;padding:18px}[dir=rtl] .minicolors-theme-semanticui .minicolors-swatch{right:0}.minicolors-theme-semanticui input{text-indent:30px}.imgix-preview-image{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-width:100%;max-height:100%;display:block;pointer-events:none}.imgix-parameters-container{position:absolute;left:0;top:0;bottom:0;right:0;overflow-x:hidden;overflow-y:auto;display:flex;flex-direction:column;padding:15px 10px}.imgix-parameters-container.is-hidden{display:none}.imgix-parameters-container .imgix-parameter-group select{font-size:12px}.imgix-parameters-container .imgix-parameter-group h4{margin:0;font-size:10px;text-transform:uppercase;color:#999;background-color:#ddd;padding:5px 15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.imgix-parameters-container .imgix-parameter-group>div{padding:15px}.imgix-parameter{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-bottom:15px;margin-bottom:15px}.imgix-parameter .imgix-param-imagick-warning{position:absolute;left:-10px;top:-5px;right:-10px;bottom:0;padding:0 5px;display:flex;align-items:center;justify-content:center;background:hsla(0,0%,100%,.8)}.imgix-parameter .imgix-param-imagick-warning>div{text-align:center}.imgix-parameter:last-of-type{margin-bottom:0;padding-bottom:0}.imgix-param-title{display:flex;align-items:baseline;margin-bottom:0}.imgix-param-title-colortype{align-items:center!important;margin-bottom:8px}.imgix-param-title-colortype h3{margin:0!important}.imgix-param-title-left{flex:1 50%}.imgix-param-title-right{flex:1 50%;padding-left:40px;text-align:right;position:relative}.imgix-param-title-right h3{text-align:right}.imgix-param-blend-mode h3,.imgix-param-title h3{margin-top:0;font-size:11px;text-transform:uppercase;color:#666}.imgix-media-param-title .imgix-param-title-left{flex:2 80%}.imgix-media-param-title .imgix-param-title-right{flex:1 20%}.imgix-media-param-title .imgix-param-title-right a{text-align:center!important}.minicolors-theme-default.minicolors{width:auto;display:block;padding:0!important;margin:0;min-height:29px}.ilab-color-input{position:relative;top:0;right:0;height:30px!important;margin:0!important;padding-left:8px!important;padding-right:30px!important}.imgix-param-blend-mode{margin-top:15px;display:flex;align-items:baseline}.imgix-param-blend-mode h3{flex:1 50%}.imgix-param-blend-mode select{flex:2 100%}.imgix-parameter input[type=range]{display:block;width:100%;-webkit-appearance:none;margin:0 0 10px;background:none;padding:0!important}.imgix-parameter input[type=range]:focus{outline:none}.imgix-parameter input[type=range]:focus::-webkit-slider-runnable-track{background:#fff}.imgix-parameter input[type=range]::-webkit-slider-runnable-track{width:100%;height:5px;cursor:pointer;animate:.2s;box-shadow:inset 1px 1px 2px 0 rgba(0,0,0,.25);background:#d4cfd4;border-radius:4px;border:0 solid #000101}.imgix-parameter input[type=range]::-webkit-slider-thumb{border:1px solid rgba(0,0,0,.25);box-shadow:inset 0 2px 2px 0 hsla(0,0%,100%,.5);height:17px;width:17px;border-radius:9px;background:#dcdcdc;cursor:pointer;-webkit-appearance:none;margin-top:-6px}.imgix-parameter input[type=range]::-moz-range-track{width:100%;height:5px;cursor:pointer;animate:.2s;box-shadow:inset 1px 1px 2px 0 rgba(0,0,0,.25);background:#d4cfd4;border-radius:4px;border:0 solid #000101}.imgix-parameter input[type=range]::-moz-range-thumb{border:1px solid rgba(0,0,0,.25);box-shadow:inset 0 2px 2px 0 hsla(0,0%,100%,.5);height:17px;width:17px;border-radius:9px;background:#dcdcdc;cursor:pointer;-webkit-appearance:none;margin-top:-6px}.imgix-parameter .imgix-param-reset{display:flex;width:100%;justify-content:flex-end}.imgix-parameter .imgix-param-reset a{font-size:11px;font-style:italic;text-decoration:none}.imgix-parameter .imgix-param-reset a,.imgix-parameter a:focus{outline:none!important;border:0!important}.imgix-media-preview{position:relative;margin:0!important;padding:0 0 100%!important;background-image:url(../img/ilab-imgix-edit-bg.png);width:100%}.imgix-media-preview img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-width:100%;max-height:100%;display:block}.imgix-media-preview-inner{position:absolute;left:0;right:0;bottom:0;top:0;display:flex;align-items:center;justify-content:center}.imgix-alignment-container{display:flex;flex:row;flex-wrap:wrap;justify-content:space-around;align-items:baseline;padding:0 35px}.imgix-alignment-button{background-color:#ddd;display:block;width:60px;height:60px;margin:5px;text-decoration:none;border-radius:4px;border:1px solid #888;box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.15)!important}.selected-alignment{background-color:#bbb;box-shadow:inset 1px 1px 1px rgba(0,0,0,.25),0 1px 0 rgba(0,0,0,.15)!important}.ilabm-pillbox{flex-wrap:wrap;border-bottom:0!important}.ilabm-pillbox,.ilabm-pillbox .ilabm-pill{align-items:center;display:flex;justify-content:center}.ilabm-pillbox .ilabm-pill{white-space:nowrap;line-height:1;height:14px;min-height:32px;width:140px;min-width:140px;max-width:140px;font-size:10px;background-color:#eaeaea;text-transform:uppercase;font-weight:700;color:#444;text-decoration:none;border-radius:8px;margin:3px}.ilabm-pillbox .ilabm-pill span{display:block;margin-right:8px}.ilabm-pillbox .ilabm-pill span.icon{width:18px;height:18px;min-width:18px;min-height:18px;max-width:18px;max-height:18px;background-repeat:no-repeat;background-position:50%;background-size:contain;margin-left:8px}.ilabm-pillbox .pill-selected{background-color:#ccc;box-shadow:inset 1px 1px 1px rgba(0,0,0,.25);color:#fff}.ilabm-pillbox-no-icon .ilabm-pill{width:100px;min-width:100px;max-width:100px}.ilabm-pillbox-no-icon .ilabm-pill span{margin-right:0}.ilabm-pillbox-no-icon .ilabm-pill span.icon{display:none}.imgix-pill-enhance>span.icon{background-image:url(../img/ilab-imgix-magic-wand-black.svg)}.imgix-pill-enhance.pill-selected>span.icon{background-image:url(../img/ilab-imgix-magic-wand-white.svg)}.imgix-pill-redeye>span.icon{background-image:url(../img/ilab-imgix-red-eye-black.svg)}.imgix-pill-redeye.pill-selected>span.icon{background-image:url(../img/ilab-imgix-red-eye-white.svg)}.imgix-pill-usefaces>span.icon{background-image:url(../img/ilab-imgix-faces-black.svg)}.imgix-pill-usefaces.pill-selected>span.icon{background-image:url(../img/ilab-imgix-faces-white.svg)}.imgix-pill-focalpoint>span.icon{background-image:url(../img/ilab-imgix-focalpoint-black.svg)}.imgix-pill-focalpoint.pill-selected>span.icon{background-image:url(../img/ilab-imgix-focalpoint-white.svg)}.imgix-pill-entropy>span.icon{background-image:url(../img/ilab-imgix-chaos-black.svg)}.imgix-pill-entropy.pill-selected>span.icon{background-image:url(../img/ilab-imgix-chaos-white.svg)}.imgix-pill-edges>span.icon{background-image:url(../img/ilab-imgix-edges-black.svg)}.imgix-pill-edges.pill-selected>span.icon{background-image:url(../img/ilab-imgix-edges-white.svg)}.imgix-pill-h>span.icon{background-image:url(../img/ilab-flip-horizontal-black.svg)}.imgix-pill-h.pill-selected>span.icon{background-image:url(../img/ilab-flip-horizontal-white.svg)}.imgix-pill-v>span.icon{background-image:url(../img/ilab-flip-vertical-black.svg)}.imgix-pill-v.pill-selected>span.icon{background-image:url(../img/ilab-flip-vertical-white.svg)}.imgix-pill-clip>span.icon{background-image:url(../img/ilab-imgix-clip-black.svg)}.imgix-pill-clip.pill-selected>span.icon{background-image:url(../img/ilab-imgix-clip-white.svg)}.imgix-pill-crop>span.icon{background-image:url(../img/ilab-imgix-crop-black.svg)}.imgix-pill-crop.pill-selected>span.icon{background-image:url(../img/ilab-imgix-crop-white.svg)}.imgix-pill-max>span.icon{background-image:url(../img/ilab-imgix-max-black.svg)}.imgix-pill-max.pill-selected>span.icon{background-image:url(../img/ilab-imgix-max-white.svg)}.imgix-pill-scale>span.icon{background-image:url(../img/ilab-imgix-scale-black.svg)}.imgix-pill-scale.pill-selected>span.icon{background-image:url(../img/ilab-imgix-scale-white.svg)}.imgix-preset-make-default-container{align-items:center;display:flex;min-height:30px;margin-left:10px}.imgix-preset-container{align-items:center;display:flex}.imgix-preset-container.is-hidden,.imgix-preset-make-default-container.is-hidden{display:none}.imgix-param-label{font-style:italic;text-transform:none!important}.imgix-label-editor{position:absolute;right:-4px;top:0;width:40px;font-size:11px;padding:1px;text-align:right}.ilabm-focal-point-icon{position:absolute;background-image:url(../img/ilab-imgix-focalpoint-icon.svg);width:24px;height:24px;background-size:contain;pointer-events:none}.ilab-face-outline{position:absolute;border:3px solid #fff;-webkit-filter:drop-shadow(0 2px 3px #000);filter:drop-shadow(0 2px 3px black);opacity:.33;z-index:999;cursor:pointer}.ilab-face-outline span{display:block;position:absolute;background-color:#fff;color:#000;font-size:9px;width:12px;height:12px;text-align:center;font-weight:700;line-height:1}.ilab-face-outline.active{opacity:1;z-index:1000}.ilab-all-faces-outline{position:absolute;border:3px solid #fff;-webkit-filter:drop-shadow(0 2px 3px #000);filter:drop-shadow(0 2px 3px black)}input[type=range].imgix-param{-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=range].imgix-param:focus{outline:none}input[type=range].imgix-param:focus::-webkit-slider-runnable-track{background:#bababa}input[type=range].imgix-param::-webkit-slider-runnable-track{width:100%;height:17px;cursor:pointer;animate:.2s;background:#cfcfcf;border-radius:17px;box-shadow:none}input[type=range].imgix-param::-moz-range-track{width:100%;height:17px;cursor:pointer;animate:.2s;background:#cfcfcf;border-radius:17px;box-shadow:none}input[type=range].imgix-param::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;width:18px;height:17px;border-radius:17px;margin-top:0}input[type=range].imgix-param::-moz-range-thumb{-webkit-appearance:none;cursor:pointer;width:18px;height:17px;border-radius:17px;margin-top:0}.ilab-crop-preview{overflow:hidden;max-width:100%;max-height:100%}.ilab-crop-now-wrapper{margin-top:12px}.ilabc-cropper{max-width:100%;max-height:100%}.ilabm-sidebar-content-cropper{flex-direction:column!important;padding:10px;overflow:scroll}.ilabm-sidebar-content-cropper h3{margin-top:0;font-size:11px;text-transform:uppercase;color:#888;font-weight:700}.cropper-dashed.dashed-h{top:38.4615385%;height:23.076923%}.cropper-dashed.dashed-v{left:38.4615385%;width:23.076923%}.ilabc-current-crop-container{position:relative;margin-bottom:15px}.ilabc-crop-preview-container,.ilabc-current-crop-container{background-image:url(../img/ilab-imgix-edit-bg.png);display:flex;align-items:center;justify-content:center;flex:1}.ilab-current-crop-img{position:absolute;-o-object-fit:contain;object-fit:contain;padding:0!important;margin:0!important;height:100%;width:100%}#ilab-crop-aspect-checkbox-container{display:flex;align-items:center}#ilab-crop-aspect-checkbox-container input{margin:0 8px 0 0;padding:0}#ilab-s3-info-meta .inside{padding:0 5px 10px}.info-panel-tabs{margin:-7px -5px 0;padding:6px 10px 0;background-color:rgba(0,0,0,.125)}.info-panel-tabs ul{display:flex;margin:0;padding:0;height:100%}.info-panel-tabs ul li{padding:5px 10px;font-size:11px;text-transform:uppercase;margin:0 10px 0 0;display:block;background-color:rgba(0,0,0,.0625);cursor:pointer;font-weight:700}.info-panel-tabs ul li.info-panel-missing-sizes{color:#9e0000}.info-panel-tabs ul li.active{background-color:#fff}.info-panel-contents{padding:15px 10px 0}.info-panel-contents .info-line{display:flex;flex-direction:column;margin-bottom:15px}.info-panel-contents .info-line h3,.info-panel-contents .info-line label{font-size:11px;text-transform:uppercase;margin:0;font-weight:700}.info-panel-contents .info-line label{margin-bottom:4px}.info-panel-contents .info-line select{font-size:12px!important}.info-panel-contents .info-line a{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.info-panel-contents .info-notice{padding:10px 5px 20px}.info-panel-contents .info-size-selector{margin-bottom:15px}.info-panel-contents .button-row{margin-bottom:15px;border-top:1px solid #eaeaea;padding-top:15px;display:flex;justify-content:flex-end;align-items:center}.info-panel-contents .button-row #ilab-info-regenerate-status{display:flex;padding:0;justify-content:center;align-items:center;width:100%;font-size:12px}.info-panel-contents .button-row #ilab-info-regenerate-status .spinner{float:none;display:block;margin:0 8px 0 0;width:16px;height:16px;background-size:16px 16px}.info-panel-contents .links-row{display:flex;align-items:center;justify-content:center;background-color:rgba(0,0,0,.05);border:1px solid rgba(0,0,0,.1);border-radius:8px;padding:10px 0;margin-bottom:15px}.info-panel-contents .links-row a{color:#000;display:flex;align-items:center;margin-right:20px;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:11px}.info-panel-contents .links-row a:last-of-type{margin-right:0}.info-panel-contents .links-row a .dashicons{margin-right:3px;width:16px;height:16px;font-size:16px}#ilab-media-grid-info-popup{position:absolute;z-index:170000;opacity:1;transition:opacity .33s;-webkit-filter:drop-shadow(0 0 5px rgba(50,50,50,.5));filter:drop-shadow(0 0 5px rgba(50,50,50,.5));display:flex;align-items:center}#ilab-media-grid-info-popup.hidden{opacity:0;pointer-events:none}#ilab-media-grid-info-popup h2{text-transform:uppercase;font-size:9px;padding:4px 10px;margin:0;color:rgba(0,0,0,.33)}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content{min-height:554px;background-color:#fff;width:275px;max-width:275px;padding-bottom:1px;display:flex;flex-direction:column;position:relative}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .info-panel-tabs{margin:0}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .info-panel-contents>div{display:flex;flex-direction:column}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .info-panel-contents>div>div{flex:1}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .info-panel-contents .info-file-info-size{flex-grow:1;display:flex;flex-direction:column}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .button-row{position:absolute;bottom:0;right:0;left:0}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader-container{display:flex;justify-content:center;align-items:center;position:absolute;left:0;top:0;right:0;bottom:0;transition:opacity .5s}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader,#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader:after{border-radius:50%;width:24px;height:24px}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader{font-size:5px;text-indent:-9999em;border:1.1em solid hsla(0,0%,100%,.2);border-left-color:#fff;-webkit-animation:load8 1.1s linear infinite;animation:load8 1.1s linear infinite}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader.ilab-loader-dark{border:1.1em solid rgba(0,0,0,.2);border-left-color:#000}@-webkit-keyframes load8{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes load8{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}#ilab-media-grid-info-popup .ilab-media-popup-arrow-left{width:45px;display:flex;justify-content:flex-end}#ilab-media-grid-info-popup .ilab-media-popup-arrow-left>div{width:0;height:0;border-color:transparent #fff transparent transparent;border-style:solid;border-width:9px 15.6px 9px 0}#ilab-media-grid-info-popup .ilab-media-popup-arrow-right{width:45px;display:flex;justify-content:flex-start}#ilab-media-grid-info-popup .ilab-media-popup-arrow-right>div{width:0;height:0;border-color:transparent transparent transparent #fff;border-style:solid;border-width:9px 0 9px 15.6px;margin-right:30px}#ilab-media-grid-info-popup.popup-left .ilab-media-popup-arrow-right,#ilab-media-grid-info-popup.popup-right .ilab-media-popup-arrow-left{display:none}li.attachment{transition:opacity .3s ease-out,transform .3s ease-out,box-shadow .3s ease-out}li.attachment .ilab-loader-container{z-index:100}li.attachment.info-focused{transform:scale(1.1)}li.attachment.info-focused>div:first-of-type{box-shadow:0 0 5px 0 rgba(50,50,50,.5)}li.attachment.info-unfocused{opacity:.33}#ilab-media-grid-info-popup.ilab-popup-document h2{background-color:rgba(0,0,0,.125);color:#000}#ilab-media-grid-info-popup.ilab-popup-document .info-panel-contents{padding:10px 10px 0}#ilab-media-grid-info-popup.ilab-popup-document .ilab-media-grid-info-popup-content{min-height:484px}.settings-container header a.button-primary{position:absolute!important;right:40px;top:50%;transform:translateY(-50%)!important}table.ilab-image-sizes{border-collapse:collapse;width:100%}table.ilab-image-sizes td,table.ilab-image-sizes th{padding:10px}table.ilab-image-sizes td.center{text-align:center}table.ilab-image-sizes thead th{border:2px solid #f1f1f1;background-color:#dadada}table.ilab-image-sizes tr{border-bottom:1px solid #dadada}.ilab-add-image-size-backdrop{display:flex;align-items:center;justify-content:center}.ilab-add-image-size-container{left:auto;right:auto;bottom:auto;top:auto}.ilab-new-image-size-form{padding:20px;display:flex;flex-direction:column}.ilab-new-image-size-form div.row{display:flex;align-items:center;margin-bottom:15px}.ilab-new-image-size-form div.row>label{width:90px;text-align:right;margin-right:15px;font-weight:700}.ilab-new-image-size-form div.button-row{padding:10px;text-align:right}.ilab-delete-size-button{font-size:0;display:inline-block;width:18px;height:18px;background-image:url(../img/ilab-ui-icon-trash.svg);background-size:contain;background-position:50%;background-repeat:no-repeat;background-size:12px;margin-right:10px}.ilab-delete-size-button.disabled{opacity:.33;pointer-events:none}.ilab-delete-size-button:hover{background-image:url(../img/ilab-ui-icon-trash-hover.svg)}.ilab-size-settings-button{font-size:0;display:inline-block;width:18px;height:18px;background-image:url(../img/ilab-ui-icon-settings.svg);background-size:contain;background-position:50%;background-repeat:no-repeat;background-size:14px}.ilab-size-settings-button.disabled{opacity:.33;pointer-events:none}.ilab-size-settings-button:hover{background-image:url(../img/ilab-ui-icon-settings-hover.svg)}.ilab-browser-select-table-container table,.ilab-storage-browser table{border-collapse:collapse;width:100%;font-size:1.1em}.ilab-browser-select-table-container table td,.ilab-browser-select-table-container table th,.ilab-storage-browser table td,.ilab-storage-browser table th{padding:12px}.ilab-browser-select-table-container table thead tr th,.ilab-storage-browser table thead tr th{text-align:left;border:2px solid #f1f1f1;background-color:#dadada}.ilab-browser-select-table-container table thead tr th.checkbox,.ilab-storage-browser table thead tr th.checkbox{max-width:30px;width:30px;text-align:center}.ilab-browser-select-table-container table tbody tr,.ilab-storage-browser table tbody tr{transition:background-color .125s linear;cursor:pointer}.ilab-browser-select-table-container table tbody tr:hover,.ilab-storage-browser table tbody tr:hover{background-color:#fff}.ilab-browser-select-table-container table tbody tr input[type=checkbox],.ilab-storage-browser table tbody tr input[type=checkbox]{z-index:1000}.ilab-browser-select-table-container table tbody tr td,.ilab-storage-browser table tbody tr td{text-decoration:none}.ilab-browser-select-table-container table tbody tr td.checkbox,.ilab-storage-browser table tbody tr td.checkbox{max-width:30px;width:30px;text-align:center}.ilab-browser-select-table-container table tbody tr td.entry,.ilab-storage-browser table tbody tr td.entry{display:flex;align-items:center}.ilab-browser-select-table-container table tbody tr td.actions,.ilab-storage-browser table tbody tr td.actions{text-align:center;width:130px;max-width:130px}.ilab-browser-select-table-container table tbody tr td.actions .button-delete,.ilab-storage-browser table tbody tr td.actions .button-delete{margin-right:0;margin-left:10px;color:#fff;border-color:#920002;background:#ca0002;box-shadow:0 1px 0 #cc0005}.ilab-browser-select-table-container table tbody tr td.actions .button-delete svg,.ilab-storage-browser table tbody tr td.actions .button-delete svg{height:14px}.ilab-browser-select-table-container table tbody tr td.actions .button-delete.disabled,.ilab-storage-browser table tbody tr td.actions .button-delete.disabled{color:#ff6468!important;border-color:#920002!important;background:#c6282a!important;box-shadow:0 1px 0 #cc0005!important;text-shadow:0 1px 0 #cc0005!important}.ilab-browser-select-table-container table tbody tr td.actions .button-delete.disabled svg>path,.ilab-browser-select-table-container table tbody tr td.actions .button-delete.disabled svg>rect,.ilab-storage-browser table tbody tr td.actions .button-delete.disabled svg>path,.ilab-storage-browser table tbody tr td.actions .button-delete.disabled svg>rect{fill:#ff6468}.ilab-browser-select-table-container table tbody tr td img.loader,.ilab-storage-browser table tbody tr td img.loader{display:none;margin-right:10px;width:16px;height:16px}.ilab-browser-select-table-container table tbody tr td span,.ilab-storage-browser table tbody tr td span{display:block;width:16px;height:16px;background-size:contain;background-repeat:no-repeat;margin-right:10px}.ilab-browser-select-table-container table tbody tr td span.icon-dir,.ilab-storage-browser table tbody tr td span.icon-dir{background-image:url(../img/ilab-ui-icon-folder.svg)}.ilab-browser-select-table-container table tbody tr td span.icon-file,.ilab-storage-browser table tbody tr td span.icon-file{background-image:url(../img/ilab-ui-icon-file.svg)}.ilab-browser-select-table-container table tbody tr td span.icon-up,.ilab-storage-browser table tbody tr td span.icon-up{background-image:url(../img/ilab-ui-icon-up-dir.svg)}.ilab-browser-select-table-container table tr,.ilab-storage-browser table tr{border-bottom:1px solid #dadada}.mcsb-buttons .button{margin-right:5px;display:flex;align-items:center}.mcsb-buttons .button svg{height:16px;width:auto;margin-right:8px}.mcsb-buttons .button svg>path,.mcsb-buttons .button svg>rect{fill:#fff}.mcsb-buttons .button-primary.disabled svg>path,.mcsb-buttons .button-primary.disabled svg>rect{fill:#66c6e4}.mcsb-buttons .button-create-folder svg{height:12px}.mcsb-buttons .button-import{margin-left:10px}.mcsb-buttons .button-import svg{height:14px}.mcsb-buttons .button-delete{margin-right:0;margin-left:10px;color:#fff;border-color:#920002;background:#ca0002;box-shadow:0 1px 0 #cc0005}.mcsb-buttons .button-delete svg{height:14px}.mcsb-buttons .button-delete.disabled{color:#ff6468!important;border-color:#920002!important;background:#c6282a!important;box-shadow:0 1px 0 #cc0005!important;text-shadow:0 1px 0 #cc0005!important}.mcsb-buttons .button-delete.disabled svg>path,.mcsb-buttons .button-delete.disabled svg>rect{fill:#ff6468}.mcsb-buttons .button-cancel{color:#fff;border-color:#920002;background:#ca0002;text-shadow:0 1px 0 #cc0005!important;box-shadow:0 1px 0 #cc0005}.mcsb-buttons .button-cancel:hover{border-color:#9f0002;background:#d80002;text-shadow:0 1px 0 #d60005!important;box-shadow:0 1px 0 #d60005}.mcsb-actions{margin-bottom:18px;font-size:1.1em}.mcsb-actions,.mcsb-actions div.mcsb-action-buttons{display:flex;align-items:center}.ilab-storage-browser-header{flex:1;padding:14px 9px;box-shadow:inset 0 0 3px 0 rgba(0,0,0,.125);border:1px solid #ddd;border-radius:8px;margin-right:18px}.ilab-storage-browser-header ul{margin:0;padding:0;display:flex}.ilab-storage-browser-header ul li{padding:0;position:relative;display:block;margin:0 30px 0 0}.ilab-storage-browser-header ul li a{text-decoration:none}.ilab-storage-browser-header ul li:first-of-type{padding-left:35px}.ilab-storage-browser-header ul li:first-of-type:before{background-image:url(../img/ilab-ui-icon-folder.svg);width:16px;height:16px;left:0}.ilab-storage-browser-header ul li:after,.ilab-storage-browser-header ul li:first-of-type:before{content:" ";position:absolute;background-size:contain;background-position:50%;background-repeat:no-repeat;top:50%;margin-left:10px;transform:translateY(-50%)}.ilab-storage-browser-header ul li:after{background-image:url(../img/ilab-ui-path-divider.svg);width:9px;height:9px}.ilab-storage-browser-header ul li:last-of-type:after{display:none}#mcsb-progress-modal{z-index:10000;position:fixed;left:0;top:0;right:0;bottom:0;background:rgba(0,0,0,.66);display:flex;align-items:center;justify-content:center;transition:opacity .15s linear;opacity:1;pointer-events:none}#mcsb-progress-modal.hidden{opacity:0}#mcsb-progress-modal .mcsb-progress-container{min-width:40vw;background-color:#fff;padding:30px}#mcsb-progress-modal .mcsb-progress-container .mcsb-progress-label{font-weight:700;font-size:1.1em;margin-bottom:20px}#mcsb-progress-modal .mcsb-progress-container .mcsb-progress-bar{position:relative;background-color:#eaeaea;height:24px;border-radius:12px;overflow:hidden}#mcsb-progress-modal .mcsb-progress-container .mcsb-progress-bar #mcsb-progress{position:absolute;left:0;top:0;bottom:0;background-color:#4f90c4}#mcsb-import-options-modal{z-index:10000;position:fixed;left:0;top:0;right:0;bottom:0;background:rgba(0,0,0,.66);display:flex;align-items:center;justify-content:center;transition:opacity .15s linear;opacity:1;pointer-events:none}#mcsb-import-options-modal.hidden{opacity:0}#mcsb-import-options-modal.hidden .mcsb-import-options-container{pointer-events:none}#mcsb-import-options-modal .mcsb-import-options-container{min-width:40vw;max-width:800px;background-color:#fff;padding:30px;pointer-events:all;display:flex;flex-direction:column}#mcsb-import-options-modal .mcsb-import-options-container h3{display:block;padding:0;margin:0 0 25px;position:relative;font-weight:700;font-size:1.125em}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options{margin-bottom:50px}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul{display:grid;grid-template-columns:repeat(1,1fr);grid-row-gap:20px;grid-column-gap:10px}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul li{display:flex;align-items:flex-start}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul li h4{margin:0;padding:0;font-size:1em}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul li .mcsb-option{padding-top:2px}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul li .mcsb-option-description{margin-left:15px}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-buttons{display:flex;justify-content:flex-end}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-buttons .button{margin:0 0 0 20px}#ilab-upload-target{position:fixed;left:0;right:0;bottom:0;top:0;display:flex;justify-content:center;align-items:center;font-size:2em;font-weight:700;color:#fff;background-color:rgba(28,90,129,.75);z-index:100000;transition:opacity .125s linear;opacity:0;pointer-events:none}#wpbody.drag-inside #ilab-upload-target{opacity:1}#mcsb-upload-modal{position:fixed;left:0;right:0;bottom:0;top:0;display:flex;justify-content:center;align-items:center;background:rgba(0,0,0,.66);z-index:100000;transition:opacity .125s linear;opacity:1}#mcsb-upload-modal.hidden{opacity:0;pointer-events:none}#mcsb-upload-modal #mcsb-upload-container{min-width:630px;min-height:385px;background-color:#fff;display:flex;flex-direction:column}#mcsb-upload-modal #mcsb-upload-container div.mcsb-upload-header{padding:20px;position:relative;font-weight:700}#mcsb-upload-modal #mcsb-upload-container div.mcsb-upload-items{position:relative;flex:1;background-color:#eaeaea}#mcsb-upload-modal #mcsb-upload-container div.mcsb-upload-items #mcsb-upload-items-container{padding:15px;position:absolute;left:0;top:0;right:0;bottom:0;overflow:auto;display:flex;flex-wrap:wrap}.ilab-browser-select{position:absolute;left:0;top:0;width:100%;height:100%;display:flex;flex-direction:column}.ilab-browser-select .ilab-browser-select-header{height:48px;min-height:48px;padding-left:12px;padding-right:64px;display:flex;align-items:center}.ilab-browser-select .ilab-browser-select-header input{flex:1;padding:7px 11px;border-radius:4px}.ilab-browser-select .ilab-browser-select-header input:disabled{color:#000}.ilab-browser-select .ilab-browser-select-table-container{flex:1;overflow-y:auto;background-color:#efefef}.ilab-browser-select .ilab-browser-select-footer{height:48px;min-height:48px;display:flex;align-items:center;justify-content:flex-end;padding-right:12px}.ilab-browser-select .ilab-browser-select-footer .button{margin-left:12px}.mcsb-modal-contents{border-radius:8px}.mcsb-modal-contents h3{background-image:url(../img/icon-cloud.svg);background-position:0;background-repeat:no-repeat;background-size:44px 44px;padding:12px 0 12px 60px!important} + */.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline-color:rgba(51,153,255,.75);outline:1px solid #39f;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.ilab-admin-separator-container{display:flex;height:12px;align-items:center;margin:0 -10px 0 0}.ilab-admin-separator-container .ilab-admin-separator-title{font-size:.68em;text-transform:uppercase;font-weight:700;margin-right:10px;color:hsla(0,0%,100%,.25)}.ilab-admin-separator-container .ilab-admin-separator{display:block;flex:1;padding:0;height:1px;line-height:1px;background:hsla(0,0%,100%,.125)}#wpadminbar #wp-admin-bar-media-cloud-admin-bar>.ab-item>.ab-icon:before{content:"\F176";top:3px}.ilabm-backdrop{position:fixed;display:block;background-color:rgba(0,0,0,.66)}.ilabm-backdrop,.ilabm-container{left:0;top:0;right:0;bottom:0;z-index:160000!important}.ilabm-container{background-color:#fcfcfc;position:absolute;border-radius:0;display:flex;flex-direction:column}.ilabm-titlebar{border-bottom:1px solid #ddd;min-height:50px;max-height:50px;box-shadow:0 0 4px rgba(0,0,0,.15);display:flex;align-items:center}.ilabm-titlebar h1{flex:1;padding:0 16px;font-size:22px;line-height:50px;margin:0 50px 0 0;display:flex;align-items:center;justify-content:space-between}.ilabm-titlebar .modal-actions{display:flex}.ilabm-titlebar .modal-actions a{margin-left:8px;display:flex;align-items:center}.ilabm-titlebar .modal-actions a svg{height:12px;width:auto;margin-right:4px}.ilabm-titlebar .modal-actions a svg>path,.ilabm-titlebar .modal-actions a svg>rect{fill:#000}.ilabm-titlebar .modal-actions div.spacer{width:8px;min-width:8px}.ilabm-titlebar>a{display:block;max-width:50px;min-width:50px;border-left:1px solid #ddd}.ilabm-window-area{flex:2 100%;display:flex;flex-direction:row}.ilabm-window-area-content{background-color:#fff;flex:2 100%;display:flex;flex-direction:column}.ilabm-editor-container{flex:2 100%;position:relative}.ilabm-editor-area{position:absolute;left:0;top:0;right:0;bottom:0;background-image:url(../img/ilab-imgix-edit-bg.png);display:block;margin:10px}.ilabm-sidebar{min-width:380px;max-width:380px;background-color:#f3f3f3;display:flex;flex-direction:column;border-left:3px solid #ddd}.ilabm-sidebar-content{position:relative;display:flex;flex:2 100%}.ilabm-sidebar-tabs{background:#ddd;display:flex;min-height:36px;max-height:36px}.ilabm-sidebar-tabs .ilabm-sidebar-tab{min-width:40px;white-space:nowrap;text-align:center;margin-top:3px;background-color:#ccc;line-height:30px;padding:0 15px;margin-right:3px;font-size:11px;text-transform:uppercase;color:#888;font-weight:700;cursor:pointer!important}.ilabm-sidebar-tabs .active-tab{background-color:#f3f3f3;color:#777}.ilabm-sidebar-actions{display:flex;justify-content:flex-end;background-color:#fff;border-top:1px solid #eee;padding:11px}.ilabm-sidebar-actions a{display:block;margin-left:10px!important}a.button-reset{background:#a00!important;border-color:#700!important;color:#fff!important;box-shadow:inset 0 1px 0 #d00,0 1px 0 rgba(0,0,0,.15)!important;text-shadow:none!important}.ilabm-editor-tabs{background:#ddd;overflow:hidden;min-height:36px}.ilabm-editor-tabs,.ilabm-editor-tabs .ilabm-tabs-select-ui{display:flex;flex-direction:row}.ilabm-editor-tabs .ilabm-tabs-select-ui .ilabm-tabs-select-label{margin-top:3px;line-height:32px;padding:0 5px 0 15px;margin-right:3px;font-size:11px;text-transform:uppercase;color:#888;font-weight:700;cursor:pointer!important}.ilabm-editor-tabs .ilabm-tabs-select-ui .ilabm-tabs-select{margin-top:4px;line-height:32px;font-size:11px}.ilabm-editor-tabs .ilabm-tabs-ui{display:flex;flex-direction:row}.ilabm-editor-tabs .ilabm-tabs-ui .ilabm-editor-tab{white-space:nowrap;min-width:50px;text-align:center;min-height:32px;max-height:33px;margin-top:3px;background-color:#ccc;line-height:31px;padding:0 15px;margin-right:3px;font-size:11px;text-transform:uppercase;color:#888;font-weight:700;cursor:pointer!important}.ilabm-editor-tabs .ilabm-tabs-ui .active-tab{background:#fff;margin-top:2px;border-right:1px solid #ddd;border-left:1px solid #ddd;border-top:1px solid #ddd}.ilabm-status-container{display:flex;flex:1;justify-content:flex-start}.ilabm-status-container .is-hidden{display:none}.ilabm-status-container .spinner{margin:0 8px 0 0}.ilabm-status-label{font-size:13px}.ilabm-preview-wait-modal{position:absolute;box-shadow:0 0 10px 1px rgba(0,0,0,.75);text-align:center;padding:20px 40px;border-radius:10px;background-color:hsla(0,0%,100%,.66);left:50%;top:50%;margin-left:-60px;margin-top:-32px}.ilabm-preview-wait-modal h3{text-transform:uppercase;font-size:13px}.ilabm-preview-wait-modal span.spinner{float:none!important}.ilabm-bottom-bar{font-size:12px!important;padding:0 10px 10px;display:flex!important;justify-content:flex-end;align-items:center;min-height:20px}.ilabm-bottom-bar .ilabm-bottom-bar-seperator{position:relative;width:1px;height:20px;background-color:#ccc;margin:0 10px 0 20px!important}.ilabm-bottom-bar a,.ilabm-bottom-bar select{margin-left:10px!important}.ilabm-bottom-bar select{font-size:13px!important;min-width:140px}.ilabm-bottom-bar label{font-size:13px!important}.is-hidden{display:none}.ilabm-modal-close{top:0;right:0;cursor:pointer;color:#777;background-color:transparent;height:50px;width:50px;position:absolute;text-align:center;border:0;border-left:1px solid #ddd;transition:color .1s ease-in-out,background .1s ease-in-out;text-decoration:none;z-index:1000;box-sizing:content-box;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}.ilabm-modal-icon{background-repeat:no-repeat;display:block;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.ilabm-modal-icon:before{content:"\F335";font:normal 22px/1 dashicons;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#666}.setup-body{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-top:40px}.setup-body .service-selection-grid{display:grid;grid-template-columns:repeat(3,1fr);grid-gap:15px;grid-auto-rows:158px}.setup-body .service-selection-grid a{border-radius:5px;background-color:#fff;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;border:1px solid #eaeaea;width:128px;height:128px;text-align:center;text-decoration:none;padding:15px;background-position:50% calc(50% - 15px);background-repeat:no-repeat;transition:transform .5s ease-out}.setup-body .service-selection-grid a:hover{transform:scale(1.1)}.setup-body .service-selection-grid a[data-service=s3]{grid-column:1;grid-row:1;background-image:url(../img/icon-service-s3.svg)}.setup-body .service-selection-grid a[data-service=google]{grid-column:2;grid-row:1;background-image:url(../img/icon-service-google.svg)}.setup-body .service-selection-grid a[data-service=minio]{grid-column:3;grid-row:1;background-image:url(../img/icon-service-minio.svg)}.setup-body .service-selection-grid a[data-service=backblaze]{grid-column:1;grid-row:2;background-image:url(../img/icon-service-backblaze.svg)}.setup-body .service-selection-grid a[data-service=do]{grid-column:2;grid-row:2;background-image:url(../img/icon-service-do.svg)}.setup-body .service-selection-grid a[data-service=other-s3]{grid-column:3;grid-row:2;background-image:url(../img/icon-service-other-s3.svg)}#ilab-video-upload-target{position:relative;padding:30px;border:4px dashed #e0e0e0;background-color:#fafafa;margin:20px 0;display:flex;flex-wrap:wrap;min-height:128px;cursor:pointer;transition:border .5s ease-out}#ilab-video-upload-target.drag-inside{border:4px solid #70a9dd;background-color:#bcd3e2}.ilab-upload-item{position:relative;min-width:128px;min-height:128px;max-width:128px;max-height:128px;width:128px;height:128px;background-color:#eaeaea;margin:10px;border-radius:0;border:1px solid #ddd;overflow:hidden;transition:opacity .5s ease-out,left .3s ease-out,top .3s ease-out,width .3s ease-out,height .3s ease-out,transform .3s ease-out;background-repeat:no-repeat;background-position:50%}.ilab-upload-item.upload-error{background-color:#eabab3;border:1px solid #bb6a6b}.ilab-upload-item.ilab-upload-selected{box-shadow:0 0 0 2px #fff,0 0 0 5px #0073aa}.ilab-upload-cell-image{background-image:url(../img/ilab-icon-image.svg);background-size:60px}.ilab-upload-cell-video{background-image:url(../img/ilab-icon-video.svg);background-size:60px}.ilab-upload-cell-doc{background-image:url(../img/ilab-icon-document.svg);background-size:45px}.no-mouse{cursor:default!important}.ilab-upload-item-background{position:absolute;left:-5px;top:-5px;right:-5px;bottom:-5px;background-repeat:no-repeat;background-size:cover;background-position:50%;transition:opacity .5s}.ilab-upload-status-container{position:absolute;left:0;top:0;right:0;bottom:0;display:flex;flex-direction:column;justify-content:center;align-items:center}.ilab-upload-status{color:#fff;font-weight:700;font-size:1em;text-shadow:0 0 3px #000}.ilab-upload-progress{width:80%;max-width:80%;height:9px;overflow:hidden;position:relative;margin-top:10px;border-radius:9px;background-color:hsla(0,0%,100%,.66)}.ilab-upload-progress-track{background-color:#0085ba;position:absolute;left:0;top:0;bottom:0;transition:width .125s ease-out}.ilab-upload-directions{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);font-size:2em;opacity:.5}.ilab-loader-container{display:flex;justify-content:center;align-items:center;position:absolute;left:0;top:0;right:0;bottom:0;transition:opacity .5s}.ilab-loader,.ilab-loader:after{border-radius:50%;width:24px;height:24px}.ilab-loader{font-size:5px;text-indent:-9999em;border:1.1em solid hsla(0,0%,100%,.2);border-left-color:#fff;-webkit-animation:load8 1.1s linear infinite;animation:load8 1.1s linear infinite}.ilab-loader.ilab-loader-dark{border:1.1em solid rgba(0,0,0,.2);border-left-color:#000}.ilab-upload-footer{padding-right:10px;position:absolute;left:0;right:0;border-top:1px solid #ddd;bottom:0;height:52px;background-color:#fff;display:flex;justify-content:flex-end;align-items:center;background-color:#fcfcfc;visibility:hidden}#ilab-attachment-info{position:absolute;right:-300px;top:0;bottom:54px;width:267px;transition:right .33s ease-out}.ilab-upload-insert-mode{position:relative;background-color:#fff}.ilab-upload-insert-mode div.wrap{position:absolute;left:0;top:0;right:0;bottom:52px;margin:0;padding:0 20px;overflow:auto;transition:right .33s ease-out}.ilab-upload-insert-mode div.wrap h2:first-of-type{display:none}.ilab-upload-insert-mode .ilab-upload-footer{visibility:visible}.ilab-item-selected div.wrap{right:300px}.ilab-item-selected #ilab-attachment-info{right:0}.media-cloud-upload-logo{width:240px;height:auto;margin-bottom:40px;opacity:.66;margin-top:-40px}.has-upload-message .upload-ui .media-cloud-upload-logo{display:none}.attachments-browser .upload-ui .media-cloud-upload-logo{margin-top:0}.minicolors{position:relative}.minicolors-sprite{background-image:url(../img/jquery.minicolors.png)}.minicolors-swatch{position:absolute;vertical-align:middle;background-position:-80px 0;border:1px solid #ccc;cursor:text;padding:0;margin:0;display:inline-block}.minicolors-swatch-color{position:absolute;top:0;left:0;right:0;bottom:0}.minicolors input[type=hidden]+.minicolors-swatch{width:28px;position:static;cursor:pointer}.minicolors input[type=hidden][disabled]+.minicolors-swatch{cursor:default}.minicolors-panel{position:absolute;width:173px;background:#fff;border:1px solid #ccc;box-shadow:0 0 20px rgba(0,0,0,.2);z-index:99999;box-sizing:content-box;display:none}.minicolors-panel.minicolors-visible{display:block}.minicolors-position-top .minicolors-panel{top:-154px}.minicolors-position-right .minicolors-panel{right:0}.minicolors-position-bottom .minicolors-panel{top:auto}.minicolors-position-left .minicolors-panel{left:0}.minicolors-with-opacity .minicolors-panel{width:194px}.minicolors .minicolors-grid{position:relative;top:1px;left:1px;width:150px;height:150px;margin-bottom:2px;background-position:-120px 0;cursor:crosshair}[dir=rtl] .minicolors .minicolors-grid{right:1px}.minicolors .minicolors-grid-inner{position:absolute;top:0;left:0;width:150px;height:150px}.minicolors-slider-saturation .minicolors-grid{background-position:-420px 0}.minicolors-slider-saturation .minicolors-grid-inner{background-position:-270px 0;background-image:inherit}.minicolors-slider-brightness .minicolors-grid{background-position:-570px 0}.minicolors-slider-brightness .minicolors-grid-inner{background-color:#000}.minicolors-slider-wheel .minicolors-grid{background-position:-720px 0}.minicolors-opacity-slider,.minicolors-slider{position:absolute;top:1px;left:152px;width:20px;height:150px;background-color:#fff;background-position:0 0;cursor:row-resize}[dir=rtl] .minicolors-opacity-slider,[dir=rtl] .minicolors-slider{right:152px}.minicolors-slider-saturation .minicolors-slider{background-position:-60px 0}.minicolors-slider-brightness .minicolors-slider,.minicolors-slider-wheel .minicolors-slider{background-position:-20px 0}.minicolors-opacity-slider{left:173px;background-position:-40px 0;display:none}[dir=rtl] .minicolors-opacity-slider{right:173px}.minicolors-with-opacity .minicolors-opacity-slider{display:block}.minicolors-grid .minicolors-picker{position:absolute;top:70px;left:70px;width:12px;height:12px;border:1px solid #000;border-radius:10px;margin-top:-6px;margin-left:-6px;background:none}.minicolors-grid .minicolors-picker>div{position:absolute;top:0;left:0;width:8px;height:8px;border-radius:8px;border:2px solid #fff;box-sizing:content-box}.minicolors-picker{position:absolute;top:0;left:0;width:18px;height:2px;background:#fff;border:1px solid #000;margin-top:-2px;box-sizing:content-box}.minicolors-swatches,.minicolors-swatches li{margin:5px 0 3px 5px;padding:0;list-style:none;overflow:hidden}[dir=rtl] .minicolors-swatches,[dir=rtl] .minicolors-swatches li{margin:5px 5px 3px 0}.minicolors-swatches .minicolors-swatch{position:relative;float:left;cursor:pointer;margin:0 4px 0 0}[dir=rtl] .minicolors-swatches .minicolors-swatch{float:right;margin:0 0 0 4px}.minicolors-with-opacity .minicolors-swatches .minicolors-swatch{margin-right:7px}[dir=rtl] .minicolors-with-opacity .minicolors-swatches .minicolors-swatch{margin-right:0;margin-left:7px}.minicolors-swatch.selected{border-color:#000}.minicolors-inline{display:inline-block}.minicolors-inline .minicolors-input{display:none!important}.minicolors-inline .minicolors-panel{position:relative;top:auto;left:auto;box-shadow:none;z-index:auto;display:inline-block}[dir=rtl] .minicolors-inline .minicolors-panel{right:auto}.minicolors-theme-default .minicolors-swatch{top:5px;left:5px;width:18px;height:18px}[dir=rtl] .minicolors-theme-default .minicolors-swatch{right:5px}.minicolors-theme-default .minicolors-swatches .minicolors-swatch{margin-bottom:2px;top:0;left:0;width:18px;height:18px}[dir=rtl] .minicolors-theme-default .minicolors-swatches .minicolors-swatch{right:0}.minicolors-theme-default.minicolors-position-right .minicolors-swatch{left:auto;right:5px}[dir=rtl] .minicolors-theme-default.minicolors-position-left .minicolors-swatch{right:auto;left:5px}.minicolors-theme-default.minicolors{display:inline-block}.minicolors-theme-default .minicolors-input{height:20px;width:auto;display:inline-block;padding-left:26px}[dir=rtl] .minicolors-theme-default .minicolors-input{text-align:right;unicode-bidi:-moz-plaintext;unicode-bidi:plaintext;padding-left:1px;padding-right:26px}.minicolors-theme-default.minicolors-position-right .minicolors-input{padding-right:26px;padding-left:inherit}[dir=rtl] .minicolors-theme-default.minicolors-position-left .minicolors-input{padding-right:inherit;padding-left:26px}.minicolors-theme-bootstrap .minicolors-swatch{z-index:2;top:3px;left:3px;width:28px;height:28px;border-radius:3px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-swatch{right:3px}.minicolors-theme-bootstrap .minicolors-swatches .minicolors-swatch{margin-bottom:2px;top:0;left:0;width:20px;height:20px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-swatches .minicolors-swatch{right:0}.minicolors-theme-bootstrap .minicolors-swatch-color{border-radius:inherit}.minicolors-theme-bootstrap.minicolors-position-right>.minicolors-swatch{left:auto;right:3px}[dir=rtl] .minicolors-theme-bootstrap.minicolors-position-left>.minicolors-swatch{right:auto;left:3px}.minicolors-theme-bootstrap .minicolors-input{float:none;padding-left:44px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-input{text-align:right;unicode-bidi:-moz-plaintext;unicode-bidi:plaintext;padding-left:12px;padding-right:44px}.minicolors-theme-bootstrap.minicolors-position-right .minicolors-input{padding-right:44px;padding-left:12px}[dir=rtl] .minicolors-theme-bootstrap.minicolors-position-left .minicolors-input{padding-right:12px;padding-left:44px}.minicolors-theme-bootstrap .minicolors-input.input-lg+.minicolors-swatch{top:4px;left:4px;width:37px;height:37px;border-radius:5px}[dir=rtl] .minicolors-theme-bootstrap .minicolors-input.input-lg+.minicolors-swatch{right:4px}.minicolors-theme-bootstrap .minicolors-input.input-sm+.minicolors-swatch{width:24px;height:24px}.minicolors-theme-bootstrap .minicolors-input.input-xs+.minicolors-swatch{width:18px;height:18px}.input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input{border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .input-group .minicolors-theme-bootstrap .minicolors-input{border-radius:4px}[dir=rtl] .input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input{border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .input-group .minicolors-theme-bootstrap:not(:last-child) .minicolors-input{border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .input-group-addon,[dir=rtl] .input-group-btn>.btn,[dir=rtl] .input-group-btn>.btn-group>.btn,[dir=rtl] .input-group-btn>.dropdown-toggle,[dir=rtl] .input-group .form-control{border:1px solid #ccc;border-radius:4px}[dir=rtl] .input-group-addon:first-child,[dir=rtl] .input-group-btn:first-child>.btn,[dir=rtl] .input-group-btn:first-child>.btn-group>.btn,[dir=rtl] .input-group-btn:first-child>.dropdown-toggle,[dir=rtl] .input-group-btn:last-child>.btn-group:not(:last-child)>.btn,[dir=rtl] .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),[dir=rtl] .input-group .form-control:first-child{border-top-left-radius:0;border-bottom-left-radius:0;border-left:0}[dir=rtl] .input-group-addon:last-child,[dir=rtl] .input-group-btn:first-child>.btn-group:not(:first-child)>.btn,[dir=rtl] .input-group-btn:first-child>.btn:not(:first-child),[dir=rtl] .input-group-btn:last-child>.btn,[dir=rtl] .input-group-btn:last-child>.btn-group>.btn,[dir=rtl] .input-group-btn:last-child>.dropdown-toggle,[dir=rtl] .input-group .form-control:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.minicolors-theme-semanticui .minicolors-swatch{top:0;left:0;padding:18px}[dir=rtl] .minicolors-theme-semanticui .minicolors-swatch{right:0}.minicolors-theme-semanticui input{text-indent:30px}.imgix-preview-image{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-width:100%;max-height:100%;display:block;pointer-events:none}.imgix-parameters-container{position:absolute;left:0;top:0;bottom:0;right:0;overflow-x:hidden;overflow-y:auto;display:flex;flex-direction:column;padding:15px 10px}.imgix-parameters-container.is-hidden{display:none}.imgix-parameters-container .imgix-parameter-group select{font-size:12px}.imgix-parameters-container .imgix-parameter-group h4{margin:0;font-size:10px;text-transform:uppercase;color:#999;background-color:#ddd;padding:5px 15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.imgix-parameters-container .imgix-parameter-group>div{padding:15px}.imgix-parameter{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-bottom:15px;margin-bottom:15px}.imgix-parameter .imgix-param-imagick-warning{position:absolute;left:-10px;top:-5px;right:-10px;bottom:0;padding:0 5px;display:flex;align-items:center;justify-content:center;background:hsla(0,0%,100%,.8)}.imgix-parameter .imgix-param-imagick-warning>div{text-align:center}.imgix-parameter:last-of-type{margin-bottom:0;padding-bottom:0}.imgix-param-title{display:flex;align-items:baseline;margin-bottom:0}.imgix-param-title-colortype{align-items:center!important;margin-bottom:8px}.imgix-param-title-colortype h3{margin:0!important}.imgix-param-title-left{flex:1 50%}.imgix-param-title-right{flex:1 50%;padding-left:40px;text-align:right;position:relative}.imgix-param-title-right h3{text-align:right}.imgix-param-blend-mode h3,.imgix-param-title h3{margin-top:0;font-size:11px;text-transform:uppercase;color:#666}.imgix-media-param-title .imgix-param-title-left{flex:2 80%}.imgix-media-param-title .imgix-param-title-right{flex:1 20%}.imgix-media-param-title .imgix-param-title-right a{text-align:center!important}.minicolors-theme-default.minicolors{width:auto;display:block;padding:0!important;margin:0;min-height:29px}.ilab-color-input{position:relative;top:0;right:0;height:30px!important;margin:0!important;padding-left:8px!important;padding-right:30px!important}.imgix-param-blend-mode{margin-top:15px;display:flex;align-items:baseline}.imgix-param-blend-mode h3{flex:1 50%}.imgix-param-blend-mode select{flex:2 100%}.imgix-parameter input[type=range]{display:block;width:100%;-webkit-appearance:none;margin:0 0 10px;background:none;padding:0!important}.imgix-parameter input[type=range]:focus{outline:none}.imgix-parameter input[type=range]:focus::-webkit-slider-runnable-track{background:#fff}.imgix-parameter input[type=range]::-webkit-slider-runnable-track{width:100%;height:5px;cursor:pointer;animate:.2s;box-shadow:inset 1px 1px 2px 0 rgba(0,0,0,.25);background:#d4cfd4;border-radius:4px;border:0 solid #000101}.imgix-parameter input[type=range]::-webkit-slider-thumb{border:1px solid rgba(0,0,0,.25);box-shadow:inset 0 2px 2px 0 hsla(0,0%,100%,.5);height:17px;width:17px;border-radius:9px;background:#dcdcdc;cursor:pointer;-webkit-appearance:none;margin-top:-6px}.imgix-parameter input[type=range]::-moz-range-track{width:100%;height:5px;cursor:pointer;animate:.2s;box-shadow:inset 1px 1px 2px 0 rgba(0,0,0,.25);background:#d4cfd4;border-radius:4px;border:0 solid #000101}.imgix-parameter input[type=range]::-moz-range-thumb{border:1px solid rgba(0,0,0,.25);box-shadow:inset 0 2px 2px 0 hsla(0,0%,100%,.5);height:17px;width:17px;border-radius:9px;background:#dcdcdc;cursor:pointer;-webkit-appearance:none;margin-top:-6px}.imgix-parameter .imgix-param-reset{display:flex;width:100%;justify-content:flex-end}.imgix-parameter .imgix-param-reset a{font-size:11px;font-style:italic;text-decoration:none}.imgix-parameter .imgix-param-reset a,.imgix-parameter a:focus{outline:none!important;border:0!important}.imgix-media-preview{position:relative;margin:0!important;padding:0 0 100%!important;background-image:url(../img/ilab-imgix-edit-bg.png);width:100%}.imgix-media-preview img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-width:100%;max-height:100%;display:block}.imgix-media-preview-inner{position:absolute;left:0;right:0;bottom:0;top:0;display:flex;align-items:center;justify-content:center}.imgix-alignment-container{display:flex;flex:row;flex-wrap:wrap;justify-content:space-around;align-items:baseline;padding:0 35px}.imgix-alignment-button{background-color:#ddd;display:block;width:60px;height:60px;margin:5px;text-decoration:none;border-radius:4px;border:1px solid #888;box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.15)!important}.selected-alignment{background-color:#bbb;box-shadow:inset 1px 1px 1px rgba(0,0,0,.25),0 1px 0 rgba(0,0,0,.15)!important}.ilabm-pillbox{flex-wrap:wrap;border-bottom:0!important}.ilabm-pillbox,.ilabm-pillbox .ilabm-pill{align-items:center;display:flex;justify-content:center}.ilabm-pillbox .ilabm-pill{white-space:nowrap;line-height:1;height:14px;min-height:32px;width:140px;min-width:140px;max-width:140px;font-size:10px;background-color:#eaeaea;text-transform:uppercase;font-weight:700;color:#444;text-decoration:none;border-radius:8px;margin:3px}.ilabm-pillbox .ilabm-pill span{display:block;margin-right:8px}.ilabm-pillbox .ilabm-pill span.icon{width:18px;height:18px;min-width:18px;min-height:18px;max-width:18px;max-height:18px;background-repeat:no-repeat;background-position:50%;background-size:contain;margin-left:8px}.ilabm-pillbox .pill-selected{background-color:#ccc;box-shadow:inset 1px 1px 1px rgba(0,0,0,.25);color:#fff}.ilabm-pillbox-no-icon .ilabm-pill{width:100px;min-width:100px;max-width:100px}.ilabm-pillbox-no-icon .ilabm-pill span{margin-right:0}.ilabm-pillbox-no-icon .ilabm-pill span.icon{display:none}.imgix-pill-enhance>span.icon{background-image:url(../img/ilab-imgix-magic-wand-black.svg)}.imgix-pill-enhance.pill-selected>span.icon{background-image:url(../img/ilab-imgix-magic-wand-white.svg)}.imgix-pill-redeye>span.icon{background-image:url(../img/ilab-imgix-red-eye-black.svg)}.imgix-pill-redeye.pill-selected>span.icon{background-image:url(../img/ilab-imgix-red-eye-white.svg)}.imgix-pill-usefaces>span.icon{background-image:url(../img/ilab-imgix-faces-black.svg)}.imgix-pill-usefaces.pill-selected>span.icon{background-image:url(../img/ilab-imgix-faces-white.svg)}.imgix-pill-focalpoint>span.icon{background-image:url(../img/ilab-imgix-focalpoint-black.svg)}.imgix-pill-focalpoint.pill-selected>span.icon{background-image:url(../img/ilab-imgix-focalpoint-white.svg)}.imgix-pill-entropy>span.icon{background-image:url(../img/ilab-imgix-chaos-black.svg)}.imgix-pill-entropy.pill-selected>span.icon{background-image:url(../img/ilab-imgix-chaos-white.svg)}.imgix-pill-edges>span.icon{background-image:url(../img/ilab-imgix-edges-black.svg)}.imgix-pill-edges.pill-selected>span.icon{background-image:url(../img/ilab-imgix-edges-white.svg)}.imgix-pill-h>span.icon{background-image:url(../img/ilab-flip-horizontal-black.svg)}.imgix-pill-h.pill-selected>span.icon{background-image:url(../img/ilab-flip-horizontal-white.svg)}.imgix-pill-v>span.icon{background-image:url(../img/ilab-flip-vertical-black.svg)}.imgix-pill-v.pill-selected>span.icon{background-image:url(../img/ilab-flip-vertical-white.svg)}.imgix-pill-clip>span.icon{background-image:url(../img/ilab-imgix-clip-black.svg)}.imgix-pill-clip.pill-selected>span.icon{background-image:url(../img/ilab-imgix-clip-white.svg)}.imgix-pill-crop>span.icon{background-image:url(../img/ilab-imgix-crop-black.svg)}.imgix-pill-crop.pill-selected>span.icon{background-image:url(../img/ilab-imgix-crop-white.svg)}.imgix-pill-max>span.icon{background-image:url(../img/ilab-imgix-max-black.svg)}.imgix-pill-max.pill-selected>span.icon{background-image:url(../img/ilab-imgix-max-white.svg)}.imgix-pill-scale>span.icon{background-image:url(../img/ilab-imgix-scale-black.svg)}.imgix-pill-scale.pill-selected>span.icon{background-image:url(../img/ilab-imgix-scale-white.svg)}.imgix-preset-make-default-container{align-items:center;display:flex;min-height:30px;margin-left:10px}.imgix-preset-container{align-items:center;display:flex}.imgix-preset-container.is-hidden,.imgix-preset-make-default-container.is-hidden{display:none}.imgix-param-label{font-style:italic;text-transform:none!important}.imgix-label-editor{position:absolute;right:-4px;top:0;width:40px;font-size:11px;padding:1px;text-align:right}.ilabm-focal-point-icon{position:absolute;background-image:url(../img/ilab-imgix-focalpoint-icon.svg);width:24px;height:24px;background-size:contain;pointer-events:none}.ilab-face-outline{position:absolute;border:3px solid #fff;-webkit-filter:drop-shadow(0 2px 3px #000);filter:drop-shadow(0 2px 3px black);opacity:.33;z-index:999;cursor:pointer}.ilab-face-outline span{display:block;position:absolute;background-color:#fff;color:#000;font-size:9px;width:12px;height:12px;text-align:center;font-weight:700;line-height:1}.ilab-face-outline.active{opacity:1;z-index:1000}.ilab-all-faces-outline{position:absolute;border:3px solid #fff;-webkit-filter:drop-shadow(0 2px 3px #000);filter:drop-shadow(0 2px 3px black)}input[type=range].imgix-param{-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=range].imgix-param:focus{outline:none}input[type=range].imgix-param:focus::-webkit-slider-runnable-track{background:#bababa}input[type=range].imgix-param::-webkit-slider-runnable-track{width:100%;height:17px;cursor:pointer;animate:.2s;background:#cfcfcf;border-radius:17px;box-shadow:none}input[type=range].imgix-param::-moz-range-track{width:100%;height:17px;cursor:pointer;animate:.2s;background:#cfcfcf;border-radius:17px;box-shadow:none}input[type=range].imgix-param::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;width:18px;height:17px;border-radius:17px;margin-top:0}input[type=range].imgix-param::-moz-range-thumb{-webkit-appearance:none;cursor:pointer;width:18px;height:17px;border-radius:17px;margin-top:0}.ilab-crop-preview{overflow:hidden;max-width:100%;max-height:100%}.ilab-crop-now-wrapper{margin-top:12px}.ilabc-cropper{max-width:100%;max-height:100%}.ilabm-sidebar-content-cropper{flex-direction:column!important;padding:10px;overflow:scroll}.ilabm-sidebar-content-cropper h3{margin-top:0;font-size:11px;text-transform:uppercase;color:#888;font-weight:700}.cropper-dashed.dashed-h{top:38.4615385%;height:23.076923%}.cropper-dashed.dashed-v{left:38.4615385%;width:23.076923%}.ilabc-current-crop-container{position:relative;margin-bottom:15px}.ilabc-crop-preview-container,.ilabc-current-crop-container{background-image:url(../img/ilab-imgix-edit-bg.png);display:flex;align-items:center;justify-content:center;flex:1}.ilab-current-crop-img{position:absolute;-o-object-fit:contain;object-fit:contain;padding:0!important;margin:0!important;height:100%;width:100%}#ilab-crop-aspect-checkbox-container{display:flex;align-items:center}#ilab-crop-aspect-checkbox-container input{margin:0 8px 0 0;padding:0}#ilab-s3-info-meta .inside{padding:0 5px 10px}.info-panel-tabs{margin:-7px -5px 0;padding:6px 10px 0;background-color:rgba(0,0,0,.125)}.info-panel-tabs ul{display:flex;margin:0;padding:0;height:100%}.info-panel-tabs ul li{padding:5px 10px;font-size:11px;text-transform:uppercase;margin:0 10px 0 0;display:block;background-color:rgba(0,0,0,.0625);cursor:pointer;font-weight:700}.info-panel-tabs ul li.info-panel-missing-sizes{color:#9e0000}.info-panel-tabs ul li.active{background-color:#fff}.info-panel-contents{padding:15px 10px 0}.info-panel-contents .info-line{display:flex;flex-direction:column;margin-bottom:15px}.info-panel-contents .info-line h3,.info-panel-contents .info-line label{font-size:11px;text-transform:uppercase;margin:0;font-weight:700}.info-panel-contents .info-line label{margin-bottom:4px}.info-panel-contents .info-line select{font-size:12px!important}.info-panel-contents .info-line a{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.info-panel-contents .info-notice{padding:10px 5px 20px}.info-panel-contents .info-size-selector{margin-bottom:15px}.info-panel-contents .button-row{margin-bottom:15px;border-top:1px solid #eaeaea;padding-top:15px;display:flex;justify-content:flex-end;align-items:center}.info-panel-contents .button-row #ilab-info-regenerate-status{display:flex;padding:0;justify-content:center;align-items:center;width:100%;font-size:12px}.info-panel-contents .button-row #ilab-info-regenerate-status .spinner{float:none;display:block;margin:0 8px 0 0;width:16px;height:16px;background-size:16px 16px}.info-panel-contents .links-row{display:flex;align-items:center;justify-content:center;background-color:rgba(0,0,0,.05);border:1px solid rgba(0,0,0,.1);border-radius:8px;padding:10px 0;margin-bottom:15px}.info-panel-contents .links-row a{color:#000;display:flex;align-items:center;margin-right:20px;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:11px}.info-panel-contents .links-row a:last-of-type{margin-right:0}.info-panel-contents .links-row a .dashicons{margin-right:3px;width:16px;height:16px;font-size:16px}#ilab-media-grid-info-popup{position:absolute;z-index:170000;opacity:1;transition:opacity .33s;-webkit-filter:drop-shadow(0 0 5px rgba(50,50,50,.5));filter:drop-shadow(0 0 5px rgba(50,50,50,.5));display:flex;align-items:center}#ilab-media-grid-info-popup.hidden{opacity:0;pointer-events:none}#ilab-media-grid-info-popup h2{text-transform:uppercase;font-size:9px;padding:4px 10px;margin:0;color:rgba(0,0,0,.33)}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content{min-height:554px;background-color:#fff;width:275px;max-width:275px;padding-bottom:1px;display:flex;flex-direction:column;position:relative}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .info-panel-tabs{margin:0}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .info-panel-contents>div{display:flex;flex-direction:column}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .info-panel-contents>div>div{flex:1}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .info-panel-contents .info-file-info-size{flex-grow:1;display:flex;flex-direction:column}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .button-row{position:absolute;bottom:0;right:0;left:0}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader-container{display:flex;justify-content:center;align-items:center;position:absolute;left:0;top:0;right:0;bottom:0;transition:opacity .5s}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader,#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader:after{border-radius:50%;width:24px;height:24px}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader{font-size:5px;text-indent:-9999em;border:1.1em solid hsla(0,0%,100%,.2);border-left-color:#fff;-webkit-animation:load8 1.1s linear infinite;animation:load8 1.1s linear infinite}#ilab-media-grid-info-popup .ilab-media-grid-info-popup-content .ilab-loader.ilab-loader-dark{border:1.1em solid rgba(0,0,0,.2);border-left-color:#000}@-webkit-keyframes load8{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes load8{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}#ilab-media-grid-info-popup .ilab-media-popup-arrow-left{width:45px;display:flex;justify-content:flex-end}#ilab-media-grid-info-popup .ilab-media-popup-arrow-left>div{width:0;height:0;border-color:transparent #fff transparent transparent;border-style:solid;border-width:9px 15.6px 9px 0}#ilab-media-grid-info-popup .ilab-media-popup-arrow-right{width:45px;display:flex;justify-content:flex-start}#ilab-media-grid-info-popup .ilab-media-popup-arrow-right>div{width:0;height:0;border-color:transparent transparent transparent #fff;border-style:solid;border-width:9px 0 9px 15.6px;margin-right:30px}#ilab-media-grid-info-popup.popup-left .ilab-media-popup-arrow-right,#ilab-media-grid-info-popup.popup-right .ilab-media-popup-arrow-left{display:none}li.attachment{transition:opacity .3s ease-out,transform .3s ease-out,box-shadow .3s ease-out}li.attachment .ilab-loader-container{z-index:100}li.attachment.info-focused{transform:scale(1.1)}li.attachment.info-focused>div:first-of-type{box-shadow:0 0 5px 0 rgba(50,50,50,.5)}li.attachment.info-unfocused{opacity:.33}#ilab-media-grid-info-popup.ilab-popup-document h2{background-color:rgba(0,0,0,.125);color:#000}#ilab-media-grid-info-popup.ilab-popup-document .info-panel-contents{padding:10px 10px 0}#ilab-media-grid-info-popup.ilab-popup-document .ilab-media-grid-info-popup-content{min-height:484px}table.ilab-image-sizes{border-collapse:collapse;width:100%}table.ilab-image-sizes td,table.ilab-image-sizes th{padding:10px}table.ilab-image-sizes td.center{text-align:center}table.ilab-image-sizes thead th{border:2px solid #f1f1f1;background-color:#dadada}table.ilab-image-sizes tr{border-bottom:1px solid #dadada}.ilab-add-image-size-backdrop{display:flex;align-items:center;justify-content:center}.ilab-add-image-size-container{left:auto;right:auto;bottom:auto;top:auto}.ilab-new-image-size-form{padding:20px;display:flex;flex-direction:column}.ilab-new-image-size-form div.row{display:flex;align-items:center;margin-bottom:15px}.ilab-new-image-size-form div.row>label{width:90px;text-align:right;margin-right:15px;font-weight:700}.ilab-new-image-size-form div.button-row{padding:10px;text-align:right}.ilab-delete-size-button{font-size:0;display:inline-block;width:18px;height:18px;background-image:url(../img/ilab-ui-icon-trash.svg);background-size:contain;background-position:50%;background-repeat:no-repeat;background-size:12px;margin-right:10px}.ilab-delete-size-button.disabled{opacity:.33;pointer-events:none}.ilab-delete-size-button:hover{background-image:url(../img/ilab-ui-icon-trash-hover.svg)}.ilab-size-settings-button{font-size:0;display:inline-block;width:18px;height:18px;background-image:url(../img/ilab-ui-icon-settings.svg);background-size:contain;background-position:50%;background-repeat:no-repeat;background-size:14px}.ilab-size-settings-button.disabled{opacity:.33;pointer-events:none}.ilab-size-settings-button:hover{background-image:url(../img/ilab-ui-icon-settings-hover.svg)}.ilab-browser-select-table-container table,.ilab-storage-browser table{border-collapse:collapse;width:100%;font-size:1.1em}.ilab-browser-select-table-container table td,.ilab-browser-select-table-container table th,.ilab-storage-browser table td,.ilab-storage-browser table th{padding:12px}.ilab-browser-select-table-container table thead tr th,.ilab-storage-browser table thead tr th{text-align:left;border:2px solid #f1f1f1;background-color:#dadada}.ilab-browser-select-table-container table thead tr th.checkbox,.ilab-storage-browser table thead tr th.checkbox{max-width:30px;width:30px;text-align:center}.ilab-browser-select-table-container table tbody tr,.ilab-storage-browser table tbody tr{transition:background-color .125s linear;cursor:pointer}.ilab-browser-select-table-container table tbody tr:hover,.ilab-storage-browser table tbody tr:hover{background-color:#fff}.ilab-browser-select-table-container table tbody tr input[type=checkbox],.ilab-storage-browser table tbody tr input[type=checkbox]{z-index:1000}.ilab-browser-select-table-container table tbody tr td,.ilab-storage-browser table tbody tr td{text-decoration:none}.ilab-browser-select-table-container table tbody tr td.checkbox,.ilab-storage-browser table tbody tr td.checkbox{max-width:30px;width:30px;text-align:center}.ilab-browser-select-table-container table tbody tr td.entry,.ilab-storage-browser table tbody tr td.entry{display:flex;align-items:center}.ilab-browser-select-table-container table tbody tr td.actions,.ilab-storage-browser table tbody tr td.actions{text-align:center;width:130px;max-width:130px}.ilab-browser-select-table-container table tbody tr td.actions .button-delete,.ilab-storage-browser table tbody tr td.actions .button-delete{margin-right:0;margin-left:10px;color:#fff;border-color:#920002;background:#ca0002;box-shadow:0 1px 0 #cc0005}.ilab-browser-select-table-container table tbody tr td.actions .button-delete svg,.ilab-storage-browser table tbody tr td.actions .button-delete svg{height:14px}.ilab-browser-select-table-container table tbody tr td.actions .button-delete.disabled,.ilab-storage-browser table tbody tr td.actions .button-delete.disabled{color:#ff6468!important;border-color:#920002!important;background:#c6282a!important;box-shadow:0 1px 0 #cc0005!important;text-shadow:0 1px 0 #cc0005!important}.ilab-browser-select-table-container table tbody tr td.actions .button-delete.disabled svg>path,.ilab-browser-select-table-container table tbody tr td.actions .button-delete.disabled svg>rect,.ilab-storage-browser table tbody tr td.actions .button-delete.disabled svg>path,.ilab-storage-browser table tbody tr td.actions .button-delete.disabled svg>rect{fill:#ff6468}.ilab-browser-select-table-container table tbody tr td img.loader,.ilab-storage-browser table tbody tr td img.loader{display:none;margin-right:10px;width:16px;height:16px}.ilab-browser-select-table-container table tbody tr td span,.ilab-storage-browser table tbody tr td span{display:block;width:16px;height:16px;background-size:contain;background-repeat:no-repeat;margin-right:10px}.ilab-browser-select-table-container table tbody tr td span.icon-dir,.ilab-storage-browser table tbody tr td span.icon-dir{background-image:url(../img/ilab-ui-icon-folder.svg)}.ilab-browser-select-table-container table tbody tr td span.icon-file,.ilab-storage-browser table tbody tr td span.icon-file{background-image:url(../img/ilab-ui-icon-file.svg)}.ilab-browser-select-table-container table tbody tr td span.icon-up,.ilab-storage-browser table tbody tr td span.icon-up{background-image:url(../img/ilab-ui-icon-up-dir.svg)}.ilab-browser-select-table-container table tr,.ilab-storage-browser table tr{border-bottom:1px solid #dadada}.mcsb-buttons .button{margin-right:5px;display:flex;align-items:center}.mcsb-buttons .button svg{height:16px;width:auto;margin-right:8px}.mcsb-buttons .button svg>path,.mcsb-buttons .button svg>rect{fill:#fff}.mcsb-buttons .button-primary.disabled svg>path,.mcsb-buttons .button-primary.disabled svg>rect{fill:#66c6e4}.mcsb-buttons .button-create-folder svg{height:12px}.mcsb-buttons .button-import{margin-left:10px}.mcsb-buttons .button-import svg{height:14px}.mcsb-buttons .button-delete{margin-right:0;margin-left:10px;color:#fff;border-color:#920002;background:#ca0002;box-shadow:0 1px 0 #cc0005}.mcsb-buttons .button-delete svg{height:14px}.mcsb-buttons .button-delete.disabled{color:#ff6468!important;border-color:#920002!important;background:#c6282a!important;box-shadow:0 1px 0 #cc0005!important;text-shadow:0 1px 0 #cc0005!important}.mcsb-buttons .button-delete.disabled svg>path,.mcsb-buttons .button-delete.disabled svg>rect{fill:#ff6468}.mcsb-buttons .button-cancel{color:#fff;border-color:#920002;background:#ca0002;text-shadow:0 1px 0 #cc0005!important;box-shadow:0 1px 0 #cc0005}.mcsb-buttons .button-cancel:hover{border-color:#9f0002;background:#d80002;text-shadow:0 1px 0 #d60005!important;box-shadow:0 1px 0 #d60005}.mcsb-actions{margin-bottom:18px;font-size:1.1em}.mcsb-actions,.mcsb-actions div.mcsb-action-buttons{display:flex;align-items:center}.ilab-storage-browser-header{flex:1;padding:14px 9px;box-shadow:inset 0 0 3px 0 rgba(0,0,0,.125);border:1px solid #ddd;border-radius:8px;margin-right:18px}.ilab-storage-browser-header ul{margin:0;padding:0;display:flex}.ilab-storage-browser-header ul li{padding:0;position:relative;display:block;margin:0 30px 0 0}.ilab-storage-browser-header ul li a{text-decoration:none}.ilab-storage-browser-header ul li:first-of-type{padding-left:35px}.ilab-storage-browser-header ul li:first-of-type:before{background-image:url(../img/ilab-ui-icon-folder.svg);width:16px;height:16px;left:0}.ilab-storage-browser-header ul li:after,.ilab-storage-browser-header ul li:first-of-type:before{content:" ";position:absolute;background-size:contain;background-position:50%;background-repeat:no-repeat;top:50%;margin-left:10px;transform:translateY(-50%)}.ilab-storage-browser-header ul li:after{background-image:url(../img/ilab-ui-path-divider.svg);width:9px;height:9px}.ilab-storage-browser-header ul li:last-of-type:after{display:none}#mcsb-progress-modal{z-index:10000;position:fixed;left:0;top:0;right:0;bottom:0;background:rgba(0,0,0,.66);display:flex;align-items:center;justify-content:center;transition:opacity .15s linear;opacity:1;pointer-events:none}#mcsb-progress-modal.hidden{opacity:0}#mcsb-progress-modal .mcsb-progress-container{min-width:40vw;background-color:#fff;padding:30px}#mcsb-progress-modal .mcsb-progress-container .mcsb-progress-label{font-weight:700;font-size:1.1em;margin-bottom:20px}#mcsb-progress-modal .mcsb-progress-container .mcsb-progress-bar{position:relative;background-color:#eaeaea;height:24px;border-radius:12px;overflow:hidden}#mcsb-progress-modal .mcsb-progress-container .mcsb-progress-bar #mcsb-progress{position:absolute;left:0;top:0;bottom:0;background-color:#4f90c4}#mcsb-import-options-modal{z-index:10000;position:fixed;left:0;top:0;right:0;bottom:0;background:rgba(0,0,0,.66);display:flex;align-items:center;justify-content:center;transition:opacity .15s linear;opacity:1;pointer-events:none}#mcsb-import-options-modal.hidden{opacity:0}#mcsb-import-options-modal.hidden .mcsb-import-options-container{pointer-events:none}#mcsb-import-options-modal .mcsb-import-options-container{min-width:40vw;max-width:800px;background-color:#fff;padding:30px;pointer-events:all;display:flex;flex-direction:column}#mcsb-import-options-modal .mcsb-import-options-container h3{display:block;padding:0;margin:0 0 25px;position:relative;font-weight:700;font-size:1.125em}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options{margin-bottom:50px}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul{display:grid;grid-template-columns:repeat(1,1fr);grid-row-gap:20px;grid-column-gap:10px}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul li{display:flex;align-items:flex-start}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul li h4{margin:0;padding:0;font-size:1em}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul li .mcsb-option{padding-top:2px}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-options ul li .mcsb-option-description{margin-left:15px}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-buttons{display:flex;justify-content:flex-end}#mcsb-import-options-modal .mcsb-import-options-container div.mcsb-import-buttons .button{margin:0 0 0 20px}#ilab-upload-target{position:fixed;left:0;right:0;bottom:0;top:0;display:flex;justify-content:center;align-items:center;font-size:2em;font-weight:700;color:#fff;background-color:rgba(28,90,129,.75);z-index:100000;transition:opacity .125s linear;opacity:0;pointer-events:none}#wpbody.drag-inside #ilab-upload-target{opacity:1}#mcsb-upload-modal{position:fixed;left:0;right:0;bottom:0;top:0;display:flex;justify-content:center;align-items:center;background:rgba(0,0,0,.66);z-index:100000;transition:opacity .125s linear;opacity:1}#mcsb-upload-modal.hidden{opacity:0;pointer-events:none}#mcsb-upload-modal #mcsb-upload-container{min-width:630px;min-height:385px;background-color:#fff;display:flex;flex-direction:column}#mcsb-upload-modal #mcsb-upload-container div.mcsb-upload-header{padding:20px;position:relative;font-weight:700}#mcsb-upload-modal #mcsb-upload-container div.mcsb-upload-items{position:relative;flex:1;background-color:#eaeaea}#mcsb-upload-modal #mcsb-upload-container div.mcsb-upload-items #mcsb-upload-items-container{padding:15px;position:absolute;left:0;top:0;right:0;bottom:0;overflow:auto;display:flex;flex-wrap:wrap}.ilab-browser-select{position:absolute;left:0;top:0;width:100%;height:100%;display:flex;flex-direction:column}.ilab-browser-select .ilab-browser-select-header{height:48px;min-height:48px;padding-left:12px;padding-right:64px;display:flex;align-items:center}.ilab-browser-select .ilab-browser-select-header input{flex:1;padding:7px 11px;border-radius:4px}.ilab-browser-select .ilab-browser-select-header input:disabled{color:#000}.ilab-browser-select .ilab-browser-select-table-container{flex:1;overflow-y:auto;background-color:#efefef}.ilab-browser-select .ilab-browser-select-footer{height:48px;min-height:48px;display:flex;align-items:center;justify-content:flex-end;padding-right:12px}.ilab-browser-select .ilab-browser-select-footer .button{margin-left:12px}.mcsb-modal-contents{border-radius:8px}.mcsb-modal-contents h3{background-image:url(../img/icon-cloud.svg);background-position:0;background-repeat:no-repeat;background-size:44px 44px;padding:12px 0 12px 60px!important}#task-manager div.available-tasks{padding:15px 20px 10px;display:flex;flex-direction:column;border-radius:8px;margin-bottom:25px;margin-top:30px;background-color:#e4e4e4}#task-manager div.available-tasks h2{margin:0 0 15px;padding:0;text-transform:uppercase;font-size:11px;color:#777}#task-manager div.available-tasks div.buttons{display:flex;flex-wrap:wrap}#task-manager div.available-tasks div.buttons .button{margin:0 10px 10px 0}#task-manager div.task-list{padding:18px 20px;border-radius:8px;background-color:#e4e4e4;margin-bottom:25px}#task-manager div.task-list h2{margin:0 0 15px;padding:0;text-transform:uppercase;font-size:11px;color:#777;display:flex;align-items:center;justify-content:space-between}#task-manager div.task-list table.task-table{width:100%;font-size:.9em}#task-manager div.task-list table.task-table td,#task-manager div.task-list table.task-table th{text-align:left;white-space:nowrap;padding:10px 20px;background-color:#efefef}#task-manager div.task-list table.task-table td.progress,#task-manager div.task-list table.task-table td.schedule,#task-manager div.task-list table.task-table th.progress,#task-manager div.task-list table.task-table th.schedule{width:100%}#task-manager div.task-list table.task-table th{background-color:#3a5674;color:#fff}#task-manager div.task-list table.task-table th:first-of-type{border-top-left-radius:4px}#task-manager div.task-list table.task-table th:last-of-type{border-top-right-radius:4px}#task-manager div.task-list table.task-table td.status{text-transform:capitalize}#task-manager div.task-list table.task-table td.status.status-complete{font-weight:700;color:green}#task-manager div.task-list table.task-table td.status.status-error{font-weight:700;color:#a70000}#task-manager div.task-list table.task-table td.progress{position:relative}#task-manager div.task-list table.task-table td.progress div.progress-bar{position:absolute;left:10px;top:10px;bottom:10px;right:10px;background-color:#ccc;display:flex;align-items:center;justify-content:center;overflow:hidden;border-radius:4px}#task-manager div.task-list table.task-table td.progress div.progress-bar .bar{position:absolute;left:0;top:0;bottom:0;width:75%;background-color:#50ade2}#task-manager div.task-list table.task-table td.progress div.progress-bar .amount{z-index:2;color:#fff;font-weight:700}#task-manager div.task-list table.task-table tbody tr:last-of-type td:first-of-type{border-bottom-left-radius:4px}#task-manager div.task-list table.task-table tbody tr:last-of-type td:last-of-type{border-bottom-right-radius:4px}.task-options-modal{position:fixed;left:0;top:0;right:0;bottom:0;background:rgba(0,0,0,.75);z-index:100000;display:flex;align-items:center;justify-content:center;transition:opacity .25s linear}.task-options-modal.invisible{opacity:0}.task-options-modal.invisible .task-modal{transform:scale(.95)}.task-options-modal .task-modal{background-color:#fff;padding:30px;border-radius:8px;transition:transform .25s ease-in-out}.task-options-modal .task-modal h2{padding:0;font-size:1.2em;margin:0 0 40px}.task-options-modal .task-modal form ul{padding:0;display:flex;flex-direction:column;margin:20px 0 0}.task-options-modal .task-modal form ul li{display:flex;margin-bottom:30px}.task-options-modal .task-modal form ul li:last-of-type{margin-bottom:0}.task-options-modal .task-modal form ul li>div:first-of-type{padding:10px 10px 20px 0;width:160px;min-width:160px;line-height:1.3;font-weight:600}.task-options-modal .task-modal form ul li>div:last-of-type{flex:1}.task-options-modal .task-modal form ul li div.description{margin-top:8px}.task-options-modal .task-modal form ul li div.option-ui{display:flex;align-items:center;width:100%}.task-options-modal .task-modal form ul li div.option-ui.option-ui-browser input[type=text]{flex:1;margin-right:10px;padding:7px 11px;border-radius:4px}.task-options-modal .task-modal form ul li div.option-ui.option-ui-browser input[type=text]:disabled{color:#000}.task-options-modal .task-modal form ul li div.option-ui.option-ui-media-select{display:flex;flex:1}.task-options-modal .task-modal form ul li div.option-ui.option-ui-media-select .media-select-label{flex:1;box-sizing:border-box;margin-right:10px;padding:7px 11px;border-radius:4px;background-color:hsla(0,0%,100%,.498039);border:1px solid hsla(0,0%,87.1%,.74902)}.task-options-modal .task-modal form ul li div.option-ui.option-ui-media-select .button{margin-right:5px}.task-options-modal .task-modal div.buttons{margin-top:40px;display:flex;justify-content:flex-end}.task-options-modal .task-modal div.buttons .button{margin-left:15px}#task-batch div.buttons{display:flex;justify-content:flex-end;margin-top:40px}#task-batch div.buttons .button-whoa{background:#a42929!important;border-color:#e62a2a #a42929 #a42929!important;box-shadow:0 1px 0 #a42929!important;color:#fff!important;text-decoration:none!important;text-shadow:0 -1px 1px #a42929,1px 0 1px #a42929,0 1px 1px #a42929,-1px 0 1px #a42929!important}#task-batch div.task-info .info-warning{border:1px solid orange;padding:24px;background:rgba(255,165,0,.125);margin-top:20px;border-radius:8px}#task-batch div.task-info .info-warning h4{padding:0;font-size:14px;margin:0 0 8px}#task-batch div.task-info .wp-cli-callout{padding:24px;background:#ddd;margin-top:20px;border-radius:8px}#task-batch div.task-info .wp-cli-callout h3{margin:0;padding:0;font-size:14px}#task-batch div.task-info .wp-cli-callout code{background-color:#bbb;padding:10px 15px;margin-top:5px;display:inline-block}#task-batch div.task-info .task-options{padding:24px;background:#e7e7e7;margin-top:20px;border-radius:8px}#task-batch div.task-info .task-options h3{margin:0;padding:0;font-size:14px}#task-batch div.task-info .task-options ul{padding:0;display:flex;flex-direction:column;margin:20px 0 0}#task-batch div.task-info .task-options ul li{display:flex;margin-bottom:30px}#task-batch div.task-info .task-options ul li:last-of-type{margin-bottom:0}#task-batch div.task-info .task-options ul li>div:first-of-type{padding:10px 10px 20px 0;width:160px;min-width:160px;line-height:1.3;font-weight:600}#task-batch div.task-info .task-options ul li div.description{margin-top:8px}#task-batch div.task-info .task-options ul li div.option-ui{display:flex;align-items:center}#task-batch div.task-info .task-options ul li div.option-ui.option-ui-browser{display:flex;width:50vw}#task-batch div.task-info .task-options ul li div.option-ui.option-ui-browser input[type=text]{flex:1;margin-right:10px;padding:7px 11px;border-radius:4px}#task-batch div.task-info .task-options ul li div.option-ui.option-ui-browser input[type=text]:disabled{color:#000}#task-batch div.task-info .task-options ul li div.option-ui.option-ui-media-select{display:flex;width:50vw}#task-batch div.task-info .task-options ul li div.option-ui.option-ui-media-select .media-select-label{flex:1;box-sizing:border-box;margin-right:10px;padding:7px 11px;border-radius:4px;background-color:hsla(0,0%,100%,.498039)}#task-batch div.task-info .task-options ul li div.option-ui.option-ui-media-select .button{margin-right:5px}#task-batch div.task-progress{padding:24px;background:#ddd;border-radius:8px}#task-batch div.task-progress .progress-container{position:relative;width:100%;height:14px;background:#aaa;border-radius:16px;overflow:hidden;background-image:url(../img/candy-stripe.svg)}#task-batch div.task-progress .progress-container .progress-bar{background-color:#4f90c4;height:100%;width:10px}#task-batch div.task-progress .progress-thumbnails{position:relative;width:100%;height:150px;margin-bottom:15px}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%);mask-image:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%)}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container img{width:150px;height:150px;max-width:150px;max-height:150px;border-radius:4px;margin-right:10px}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container .item-title{color:#fff;position:absolute;right:10px;bottom:7px;text-align:right;left:10px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;text-shadow:1px 1px 2px rgba(0,0,0,.75);font-weight:700}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container .progress-thumb{position:absolute;left:0;top:0;width:150px;min-width:150px;max-width:150px;height:150px;min-height:150px;max-height:150px;background-size:cover;background-position:50%;background-repeat:no-repeat;margin-right:10px;border-radius:4px;background-color:#888;transition:opacity .25s linear,transform .25s linear}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container .progress-thumb.invisible{opacity:0;transform:scale(.7)}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container .progress-icon{position:absolute;left:0;top:0;position:relative;width:150px;min-width:150px;max-width:150px;height:150px;min-height:150px;max-height:150px;display:flex;align-items:center;justify-content:center;transition:opacity .25s linear,transform .25s linear}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-container .progress-icon.invisible{opacity:0;transform:scale(.8)}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-fade{background:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%);position:absolute;left:150px;top:0;right:0;bottom:0}@supports ((-webkit-mask-image:linear-gradient(to left,rgba(221,221,221,0) 0%,#dddddd 95%,#dddddd 100%)) or (mask-image:linear-gradient(to left,rgba(221,221,221,0) 0%,#dddddd 95%,#dddddd 100%))){#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-fade{display:none}}#task-batch div.task-progress .progress-thumbnails .progress-thumbnails-cloud{position:absolute;right:20px;top:50%;transform:translateY(-50%)}#task-batch div.task-progress .progress-stats{margin-top:20px;display:flex;align-items:center;justify-content:center}@media (max-width:960px){#task-batch div.task-progress .progress-stats{flex-direction:column;align-items:flex-start;justify-content:flex-start}}#task-batch div.task-progress .progress-stats div.group-break{display:flex;margin-right:1.2195121951vw}#task-batch div.task-progress .progress-stats div.group-break:last-of-type{margin-right:0}#task-batch div.task-progress .progress-stats div.group-break:first-of-type{flex:1}@media (max-width:960px){#task-batch div.task-progress .progress-stats div.group-break{width:100%;margin-bottom:1.2195121951vw}}#task-batch div.task-progress .progress-stats div.group{display:flex;align-items:center;padding:1.0975609756vw 0;background-color:#e6e6e6;border-radius:8px;margin-right:1.2195121951vw}#task-batch div.task-progress .progress-stats div.group *{white-space:nowrap}@media (max-width:960px){#task-batch div.task-progress .progress-stats div.group.mobile-flexed{flex:1}}#task-batch div.task-progress .progress-stats div.group.flexed{flex:1}#task-batch div.task-progress .progress-stats div.group:last-of-type{margin-right:0}#task-batch div.task-progress .progress-stats div.group div.callout{position:relative;margin-right:.6097560976vw;padding:0 1.4634146341vw}#task-batch div.task-progress .progress-stats div.group div.callout:after{display:block;position:absolute;content:"";height:50%;width:1px;right:0;top:25%;background-color:rgba(0,0,0,.25)}#task-batch div.task-progress .progress-stats div.group div.callout:last-of-type:after{display:none}#task-batch div.task-progress .progress-stats div.group div.callout p.value{line-height:1;padding:0;font-size:1.5853658537vw;font-weight:300;margin:0 0 .487804878vw}#task-batch div.task-progress .progress-stats div.group div.callout p.value.status{text-transform:capitalize}@media (max-width:960px){#task-batch div.task-progress .progress-stats div.group div.callout p.value{font-size:2.9268292683vw}}#task-batch div.task-progress .progress-stats div.group div.callout h4{line-height:1;margin:0;padding:0;font-size:.6097560976vw;text-transform:uppercase}@media (max-width:960px){#task-batch div.task-progress .progress-stats div.group div.callout h4{font-size:.8536585366vw}} -/*! mediabox v1.1.3 | (c) 2018 Pedro Rogerio | https://github.com/pinceladasdaweb/mediabox */.stop-scroll{height:100%;overflow:hidden}.mediabox-wrap{position:fixed;width:100%;height:100%;background-color:rgba(0,0,0,.8);top:0;left:0;opacity:0;z-index:999;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:mediabox;animation-name:mediabox}@-webkit-keyframes mediabox{0%{opacity:0}to{opacity:1}}@keyframes mediabox{0%{opacity:0}to{opacity:1}}.mediabox-content{max-width:853px;display:block;margin:0 auto;height:100%;position:relative}.mediabox-content iframe{max-width:100%!important;width:100%!important;display:block!important;height:480px!important;border:none!important;position:absolute;top:0;bottom:0;margin:auto 0}.mediabox-hide{-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:mediaboxhide;animation-name:mediaboxhide}@-webkit-keyframes mediaboxhide{0%{opacity:1}to{opacity:0}}@keyframes mediaboxhide{0%{opacity:1}to{opacity:0}}.mediabox-close{position:absolute;top:0;cursor:pointer;bottom:528px;right:0;margin:auto 0;width:24px;height:24px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMvSURBVHja7Js9aBRBFMd/d1lPY6FiJVjY+Fkoxl7wA1Q0prQRS6tgoZV2MWIRRVHUUq3U+JnESrS2sBXBzipREWMlATXwt8gFznC5nd15M7Nn8uC45nZnfr/dY96+N1uTxFKOOks8lgUU/H2t4tJqIQUcAiaBGeBymcECRgO4B/wBPgJ9zkdKcvkclfRL/8ZtSTXH40N+GpLGF8zth6Q9Lse7DHCsDXxVJLSDLyQhb4B+Sb/VOVJJ6ATfKqGvrIDjDvCpJLjAz8d0JwmLDTBQAD62hIakiYJzm5a021VAfwn4WBLKwLdK2JUnIJP0XX4RSoIP/Hy8W3jeepv1dL3nmjwI3DLOExrAU2DA8zwb8xKhGeCuwYQtJTSAZwbwAHdcEqFM0mPZhO/foSHppdFcrraby2IDV0FCcPi8PCClhCjwLplgCgkrDeGv5I3pcjViSogK7yogloTo8EUEhJaQBL6oAGsJ9yVtkrRD0qsU8JKolagKZ8AD4ETFymFXgPOAQpXE5mMWOAk86XZ4n6pwlSSUhvcti1dBghe8RV8gpYQRX3irxkgKCSPABV94y85QTAlm8NatsRgSTOGBUnmAS57w3KiA0Ro3gHOW8KEEAOwE3hvfXWubFauu6A6vCND07OmW9viq5vpsGT3AtRAN2XoA+BfAwQBiTweoNpMZw48BRwKuAoPN7zNVWwZjwAfpO9S7DN5cQmYAPw4cTvAsYPJ3qHcpvNmdUO9ieBMJZQT0AhMVgfeWUC8BP87cjjHfuA6sATY0c4c0EgpUUHslvTaq3l5aUL1N1oarAnxSCVWBTyYhJvyw41XJJI3GkpAH/yYyfHQJi01gdUL4qBKqCh9NQrtBx4wGvGi0XS6T9MhoTkN5AtZVDN5awlTePsGfwDfPjGwYGDKu3s4Cp4BRz/N8cskED0iaqciVt7wTvkra5roKlJEQGt5HwhdJ24vmAUUkDEV+VyCT9NBxbp/bXXnXTNBFQmz4IhI6wrs+C+zvICEVvIuEKUlbrZ4G97WRkBq+k4RJSVusd4ntlfSheVudrQh8q4SbmntH6K2kzSF3if1Xsfzq7LKAJR5/BwCdAQBJn4egPgAAAABJRU5ErkJggg==") no-repeat;background-size:24px 24px}.mediabox-close:hover{opacity:.5}@media (max-width:768px){.mediabox-content{max-width:90%}}@media (max-width:600px){.mediabox-content iframe{height:320px!important}.mediabox-close{bottom:362px}}@media (max-width:480px){.mediabox-content iframe{height:220px!important}.mediabox-close{bottom:262px}}.mediabox-wrap{z-index:1000000}.mediabox-content{max-width:75vw}.mediabox-content iframe{height:42.1875vw!important}.mediabox-close{bottom:46vw}.ic-Super-toggle__label{box-sizing:border-box;margin:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ic-Form-group.ic-Form-group--horizontal .ic-Super-toggle__label{display:inline-flex;align-items:center}.ic-Super-toggle__input{opacity:0;position:absolute;top:0;left:0}.ic-Super-toggle__input:checked~label .ic-Super-toggle-switch:after{transform:translate3d(100%,0,0)}.ic-Super-toggle__input:checked~label .ic-Super-toggle__disabled-msg:before{content:attr(data-checked)}.ic-Super-toggle__input[disabled]{opacity:0!important}.ic-Super-toggle__input[disabled]~label .ic-Super-toggle-switch{opacity:.33}.ic-Super-toggle-switch{transition:background .1s,border-color .1s;display:inline-block;position:relative;line-height:1;display:flex;align-items:center;background-clip:padding-box}.ic-Super-toggle-switch:after{transition:all .1s ease-in-out;content:"";position:absolute;top:0;left:0;transform:translateZ(0);border-radius:100%;box-shadow:0 3px 6px rgba(0,0,0,.3);background-image:url(https://cl.ly/320m31452k2X/handle.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:20px}.ic-Super-toggle__disabled-msg{display:none}.ic-Super-toggle__disabled-msg:before{content:attr(data-unchecked);font-style:italic;opacity:.8}[class^=ic-Super-toggle-option-]{transition:all .2s ease-out;flex:0 0 50%;text-align:center;position:relative;z-index:1;text-transform:uppercase;font-weight:700;line-height:1;speak:none;box-sizing:border-box}.ic-Super-toggle__screenreader{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.ic-Super-toggle--on-off{display:inline-block;vertical-align:middle}.ic-Super-toggle--on-off .ic-Super-toggle__input:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-switch{background:#4cace3;border-color:#4cace3}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #4cace3,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--on-off .ic-Super-toggle-switch{width:50px;height:25px;background:#5b6c79;border:2px solid #5b6c79;border-radius:14.5px}.ic-Form-group.ic-Form-group--horizontal .ic-Super-toggle--on-off .ic-Super-toggle-switch{flex:0 0 50px}.ic-Super-toggle--on-off .ic-Super-toggle-switch:after{background-color:#fff;width:25px;height:25px}.ic-Super-toggle--on-off .ic-Super-toggle-option-LEFT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle-option-RIGHT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__svg{max-width:12.5px;max-height:12.5px}.ic-Super-toggle--on-off [class^=ic-Super-toggle-option-]{transition-delay:.1s}.ic-Super-toggle--on-off .ic-Super-toggle-option-LEFT{transform:scale(.1);opacity:0}.ic-Super-toggle--on-off .ic-Super-toggle-option-RIGHT,.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{transform:scale(1);opacity:1}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{transform:scale(.1);opacity:0}.toggle-warning{display:inline-block;vertical-align:middle}.toggle-warning .ic-Super-toggle__input:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-switch{background:#ffaa10;border-color:#ffaa10}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{color:#fff}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{color:#fff}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle__input:checked:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #ffaa10,0 3px 6px rgba(0,0,0,.3)}.toggle-warning .ic-Super-toggle-switch{width:50px;height:25px;background:#5b6c79;border:2px solid #5b6c79;border-radius:14.5px}.ic-Form-group.ic-Form-group--horizontal .toggle-warning .ic-Super-toggle-switch{flex:0 0 50px}.toggle-warning .ic-Super-toggle-switch:after{background-color:#fff;width:25px;height:25px}.toggle-warning .ic-Super-toggle-option-LEFT{color:#fff}.toggle-warning .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle-option-RIGHT{color:#fff}.toggle-warning .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle__svg{max-width:12.5px;max-height:12.5px}.ic-Super-toggle--ui-switch{display:inline-block;vertical-align:middle}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-switch{background:#5b6c79;border-color:#5b6c79}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{color:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{color:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--ui-switch .ic-Super-toggle-switch{width:50px;height:25px;background:#5b6c79;border:2px solid #5b6c79;border-radius:14.5px}.ic-Form-group.ic-Form-group--horizontal .ic-Super-toggle--ui-switch .ic-Super-toggle-switch{flex:0 0 50px}.ic-Super-toggle--ui-switch .ic-Super-toggle-switch:after{background-color:#fff;width:25px;height:25px}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-LEFT{color:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-RIGHT{color:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle__svg{max-width:12.5px;max-height:12.5px}.ic-Super-toggle--ui-switch .ic-Super-toggle__label{display:inline-flex;align-items:center}.ic-Super-toggle--ui-switch .ic-Super-toggle-switch{display:block}.ic-Super-toggle--ui-switch [class^=ic-Super-toggle-option-]{flex:none;min-width:24px}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-LEFT{text-align:left;transform:scale(1.1)}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-RIGHT{text-align:right;transform:scale(.9)}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{transform:scale(.9)}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{transform:scale(1.1)}.settings-container{margin:0 0 0 -20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif}.settings-container header{position:relative;background-image:url(../img/settings-bg-large.svg);background-position:0;background-size:cover;height:80px;width:100%;display:flex;align-items:center}.settings-container header>img{margin:0 20px;width:88px;max-width:88px}.settings-container header h1{margin-left:5px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;text-transform:uppercase;font-weight:400;font-size:1.5em;color:#777}.settings-container header.all-settings{position:relative;height:104px;background-image:url(../img/settings-bg-large.svg)}.settings-container header.all-settings>img{margin:0;position:absolute;left:23px;top:50%;transform:translateY(-50%);width:108px;max-width:108px}.settings-container header.all-settings div.settings-select-container{background-color:hsla(0,0%,100%,.6);padding:10px 14px;border-radius:8px;position:absolute;right:30px;top:50%;transform:translateY(-50%);z-index:1000}.settings-container header.all-settings div.settings-select-container nav.dropdown{display:flex;align-items:center;z-index:1000}.settings-container header.all-settings div.settings-select-container nav.dropdown>div:first-of-type{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;margin-right:10px;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:1em}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown{position:relative;width:200px;height:36px;z-index:1000;cursor:pointer}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.current{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;display:flex;align-items:center;position:absolute;left:0;top:0;right:0;bottom:0;background-color:#eee;border:1px solid #ddd;padding-left:10px;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:13px;cursor:pointer;background-image:url(../img/icon-dropdown-arrow.svg);background-repeat:no-repeat;background-position:right 12px center;transition:background-color .15s linear}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.current:hover{background-color:#fff}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items{z-index:1001;position:absolute;top:0;left:0;right:0;transition:opacity .15s linear,transform .15s linear;opacity:0;pointer-events:none}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items.visible{pointer-events:auto;opacity:1}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul{margin:0;padding:0;box-shadow:0 0 8px 1px rgba(0,0,0,.125)}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li{position:relative;margin:0;padding:0;border:1px solid #ddd;border-top:0;align-items:center}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li:first-of-type{border:1px solid #ddd}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool{position:relative;display:flex;align-items:center;height:36px;background-color:#eee;padding-left:10px;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:13px;transition:background-color .15s linear}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool:hover{background:#fff}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool-pin{display:block;position:absolute;top:0;width:36px;height:36px;right:0;background-image:url(../img/icon-pin-deselected.svg);background-repeat:no-repeat;background-position:50%}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool-pin.pinned{background-image:url(../img/icon-pin-selected.svg)}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li.active a.tool{background:#fff}.settings-container header.all-settings div.settings-select-container nav.dropdown.active div.dropdown div.current{background-color:#ddd}.settings-container .settings-body{margin:20px}.settings-container .settings-body .settings-description{font-size:1.1em;text-align:center;background-color:#fafafa;padding:25px;border-radius:8px;margin-bottom:20px}.settings-container .settings-body.show-upgrade{display:flex}.settings-container .settings-body.show-upgrade>.settings-interior{flex:1;margin-right:20px}@media (max-width:64em){.settings-container .settings-body.show-upgrade>.settings-interior{order:1;margin-right:0}}@media (max-width:64em){.settings-container .settings-body.show-upgrade{flex-direction:column}}.settings-container .settings-body .upgrade-feature{background-color:#fafafa;border-radius:8px;padding:15px 20px}.settings-container .settings-body .upgrade-feature h2{padding:0;margin:0 0 30px;color:#46a4dd}.settings-container .settings-body .upgrade-feature ul{margin-left:20px;list-style:unset}.settings-container .settings-body .upgrade-feature ul li{list-style-type:square}.settings-container .settings-body .upgrade-feature div.button-container{text-align:right;padding:20px 0}.settings-container .settings-body .upgrade-feature div.button-container a{padding:10px;background-color:#46a4dd;border-radius:6px;color:#fff;text-decoration:none;font-weight:700;font-size:1.1em}.settings-container .settings-body .upgrade-promo{min-width:200px;max-width:320px;position:relative}.settings-container .settings-body .upgrade-promo .upgrade-interior{position:relative;background-color:#fafafa;border-radius:8px;padding:15px 20px}.settings-container .settings-body .upgrade-promo .upgrade-interior h2{padding:0;margin:0 0 30px;color:#46a4dd}.settings-container .settings-body .upgrade-promo .upgrade-interior ul{margin-left:20px}.settings-container .settings-body .upgrade-promo .upgrade-interior ul li{list-style-type:square}@media (max-width:64em){.settings-container .settings-body .upgrade-promo .upgrade-interior ul{display:flex;flex-wrap:wrap;width:100%}@supports (display:grid){.settings-container .settings-body .upgrade-promo .upgrade-interior ul{display:grid;grid-template-columns:1fr 1fr 1fr}}.settings-container .settings-body .upgrade-promo .upgrade-interior ul li{margin-right:30px}}@media (max-width:48.9275em){@supports (display:grid){.settings-container .settings-body .upgrade-promo .upgrade-interior ul{grid-template-columns:1fr 1fr}}}.settings-container .settings-body .upgrade-promo .upgrade-interior div.button-container{text-align:right;padding:20px 0}.settings-container .settings-body .upgrade-promo .upgrade-interior div.button-container a{padding:10px;background-color:#46a4dd;border-radius:6px;color:#fff;text-decoration:none;font-weight:700;font-size:1.1em}.settings-container .settings-body .upgrade-promo .upgrade-interior a.upgrade-close{display:none;position:absolute;top:15px;right:20px}@media (max-width:64em){.settings-container .settings-body .upgrade-promo .upgrade-interior a.upgrade-close{display:block}}@media (max-width:64em){.settings-container .settings-body .upgrade-promo{order:0;margin-bottom:20px;max-width:100%}}@media (max-width:64em){.settings-container .settings-body .upgrade-promo.hide-on-mobile{display:none}}.button-warning{background:#dd9000!important;border-color:#dd9000 #b97800 #b97800!important;box-shadow:0 1px 0 #b97800!important;color:#fff!important;text-decoration:none!important;text-shadow:0 -1px 1px #b97800,1px 0 1px #b97800,0 1px 1px #b97800,-1px 0 1px #b97800!important}.media-cloud-tool-description{padding:24px;background:#ddd;border-radius:8px;margin-bottom:20px}.media-cloud-tool-description h2{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;text-transform:uppercase;margin:0 0 5px;padding:0}.media-cloud-tool-description p{margin-top:0;font-size:1.2em}.ilab-notification-container .notice{margin-left:0;margin-right:0;margin-bottom:10px}.ilab-notification-container .notice:last-of-type{margin-bottom:20px}.ilab-settings-section{background-color:#fafafa;padding:25px;border-radius:8px;margin-bottom:20px;overflow:hidden}.ilab-settings-section h2{padding:10px 25px;background-color:#ddd;margin:-25px -25px 0;font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;font-weight:700;font-size:13px;color:rgba(0,0,0,.5)!important;text-transform:uppercase;display:flex;align-items:center;justify-content:space-between}.ilab-settings-section .section-description{margin-top:20px;margin-bottom:15px;font-style:italic}.ilab-settings-section .checkbox-w-description{display:flex;align-items:center}.ilab-settings-section .checkbox-w-description label{margin-right:20px}.ilab-settings-section .checkbox-w-description>div>p{margin:0}.ilab-settings-toggle{padding:0 25px 5px}.ilab-settings-toggle table.form-table tr{display:flex;flex-direction:row;align-items:center}@media (max-width:48.9275em){.ilab-settings-toggle table.form-table tr{flex-direction:column;align-items:flex-start}}.ilab-settings-toggle table.form-table tr th{min-width:200px;max-width:200px}@media (max-width:48.9275em){.ilab-settings-toggle table.form-table tr{margin-bottom:20px}.ilab-settings-toggle table.form-table tr th{margin-bottom:10px}}.ilab-settings-features{padding:10px 25px 15px}.ilab-settings-features table.form-table tr{display:flex;flex-direction:row;align-items:center}.ilab-settings-features table.form-table tr td.toggle{display:flex;align-items:center;max-width:220px;min-width:220px}.ilab-settings-features table.form-table tr td.toggle div.title{display:flex;flex-direction:column;margin-left:30px;white-space:nowrap;font-weight:700;font-size:1.05em}.ilab-settings-features table.form-table tr td.toggle div.title a{margin-top:5px;font-size:.85em;font-weight:400}.ilab-settings-features table.form-table tr td.description p{font-size:1.05em}@media (max-width:48.9275em){.ilab-settings-features table.form-table tr{flex-direction:column;align-items:flex-start;margin-bottom:30px}.ilab-settings-features table.form-table td.toggle div.title{font-size:1.2em!important}}.ilab-settings-button{display:flex;justify-content:center}.ilab-settings-button p{padding:0;margin:0}.ilab-settings-batch-tools{display:flex;padding-right:10px;margin-right:20px;border-right:1px solid #ccc}.ilab-settings-batch-tools a.button{margin-right:10px}span.tool-indicator{background:#ccc;border:1px solid #979797;display:block;width:9px;height:9px;border-radius:9px;margin-right:6px}span.tool-indicator.tool-active{background:#6dd51b}span.tool-indicator.tool-env-active{background:#fdac00}div.ilab-section-doc-links{margin-top:10px}div.ilab-section-doc-links div.doc-links-setting{background-color:rgba(0,0,0,.04);width:100%;border-radius:6px;display:flex;align-items:center;justify-content:center;padding:12px 0}div.ilab-section-doc-links div.doc-links-setting a{margin:0 5px!important}.troubleshooter-info li{margin:0;padding:8px 0 8px 28px;list-style:none;background-repeat:no-repeat;background-position:left top 6px;background-size:20px}.troubleshooter-info li.info-warning{background-image:url(../img/icon-warning.svg)}.troubleshooter-info li.info-success{background-image:url(../img/icon-success.svg)}.troubleshooter-info li.info-error{background-image:url(../img/icon-error.svg)}.troubleshooter-wait{display:flex;align-items:center}.troubleshooter-wait.hidden{display:none}.troubleshooter-wait>img{margin-right:7px;height:18px}.ilab-popup{position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.85);pointer-events:all;z-index:10000;display:flex;align-items:center;justify-content:center;transition:opacity .25s linear;opacity:1}.ilab-popup .ilab-popup-body{position:relative}.ilab-popup .ilab-popup-body .ilab-popup-contents{width:80vw;height:80vh;min-width:80vw;min-height:80vh;max-width:80vw;max-height:80vh;background-color:#fff}.ilab-popup .ilab-popup-body .ilab-popup-close{position:absolute;right:38px;top:12px;font-size:0}.ilab-popup .ilab-popup-body .ilab-popup-close:after,.ilab-popup .ilab-popup-body .ilab-popup-close:before{position:absolute;left:13px;content:" ";height:25px;width:2px;background-color:#000}.ilab-popup .ilab-popup-body .ilab-popup-close:before{transform:rotate(45deg)}.ilab-popup .ilab-popup-body .ilab-popup-close:after{transform:rotate(-45deg)}.ilab-popup.hidden{pointer-events:none;opacity:0}#s3-importer-progress{padding:24px;background:#ddd;border-radius:8px}#s3-importer-progress .button-whoa{background:#a42929!important;border-color:#e62a2a #a42929 #a42929!important;box-shadow:0 1px 0 #a42929!important;color:#fff!important;text-decoration:none!important;text-shadow:0 -1px 1px #a42929,1px 0 1px #a42929,0 1px 1px #a42929,-1px 0 1px #a42929!important}#s3-importer-progress>button{margin-top:20px}.s3-importer-progress-container{position:relative;width:100%;height:32px;background:#aaa;border-radius:16px;overflow:hidden;background-image:url(../img/candy-stripe.svg)}#s3-importer-progress-bar{background-color:#4f90c4;height:100%}.tool-disabled{padding:10px 15px;border:1px solid #df8403}.force-cancel-help{margin-top:20px}.wp-cli-callout{padding:24px;background:#ddd;margin-top:20px;border-radius:8px}.wp-cli-callout>h3{margin:0;padding:0;font-size:14px}.wp-cli-callout>code{background-color:#bbb;padding:10px 15px;margin-top:5px;display:inline-block}#s3-importer-options{padding:24px;background:#e7e7e7;margin-top:20px;border-radius:8px}#s3-importer-options h3{margin:0;padding:0;font-size:14px}#s3-importer-options ul{padding:0;display:flex;flex-direction:column;margin:20px 0 0}#s3-importer-options ul li{display:flex;margin-bottom:30px}#s3-importer-options ul li:last-of-type{margin-bottom:0}#s3-importer-options ul li>div:first-of-type{padding:10px 10px 20px 0;width:160px;min-width:160px;line-height:1.3;font-weight:600}#s3-importer-options ul li div.description{margin-top:8px}#s3-importer-options ul li div.option-ui{display:flex;align-items:center}#s3-importer-options ul li div.option-ui.option-ui-browser input[type=text]{width:40vw;margin-right:10px;padding:7px 11px;border-radius:4px}#s3-importer-options ul li div.option-ui.option-ui-browser input[type=text]:disabled{color:#000}#s3-timing-stats{display:none}#s3-importer-status-text{position:absolute;left:16px;top:0;bottom:0;right:16px;display:flex;align-items:center;color:#fff;font-weight:700}#s3-importer-thumbnails{position:relative;width:100%;height:150px;margin-bottom:15px}#s3-importer-thumbnails-container{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%);mask-image:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%)}#s3-importer-thumbnails-container img{width:150px;height:150px;max-width:150px;max-height:150px;border-radius:4px}#s3-importer-thumbnails-container>img{margin-right:10px}#s3-importer-thumbnails-fade{background:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%);position:absolute;left:150px;top:0;right:0;bottom:0}@supports ((-webkit-mask-image:linear-gradient(to left,rgba(221,221,221,0) 0%,#dddddd 95%,#dddddd 100%)) or (mask-image:linear-gradient(to left,rgba(221,221,221,0) 0%,#dddddd 95%,#dddddd 100%))){#s3-importer-thumbnails-fade{display:none}}#s3-importer-thumbnails-cloud{position:absolute;right:20px;top:50%;transform:translateY(-50%)}.s3-importer-thumb{position:absolute;left:0;top:0;width:150px;min-width:150px;max-width:150px;height:150px;min-height:150px;max-height:150px;background-size:cover;background-position:50%;background-repeat:no-repeat;margin-right:10px;border-radius:4px;background-color:#888;transition:opacity .25s linear,transform .25s linear}.s3-importer-thumb.ilab-hidden{opacity:0;transform:scale(.7)}.s3-importer-image-icon{position:absolute;left:0;top:0;position:relative;width:150px;min-width:150px;max-width:150px;height:150px;min-height:150px;max-height:150px;display:flex;align-items:center;justify-content:center;transition:opacity .25s linear,transform .25s linear}.s3-importer-image-icon.ilab-hidden{opacity:0;transform:scale(.8)}.s3-importer-info-warning{border:1px solid orange;padding:24px;background:rgba(255,165,0,.125);margin-top:20px;border-radius:8px}.s3-importer-info-warning h4{padding:0;font-size:14px;margin:0 0 8px} \ No newline at end of file +/*! mediabox v1.1.3 | (c) 2018 Pedro Rogerio | https://github.com/pinceladasdaweb/mediabox */.stop-scroll{height:100%;overflow:hidden}.mediabox-wrap{position:fixed;width:100%;height:100%;background-color:rgba(0,0,0,.8);top:0;left:0;opacity:0;z-index:999;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:mediabox;animation-name:mediabox}@-webkit-keyframes mediabox{0%{opacity:0}to{opacity:1}}@keyframes mediabox{0%{opacity:0}to{opacity:1}}.mediabox-content{max-width:853px;display:block;margin:0 auto;height:100%;position:relative}.mediabox-content iframe{max-width:100%!important;width:100%!important;display:block!important;height:480px!important;border:none!important;position:absolute;top:0;bottom:0;margin:auto 0}.mediabox-hide{-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:mediaboxhide;animation-name:mediaboxhide}@-webkit-keyframes mediaboxhide{0%{opacity:1}to{opacity:0}}@keyframes mediaboxhide{0%{opacity:1}to{opacity:0}}.mediabox-close{position:absolute;top:0;cursor:pointer;bottom:528px;right:0;margin:auto 0;width:24px;height:24px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMvSURBVHja7Js9aBRBFMd/d1lPY6FiJVjY+Fkoxl7wA1Q0prQRS6tgoZV2MWIRRVHUUq3U+JnESrS2sBXBzipREWMlATXwt8gFznC5nd15M7Nn8uC45nZnfr/dY96+N1uTxFKOOks8lgUU/H2t4tJqIQUcAiaBGeBymcECRgO4B/wBPgJ9zkdKcvkclfRL/8ZtSTXH40N+GpLGF8zth6Q9Lse7DHCsDXxVJLSDLyQhb4B+Sb/VOVJJ6ATfKqGvrIDjDvCpJLjAz8d0JwmLDTBQAD62hIakiYJzm5a021VAfwn4WBLKwLdK2JUnIJP0XX4RSoIP/Hy8W3jeepv1dL3nmjwI3DLOExrAU2DA8zwb8xKhGeCuwYQtJTSAZwbwAHdcEqFM0mPZhO/foSHppdFcrraby2IDV0FCcPi8PCClhCjwLplgCgkrDeGv5I3pcjViSogK7yogloTo8EUEhJaQBL6oAGsJ9yVtkrRD0qsU8JKolagKZ8AD4ETFymFXgPOAQpXE5mMWOAk86XZ4n6pwlSSUhvcti1dBghe8RV8gpYQRX3irxkgKCSPABV94y85QTAlm8NatsRgSTOGBUnmAS57w3KiA0Ro3gHOW8KEEAOwE3hvfXWubFauu6A6vCND07OmW9viq5vpsGT3AtRAN2XoA+BfAwQBiTweoNpMZw48BRwKuAoPN7zNVWwZjwAfpO9S7DN5cQmYAPw4cTvAsYPJ3qHcpvNmdUO9ieBMJZQT0AhMVgfeWUC8BP87cjjHfuA6sATY0c4c0EgpUUHslvTaq3l5aUL1N1oarAnxSCVWBTyYhJvyw41XJJI3GkpAH/yYyfHQJi01gdUL4qBKqCh9NQrtBx4wGvGi0XS6T9MhoTkN5AtZVDN5awlTePsGfwDfPjGwYGDKu3s4Cp4BRz/N8cskED0iaqciVt7wTvkra5roKlJEQGt5HwhdJ24vmAUUkDEV+VyCT9NBxbp/bXXnXTNBFQmz4IhI6wrs+C+zvICEVvIuEKUlbrZ4G97WRkBq+k4RJSVusd4ntlfSheVudrQh8q4SbmntH6K2kzSF3if1Xsfzq7LKAJR5/BwCdAQBJn4egPgAAAABJRU5ErkJggg==") no-repeat;background-size:24px 24px}.mediabox-close:hover{opacity:.5}@media (max-width:768px){.mediabox-content{max-width:90%}}@media (max-width:600px){.mediabox-content iframe{height:320px!important}.mediabox-close{bottom:362px}}@media (max-width:480px){.mediabox-content iframe{height:220px!important}.mediabox-close{bottom:262px}}.mediabox-wrap{z-index:1000000}.mediabox-content{max-width:75vw}.mediabox-content iframe{height:42.1875vw!important}.mediabox-close{bottom:46vw}.ic-Super-toggle__label{box-sizing:border-box;margin:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ic-Form-group.ic-Form-group--horizontal .ic-Super-toggle__label{display:inline-flex;align-items:center}.ic-Super-toggle__input{opacity:0;position:absolute;top:0;left:0}.ic-Super-toggle__input:checked~label .ic-Super-toggle-switch:after{transform:translate3d(100%,0,0)}.ic-Super-toggle__input:checked~label .ic-Super-toggle__disabled-msg:before{content:attr(data-checked)}.ic-Super-toggle__input[disabled]{opacity:0!important}.ic-Super-toggle__input[disabled]~label .ic-Super-toggle-switch{opacity:.33}.ic-Super-toggle-switch{transition:background .1s,border-color .1s;display:inline-block;position:relative;line-height:1;display:flex;align-items:center;background-clip:padding-box}.ic-Super-toggle-switch:after{transition:all .1s ease-in-out;content:"";position:absolute;top:0;left:0;transform:translateZ(0);border-radius:100%;box-shadow:0 3px 6px rgba(0,0,0,.3);background-image:url(https://cl.ly/320m31452k2X/handle.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:20px}.ic-Super-toggle__disabled-msg{display:none}.ic-Super-toggle__disabled-msg:before{content:attr(data-unchecked);font-style:italic;opacity:.8}[class^=ic-Super-toggle-option-]{transition:all .2s ease-out;flex:0 0 50%;text-align:center;position:relative;z-index:1;text-transform:uppercase;font-weight:700;line-height:1;speak:none;box-sizing:border-box}.ic-Super-toggle__screenreader{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.ic-Super-toggle--on-off{display:inline-block;vertical-align:middle}.ic-Super-toggle--on-off .ic-Super-toggle__input:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-switch{background:#4cace3;border-color:#4cace3}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #4cace3,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--on-off .ic-Super-toggle-switch{width:50px;height:25px;background:#5b6c79;border:2px solid #5b6c79;border-radius:14.5px}.ic-Form-group.ic-Form-group--horizontal .ic-Super-toggle--on-off .ic-Super-toggle-switch{flex:0 0 50px}.ic-Super-toggle--on-off .ic-Super-toggle-switch:after{background-color:#fff;width:25px;height:25px}.ic-Super-toggle--on-off .ic-Super-toggle-option-LEFT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle-option-RIGHT{color:#fff}.ic-Super-toggle--on-off .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.ic-Super-toggle--on-off .ic-Super-toggle__svg{max-width:12.5px;max-height:12.5px}.ic-Super-toggle--on-off [class^=ic-Super-toggle-option-]{transition-delay:.1s}.ic-Super-toggle--on-off .ic-Super-toggle-option-LEFT{transform:scale(.1);opacity:0}.ic-Super-toggle--on-off .ic-Super-toggle-option-RIGHT,.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{transform:scale(1);opacity:1}.ic-Super-toggle--on-off .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{transform:scale(.1);opacity:0}.toggle-warning{display:inline-block;vertical-align:middle}.toggle-warning .ic-Super-toggle__input:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-switch{background:#ffaa10;border-color:#ffaa10}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{color:#fff}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{color:#fff}.toggle-warning .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle__input:checked:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #ffaa10,0 3px 6px rgba(0,0,0,.3)}.toggle-warning .ic-Super-toggle-switch{width:50px;height:25px;background:#5b6c79;border:2px solid #5b6c79;border-radius:14.5px}.ic-Form-group.ic-Form-group--horizontal .toggle-warning .ic-Super-toggle-switch{flex:0 0 50px}.toggle-warning .ic-Super-toggle-switch:after{background-color:#fff;width:25px;height:25px}.toggle-warning .ic-Super-toggle-option-LEFT{color:#fff}.toggle-warning .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle-option-RIGHT{color:#fff}.toggle-warning .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#fff}.toggle-warning .ic-Super-toggle__svg{max-width:12.5px;max-height:12.5px}.ic-Super-toggle--ui-switch{display:inline-block;vertical-align:middle}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-switch{background:#5b6c79;border-color:#5b6c79}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{color:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{color:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked:focus~label .ic-Super-toggle-switch:after{box-shadow:inset 0 0 0 1px #fff,inset 0 0 0 3px #5b6c79,0 3px 6px rgba(0,0,0,.3)}.ic-Super-toggle--ui-switch .ic-Super-toggle-switch{width:50px;height:25px;background:#5b6c79;border:2px solid #5b6c79;border-radius:14.5px}.ic-Form-group.ic-Form-group--horizontal .ic-Super-toggle--ui-switch .ic-Super-toggle-switch{flex:0 0 50px}.ic-Super-toggle--ui-switch .ic-Super-toggle-switch:after{background-color:#fff;width:25px;height:25px}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-LEFT{color:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-LEFT .ic-Super-toggle__svg>*{fill:#08c}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-RIGHT{color:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-RIGHT .ic-Super-toggle__svg>*{fill:#888}.ic-Super-toggle--ui-switch .ic-Super-toggle__svg{max-width:12.5px;max-height:12.5px}.ic-Super-toggle--ui-switch .ic-Super-toggle__label{display:inline-flex;align-items:center}.ic-Super-toggle--ui-switch .ic-Super-toggle-switch{display:block}.ic-Super-toggle--ui-switch [class^=ic-Super-toggle-option-]{flex:none;min-width:24px}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-LEFT{text-align:left;transform:scale(1.1)}.ic-Super-toggle--ui-switch .ic-Super-toggle-option-RIGHT{text-align:right;transform:scale(.9)}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-LEFT{transform:scale(.9)}.ic-Super-toggle--ui-switch .ic-Super-toggle__input:checked~label .ic-Super-toggle-option-RIGHT{transform:scale(1.1)}.settings-container{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;margin:0 0 64px -20px}.settings-container header{position:relative;background-image:url(../img/settings-bg-large.svg);background-position:0;background-size:cover;height:80px;width:100%;display:flex;align-items:center}.settings-container header>img{margin:0 20px;width:88px;max-width:88px}.settings-container header h1{margin-left:5px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;text-transform:uppercase;font-weight:400;font-size:1.5em;color:#777}.settings-container header .header-actions{position:absolute!important;right:40px;top:50%;transform:translateY(-50%)!important;display:flex}.settings-container header .header-actions a{margin-left:8px;display:flex;align-items:center}.settings-container header .header-actions a svg{height:16px;width:auto;margin-right:8px}.settings-container header .header-actions a svg>path,.settings-container header .header-actions a svg>rect{fill:#fff}.settings-container header .header-actions div.spacer{width:8px;min-width:8px}.settings-container header.all-settings{position:relative;height:104px;background-image:url(../img/settings-bg-large.svg)}.settings-container header.all-settings>img{margin:0;position:absolute;left:23px;top:50%;transform:translateY(-50%);width:108px;max-width:108px}.settings-container header.all-settings div.settings-select-container{background-color:hsla(0,0%,100%,.6);padding:10px 14px;border-radius:8px;position:absolute;right:30px;top:50%;transform:translateY(-50%);z-index:1000}.settings-container header.all-settings div.settings-select-container nav.dropdown{display:flex;align-items:center;z-index:1000}.settings-container header.all-settings div.settings-select-container nav.dropdown>div:first-of-type{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;margin-right:10px;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:1em}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown{position:relative;width:200px;height:36px;z-index:1000;cursor:pointer}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.current{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;display:flex;align-items:center;position:absolute;left:0;top:0;right:0;bottom:0;background-color:#eee;border:1px solid #ddd;padding-left:10px;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:13px;cursor:pointer;background-image:url(../img/icon-dropdown-arrow.svg);background-repeat:no-repeat;background-position:right 12px center;transition:background-color .15s linear}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.current:hover{background-color:#fff}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items{z-index:1001;position:absolute;top:0;left:0;right:0;transition:opacity .15s linear,transform .15s linear;opacity:0;pointer-events:none}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items.visible{pointer-events:auto;opacity:1}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul{margin:0;padding:0;box-shadow:0 0 8px 1px rgba(0,0,0,.125)}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li{position:relative;margin:0;padding:0;border:1px solid #ddd;border-top:0;align-items:center}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li:first-of-type{border:1px solid #ddd}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool{position:relative;display:flex;align-items:center;height:36px;background-color:#eee;padding-left:10px;color:#777;text-decoration:none;text-transform:uppercase;font-weight:700;font-size:13px;transition:background-color .15s linear}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool:hover{background:#fff}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool-pin{display:block;position:absolute;top:0;width:36px;height:36px;right:0;background-image:url(../img/icon-pin-deselected.svg);background-repeat:no-repeat;background-position:50%}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li a.tool-pin.pinned{background-image:url(../img/icon-pin-selected.svg)}.settings-container header.all-settings div.settings-select-container nav.dropdown div.dropdown div.items ul li.active a.tool{background:#fff}.settings-container header.all-settings div.settings-select-container nav.dropdown.active div.dropdown div.current{background-color:#ddd}.settings-container .settings-body{margin:20px}.settings-container .settings-body .settings-description{font-size:1.1em;text-align:center;background-color:#fafafa;padding:25px;border-radius:8px;margin-bottom:20px}.settings-container .settings-body.show-upgrade{display:flex}.settings-container .settings-body.show-upgrade>.settings-interior{flex:1;margin-right:20px}@media (max-width:64em){.settings-container .settings-body.show-upgrade>.settings-interior{order:1;margin-right:0}}@media (max-width:64em){.settings-container .settings-body.show-upgrade{flex-direction:column}}.settings-container .settings-body .upgrade-feature{background-color:#fafafa;border-radius:8px;padding:15px 20px}.settings-container .settings-body .upgrade-feature h2{padding:0;margin:0 0 30px;color:#46a4dd}.settings-container .settings-body .upgrade-feature ul{margin-left:20px;list-style:unset}.settings-container .settings-body .upgrade-feature ul li{list-style-type:square}.settings-container .settings-body .upgrade-feature div.button-container{text-align:right;padding:20px 0}.settings-container .settings-body .upgrade-feature div.button-container a{padding:10px;background-color:#46a4dd;border-radius:6px;color:#fff;text-decoration:none;font-weight:700;font-size:1.1em}.settings-container .settings-body .upgrade-promo{min-width:200px;max-width:320px;position:relative}.settings-container .settings-body .upgrade-promo .upgrade-interior{position:relative;background-color:#fafafa;border-radius:8px;padding:15px 20px}.settings-container .settings-body .upgrade-promo .upgrade-interior h2{padding:0;margin:0 0 30px;color:#46a4dd}.settings-container .settings-body .upgrade-promo .upgrade-interior ul{margin-left:20px}.settings-container .settings-body .upgrade-promo .upgrade-interior ul li{list-style-type:square}@media (max-width:64em){.settings-container .settings-body .upgrade-promo .upgrade-interior ul{display:flex;flex-wrap:wrap;width:100%}@supports (display:grid){.settings-container .settings-body .upgrade-promo .upgrade-interior ul{display:grid;grid-template-columns:1fr 1fr 1fr}}.settings-container .settings-body .upgrade-promo .upgrade-interior ul li{margin-right:30px}}@media (max-width:48.9275em){@supports (display:grid){.settings-container .settings-body .upgrade-promo .upgrade-interior ul{grid-template-columns:1fr 1fr}}}.settings-container .settings-body .upgrade-promo .upgrade-interior div.button-container{text-align:right;padding:20px 0}.settings-container .settings-body .upgrade-promo .upgrade-interior div.button-container a{padding:10px;background-color:#46a4dd;border-radius:6px;color:#fff;text-decoration:none;font-weight:700;font-size:1.1em}.settings-container .settings-body .upgrade-promo .upgrade-interior a.upgrade-close{display:none;position:absolute;top:15px;right:20px}@media (max-width:64em){.settings-container .settings-body .upgrade-promo .upgrade-interior a.upgrade-close{display:block}}@media (max-width:64em){.settings-container .settings-body .upgrade-promo{order:0;margin-bottom:20px;max-width:100%}}@media (max-width:64em){.settings-container .settings-body .upgrade-promo.hide-on-mobile{display:none}}.button-warning{background:#dd9000!important;border-color:#dd9000 #b97800 #b97800!important;box-shadow:0 1px 0 #b97800!important;color:#fff!important;text-decoration:none!important;text-shadow:0 -1px 1px #b97800,1px 0 1px #b97800,0 1px 1px #b97800,-1px 0 1px #b97800!important}.media-cloud-tool-description{padding:24px;background:#ddd;border-radius:8px;margin-bottom:20px}.media-cloud-tool-description h2{font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;text-transform:uppercase;margin:0 0 5px;padding:0}.media-cloud-tool-description p{margin-top:0;font-size:1.2em}.ilab-notification-container .notice{margin-left:0;margin-right:0;margin-bottom:10px}.ilab-notification-container .notice:last-of-type{margin-bottom:20px}.ilab-settings-section{background-color:#fafafa;padding:25px;border-radius:8px;margin-bottom:20px;overflow:hidden}.ilab-settings-section h2{padding:10px 25px;background-color:#ddd;margin:-25px -25px 0;font-family:system-ui,-apple-system,BlinkMacSystemFont,Avenir Next,Avenir,Segoe UI,Lucida Grande,Helvetica Neue,Helvetica,Fira Sans,Roboto,Noto,Droid Sans,Cantarell,Oxygen,Ubuntu,Franklin Gothic Medium,Century Gothic,Liberation Sans,sans-serif;font-weight:700;font-size:13px;color:rgba(0,0,0,.5)!important;text-transform:uppercase;display:flex;align-items:center}.ilab-settings-section h2 a.help-beacon{margin:0 0 0 10px;padding:0;display:block;width:16px;height:16px;color:transparent;overflow:hidden;background-image:url(../img/mcloud-icon-help.svg);background-position:50%;background-size:contain;background-repeat:no-repeat}.ilab-settings-section .section-description{margin-top:20px;margin-bottom:15px;font-style:italic}.ilab-settings-section .checkbox-w-description{display:flex;align-items:center}.ilab-settings-section .checkbox-w-description label{margin-right:20px}.ilab-settings-section .checkbox-w-description>div>p{margin:0}.ilab-settings-toggle{padding:0 25px 5px}.ilab-settings-toggle table.form-table tr{display:flex;flex-direction:row;align-items:center}@media (max-width:48.9275em){.ilab-settings-toggle table.form-table tr{flex-direction:column;align-items:flex-start}}.ilab-settings-toggle table.form-table tr th{min-width:200px;max-width:200px}@media (max-width:48.9275em){.ilab-settings-toggle table.form-table tr{margin-bottom:20px}.ilab-settings-toggle table.form-table tr th{margin-bottom:10px}}.ilab-settings-features{padding:10px 25px 15px}.ilab-settings-features table.form-table tr{display:flex;flex-direction:row;align-items:center}.ilab-settings-features table.form-table tr td.toggle{display:flex;align-items:center;max-width:220px;min-width:220px}.ilab-settings-features table.form-table tr td.toggle div.title{display:flex;flex-direction:column;margin-left:30px;white-space:nowrap;font-weight:700;font-size:1.05em}.ilab-settings-features table.form-table tr td.toggle div.title a{margin-top:5px;font-size:.85em;font-weight:400}.ilab-settings-features table.form-table tr td.description p{font-size:1.05em}@media (max-width:48.9275em){.ilab-settings-features table.form-table tr{flex-direction:column;align-items:flex-start;margin-bottom:30px}.ilab-settings-features table.form-table td.toggle div.title{font-size:1.2em!important}}.ilab-settings-button{display:flex;justify-content:center}.ilab-settings-button p{padding:0;margin:0}.ilab-settings-batch-tools{display:flex;padding-right:10px;margin-right:20px;border-right:1px solid #ccc}.ilab-settings-batch-tools a.button{margin-right:10px}span.tool-indicator{background:#ccc;border:1px solid #979797;display:block;width:9px;height:9px;border-radius:9px;margin-right:6px}span.tool-indicator.tool-active{background:#6dd51b}span.tool-indicator.tool-env-active{background:#fdac00}div.ilab-section-doc-links{margin-top:10px}div.ilab-section-doc-links div.doc-links-setting{background-color:rgba(0,0,0,.04);width:100%;border-radius:6px;display:flex;align-items:center;justify-content:center;padding:12px 0}div.ilab-section-doc-links div.doc-links-setting a{margin:0 5px!important}.troubleshooter-info li{margin:0;padding:8px 0 8px 28px;list-style:none;background-repeat:no-repeat;background-position:left top 6px;background-size:20px}.troubleshooter-info li.info-warning{background-image:url(../img/icon-warning.svg)}.troubleshooter-info li.info-success{background-image:url(../img/icon-success.svg)}.troubleshooter-info li.info-error{background-image:url(../img/icon-error.svg)}.troubleshooter-wait{display:flex;align-items:center}.troubleshooter-wait.hidden{display:none}.troubleshooter-wait>img{margin-right:7px;height:18px}#beacon-container iframe{z-index:200000!important}.ilab-popup{position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.85);pointer-events:all;z-index:100002;display:flex;align-items:center;justify-content:center;transition:opacity .25s linear;opacity:1}.ilab-popup .ilab-popup-body{position:relative}.ilab-popup .ilab-popup-body .ilab-popup-contents{width:80vw;height:80vh;min-width:80vw;min-height:80vh;max-width:80vw;max-height:80vh;background-color:#fff}.ilab-popup .ilab-popup-body .ilab-popup-close{position:absolute;right:38px;top:12px;font-size:0}.ilab-popup .ilab-popup-body .ilab-popup-close:after,.ilab-popup .ilab-popup-body .ilab-popup-close:before{position:absolute;left:13px;content:" ";height:25px;width:2px;background-color:#000}.ilab-popup .ilab-popup-body .ilab-popup-close:before{transform:rotate(45deg)}.ilab-popup .ilab-popup-body .ilab-popup-close:after{transform:rotate(-45deg)}.ilab-popup.hidden{pointer-events:none;opacity:0}body.modal-open #beacon-container{display:none!important}.BeaconContainer{right:10px!important;bottom:88px!important}.BeaconFabButtonFrame{right:10px!important;bottom:10px!important}#s3-importer-progress{padding:24px;background:#ddd;border-radius:8px}#s3-importer-progress .button-whoa{background:#a42929!important;border-color:#e62a2a #a42929 #a42929!important;box-shadow:0 1px 0 #a42929!important;color:#fff!important;text-decoration:none!important;text-shadow:0 -1px 1px #a42929,1px 0 1px #a42929,0 1px 1px #a42929,-1px 0 1px #a42929!important}#s3-importer-progress>button{margin-top:20px}.s3-importer-progress-container{position:relative;width:100%;height:32px;background:#aaa;border-radius:16px;overflow:hidden;background-image:url(../img/candy-stripe.svg)}#s3-importer-progress-bar{background-color:#4f90c4;height:100%}.tool-disabled{padding:10px 15px;border:1px solid #df8403}.force-cancel-help{margin-top:20px}.wp-cli-callout{padding:24px;background:#ddd;margin-top:20px;border-radius:8px}.wp-cli-callout>h3{margin:0;padding:0;font-size:14px}.wp-cli-callout>code{background-color:#bbb;padding:10px 15px;margin-top:5px;display:inline-block}#s3-importer-options{padding:24px;background:#e7e7e7;margin-top:20px;border-radius:8px}#s3-importer-options h3{margin:0;padding:0;font-size:14px}#s3-importer-options ul{padding:0;display:flex;flex-direction:column;margin:20px 0 0}#s3-importer-options ul li{display:flex;margin-bottom:30px}#s3-importer-options ul li:last-of-type{margin-bottom:0}#s3-importer-options ul li>div:first-of-type{padding:10px 10px 20px 0;width:160px;min-width:160px;line-height:1.3;font-weight:600}#s3-importer-options ul li div.description{margin-top:8px}#s3-importer-options ul li div.option-ui{display:flex;align-items:center}#s3-importer-options ul li div.option-ui.option-ui-browser input[type=text]{width:40vw;margin-right:10px;padding:7px 11px;border-radius:4px}#s3-importer-options ul li div.option-ui.option-ui-browser input[type=text]:disabled{color:#000}#s3-timing-stats{display:none}#s3-importer-status-text{position:absolute;left:16px;top:0;bottom:0;right:16px;display:flex;align-items:center;color:#fff;font-weight:700}#s3-importer-thumbnails{position:relative;width:100%;height:150px;margin-bottom:15px}#s3-importer-thumbnails-container{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%);mask-image:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%)}#s3-importer-thumbnails-container img{width:150px;height:150px;max-width:150px;max-height:150px;border-radius:4px}#s3-importer-thumbnails-container>img{margin-right:10px}#s3-importer-thumbnails-fade{background:linear-gradient(90deg,#ddd 0,hsla(0,0%,86.7%,0) 90%);position:absolute;left:150px;top:0;right:0;bottom:0}@supports ((-webkit-mask-image:linear-gradient(to left,rgba(221,221,221,0) 0%,#dddddd 95%,#dddddd 100%)) or (mask-image:linear-gradient(to left,rgba(221,221,221,0) 0%,#dddddd 95%,#dddddd 100%))){#s3-importer-thumbnails-fade{display:none}}#s3-importer-thumbnails-cloud{position:absolute;right:20px;top:50%;transform:translateY(-50%)}.s3-importer-thumb{position:absolute;left:0;top:0;width:150px;min-width:150px;max-width:150px;height:150px;min-height:150px;max-height:150px;background-size:cover;background-position:50%;background-repeat:no-repeat;margin-right:10px;border-radius:4px;background-color:#888;transition:opacity .25s linear,transform .25s linear}.s3-importer-thumb.ilab-hidden{opacity:0;transform:scale(.7)}.s3-importer-image-icon{position:absolute;left:0;top:0;position:relative;width:150px;min-width:150px;max-width:150px;height:150px;min-height:150px;max-height:150px;display:flex;align-items:center;justify-content:center;transition:opacity .25s linear,transform .25s linear}.s3-importer-image-icon.ilab-hidden{opacity:0;transform:scale(.8)}.s3-importer-info-warning{border:1px solid orange;padding:24px;background:rgba(255,165,0,.125);margin-top:20px;border-radius:8px}.s3-importer-info-warning h4{padding:0;font-size:14px;margin:0 0 8px} \ No newline at end of file diff --git a/public/css/media-cloud-docs.css b/public/css/media-cloud-docs.css deleted file mode 100755 index ad615693..00000000 --- a/public/css/media-cloud-docs.css +++ /dev/null @@ -1 +0,0 @@ -code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:none;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#ae81ff}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#a6e22e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#e6db74}.token.keyword{color:#66d9ef}.token.important,.token.regex{color:#fd971f}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}.media-cloud-docs-header{padding:0 40px;display:flex;justify-content:space-between;align-items:center;position:relative;height:104px;background-image:url(../img/settings-bg-large.svg);background-repeat:no-repeat;background-size:cover}.media-cloud-docs-header>img{margin:0;width:108px;max-width:108px}.media-cloud-docs-header span{font-weight:700;font-size:1.5em}.media-cloud-docs-header.media-cloud-docs-has-search span{flex:1;margin-left:30px}.media-cloud-docs-header .media-cloud-docs-search form{margin:0;padding:0;display:flex;align-items:center}.media-cloud-docs-breadcrumbs{padding:12px 40px;background-color:rgba(0,0,0,.0625);display:flex;align-items:center}.media-cloud-docs-breadcrumbs ul.toc-menu{position:relative;display:block;padding:0;margin:0 12px 0 0}@media only screen and (min-width:1140px){.media-cloud-docs-breadcrumbs ul.toc-menu{display:none}}.media-cloud-docs-breadcrumbs ul.toc-menu li,.media-cloud-docs-breadcrumbs ul.toc-menu ul{display:block;margin:0;padding:0;white-space:nowrap}.media-cloud-docs-breadcrumbs ul.toc-menu>li{background-color:hsla(0,0%,100%,.5);padding:5px 8px 3px;position:relative;border-radius:6px;cursor:pointer;transition:border-radius .125s linear,background-color .125s linear}.media-cloud-docs-breadcrumbs ul.toc-menu:hover>li{background-color:#45a4dd;border-radius:0}.media-cloud-docs-breadcrumbs ul.toc-menu:hover>li svg path{fill:#fff}.media-cloud-docs-breadcrumbs ul.toc-menu:hover>li>ul{opacity:1;pointer-events:unset}.media-cloud-docs-breadcrumbs ul.toc-menu>li>svg{width:13px;height:auto}.media-cloud-docs-breadcrumbs ul.toc-menu>li>svg path{fill:#000}.media-cloud-docs-breadcrumbs ul.toc-menu ul.child-entries{opacity:0;background-color:#45a4dd;position:absolute;left:100%;top:0;transition:opacity .125s linear;pointer-events:none}.media-cloud-docs-breadcrumbs ul.toc-menu ul.child-entries li{position:relative}.media-cloud-docs-breadcrumbs ul.toc-menu ul.child-entries li.has-children{background-image:url(../img/ui-icon-submenu.svg);background-repeat:no-repeat;background-size:8px;background-position:center right 8px}.media-cloud-docs-breadcrumbs ul.toc-menu ul.child-entries li a{display:block;padding:10px 30px 10px 10px;color:#fff;text-decoration:none}.media-cloud-docs-breadcrumbs ul.toc-menu ul.child-entries li:hover{background-color:#58bef0}.media-cloud-docs-breadcrumbs ul.toc-menu ul.child-entries li:hover>ul.child-entries{opacity:1;pointer-events:unset}.media-cloud-docs-breadcrumbs ul.toc-menu>li>ul.child-entries{left:0;top:100%}.media-cloud-docs-breadcrumbs ul.crumbs{margin:0;padding:0;display:flex}.media-cloud-docs-breadcrumbs ul.crumbs li{padding:0;margin:0 10px 0 0}.media-cloud-docs-breadcrumbs ul.crumbs li:after{padding-left:10px;content:"\BB"}.media-cloud-docs-breadcrumbs ul.crumbs li:last-of-type{margin-right:0}.media-cloud-docs-breadcrumbs ul.crumbs li:last-of-type:after{content:""}.media-cloud-docs-container{width:100%;display:flex}.media-cloud-docs-container .media-cloud-docs-toc{background-color:#417fb4;padding:20px}.media-cloud-docs-container .media-cloud-docs-toc li,.media-cloud-docs-container .media-cloud-docs-toc ul{display:block}.media-cloud-docs-container .media-cloud-docs-toc li a,.media-cloud-docs-container .media-cloud-docs-toc ul a{color:#fff;text-decoration:none}.media-cloud-docs-container .media-cloud-docs-toc ul{margin:0;padding:5px 20px 5px 10px}@media only screen and (max-width:1140px){.media-cloud-docs-container .media-cloud-docs-toc{display:none}}.media-cloud-docs-container .media-cloud-docs-body{flex:1;background-color:hsla(0,0%,100%,.66);padding:20px 40px}.media-cloud-docs-container .media-cloud-docs-body h1{font-size:2em}.media-cloud-docs-container .media-cloud-docs-body h2{font-size:1.66em}.media-cloud-docs-container .media-cloud-docs-body h3{font-size:1.33em}.media-cloud-docs-container .media-cloud-docs-body h4{font-size:1.25em}.media-cloud-docs-container .media-cloud-docs-body h5,.media-cloud-docs-container .media-cloud-docs-body h6{font-size:1em}.media-cloud-docs-container .media-cloud-docs-body>img.responsive,.media-cloud-docs-container .media-cloud-docs-body>p>img.responsive{display:block;margin-left:auto;margin-right:auto;max-width:980px;width:100%;height:auto}.media-cloud-docs-container .media-cloud-docs-body .embed-container{position:relative}.media-cloud-docs-container .media-cloud-docs-body .embed-container.embed-video{margin:1em 0;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%}.media-cloud-docs-container .media-cloud-docs-body .embed-container.embed-video iframe{position:absolute;top:0;left:0;width:100%;height:100%}.media-cloud-docs-container .media-cloud-docs-body pre:not([class*=language]){padding:1em .5em;background-color:rgba(0,0,0,.07)}.media-cloud-docs-container .media-cloud-docs-body pre:not([class*=language]) code{background-color:transparent}.media-cloud-docs-container ul{list-style:outside;padding:5px 20px}.media-cloud-docs-container ul li{display:list-item;margin:0;padding:5px 0 0}.media-cloud-docs-container ol{list-style:inside decimal}.media-cloud-docs-container table{width:100%}.media-cloud-docs-container table thead{background-color:rgba(0,0,0,.0625)}.media-cloud-docs-container table thead th{text-align:left;padding:10px}.media-cloud-docs-container table tbody td{padding:10px}.media-cloud-docs-container table tbody td img{width:auto;height:auto}.media-cloud-docs-modal{z-index:1000000;position:fixed;background:rgba(0,0,0,.75);left:0;top:0;right:0;bottom:0;transition:opacity .25s linear;display:flex;justify-content:center;padding:40px 0}.media-cloud-docs-modal.media-cloud-docs-modal-hidden{opacity:0}.media-cloud-docs-modal .media-cloud-docs-ajax-container{position:relative;width:100%;max-width:95vw;background:#fff;display:flex;flex-direction:column}@media only screen and (max-width:980px){.media-cloud-docs-modal .media-cloud-docs-ajax-container{margin:0 20px}}.media-cloud-docs-modal .media-cloud-docs-ajax-container .media-cloud-docs-header{margin-left:0;margin-right:0}.media-cloud-docs-modal .media-cloud-docs-ajax-container .media-cloud-docs-breadcrumbs{margin-left:0}.media-cloud-docs-modal .media-cloud-docs-ajax-container .media-cloud-docs-container{display:block;padding:0;overflow:auto}.media-cloud-docs-modal .media-cloud-docs-ajax-container .media-cloud-docs-body{flex:auto;background:#fff;width:auto;max-width:none;padding:0 20px;margin:0}.media-cloud-docs-modal .media-cloud-docs-ajax-container .media-cloud-docs-modal-close{position:absolute;left:0;top:0;width:24px;height:24px;border-radius:24px;transform:translate(-50%,-50%);font-size:0;background-color:#000;border:2px solid #fff}.media-cloud-docs-modal .media-cloud-docs-ajax-container .media-cloud-docs-modal-close:after,.media-cloud-docs-modal .media-cloud-docs-ajax-container .media-cloud-docs-modal-close:before{content:"";position:absolute;top:11px;width:12px;height:2px;background-color:#fff;border-radius:2px}.media-cloud-docs-modal .media-cloud-docs-ajax-container .media-cloud-docs-modal-close:before{transform:rotate(45deg);left:6px}.media-cloud-docs-modal .media-cloud-docs-ajax-container .media-cloud-docs-modal-close:after{transform:rotate(-45deg);right:6px} \ No newline at end of file diff --git a/public/img/ilab-ui-icon-add.png b/public/img/ilab-ui-icon-add.png new file mode 100755 index 0000000000000000000000000000000000000000..e56ea8d9b73cc77ab84407d5ff7a22740f480a0d GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^sUXb33?!2m-Te!s%mREuT!AzhV0&3c5m1|8NswPK z11p<^l&*nMRCG-2%U55&eJ`JLwgxCU!PCVtB;(%OTf6xh6nGp09cq|w{r?|n?i?%O z(|fG?d(knqCFcb9E>}GrIjd*F2Jg_1W?mwp?M+CaD428O%@tD@+6wBO*wyWLd(l)K zwbZp8ff^bb@53hXPTFE5&b=hYo~8DB&ISK3Z#mDqxj7=h&laI=>g%lUM8&T<)AyoW Y_GZQ`_7?&%n?U~cboFyt=akR{01vHQL;wH) literal 0 HcmV?d00001 diff --git a/public/img/ilab-ui-icon-add.svg b/public/img/ilab-ui-icon-add.svg new file mode 100755 index 00000000..90b816db --- /dev/null +++ b/public/img/ilab-ui-icon-add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/ilab-ui-icon-help.svg b/public/img/ilab-ui-icon-help.svg new file mode 100755 index 00000000..e025d74e --- /dev/null +++ b/public/img/ilab-ui-icon-help.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/ilab-ui-icon-youtube.svg b/public/img/ilab-ui-icon-youtube.svg new file mode 100755 index 00000000..0454480d --- /dev/null +++ b/public/img/ilab-ui-icon-youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/mcloud-icon-help.svg b/public/img/mcloud-icon-help.svg new file mode 100755 index 00000000..e81bfb98 --- /dev/null +++ b/public/img/mcloud-icon-help.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/js/docs-prism.js b/public/js/docs-prism.js index 216f1148..57e3fdea 100755 --- a/public/js/docs-prism.js +++ b/public/js/docs-prism.js @@ -1 +1,102 @@ -!function(e){var n={};function t(a){if(n[a])return n[a].exports;var r=n[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,t),r.l=!0,r.exports}t.m=e,t.c=n,t.d=function(e,n,a){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:a})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(t.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var r in e)t.d(a,r,function(n){return e[n]}.bind(null,r));return a},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="/",t(t.s=585)}({24:function(e,n){var t;t=function(){return this}();try{t=t||new Function("return this")()}catch(e){"object"==typeof window&&(t=window)}e.exports=t},585:function(e,n,t){e.exports=t(586)},586:function(e,n,t){(function(n){var t,a,r=function(e){var n=/\blang(?:uage)?-([\w-]+)\b/i,t=0,a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof r?new r(e.type,a.util.encode(e.content),e.alias):Array.isArray(e)?e.map(a.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(v instanceof r)){if(m&&y!=n.length-1){if(d.lastIndex=k,!(T=d.exec(e)))break;for(var E=T.index+(f?T[1].length:0),A=T.index+T[0].length,_=y,w=k,O=n.length;_"+t.content+""},!e.document)return e.addEventListener&&(a.disableWorkerMessageHandler||e.addEventListener("message",function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,o=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),o&&e.close()},!1)),a;var i=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return i&&(a.filename=i.src,a.manual||i.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(a.highlightAll):window.setTimeout(a.highlightAll,16):document.addEventListener("DOMContentLoaded",a.highlightAll))),a}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});e.exports&&(e.exports=r),void 0!==n&&(n.Prism=r),r.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s\/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},r.languages.markup.tag.inside["attr-value"].inside.entity=r.languages.markup.entity,r.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(r.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:r.languages[n]},t.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:t}};a["language-"+n]={pattern:/[\s\S]+/,inside:r.languages[n]};var i={};i[e]={pattern:RegExp("(<__[\\s\\S]*?>)(?:\\s*|[\\s\\S])*?(?=<\\/__>)".replace(/__/g,e),"i"),lookbehind:!0,greedy:!0,inside:a},r.languages.insertBefore("markup","cdata",i)}}),r.languages.xml=r.languages.extend("markup",{}),r.languages.html=r.languages.markup,r.languages.mathml=r.languages.markup,r.languages.svg=r.languages.markup,r.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},function(e){var n="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",t={environment:{pattern:RegExp("\\$"+n),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+n),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b\w+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+n),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+?)\s*(?:\r?\n|\r)(?:[\s\S])*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:t},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s*(?:\r?\n|\r)(?:[\s\S])*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0},{pattern:/(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/,greedy:!0,inside:t}],environment:{pattern:RegExp("\\$?"+n),alias:"constant"},variable:t.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}};for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],r=t.variable[1].inside,i=0;i=i.length);l++){var u=s[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=i[r],p=t.tokenStack[c],d="string"==typeof u?u:u.content,g=n(a,c),f=d.indexOf(g);if(-1$|^<\?(?:php(?=\s)|=)?/i,alias:"important"}}),e.languages.insertBefore("php","keyword",{variable:/\$+(?:\w+\b|(?={))/i,package:{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),e.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var n={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,lookbehind:!0,inside:{rest:e.languages.php}};e.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:n}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:n}}}),delete e.languages.php.string,e.hooks.add("before-tokenize",function(n){/<\?/.test(n.code)&&e.languages["markup-templating"].buildPlaceholders(n,"php",/<\?(?:[^"'\/#]|\/(?![*\/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/gi)}),e.hooks.add("after-tokenize",function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"php")})}(r),a=(t=r).languages.javadoclike={parameter:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*@(?:param|arg|arguments)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/},Object.defineProperty(a,"addSupport",{value:function(e,n){"string"==typeof e&&(e=[e]),e.forEach(function(e){!function(e,n){var a="doc-comment",r=t.languages[e];if(r){var i=r[a];if(i||(i=(r=t.languages.insertBefore(e,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^\/][\s\S]*?(?:\*\/|$)/,alias:"comment"}}))[a]),i instanceof RegExp&&(i=r[a]={pattern:i}),Array.isArray(i))for(var o=0,s=i.length;o");(u=document.createElement("span")).setAttribute("aria-hidden","true"),u.className="line-numbers-rows",u.innerHTML=d,i.hasAttribute("data-start")&&(i.style.counterReset="linenumber "+(parseInt(i.getAttribute("data-start"),10)-1)),e.element.appendChild(u),t(i),r.hooks.run("line-numbers",e)}}}}),r.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}),r.plugins.lineNumbers={getLine:function(n,t){if("PRE"===n.tagName&&n.classList.contains(e)){var a=n.querySelector(".line-numbers-rows"),r=parseInt(n.getAttribute("data-start"),10)||1,i=r+(a.children.length-1);t=0;--o){var a=this.tryEntries[o],h=a.completion;if("root"===a.tryLoc)return i("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(u&&c){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),T(r),y}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var i=n.arg;T(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:R(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),y}},t}(t.exports);try{regeneratorRuntime=n}catch(t){Function("r","regeneratorRuntime = r")(n)}},52:function(t,e,r){t.exports=r(108)},609:function(t,e,r){t.exports=r(610)},610:function(t,e,r){"use strict";r.r(e);var n=r(52),i=r.n(n);function o(t,e,r,n,i,o,a){try{var h=t[o](a),u=h.value}catch(t){return void r(t)}h.done?e(u):Promise.resolve(u).then(n,i)}function a(t){return function(){var e=this,r=arguments;return new Promise(function(n,i){var a=t.apply(e,r);function h(t){o(a,n,i,h,u,"next",t)}function u(t){o(a,n,i,h,u,"throw",t)}h(void 0)})}}window.ILABFaceDetector=function(t,e){if("undefined"==typeof faceapi)return null;var r=function(t,e){var r=Number.MAX_SAFE_INTEGER,n=Number.MAX_SAFE_INTEGER,i=0,o=0;return t.forEach(function(t){r=Math.min(r,t.x),i=Math.max(i,t.x),n=Math.min(n,t.y),o=Math.max(o,t.y)}),{x1:r/e.width,x2:i/e.width,y1:n/e.height,y2:o/e.height,midX:(r+(i-r)/2)/e.width,midY:(n+(o-n)/2)/e.height,width:(i-r)/e.width,height:(o-n)/e.height}},n=function(t,e,r){var n=[];return t.forEach(function(t){var i=Math.sin(e),o=Math.cos(e);n.push({x:o*(t.x-r.x)-i*(t.y-r.y)+r.x,y:i*(t.x-r.x)+o*(t.y-r.y)+r.y})}),n},o=function(t,e){return{x:t.x/e.width,y:t.y/e.height}},h=function(t,e,i){var a=n(t,-e.angle,e.center),h=r(a,{width:1,height:1}),u=[{x:h.x1,y:h.y1},{x:h.x2,y:h.y2},{x:h.x1,y:h.y2},{x:h.x2,y:h.y1},{x:h.midX,y:h.y1},{x:h.x2,y:h.midY},{x:h.midX,y:h.y2},{x:h.x1,y:h.midY},{x:h.midX,y:h.midY}];return{x1:(u=n(u,e.angle,e.center))[0].x/i.width,x2:u[1].x/i.width,y1:u[0].y/i.height,y2:u[1].y/i.height,midX:u[2].x/i.width,midY:u[2].y/i.height,width:h.width/i.width,height:h.height/i.height,topLeft:o(u[0],i),bottomRight:o(u[1],i),bottomLeft:o(u[2],i),topRight:o(u[3],i),topMiddle:o(u[4],i),middleRight:o(u[5],i),bottomMiddle:o(u[6],i),middleLeft:o(u[7],i)}},u=function(t){var e=r(t.getLeftEye(),{width:1,height:1}),n=r(t.getRightEye(),{width:1,height:1}),i=Math.max(n.midX,e.midX),o=Math.min(n.midX,e.midX),a=Math.max(n.midY,e.midY),h=o-i,u=Math.min(n.midY,e.midY)-a;return{angle:Math.atan2(n.midY-e.midY,n.midX-e.midX),center:{x:i+h/2,y:a+u/2}}},c=function(){var t=a(i.a.mark(function t(){return i.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",new Promise(function(t){setTimeout(function(){t()},250)}));case 1:case"end":return t.stop()}},t)}));return function(){return t.apply(this,arguments)}}(),d=function(){var t=a(i.a.mark(function t(o){var a;return i.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:if(window.loadedFaceData){t.next=6;break}return console.log("waiting for loaded."),t.next=4,c();case 4:t.next=0;break;case 6:return a=[],t.next=9,faceapi.detectAllFaces(o).withFaceLandmarks();case 9:t.sent.forEach(function(t){var e=t.detection.imageDims,i={Left:t.detection.box.x/e.width,Top:t.detection.box.y/e.height,Width:t.detection.box.width/e.width,Height:t.detection.box.height/e.height},o=[],c=u(t.landmarks);c.center={x:i.Left+i.Width/2,y:i.Top+i.Height/2};var d=h(t.landmarks.getMouth(),c,t.detection.imageDims);0!=d.width&&0!=d.height&&(o.push({Type:"mouthLeft",X:d.middleLeft.x,Y:d.middleLeft.y}),o.push({Type:"mouthRight",X:d.middleRight.x,Y:d.middleRight.y}),o.push({Type:"mouthUp",X:d.topMiddle.x,Y:d.topMiddle.y}),o.push({Type:"mouthDown",X:d.bottomMiddle.x,Y:d.bottomMiddle.y}));var f=h(t.landmarks.getLeftEye(),c,t.detection.imageDims);0!=f.width&&0!=f.height&&(o.push({Type:"eyeLeft",X:f.midX,Y:f.midY}),o.push({Type:"leftEyeLeft",X:f.middleLeft.x,Y:f.middleLeft.y}),o.push({Type:"leftEyeRight",X:f.middleRight.x,Y:f.middleRight.y}),o.push({Type:"leftEyeUp",X:f.topMiddle.x,Y:f.topMiddle.y}),o.push({Type:"leftEyeDown",X:f.bottomMiddle.x,Y:f.bottomMiddle.y}));var l=h(t.landmarks.getLeftEyeBrow(),c,t.detection.imageDims);0!=l.width&&0!=l.height&&(o.push({Type:"leftEyeBrowLeft",X:l.bottomLeft.x,Y:l.bottomLeft.y}),o.push({Type:"leftEyeBrowRight",X:l.bottomRight.x,Y:l.bottomRight.y}),o.push({Type:"leftEyeBrowUp",X:l.topMiddle.x,Y:l.topMiddle.y}));var s=h(t.landmarks.getRightEye(),c,t.detection.imageDims);0!=s.width&&0!=s.height&&(o.push({Type:"eyeRight",X:s.midX,Y:s.midY}),o.push({Type:"rightEyeLeft",X:s.middleLeft.x,Y:s.middleLeft.y}),o.push({Type:"rightEyeRight",X:s.middleRight.x,Y:s.middleRight.y}),o.push({Type:"rightEyeUp",X:s.topMiddle.x,Y:s.topMiddle.y}),o.push({Type:"rightEyeDown",X:s.bottomMiddle.x,Y:s.bottomMiddle.y}));var y=h(t.landmarks.getRightEyeBrow(),c,t.detection.imageDims);0!=y.width&&0!=y.height&&(o.push({Type:"rightEyeBrowLeft",X:y.bottomLeft.x,Y:y.bottomLeft.y}),o.push({Type:"rightEyeBrowRight",X:y.bottomRight.x,Y:y.bottomRight.y}),o.push({Type:"rightEyeBrowUp",X:y.topMiddle.x,Y:y.topMiddle.y}));var p=h(t.landmarks.getNose(),c,t.detection.imageDims);0!=p.width&&0!=p.height&&(o.push({Type:"nose",X:p.midX,Y:p.midY}),o.push({Type:"noseLeft",X:p.bottomLeft.x,Y:p.bottomLeft.y}),o.push({Type:"noseRight",X:p.bottomRight.x,Y:p.bottomRight.y}),o.push({Type:"noseUp",X:p.topMiddle.x,Y:p.topMiddle.y}),o.push({Type:"noseDown",X:p.bottomMiddle.x,Y:p.bottomMiddle.y}));var m=t.landmarks.getJawOutline();if(m.length>0){var g=n(m,-c.angle,c.center),x=r(g,{width:1,height:1}),w={x:Number.MAX_SAFE_INTEGER,y:Number.MAX_SAFE_INTEGER},v={x:0,y:Number.MAX_SAFE_INTEGER},E={x:Number.MAX_SAFE_INTEGER,y:Number.MAX_SAFE_INTEGER},b={x:0,y:Number.MAX_SAFE_INTEGER},L={x:x.midX,y:x.y2};g.forEach(function(t){t.y0){var g=n(m,-c.angle,c.center),x=r(g,{width:1,height:1}),w={x:Number.MAX_SAFE_INTEGER,y:Number.MAX_SAFE_INTEGER},v={x:0,y:Number.MAX_SAFE_INTEGER},E={x:Number.MAX_SAFE_INTEGER,y:Number.MAX_SAFE_INTEGER},b={x:0,y:Number.MAX_SAFE_INTEGER},L={x:x.midX,y:x.y2};g.forEach(function(t){t.y=0;--o){var a=this.tryEntries[o],h=a.completion;if("root"===a.tryLoc)return i("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(u&&c){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),T(r),y}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var i=n.arg;T(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:R(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),y}},t}(t.exports);try{regeneratorRuntime=n}catch(t){Function("r","regeneratorRuntime = r")(n)}}}); \ No newline at end of file diff --git a/public/js/ilab-image-sizes.js b/public/js/ilab-image-sizes.js index 97f102f4..874e751d 100755 --- a/public/js/ilab-image-sizes.js +++ b/public/js/ilab-image-sizes.js @@ -1 +1 @@ -!function(e){var t={};function n(i){if(t[i])return t[i].exports;var a=t[i]={i:i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(i,a,function(t){return e[t]}.bind(null,a));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=589)}({589:function(e,t,n){e.exports=n(590)},590:function(e,t){jQuery(document).ready(function(e){var t=null;e(".ilab-size-row").each(function(){var n=e(this),i=e(this).hasClass("ilab-custom-size-row"),a=e(n.find("input[name=nonce]")[0]).val(),o=n.find('input[name="size"]').val(),u=0,r=function(){var t=n.find('input[name="width"]').val(),i=n.find('input[name="height"]').val(),r=n.find('input[name="'+o+'__crop"]')[0].checked,l=n.find('select[name="x-axis"]').val(),c=n.find('select[name="y-axis"]').val(),s={action:"ilab_update_image_size",size:o,nonce:a,width:t,height:i,crop:r,xAxis:l,yAxis:c};clearTimeout(u),u=setTimeout(function(){e.post(ajaxurl,s,function(e){})},1e3)};i&&(n.find('input[type="number"]').on("change",function(){r()}),n.find('input[type="checkbox"]').on("change",function(){r()}),n.find("select").on("change",function(){r()}),n.find(".ilab-delete-size-button").on("click",function(t){if(t.preventDefault(),confirm("Are you sure you want to delete this image size?")){var i={action:"ilab_delete_image_size",size:o,nonce:a};e.post(ajaxurl,i,function(e){"ok"==e.status&&n.remove()})}return!1})),n.find(".ilab-size-settings-button").on("click",function(e){if(e.preventDefault(),null==t){alert("Select a sample image to use to edit this image size settings.");var n=wp.media({title:"Select a image to use",button:{text:"Use this image"},multiple:!1});n.on("select",function(){t=n.state().get("selection").first().toJSON().id,ILabModal.loadURL(ajaxurl+"?action=ilab_dynamic_images_edit_page&image_id="+t+"&size="+o+"&mode=size",!1,null)}),n.open()}else ILabModal.loadURL(ajaxurl+"?action=ilab_dynamic_images_edit_page&image_id="+t+"&size="+o+"&mode=size",!1,null);return!1})})})}}); \ No newline at end of file +!function(e){var t={};function n(i){if(t[i])return t[i].exports;var a=t[i]={i:i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(i,a,function(t){return e[t]}.bind(null,a));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=282)}({282:function(e,t,n){e.exports=n(283)},283:function(e,t){jQuery(document).ready(function(e){var t=null;e(".ilab-size-row").each(function(){var n=e(this),i=e(this).hasClass("ilab-custom-size-row"),a=e(n.find("input[name=nonce]")[0]).val(),o=n.find('input[name="size"]').val(),u=0,r=function(){var t=n.find('input[name="width"]').val(),i=n.find('input[name="height"]').val(),r=n.find('input[name="'+o+'__crop"]')[0].checked,l=n.find('select[name="x-axis"]').val(),c=n.find('select[name="y-axis"]').val(),s={action:"ilab_update_image_size",size:o,nonce:a,width:t,height:i,crop:r,xAxis:l,yAxis:c};clearTimeout(u),u=setTimeout(function(){e.post(ajaxurl,s,function(e){})},1e3)};i&&(n.find('input[type="number"]').on("change",function(){r()}),n.find('input[type="checkbox"]').on("change",function(){r()}),n.find("select").on("change",function(){r()}),n.find(".ilab-delete-size-button").on("click",function(t){if(t.preventDefault(),confirm("Are you sure you want to delete this image size?")){var i={action:"ilab_delete_image_size",size:o,nonce:a};e.post(ajaxurl,i,function(e){"ok"==e.status&&n.remove()})}return!1})),n.find(".ilab-size-settings-button").on("click",function(e){if(e.preventDefault(),null==t){alert("Select a sample image to use to edit this image size settings.");var n=wp.media({title:"Select a image to use",button:{text:"Use this image"},multiple:!1});n.on("select",function(){t=n.state().get("selection").first().toJSON().id,ILabModal.loadURL(ajaxurl+"?action=ilab_dynamic_images_edit_page&image_id="+t+"&size="+o+"&mode=size",!1,null)}),n.open()}else ILabModal.loadURL(ajaxurl+"?action=ilab_dynamic_images_edit_page&image_id="+t+"&size="+o+"&mode=size",!1,null);return!1})})})}}); \ No newline at end of file diff --git a/public/js/ilab-media-direct-upload-google.js b/public/js/ilab-media-direct-upload-google.js index 3b841dbb..573b40d6 100755 --- a/public/js/ilab-media-direct-upload-google.js +++ b/public/js/ilab-media-direct-upload-google.js @@ -1 +1 @@ -!function(e){var o={};function t(r){if(o[r])return o[r].exports;var n=o[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,t),n.l=!0,n.exports}t.m=e,t.c=o,t.d=function(e,o,r){t.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,o){if(1&o&&(e=t(e)),8&o)return e;if(4&o&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&o&&"string"!=typeof e)for(var n in e)t.d(r,n,function(o){return e[o]}.bind(null,n));return r},t.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(o,"a",o),o},t.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},t.p="/",t(t.s=581)}({581:function(e,o,t){e.exports=t(582)},582:function(e,o){window.ILABUploadToGoogleStorage=function(e,o,t,r){var n={action:"ilab_upload_prepare",filename:e.name,type:t};r.hasOwnProperty("uploadDirectory")&&(n.directory=r.uploadDirectory),$.post(ajaxurl,n,function(t){if("ready"==t.status){r.set({state:"uploading"});var n=t.key;t.acl;$.ajax({url:t.url,method:"POST",headers:{"x-goog-resumable":"start","Content-Type":e.type},success:function(t,a,u){var l=u.getResponseHeader("location");$.ajax({url:l,method:"PUT",processData:!1,crossDomain:!0,data:e,contentType:e.type,xhr:function(){var e=$.ajaxSettings.xhr();return e.upload.onprogress=function(e){r.set({progress:e.loaded/e.total*100})}.bind(this),e},success:function(e){r.uploadFinished(n,o)},error:function(e){r.uploadError()}})},error:function(e){r.uploadError()}})}else r.uploadError()})},"undefined"!=typeof DirectUploadItem&&(DirectUploadItem.prototype.uploadToStorage=ILABUploadToGoogleStorage),ilabMediaUploadItem.prototype.uploadToStorage=ILABUploadToGoogleStorage}}); \ No newline at end of file +!function(e){var o={};function t(r){if(o[r])return o[r].exports;var n=o[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,t),n.l=!0,n.exports}t.m=e,t.c=o,t.d=function(e,o,r){t.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,o){if(1&o&&(e=t(e)),8&o)return e;if(4&o&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&o&&"string"!=typeof e)for(var n in e)t.d(r,n,function(o){return e[o]}.bind(null,n));return r},t.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(o,"a",o),o},t.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},t.p="/",t(t.s=274)}({274:function(e,o,t){e.exports=t(275)},275:function(e,o){window.ILABUploadToGoogleStorage=function(e,o,t,r){var n={action:"ilab_upload_prepare",filename:e.name,type:t};r.hasOwnProperty("uploadDirectory")&&(n.directory=r.uploadDirectory),$.post(ajaxurl,n,function(t){if("ready"==t.status){r.set({state:"uploading"});var n=t.key;t.acl;$.ajax({url:t.url,method:"POST",headers:{"x-goog-resumable":"start","Content-Type":e.type},success:function(t,a,u){var l=u.getResponseHeader("location");$.ajax({url:l,method:"PUT",processData:!1,crossDomain:!0,data:e,contentType:e.type,xhr:function(){var e=$.ajaxSettings.xhr();return e.upload.onprogress=function(e){r.set({progress:e.loaded/e.total*100})}.bind(this),e},success:function(e){r.uploadFinished(n,o)},error:function(e){r.uploadError()}})},error:function(e){r.uploadError()}})}else r.uploadError()})},"undefined"!=typeof DirectUploadItem&&(DirectUploadItem.prototype.uploadToStorage=ILABUploadToGoogleStorage),ilabMediaUploadItem.prototype.uploadToStorage=ILABUploadToGoogleStorage}}); \ No newline at end of file diff --git a/public/js/ilab-media-direct-upload-other-s3.js b/public/js/ilab-media-direct-upload-other-s3.js index 5ebc0986..f97e154f 100755 --- a/public/js/ilab-media-direct-upload-other-s3.js +++ b/public/js/ilab-media-direct-upload-other-s3.js @@ -1 +1 @@ -!function(e){var o={};function t(r){if(o[r])return o[r].exports;var n=o[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,t),n.l=!0,n.exports}t.m=e,t.c=o,t.d=function(e,o,r){t.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,o){if(1&o&&(e=t(e)),8&o)return e;if(4&o&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&o&&"string"!=typeof e)for(var n in e)t.d(r,n,function(o){return e[o]}.bind(null,n));return r},t.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(o,"a",o),o},t.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},t.p="/",t(t.s=583)}({583:function(e,o,t){e.exports=t(584)},584:function(e,o){window.ILABUploadToOtherS3Storage=function(e,o,t,r){var n={action:"ilab_upload_prepare",filename:e.name,type:t};r.hasOwnProperty("uploadDirectory")&&(n.directory=r.uploadDirectory),$.post(ajaxurl,n,function(t){if("ready"==t.status){r.set({state:"uploading"});var n=new XMLHttpRequest;n.open("PUT",t.url,!0),n.upload.onprogress=function(e){r.set({progress:e.loaded/e.total*100})},n.onload=function(){t.hasOwnProperty("key")?r.uploadFinished(t.key,o):r.uploadError()},n.onerror=function(){r.uploadError()},n.send(e)}else r.uploadError()}.bind(this))},"undefined"!=typeof DirectUploadItem&&(DirectUploadItem.prototype.uploadToStorage=ILABUploadToOtherS3Storage),ilabMediaUploadItem.prototype.uploadToStorage=ILABUploadToOtherS3Storage}}); \ No newline at end of file +!function(e){var o={};function t(r){if(o[r])return o[r].exports;var n=o[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,t),n.l=!0,n.exports}t.m=e,t.c=o,t.d=function(e,o,r){t.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,o){if(1&o&&(e=t(e)),8&o)return e;if(4&o&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&o&&"string"!=typeof e)for(var n in e)t.d(r,n,function(o){return e[o]}.bind(null,n));return r},t.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(o,"a",o),o},t.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},t.p="/",t(t.s=276)}({276:function(e,o,t){e.exports=t(277)},277:function(e,o){window.ILABUploadToOtherS3Storage=function(e,o,t,r){var n={action:"ilab_upload_prepare",filename:e.name,type:t};r.hasOwnProperty("uploadDirectory")&&(n.directory=r.uploadDirectory),$.post(ajaxurl,n,function(t){if("ready"==t.status){r.set({state:"uploading"});var n=new XMLHttpRequest;n.open("PUT",t.url,!0),n.upload.onprogress=function(e){r.set({progress:e.loaded/e.total*100})},n.onload=function(){t.hasOwnProperty("key")?r.uploadFinished(t.key,o):r.uploadError()},n.onerror=function(){r.uploadError()},n.send(e)}else r.uploadError()}.bind(this))},"undefined"!=typeof DirectUploadItem&&(DirectUploadItem.prototype.uploadToStorage=ILABUploadToOtherS3Storage),ilabMediaUploadItem.prototype.uploadToStorage=ILABUploadToOtherS3Storage}}); \ No newline at end of file diff --git a/public/js/ilab-media-direct-upload-s3.js b/public/js/ilab-media-direct-upload-s3.js index cecdc96f..8ed25da7 100755 --- a/public/js/ilab-media-direct-upload-s3.js +++ b/public/js/ilab-media-direct-upload-s3.js @@ -1 +1 @@ -!function(e){var o={};function r(t){if(o[t])return o[t].exports;var n=o[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.m=e,r.c=o,r.d=function(e,o,t){r.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:t})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,o){if(1&o&&(e=r(e)),8&o)return e;if(4&o&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(r.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&o&&"string"!=typeof e)for(var n in e)r.d(t,n,function(o){return e[o]}.bind(null,n));return t},r.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(o,"a",o),o},r.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},r.p="/",r(r.s=579)}({579:function(e,o,r){e.exports=r(580)},580:function(e,o){window.ILABUploadToS3Storage=function(e,o,r,t){console.log(e,t);var n={action:"ilab_upload_prepare",filename:e.name,type:r};t.hasOwnProperty("uploadDirectory")&&(n.directory=t.uploadDirectory),console.log(t),jQuery.post(ajaxurl,n,function(n){if(console.log(t),"ready"==n.status){t.set({state:"uploading"});var a=new FormData;_.each(Object.keys(n.formData),function(e){"key"!=e&&a.append(e,n.formData[e])}),null!=n.cacheControl&&n.cacheControl.length>0&&a.append("Cache-Control",n.cacheControl),null!=n.expires&&a.append("Expires",n.expires),a.append("Content-Type",r),a.append("acl",n.acl),a.append("key",n.key),a.append("file",e),jQuery.ajax({url:n.url,method:"POST",contentType:!1,processData:!1,data:a,xhr:function(){var e=jQuery.ajaxSettings.xhr();return e.upload.onprogress=function(e){t.set({progress:e.loaded/e.total*100})}.bind(this),e},success:function(e){n.hasOwnProperty("key")?t.uploadFinished(n.key,o):t.uploadError()},error:function(e){t.uploadError()}})}else t.uploadError()})},"undefined"!=typeof DirectUploadItem&&(DirectUploadItem.prototype.uploadToStorage=ILABUploadToS3Storage),ilabMediaUploadItem.prototype.uploadToStorage=ILABUploadToS3Storage}}); \ No newline at end of file +!function(e){var o={};function r(t){if(o[t])return o[t].exports;var n=o[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.m=e,r.c=o,r.d=function(e,o,t){r.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:t})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,o){if(1&o&&(e=r(e)),8&o)return e;if(4&o&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(r.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&o&&"string"!=typeof e)for(var n in e)r.d(t,n,function(o){return e[o]}.bind(null,n));return t},r.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(o,"a",o),o},r.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},r.p="/",r(r.s=272)}({272:function(e,o,r){e.exports=r(273)},273:function(e,o){window.ILABUploadToS3Storage=function(e,o,r,t){console.log(e,t);var n={action:"ilab_upload_prepare",filename:e.name,type:r};t.hasOwnProperty("uploadDirectory")&&(n.directory=t.uploadDirectory),console.log(t),jQuery.post(ajaxurl,n,function(n){if(console.log(t),"ready"==n.status){t.set({state:"uploading"});var a=new FormData;_.each(Object.keys(n.formData),function(e){"key"!=e&&a.append(e,n.formData[e])}),null!=n.cacheControl&&n.cacheControl.length>0&&a.append("Cache-Control",n.cacheControl),null!=n.expires&&a.append("Expires",n.expires),a.append("Content-Type",r),a.append("acl",n.acl),a.append("key",n.key),a.append("file",e),jQuery.ajax({url:n.url,method:"POST",contentType:!1,processData:!1,data:a,xhr:function(){var e=jQuery.ajaxSettings.xhr();return e.upload.onprogress=function(e){t.set({progress:e.loaded/e.total*100})}.bind(this),e},success:function(e){n.hasOwnProperty("key")?t.uploadFinished(n.key,o):t.uploadError()},error:function(e){t.uploadError()}})}else t.uploadError()})},"undefined"!=typeof DirectUploadItem&&(DirectUploadItem.prototype.uploadToStorage=ILABUploadToS3Storage),ilabMediaUploadItem.prototype.uploadToStorage=ILABUploadToS3Storage}}); \ No newline at end of file diff --git a/public/js/ilab-media-direct-upload.js b/public/js/ilab-media-direct-upload.js index a624ef23..44dbcc0b 100755 --- a/public/js/ilab-media-direct-upload.js +++ b/public/js/ilab-media-direct-upload.js @@ -1 +1 @@ -!function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/",r(r.s=491)}([,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(19),i=(e,t,r,n)=>{if(t+r>e.length){if("function"!=typeof n)throw new Error("Buffer out of space and no valid flush() function found");return n(e,t),0}return t};t.UINT8={len:1,get:(e,t)=>e.readUInt8(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=255),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUInt8(r,s),s-t+this.len}},t.UINT16_LE={len:2,get:(e,t)=>e.readUInt16LE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=65535),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUInt16LE(r,s),s-t+this.len}},t.UINT16_BE={len:2,get:(e,t)=>e.readUInt16BE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=65535),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUInt16BE(r,s),s-t+this.len}},t.UINT24_LE={len:3,get:(e,t)=>e.readUIntLE(t,3),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=16777215),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUIntLE(r,s,3),s-t+this.len}},t.UINT24_BE={len:3,get:(e,t)=>e.readUIntBE(t,3),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=16777215),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUIntBE(r,s,3),s-t+this.len}},t.UINT32_LE={len:4,get:(e,t)=>e.readUInt32LE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=4294967295),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUInt32LE(r,s),s-t+this.len}},t.UINT32_BE={len:4,get:(e,t)=>e.readUInt32BE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=4294967295),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUInt32BE(r,s),s-t+this.len}},t.INT8={len:1,get:(e,t)=>e.readInt8(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-128&&r<=127),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeInt8(r,s),s-t+this.len}},t.INT16_BE={len:2,get:(e,t)=>e.readInt16BE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-32768&&r<=32767),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeInt16BE(r,s),s-t+this.len}},t.INT16_LE={len:2,get:(e,t)=>e.readInt16LE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-32768&&r<=32767),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeInt16LE(r,s),s-t+this.len}},t.INT24_LE={len:3,get:(e,t)=>e.readIntLE(t,3),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-8388608&&r<=8388607),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeIntLE(r,s,3),s-t+this.len}},t.INT24_BE={len:3,get:(e,t)=>e.readIntBE(t,3),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-8388608&&r<=8388607),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeIntBE(r,s,3),s-t+this.len}},t.INT32_BE={len:4,get:(e,t)=>e.readInt32BE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-2147483648&&r<=2147483647),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeInt32BE(r,s),s-t+this.len}},t.INT32_LE={len:4,get:(e,t)=>e.readInt32LE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-2147483648&&r<=2147483647),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeInt32LE(r,s),s-t+this.len}},t.UINT64_LE={len:8,get(e,t){return function(e,t,r){r>>>=0;let n=e[t>>>=0],i=1,a=0;for(;++a>>=0;let i=1,a=0;e[r>>>=0]=255&t;for(;++a>>=0;let n=e[t>>>=0],i=1,a=0;for(;++a=(i*=128)&&(n-=Math.pow(2,8*r));return n}(e,t,this.len)},put(e,t,r){return s(e,r,t,this.len)}},t.UINT64_BE={len:8,get(e,t){return o(e,t,this.len)},put(e,t,r){return c(e,r,t,this.len)}},t.INT64_BE={len:8,get(e,t){return u(e,t,this.len)},put(e,t,r){return l(e,r,t,this.len)}};t.IgnoreType=class{constructor(e){this.len=e}get(e,t){return null}};t.BufferType=class{constructor(e){this.len=e}get(e,t){return e.slice(t,t+this.len)}};t.StringType=class{constructor(e,t){this.len=e,this.encoding=t}get(e,t){return e.toString(this.encoding,t,t+this.len)}};class a{constructor(e){this.len=e}static decode(e,t,r){let n="";for(let i=t;i>10),56320+(1023&e)))}static singleByteDecoder(e){if(a.inRange(e,0,127))return e;const t=a.windows1252[e-128];if(null===t)throw Error("invaliding encoding");return t}get(e,t=0){return a.decode(e,t,t+this.len)}}function s(e,t,r,n){t=+t;let i=0,a=1,s=0;for(e[r>>>=0]=255&t;++i>0)-s&255;return r+n}function o(e,t,r){r>>>=0;let n=e[(t>>>=0)+--r],i=1;for(;r>0&&(i*=256);)n+=e[t+--r]*i;return n}function c(e,t,r,n){t=+t;let i=(n>>>=0)-1,a=1;for(e[(r>>>=0)+i]=255&t;--i>=0&&(a*=256);)e[r+i]=t/a&255;return r+n}function u(e,t,r){let n=r>>>=0,i=1,a=e[(t>>>=0)+--n];for(;n>0&&(i*=256);)a+=e[t+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*r)),a}function l(e,t,r,n){t=+t;let i=n-1,a=1,s=0;for(e[(r>>>=0)+i]=255&t;--i>=0&&(a*=256);)t<0&&0===s&&0!==e[r+i+1]&&(s=1),e[r+i]=(t/a>>0)-s&255;return r+n}a.windows1252=[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],t.AnsiStringType=a,t.writeIntLE=s,t.readUIntBE=o,t.writeUIntBE=c,t.readIntBE=u,t.writeIntBE=l},,,,,function(e,t,r){(function(n){t.log=function(...e){return"object"==typeof console&&console.log&&console.log(...e)},t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const r="color: "+this.color;t.splice(1,0,r,"color: inherit");let n=0,i=0;t[0].replace(/%[a-zA-Z%]/g,e=>{"%%"!==e&&(n++,"%c"===e&&(i=n))}),t.splice(i,0,r)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&void 0!==n&&"env"in n&&(e=n.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],e.exports=r(515)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}).call(this,r(38))},,function(e,t,r){"use strict";(function(e){var n=r(493),i=r(494),a=r(154);function s(){return c.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function o(e,t){if(s()=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|e}function h(e,t){if(c.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return j(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return q(e).length;default:if(n)return j(e).length;t=(""+t).toLowerCase(),n=!0}}function m(e,t,r){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return x(this,t,r);case"utf8":case"utf-8":return E(this,t,r);case"ascii":return F(this,t,r);case"latin1":case"binary":return A(this,t,r);case"base64":return C(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function g(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function b(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof t&&(t=c.from(t,n)),c.isBuffer(t))return 0===t.length?-1:y(e,t,r,n,i);if("number"==typeof t)return t&=255,c.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):y(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function y(e,t,r,n,i){var a,s=1,o=e.length,c=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;s=2,o/=2,c/=2,r/=2}function u(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(i){var l=-1;for(a=r;ao&&(r=o-c),a=r;a>=0;a--){for(var d=!0,f=0;fi&&(n=i):n=i;var a=t.length;if(a%2!=0)throw new TypeError("Invalid hex string");n>a/2&&(n=a/2);for(var s=0;s>8,i=r%256,a.push(i),a.push(n);return a}(t,e.length-r),e,r,n)}function C(e,t,r){return 0===t&&r===e.length?n.fromByteArray(e):n.fromByteArray(e.slice(t,r))}function E(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;i239?4:u>223?3:u>191?2:1;if(i+d<=r)switch(d){case 1:u<128&&(l=u);break;case 2:128==(192&(a=e[i+1]))&&(c=(31&u)<<6|63&a)>127&&(l=c);break;case 3:a=e[i+1],s=e[i+2],128==(192&a)&&128==(192&s)&&(c=(15&u)<<12|(63&a)<<6|63&s)>2047&&(c<55296||c>57343)&&(l=c);break;case 4:a=e[i+1],s=e[i+2],o=e[i+3],128==(192&a)&&128==(192&s)&&128==(192&o)&&(c=(15&u)<<18|(63&a)<<12|(63&s)<<6|63&o)>65535&&c<1114112&&(l=c)}null===l?(l=65533,d=1):l>65535&&(l-=65536,n.push(l>>>10&1023|55296),l=56320|1023&l),n.push(l),i+=d}return function(e){var t=e.length;if(t<=_)return String.fromCharCode.apply(String,e);var r="",n=0;for(;n0&&(e=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(e+=" ... ")),""},c.prototype.compare=function(e,t,r,n,i){if(!c.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),t<0||r>e.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(this===e)return 0;for(var a=(i>>>=0)-(n>>>=0),s=(r>>>=0)-(t>>>=0),o=Math.min(a,s),u=this.slice(n,i),l=e.slice(t,r),d=0;di)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var a=!1;;)switch(n){case"hex":return w(this,e,t,r);case"utf8":case"utf-8":return T(this,e,t,r);case"ascii":return v(this,e,t,r);case"latin1":case"binary":return I(this,e,t,r);case"base64":return k(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,r);default:if(a)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),a=!0}},c.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var _=4096;function F(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;in)&&(r=n);for(var i="",a=t;ar)throw new RangeError("Trying to access beyond buffer length")}function M(e,t,r,n,i,a){if(!c.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}function D(e,t,r,n){t<0&&(t=65535+t+1);for(var i=0,a=Math.min(e.length-r,2);i>>8*(n?i:1-i)}function O(e,t,r,n){t<0&&(t=4294967295+t+1);for(var i=0,a=Math.min(e.length-r,4);i>>8*(n?i:3-i)&255}function R(e,t,r,n,i,a){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function U(e,t,r,n,a){return a||R(e,0,r,4),i.write(e,t,r,n,23,4),r+4}function L(e,t,r,n,a){return a||R(e,0,r,8),i.write(e,t,r,n,52,8),r+8}c.prototype.slice=function(e,t){var r,n=this.length;if((e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t0&&(i*=256);)n+=this[e+--t]*i;return n},c.prototype.readUInt8=function(e,t){return t||B(e,1,this.length),this[e]},c.prototype.readUInt16LE=function(e,t){return t||B(e,2,this.length),this[e]|this[e+1]<<8},c.prototype.readUInt16BE=function(e,t){return t||B(e,2,this.length),this[e]<<8|this[e+1]},c.prototype.readUInt32LE=function(e,t){return t||B(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},c.prototype.readUInt32BE=function(e,t){return t||B(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},c.prototype.readIntLE=function(e,t,r){e|=0,t|=0,r||B(e,t,this.length);for(var n=this[e],i=1,a=0;++a=(i*=128)&&(n-=Math.pow(2,8*t)),n},c.prototype.readIntBE=function(e,t,r){e|=0,t|=0,r||B(e,t,this.length);for(var n=t,i=1,a=this[e+--n];n>0&&(i*=256);)a+=this[e+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*t)),a},c.prototype.readInt8=function(e,t){return t||B(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},c.prototype.readInt16LE=function(e,t){t||B(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},c.prototype.readInt16BE=function(e,t){t||B(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},c.prototype.readInt32LE=function(e,t){return t||B(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},c.prototype.readInt32BE=function(e,t){return t||B(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},c.prototype.readFloatLE=function(e,t){return t||B(e,4,this.length),i.read(this,e,!0,23,4)},c.prototype.readFloatBE=function(e,t){return t||B(e,4,this.length),i.read(this,e,!1,23,4)},c.prototype.readDoubleLE=function(e,t){return t||B(e,8,this.length),i.read(this,e,!0,52,8)},c.prototype.readDoubleBE=function(e,t){return t||B(e,8,this.length),i.read(this,e,!1,52,8)},c.prototype.writeUIntLE=function(e,t,r,n){(e=+e,t|=0,r|=0,n)||M(this,e,t,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[t]=255&e;++a=0&&(a*=256);)this[t+i]=e/a&255;return t+r},c.prototype.writeUInt8=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,1,255,0),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},c.prototype.writeUInt16LE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):D(this,e,t,!0),t+2},c.prototype.writeUInt16BE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):D(this,e,t,!1),t+2},c.prototype.writeUInt32LE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):O(this,e,t,!0),t+4},c.prototype.writeUInt32BE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):O(this,e,t,!1),t+4},c.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);M(this,e,t,r,i-1,-i)}var a=0,s=1,o=0;for(this[t]=255&e;++a>0)-o&255;return t+r},c.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);M(this,e,t,r,i-1,-i)}var a=r-1,s=1,o=0;for(this[t+a]=255&e;--a>=0&&(s*=256);)e<0&&0===o&&0!==this[t+a+1]&&(o=1),this[t+a]=(e/s>>0)-o&255;return t+r},c.prototype.writeInt8=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,1,127,-128),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},c.prototype.writeInt16LE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):D(this,e,t,!0),t+2},c.prototype.writeInt16BE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):D(this,e,t,!1),t+2},c.prototype.writeInt32LE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,4,2147483647,-2147483648),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):O(this,e,t,!0),t+4},c.prototype.writeInt32BE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):O(this,e,t,!1),t+4},c.prototype.writeFloatLE=function(e,t,r){return U(this,e,t,!0,r)},c.prototype.writeFloatBE=function(e,t,r){return U(this,e,t,!1,r)},c.prototype.writeDoubleLE=function(e,t,r){return L(this,e,t,!0,r)},c.prototype.writeDoubleBE=function(e,t,r){return L(this,e,t,!1,r)},c.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t=0;--i)e[i+t]=this[i+r];else if(a<1e3||!c.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(a=t;a55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(s+1===n){(t-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;a.push(r)}else if(r<2048){if((t-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function q(e){return n.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(z,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function H(e,t,r,n){for(var i=0;i=t.length||i>=e.length);++i)t[i+r]=e[i];return i}}).call(this,r(24))},,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(19),i=r(521);class a{static findZero(e,t,r,n){let i=t;if("utf16"===n){for(;0!==e[i]||0!==e[i+1];){if(i>=r)return r;i+=2}return i}for(;0!==e[i];){if(i>=r)return r;i++}return i}static trimRightNull(e){const t=e.indexOf("\0");return-1===t?e:e.substr(0,t)}static swapBytes(e){const t=e.length;n.ok(0==(1&t),"Buffer length must be even");for(let r=0;r>i;const o=8-i,c=n-o;return c<0?s>>=8-i-n:c>0&&(s<<=c,s|=a.getBitAllignedNumber(e,t,r+o,c)),s}static isBitSet(e,t,r){return 1===a.getBitAllignedNumber(e,t,r,1)}static a2hex(e){const t=[];for(let r=0,n=e.length;r0!=(e[t]&1<e.trim().toLowerCase());if(t.length>=1){const e=parseFloat(t[0]);return 2===t.length&&"db"===t[1]?{dB:e,ratio:o(e)}:{dB:s(e),ratio:e}}}},,function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(14),i=/^[\w-©][\w-\x000-3]/;t.FourCcToken={len:4,get:(e,r)=>{const a=e.toString("binary",r,r+t.FourCcToken.len);if(!a.match(i))throw new Error(`FourCC contains invalid characters: ${n.default.a2hex(a)}`);return a},put:(t,r,n)=>{const i=e.from(n,"binary");if(4!==i.length)throw new Error("Invalid length");return i.copy(t,r)}}}).call(this,r(9).Buffer)},,,function(e,t,r){"use strict";(function(t){var n=r(502);function i(e,t){if(e===t)return 0;for(var r=e.length,n=t.length,i=0,a=Math.min(r,n);i=0;u--)if(l[u]!==d[u])return!1;for(u=l.length-1;u>=0;u--)if(o=l[u],!w(e[o],t[o],r,n))return!1;return!0}(e,t,r,n))}return r?e===t:e==t}function T(e){return"[object Arguments]"==Object.prototype.toString.call(e)}function v(e,t){if(!e||!t)return!1;if("[object RegExp]"==Object.prototype.toString.call(t))return t.test(e);try{if(e instanceof t)return!0}catch(e){}return!Error.isPrototypeOf(t)&&!0===t.call({},e)}function I(e,t,r,n){var i;if("function"!=typeof t)throw new TypeError('"block" argument must be a function');"string"==typeof r&&(n=r,r=null),i=function(e){var t;try{e()}catch(e){t=e}return t}(t),n=(r&&r.name?" ("+r.name+").":".")+(n?" "+n:"."),e&&!i&&b(i,r,"Missing expected exception"+n);var a="string"==typeof n,o=!e&&i&&!r;if((!e&&s.isError(i)&&a&&v(i,r)||o)&&b(i,r,"Got unwanted exception"+n),e&&i&&r&&!v(i,r)||!e&&i)throw i}f.AssertionError=function(e){this.name="AssertionError",this.actual=e.actual,this.expected=e.expected,this.operator=e.operator,e.message?(this.message=e.message,this.generatedMessage=!1):(this.message=function(e){return m(g(e.actual),128)+" "+e.operator+" "+m(g(e.expected),128)}(this),this.generatedMessage=!0);var t=e.stackStartFunction||b;if(Error.captureStackTrace)Error.captureStackTrace(this,t);else{var r=new Error;if(r.stack){var n=r.stack,i=h(t),a=n.indexOf("\n"+i);if(a>=0){var s=n.indexOf("\n",a+1);n=n.substring(s+1)}this.stack=n}}},s.inherits(f.AssertionError,Error),f.fail=b,f.ok=y,f.equal=function(e,t,r){e!=t&&b(e,t,r,"==",f.equal)},f.notEqual=function(e,t,r){e==t&&b(e,t,r,"!=",f.notEqual)},f.deepEqual=function(e,t,r){w(e,t,!1)||b(e,t,r,"deepEqual",f.deepEqual)},f.deepStrictEqual=function(e,t,r){w(e,t,!0)||b(e,t,r,"deepStrictEqual",f.deepStrictEqual)},f.notDeepEqual=function(e,t,r){w(e,t,!1)&&b(e,t,r,"notDeepEqual",f.notDeepEqual)},f.notDeepStrictEqual=function e(t,r,n){w(t,r,!0)&&b(t,r,n,"notDeepStrictEqual",e)},f.strictEqual=function(e,t,r){e!==t&&b(e,t,r,"===",f.strictEqual)},f.notStrictEqual=function(e,t,r){e===t&&b(e,t,r,"!==",f.notStrictEqual)},f.throws=function(e,t,r){I(!0,e,t,r)},f.doesNotThrow=function(e,t,r){I(!1,e,t,r)},f.ifError=function(e){if(e)throw e},f.strict=n(function e(t,r){t||b(t,!0,r,"==",e)},f,{equal:f.strictEqual,deepEqual:f.deepStrictEqual,notEqual:f.notStrictEqual,notDeepEqual:f.notDeepStrictEqual}),f.strict.strict=f.strict;var k=Object.keys||function(e){var t=[];for(var r in e)o.call(e,r)&&t.push(r);return t}}).call(this,r(24))},,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.BasicParser=class{constructor(){this.warnings=[]}init(e,t,r){return this.metadata=e,this.tokenizer=t,this.options=r,this}}},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},,,,,,,,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(112);class i{constructor(e,t){this.tagTypes=e,this.tagMap=t}static parseGenre(e){const t=e.trim().split(/\((.*?)\)/g).filter(e=>""!==e),r=[];for(let e of t)/^\d+$/.test(e)&&!isNaN(parseInt(e,10))&&(e=n.Genres[e]),r.push(e);return r.filter(e=>void 0!==e).join("/")}static fixPictureMimeType(e){switch(e=e.toLocaleLowerCase()){case"image/jpg":return"image/jpeg"}return e}static toIntOrNull(e){const t=parseInt(e,10);return isNaN(t)?null:t}static normalizeTrack(e){const t=e.toString().split("/");return{no:parseInt(t[0],10)||null,of:parseInt(t[1],10)||null}}mapGenericTag(e){e={id:e.id,value:e.value},this.postMap(e);const t=this.getCommonName(e.id);return t?{id:t,value:e.value}:null}getCommonName(e){return this.tagMap[e]}postMap(e){}}i.maxRatingScore=1,t.CommonTagMapper=i},,,function(e,t){var r,n,i=e.exports={};function a(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function o(e){if(r===setTimeout)return setTimeout(e,0);if((r===a||!r)&&setTimeout)return r=setTimeout,setTimeout(e,0);try{return r(e,0)}catch(t){try{return r.call(null,e,0)}catch(t){return r.call(this,e,0)}}}!function(){try{r="function"==typeof setTimeout?setTimeout:a}catch(e){r=a}try{n="function"==typeof clearTimeout?clearTimeout:s}catch(e){n=s}}();var c,u=[],l=!1,d=-1;function f(){l&&c&&(l=!1,c.length?u=c.concat(u):d=-1,u.length&&p())}function p(){if(!l){var e=o(f);l=!0;for(var t=u.length;t;){for(c=u,u=[];++d1)for(var r=1;r0?this.parseExtendedHeaderData(t,e.size):this.parseId3Data(this.id3Header.size-e.size)}async parseExtendedHeaderData(t,r){const n=e.alloc(t);return await this.tokenizer.readBuffer(n,0,t),this.parseId3Data(this.id3Header.size-r)}async parseId3Data(t){const r=e.alloc(t);await this.tokenizer.readBuffer(r,0,t);for(const e of this.parseMetadata(r))if("TXXX"===e.id)for(const t of e.value.text)this.addTag(o.makeDescriptionTagName(e.id,e.value.description),t);else if("COM"===e.id)for(const t of e.value)this.addTag(o.makeDescriptionTagName(e.id,t.description),t.text);else if(Array.isArray(e.value))for(const t of e.value)this.addTag(e.id,t);else this.addTag(e.id,e.value)}addTag(e,t){this.metadata.addTag(this.headerType,e,t)}parseMetadata(e){let t=0;const r=[];for(;t!==e.length;){const n=o.getFrameHeaderLength(this.id3Header.version.major);if(t+n>e.length)break;const i=e.slice(t,t+=n),a=o.readFrameHeader(i,this.id3Header.version.major);if(""===a.id||"\0\0\0\0"===a.id||-1==="ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(a.id[0]))break;const s=e.slice(t,t+=a.length),c=o.readFrameData(s,a,this.id3Header.version.major,!this.options.skipCovers);r.push({id:a.id,value:c})}return r}}t.ID3v2Parser=o}).call(this,r(9).Buffer)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(14);!function(e){e[e.Other=0]="Other",e[e["32x32 pixels 'file icon' (PNG only)"]=1]="32x32 pixels 'file icon' (PNG only)",e[e["Other file icon"]=2]="Other file icon",e[e["Cover (front)"]=3]="Cover (front)",e[e["Cover (back)"]=4]="Cover (back)",e[e["Leaflet page"]=5]="Leaflet page",e[e["Media (e.g. label side of CD)"]=6]="Media (e.g. label side of CD)",e[e["Lead artist/lead performer/soloist"]=7]="Lead artist/lead performer/soloist",e[e["Artist/performer"]=8]="Artist/performer",e[e.Conductor=9]="Conductor",e[e["Band/Orchestra"]=10]="Band/Orchestra",e[e.Composer=11]="Composer",e[e["Lyricist/text writer"]=12]="Lyricist/text writer",e[e["Recording Location"]=13]="Recording Location",e[e["During recording"]=14]="During recording",e[e["During performance"]=15]="During performance",e[e["Movie/video screen capture"]=16]="Movie/video screen capture",e[e["A bright coloured fish"]=17]="A bright coloured fish",e[e.Illustration=18]="Illustration",e[e["Band/artist logotype"]=19]="Band/artist logotype",e[e["Publisher/Studio logotype"]=20]="Publisher/Studio logotype"}(t.AttachedPictureType||(t.AttachedPictureType={})),t.UINT32SYNCSAFE={get:(e,t)=>127&e[t+3]|e[t+2]<<7|e[t+1]<<14|e[t]<<21,len:4},t.ID3v2Header={len:10,get:(e,r)=>({fileIdentifier:new n.StringType(3,"ascii").get(e,r),version:{major:n.INT8.get(e,r+3),revision:n.INT8.get(e,r+4)},flags:{raw:n.INT8.get(e,r+4),unsynchronisation:i.default.strtokBITSET.get(e,r+5,7),isExtendedHeader:i.default.strtokBITSET.get(e,r+5,6),expIndicator:i.default.strtokBITSET.get(e,r+5,5),footer:i.default.strtokBITSET.get(e,r+5,4)},size:t.UINT32SYNCSAFE.get(e,r+6)})},t.ExtendedHeader={len:10,get:(e,t)=>({size:n.UINT32_BE.get(e,t),extendedFlags:n.UINT16_BE.get(e,t+4),sizeOfPadding:n.UINT32_BE.get(e,t+6),crcDataPresent:i.default.strtokBITSET.get(e,t+4,31)})},t.TextEncodingToken={len:1,get:(e,t)=>{switch(e.readUInt8(t)){case 0:return{encoding:"iso-8859-1"};case 1:return{encoding:"utf16",bom:!0};case 2:return{encoding:"utf16",bom:!1};case 3:default:return{encoding:"utf8",bom:!1}}}}},function(e,t,r){(function(e){function r(e){return Object.prototype.toString.call(e)}t.isArray=function(e){return Array.isArray?Array.isArray(e):"[object Array]"===r(e)},t.isBoolean=function(e){return"boolean"==typeof e},t.isNull=function(e){return null===e},t.isNullOrUndefined=function(e){return null==e},t.isNumber=function(e){return"number"==typeof e},t.isString=function(e){return"string"==typeof e},t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=function(e){return void 0===e},t.isRegExp=function(e){return"[object RegExp]"===r(e)},t.isObject=function(e){return"object"==typeof e&&null!==e},t.isDate=function(e){return"[object Date]"===r(e)},t.isError=function(e){return"[object Error]"===r(e)||e instanceof Error},t.isFunction=function(e){return"function"==typeof e},t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=e.isBuffer}).call(this,r(9).Buffer)},,,,,,,,,,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(499),i=r(509);t.fromStream=function(e,t){return new n.ReadStreamTokenizer(e,t)},t.fromBuffer=function(e){return new i.BufferTokenizer(e)}},function(e,t,r){"use strict";(function(t){void 0===t||!t.version||0===t.version.indexOf("v0.")||0===t.version.indexOf("v1.")&&0!==t.version.indexOf("v1.8.")?e.exports={nextTick:function(e,r,n,i){if("function"!=typeof e)throw new TypeError('"callback" argument must be a function');var a,s,o=arguments.length;switch(o){case 0:case 1:return t.nextTick(e);case 2:return t.nextTick(function(){e.call(null,r)});case 3:return t.nextTick(function(){e.call(null,r,n)});case 4:return t.nextTick(function(){e.call(null,r,n,i)});default:for(a=new Array(o-1),s=0;s1?e.blocksPerFrame*(e.totalFrames-1):0;return(t+=e.finalFrameBlocks)/e.sampleRate}static async parseTagHeader(t,r,n){if(r.fileSize&&r.fileSize-r.position0?this.parseDescriptorExpansion(t):this.parseHeader());return await this.tokenizer.readToken(new a.IgnoreType(r.forwardBytes)),p.parseTagHeader(this.metadata,this.tokenizer,this.options)}async parseDescriptorExpansion(e){return await this.tokenizer.readToken(new a.IgnoreType(e)),this.parseHeader()}async parseHeader(){const e=await this.tokenizer.readToken(u.Header);return this.metadata.setFormat("lossless",!0),this.metadata.setFormat("container","Monkey's Audio"),this.metadata.setFormat("bitsPerSample",e.bitsPerSample),this.metadata.setFormat("sampleRate",e.sampleRate),this.metadata.setFormat("numberOfChannels",e.channel),this.metadata.setFormat("duration",p.calculateDuration(e)),{forwardBytes:this.ape.descriptor.seekTableBytes+this.ape.descriptor.headerDataBytes+this.ape.descriptor.apeFrameDataBytes+this.ape.descriptor.terminatingDataBytes}}}t.APEv2Parser=p}).call(this,r(9).Buffer)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(39),i=r(65),a=r(64),s=r(112),o=r(7),c=r(23),u=o("music-metadata:parser:ID3");t.AbstractID3Parser=class extends c.BasicParser{constructor(){super(...arguments),this.id3parser=new a.ID3v2Parser}static async startsWithID3v2Header(e){return"ID3"===(await e.peekToken(i.ID3v2Header)).fileIdentifier}parse(){return this.parseID3v2().catch(e=>{if(e.message!==n.endOfFile)throw e})}finalize(){}async parseID3v2(){if(await this.tryReadId3v2Headers(),u("End of ID3v2 header, go to MPEG-parser: pos=%s",this.tokenizer.position),await this._parse(),this.options.skipPostHeaders&&this.metadata.hasAny())this.finalize();else{const e=new s.ID3v1Parser;await e.init(this.metadata,this.tokenizer,this.options).parse(),this.finalize()}}async tryReadId3v2Headers(){if("ID3"===(await this.tokenizer.peekToken(i.ID3v2Header)).fileIdentifier)return u("Found ID3v2 header, pos=%s",this.tokenizer.position),await this.id3parser.parse(this.metadata,this.tokenizer,this.options),this.tryReadId3v2Headers()}}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(7),i=r(14),a=r(2),s=r(23),o=n("music-metadata:parser:ID3v1");t.Genres=["Blues","Classic Rock","Country","Dance","Disco","Funk","Grunge","Hip-Hop","Jazz","Metal","New Age","Oldies","Other","Pop","R&B","Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska","Death Metal","Pranks","Soundtrack","Euro-Techno","Ambient","Trip-Hop","Vocal","Jazz+Funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound Clip","Gospel","Noise","Alt. Rock","Bass","Soul","Punk","Space","Meditative","Instrumental Pop","Instrumental Rock","Ethnic","Gothic","Darkwave","Techno-Industrial","Electronic","Pop-Folk","Eurodance","Dream","Southern Rock","Comedy","Cult","Gangsta Rap","Top 40","Christian Rap","Pop/Funk","Jungle","Native American","Cabaret","New Wave","Psychedelic","Rave","Showtunes","Trailer","Lo-Fi","Tribal","Acid Punk","Acid Jazz","Polka","Retro","Musical","Rock & Roll","Hard Rock","Folk","Folk/Rock","National Folk","Swing","Fast-Fusion","Bebob","Latin","Revival","Celtic","Bluegrass","Avantgarde","Gothic Rock","Progressive Rock","Psychedelic Rock","Symphonic Rock","Slow Rock","Big Band","Chorus","Easy Listening","Acoustic","Humour","Speech","Chanson","Opera","Chamber Music","Sonata","Symphony","Booty Bass","Primus","Porn Groove","Satire","Slow Jam","Club","Tango","Samba","Folklore","Ballad","Power Ballad","Rhythmic Soul","Freestyle","Duet","Punk Rock","Drum Solo","A Cappella","Euro-House","Dance Hall","Goa","Drum & Bass","Club-House","Hardcore","Terror","Indie","BritPop","Negerpunk","Polsk Punk","Beat","Christian Gangsta Rap","Heavy Metal","Black Metal","Crossover","Contemporary Christian","Christian Rock","Merengue","Salsa","Thrash Metal","Anime","JPop","Synthpop","Abstract","Art Rock","Baroque","Bhangra","Big Beat","Breakbeat","Chillout","Downtempo","Dub","EBM","Eclectic","Electro","Electroclash","Emo","Experimental","Garage","Global","IDM","Illbient","Industro-Goth","Jam Band","Krautrock","Leftfield","Lounge","Math Rock","New Romantic","Nu-Breakz","Post-Punk","Post-Rock","Psytrance","Shoegaze","Space Rock","Trop Rock","World Music","Neoclassical","Audiobook","Audio Theatre","Neue Deutsche Welle","Podcast","Indie Rock","G-Funk","Dubstep","Garage Rock","Psybient"];const c={len:128,get:(e,t)=>{const r=new u(3).get(e,t);return"TAG"===r?{header:r,title:new u(30).get(e,t+3),artist:new u(30).get(e,t+33),album:new u(30).get(e,t+63),year:new u(4).get(e,t+93),comment:new u(28).get(e,t+97),zeroByte:a.UINT8.get(e,t+127),track:a.UINT8.get(e,t+126),genre:a.UINT8.get(e,t+127)}:null}};class u extends a.StringType{constructor(e){super(e,"binary")}get(e,t){let r=super.get(e,t);return(r=(r=i.default.trimRightNull(r)).trim()).length>0?r:void 0}}class l extends s.BasicParser{static getGenre(e){if(ee)return void o("Already consumed the last 128 bytes");const t=await this.tokenizer.readToken(c,e);if(t){o("ID3v1 header found at: pos=%s",this.tokenizer.fileSize-c.len);for(const e of["title","artist","album","comment","track","year"])t[e]&&""!==t[e]&&this.addTag(e,t[e]);const e=l.getGenre(t.genre);e&&this.addTag("genre",e)}else o("ID3v1 header not found at: pos=%s",this.tokenizer.fileSize-c.len)}addTag(e,t){this.metadata.addTag("ID3v1",e,t)}}t.ID3v1Parser=l},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(156);t.ID3Stream=class extends n.Readable{constructor(e){super(),this.buf=e}_read(){this.push(this.buf),this.push(null)}}},function(e,t,r){"use strict";var n,i="object"==typeof Reflect?Reflect:null,a=i&&"function"==typeof i.apply?i.apply:function(e,t,r){return Function.prototype.apply.call(e,t,r)};n=i&&"function"==typeof i.ownKeys?i.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function o(){o.init.call(this)}e.exports=o,o.EventEmitter=o,o.prototype._events=void 0,o.prototype._eventsCount=0,o.prototype._maxListeners=void 0;var c=10;function u(e){return void 0===e._maxListeners?o.defaultMaxListeners:e._maxListeners}function l(e,t,r,n){var i,a,s,o;if("function"!=typeof r)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof r);if(void 0===(a=e._events)?(a=e._events=Object.create(null),e._eventsCount=0):(void 0!==a.newListener&&(e.emit("newListener",t,r.listener?r.listener:r),a=e._events),s=a[t]),void 0===s)s=a[t]=r,++e._eventsCount;else if("function"==typeof s?s=a[t]=n?[r,s]:[s,r]:n?s.unshift(r):s.push(r),(i=u(e))>0&&s.length>i&&!s.warned){s.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=s.length,o=c,console&&console.warn&&console.warn(o)}return e}function d(e,t,r){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:r},i=function(){for(var e=[],t=0;t0&&(s=t[0]),s instanceof Error)throw s;var o=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw o.context=s,o}var c=i[e];if(void 0===c)return!1;if("function"==typeof c)a(c,this,t);else{var u=c.length,l=h(c,u);for(r=0;r=0;a--)if(r[a]===t||r[a].listener===t){s=r[a].listener,i=a;break}if(i<0)return this;0===i?r.shift():function(e,t){for(;t+1=0;n--)this.removeListener(e,t[n]);return this},o.prototype.listeners=function(e){return f(this,e,!0)},o.prototype.rawListeners=function(e){return f(this,e,!1)},o.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},o.prototype.listenerCount=p,o.prototype.eventNames=function(){return this._eventsCount>0?n(this._events):[]}},function(e,t,r){(t=e.exports=r(157)).Stream=t,t.Readable=t,t.Writable=r(117),t.Duplex=r(50),t.Transform=r(161),t.PassThrough=r(540)},function(e,t,r){var n=r(9),i=n.Buffer;function a(e,t){for(var r in e)t[r]=e[r]}function s(e,t,r){return i(e,t,r)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=n:(a(n,t),t.Buffer=s),a(i,s),s.from=function(e,t,r){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,r)},s.alloc=function(e,t,r){if("number"!=typeof e)throw new TypeError("Argument must be a number");var n=i(e);return void 0!==t?"string"==typeof r?n.fill(t,r):n.fill(t):n.fill(0),n},s.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},s.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return n.SlowBuffer(e)}},function(e,t,r){"use strict";(function(t,n,i){var a=r(80);function s(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,r){var n=e.entry;e.entry=null;for(;n;){var i=n.callback;t.pendingcb--,i(r),n=n.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}(t,e)}}e.exports=y;var o,c=!t.browser&&["v0.10","v0.9."].indexOf(t.version.slice(0,5))>-1?n:a.nextTick;y.WritableState=b;var u=r(66);u.inherits=r(59);var l={deprecate:r(538)},d=r(158),f=r(116).Buffer,p=i.Uint8Array||function(){};var h,m=r(159);function g(){}function b(e,t){o=o||r(50),e=e||{};var n=t instanceof o;this.objectMode=!!e.objectMode,n&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var i=e.highWaterMark,u=e.writableHighWaterMark,l=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(u||0===u)?u:l,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var d=!1===e.decodeStrings;this.decodeStrings=!d,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var r=e._writableState,n=r.sync,i=r.writecb;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(r),t)!function(e,t,r,n,i){--t.pendingcb,r?(a.nextTick(i,n),a.nextTick(S,e,t),e._writableState.errorEmitted=!0,e.emit("error",n)):(i(n),e._writableState.errorEmitted=!0,e.emit("error",n),S(e,t))}(e,r,n,t,i);else{var s=I(r);s||r.corked||r.bufferProcessing||!r.bufferedRequest||v(e,r),n?c(T,e,r,s,i):T(e,r,s,i)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new s(this)}function y(e){if(o=o||r(50),!(h.call(y,this)||this instanceof o))return new y(e);this._writableState=new b(e,this),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev),"function"==typeof e.destroy&&(this._destroy=e.destroy),"function"==typeof e.final&&(this._final=e.final)),d.call(this)}function w(e,t,r,n,i,a,s){t.writelen=n,t.writecb=s,t.writing=!0,t.sync=!0,r?e._writev(i,t.onwrite):e._write(i,a,t.onwrite),t.sync=!1}function T(e,t,r,n){r||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit("drain"))}(e,t),t.pendingcb--,n(),S(e,t)}function v(e,t){t.bufferProcessing=!0;var r=t.bufferedRequest;if(e._writev&&r&&r.next){var n=t.bufferedRequestCount,i=new Array(n),a=t.corkedRequestsFree;a.entry=r;for(var o=0,c=!0;r;)i[o]=r,r.isBuf||(c=!1),r=r.next,o+=1;i.allBuffers=c,w(e,t,!0,t.length,i,"",a.finish),t.pendingcb++,t.lastBufferedRequest=null,a.next?(t.corkedRequestsFree=a.next,a.next=null):t.corkedRequestsFree=new s(t),t.bufferedRequestCount=0}else{for(;r;){var u=r.chunk,l=r.encoding,d=r.callback;if(w(e,t,!1,t.objectMode?1:u.length,u,l,d),r=r.next,t.bufferedRequestCount--,t.writing)break}null===r&&(t.lastBufferedRequest=null)}t.bufferedRequest=r,t.bufferProcessing=!1}function I(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function k(e,t){e._final(function(r){t.pendingcb--,r&&e.emit("error",r),t.prefinished=!0,e.emit("prefinish"),S(e,t)})}function S(e,t){var r=I(t);return r&&(!function(e,t){t.prefinished||t.finalCalled||("function"==typeof e._final?(t.pendingcb++,t.finalCalled=!0,a.nextTick(k,e,t)):(t.prefinished=!0,e.emit("prefinish")))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit("finish"))),r}u.inherits(y,d),b.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(b.prototype,"buffer",{get:l.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(e){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(h=Function.prototype[Symbol.hasInstance],Object.defineProperty(y,Symbol.hasInstance,{value:function(e){return!!h.call(this,e)||this===y&&(e&&e._writableState instanceof b)}})):h=function(e){return e instanceof this},y.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},y.prototype.write=function(e,t,r){var n,i=this._writableState,s=!1,o=!i.objectMode&&(n=e,f.isBuffer(n)||n instanceof p);return o&&!f.isBuffer(e)&&(e=function(e){return f.from(e)}(e)),"function"==typeof t&&(r=t,t=null),o?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=g),i.ended?function(e,t){var r=new Error("write after end");e.emit("error",r),a.nextTick(t,r)}(this,r):(o||function(e,t,r,n){var i=!0,s=!1;return null===r?s=new TypeError("May not write null values to stream"):"string"==typeof r||void 0===r||t.objectMode||(s=new TypeError("Invalid non-string/buffer chunk")),s&&(e.emit("error",s),a.nextTick(n,s),i=!1),i}(this,i,e,r))&&(i.pendingcb++,s=function(e,t,r,n,i,a){if(!r){var s=function(e,t,r){e.objectMode||!1===e.decodeStrings||"string"!=typeof t||(t=f.from(t,r));return t}(t,n,i);n!==s&&(r=!0,i="buffer",n=s)}var o=t.objectMode?1:n.length;t.length+=o;var c=t.length-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(y.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),y.prototype._write=function(e,t,r){r(new Error("_write() is not implemented"))},y.prototype._writev=null,y.prototype.end=function(e,t,r){var n=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!=e&&this.write(e,t),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||function(e,t,r){t.ending=!0,S(e,t),r&&(t.finished?a.nextTick(r):e.once("finish",r));t.ended=!0,e.writable=!1}(this,n,r)},Object.defineProperty(y.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),y.prototype.destroy=m.destroy,y.prototype._undestroy=m.undestroy,y.prototype._destroy=function(e,t){this.end(),t(e)}}).call(this,r(38),r(536).setImmediate,r(24))},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(7),a=r(163),s=i("music-metadata:parser:ogg:vorbis1");t.VorbisParser=class{constructor(e,t){this.metadata=e,this.options=t,this.codecName="Vorbis I",this.pageSegments=[]}parsePage(t,r){if(t.headerType.firstPage)this.parseFirstPage(t,r);else{if(t.headerType.continued){if(0===this.pageSegments.length)throw new Error("Cannot continue on previous page");this.pageSegments.push(r)}if(t.headerType.lastPage||!t.headerType.continued){if(this.pageSegments.length>0){const t=e.concat(this.pageSegments);this.parseFullPage(t)}this.pageSegments=t.headerType.lastPage?[]:[r]}}t.headerType.lastPage&&this.calculateDuration(t)}flush(){this.parseFullPage(e.concat(this.pageSegments))}parseFirstPage(e,t){this.metadata.setFormat("codec","Vorbis I"),s("Parse first page");const r=a.CommonHeader.get(t,0);if("vorbis"!==r.vorbis)throw new Error("Metadata does not look like Vorbis");if(1!==r.packetType)throw new Error("First Ogg page should be type 1: the identification header");{const e=a.IdentificationHeader.get(t,a.CommonHeader.len);this.metadata.setFormat("sampleRate",e.sampleRate),this.metadata.setFormat("bitrate",e.bitrateNominal),this.metadata.setFormat("numberOfChannels",e.channelMode),s("sample-rate=%s[hz], bitrate=%s[b/s], channel-mode=%s",e.sampleRate,e.bitrateNominal,e.channelMode)}}parseFullPage(e){const t=a.CommonHeader.get(e,0);switch(s("Parse full page: type=%s, byteLength=%s",t.packetType,e.byteLength),t.packetType){case 3:return this.parseUserCommentList(e,a.CommonHeader.len)}}calculateDuration(e){this.metadata.format.sampleRate&&e.absoluteGranulePosition>=0&&(this.metadata.setFormat("numberOfSamples",e.absoluteGranulePosition),this.metadata.setFormat("duration",this.metadata.format.numberOfSamples/this.metadata.format.sampleRate))}parseUserCommentList(e,t){const r=n.UINT32_LE.get(e,t);t+=4,new n.StringType(r,"utf-8").get(e,t),t+=r;let i=n.UINT32_LE.get(e,t);for(t+=4;i-- >0;)t+=this.parseUserComment(e,t)}parseUserComment(e,t){const r=n.UINT32_LE.get(e,t),i=new n.StringType(r,"utf-8").get(e,t+4),o=i.indexOf("="),c=i.slice(0,o).toUpperCase();let u=i.slice(o+1);return"METADATA_BLOCK_PICTURE"===c&&(u=this.options.skipCovers?null:a.VorbisPictureToken.fromBase64(u)),null!==u&&(s("Push tag: id=%s, value=%s",c,u),this.metadata.addTag("vorbis",c,u)),n.UINT32_LE.len+r}}}).call(this,r(9).Buffer)},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t){var r={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==r.call(e)}},function(module,exports,__webpack_require__){"use strict";(function(Buffer){const{multiByteIndexOf:multiByteIndexOf,stringToBytes:stringToBytes,readUInt64LE:readUInt64LE,tarHeaderChecksumMatches:tarHeaderChecksumMatches,uint8ArrayUtf8ByteString:uint8ArrayUtf8ByteString}=__webpack_require__(511),supported=__webpack_require__(512),xpiZipFilename=stringToBytes("META-INF/mozilla.rsa"),oxmlContentTypes=stringToBytes("[Content_Types].xml"),oxmlRels=stringToBytes("_rels/.rels"),fileType=e=>{if(!(e instanceof Uint8Array||e instanceof ArrayBuffer||Buffer.isBuffer(e)))throw new TypeError(`Expected the \`input\` argument to be of type \`Uint8Array\` or \`Buffer\` or \`ArrayBuffer\`, got \`${typeof e}\``);const t=e instanceof Uint8Array?e:new Uint8Array(e);if(!(t&&t.length>1))return;const r=(e,r)=>{r={offset:0,...r};for(let n=0;nr(stringToBytes(e),t);if(r([255,216,255]))return{ext:"jpg",mime:"image/jpeg"};if(r([137,80,78,71,13,10,26,10])){const e=33,r=t.findIndex((r,n)=>n>=e&&73===t[n]&&68===t[n+1]&&65===t[n+2]&&84===t[n+3]),n=t.subarray(e,r);return n.findIndex((e,t)=>97===n[t]&&99===n[t+1]&&84===n[t+2]&&76===n[t+3])>=0?{ext:"apng",mime:"image/apng"}:{ext:"png",mime:"image/png"}}if(r([71,73,70]))return{ext:"gif",mime:"image/gif"};if(r([87,69,66,80],{offset:8}))return{ext:"webp",mime:"image/webp"};if(r([70,76,73,70]))return{ext:"flif",mime:"image/flif"};if((r([73,73,42,0])||r([77,77,0,42]))&&r([67,82],{offset:8}))return{ext:"cr2",mime:"image/x-canon-cr2"};if(r([73,73,82,79,8,0,0,0,24]))return{ext:"orf",mime:"image/x-olympus-orf"};if(r([73,73,42,0])&&(r([16,251,134,1],{offset:4})||r([8,0,0,0,19,0],{offset:4})||r([8,0,0,0,18,0],{offset:4})))return{ext:"arw",mime:"image/x-sony-arw"};if(r([73,73,42,0,8,0,0,0])&&(r([45,0,254,0],{offset:8})||r([39,0,254,0],{offset:8})))return{ext:"dng",mime:"image/x-adobe-dng"};if(r([73,73,42,0])&&r([28,0,254,0],{offset:8}))return{ext:"nef",mime:"image/x-nikon-nef"};if(r([73,73,85,0,24,0,0,0,136,231,116,216]))return{ext:"rw2",mime:"image/x-panasonic-rw2"};if(n("FUJIFILMCCD-RAW"))return{ext:"raf",mime:"image/x-fujifilm-raf"};if(r([73,73,42,0])||r([77,77,0,42]))return{ext:"tif",mime:"image/tiff"};if(r([66,77]))return{ext:"bmp",mime:"image/bmp"};if(r([73,73,188]))return{ext:"jxr",mime:"image/vnd.ms-photo"};if(r([56,66,80,83]))return{ext:"psd",mime:"image/vnd.adobe.photoshop"};const i=[80,75,3,4];if(r(i)){if(r([109,105,109,101,116,121,112,101,97,112,112,108,105,99,97,116,105,111,110,47,101,112,117,98,43,122,105,112],{offset:30}))return{ext:"epub",mime:"application/epub+zip"};if(r(xpiZipFilename,{offset:30}))return{ext:"xpi",mime:"application/x-xpinstall"};if(n("mimetypeapplication/vnd.oasis.opendocument.text",{offset:30}))return{ext:"odt",mime:"application/vnd.oasis.opendocument.text"};if(n("mimetypeapplication/vnd.oasis.opendocument.spreadsheet",{offset:30}))return{ext:"ods",mime:"application/vnd.oasis.opendocument.spreadsheet"};if(n("mimetypeapplication/vnd.oasis.opendocument.presentation",{offset:30}))return{ext:"odp",mime:"application/vnd.oasis.opendocument.presentation"};let e,a=0,s=!1;do{const o=a+30;if(s||(s=r(oxmlContentTypes,{offset:o})||r(oxmlRels,{offset:o})),e||(n("word/",{offset:o})?e={ext:"docx",mime:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"}:n("ppt/",{offset:o})?e={ext:"pptx",mime:"application/vnd.openxmlformats-officedocument.presentationml.presentation"}:n("xl/",{offset:o})&&(e={ext:"xlsx",mime:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})),s&&e)return e;a=multiByteIndexOf(t,i,o)}while(a>=0);if(e)return e}if(r([80,75])&&(3===t[2]||5===t[2]||7===t[2])&&(4===t[3]||6===t[3]||8===t[3]))return{ext:"zip",mime:"application/zip"};if(r([48,48,48,48,48,48],{offset:148,mask:[248,248,248,248,248,248]})&&tarHeaderChecksumMatches(t))return{ext:"tar",mime:"application/x-tar"};if(r([82,97,114,33,26,7])&&(0===t[6]||1===t[6]))return{ext:"rar",mime:"application/x-rar-compressed"};if(r([31,139,8]))return{ext:"gz",mime:"application/gzip"};if(r([66,90,104]))return{ext:"bz2",mime:"application/x-bzip2"};if(r([55,122,188,175,39,28]))return{ext:"7z",mime:"application/x-7z-compressed"};if(r([120,1]))return{ext:"dmg",mime:"application/x-apple-diskimage"};if(r([102,114,101,101],{offset:4})||r([109,100,97,116],{offset:4})||r([109,111,111,118],{offset:4})||r([119,105,100,101],{offset:4}))return{ext:"mov",mime:"video/quicktime"};if(r([102,116,121,112],{offset:4})&&0!=(96&t[8])&&0!=(96&t[9])&&0!=(96&t[10])&&0!=(96&t[11])){const e=uint8ArrayUtf8ByteString(t,8,12);switch(e){case"mif1":return{ext:"heic",mime:"image/heif"};case"msf1":return{ext:"heic",mime:"image/heif-sequence"};case"heic":case"heix":return{ext:"heic",mime:"image/heic"};case"hevc":case"hevx":return{ext:"heic",mime:"image/heic-sequence"};case"qt ":return{ext:"mov",mime:"video/quicktime"};case"M4V ":case"M4VH":case"M4VP":return{ext:"m4v",mime:"video/x-m4v"};case"M4P ":return{ext:"m4p",mime:"video/mp4"};case"M4B ":return{ext:"m4b",mime:"audio/mp4"};case"M4A ":return{ext:"m4a",mime:"audio/x-m4a"};case"F4V ":return{ext:"f4v",mime:"video/mp4"};case"F4P ":return{ext:"f4p",mime:"video/mp4"};case"F4A ":return{ext:"f4a",mime:"audio/mp4"};case"F4B ":return{ext:"f4b",mime:"audio/mp4"};default:return e.startsWith("3g")?e.startsWith("3g2")?{ext:"3g2",mime:"video/3gpp2"}:{ext:"3gp",mime:"video/3gpp"}:{ext:"mp4",mime:"video/mp4"}}}if(r([77,84,104,100]))return{ext:"mid",mime:"audio/midi"};if(r([26,69,223,163])){const e=t.subarray(4,4100),r=e.findIndex((e,t,r)=>66===r[t]&&130===r[t+1]);if(-1!==r){const t=r+3,n=r=>[...r].every((r,n)=>e[t+n]===r.charCodeAt(0));if(n("matroska"))return{ext:"mkv",mime:"video/x-matroska"};if(n("webm"))return{ext:"webm",mime:"video/webm"}}}if(r([82,73,70,70])){if(r([65,86,73],{offset:8}))return{ext:"avi",mime:"video/vnd.avi"};if(r([87,65,86,69],{offset:8}))return{ext:"wav",mime:"audio/vnd.wave"};if(r([81,76,67,77],{offset:8}))return{ext:"qcp",mime:"audio/qcelp"}}if(r([48,38,178,117,142,102,207,17,166,217])){let e=30;do{const n=readUInt64LE(t,e+16);if(r([145,7,220,183,183,169,207,17,142,230,0,192,12,32,83,101],{offset:e})){if(r([64,158,105,248,77,91,207,17,168,253,0,128,95,92,68,43],{offset:e+24}))return{ext:"wma",mime:"audio/x-ms-wma"};if(r([192,239,25,188,77,91,207,17,168,253,0,128,95,92,68,43],{offset:e+24}))return{ext:"wmv",mime:"video/x-ms-asf"};break}e+=n}while(e+24<=t.length);return{ext:"asf",mime:"application/vnd.ms-asf"}}if(r([0,0,1,186])||r([0,0,1,179]))return{ext:"mpg",mime:"video/mpeg"};for(let e=0;e<2&&enew Promise((resolve,reject)=>{const stream=eval("require")("stream");readableStream.on("error",reject),readableStream.once("readable",()=>{const e=new stream.PassThrough,t=readableStream.read(module.exports.minimumBytes)||readableStream.read();try{e.fileType=fileType(t)}catch(e){reject(e)}readableStream.unshift(t),stream.pipeline?resolve(stream.pipeline(readableStream,e,()=>{})):resolve(readableStream.pipe(e))})}),Object.defineProperty(fileType,"extensions",{get:()=>new Set(supported.extensions)}),Object.defineProperty(fileType,"mimeTypes",{get:()=>new Set(supported.mimeTypes)})}).call(this,__webpack_require__(9).Buffer)},function(e,t,r){e.exports=i;var n=r(114).EventEmitter;function i(){n.call(this)}r(59)(i,n),i.Readable=r(115),i.Writable=r(541),i.Duplex=r(542),i.Transform=r(543),i.PassThrough=r(544),i.Stream=i,i.prototype.pipe=function(e,t){var r=this;function i(t){e.writable&&!1===e.write(t)&&r.pause&&r.pause()}function a(){r.readable&&r.resume&&r.resume()}r.on("data",i),e.on("drain",a),e._isStdio||t&&!1===t.end||(r.on("end",o),r.on("close",c));var s=!1;function o(){s||(s=!0,e.end())}function c(){s||(s=!0,"function"==typeof e.destroy&&e.destroy())}function u(e){if(l(),0===n.listenerCount(this,"error"))throw e}function l(){r.removeListener("data",i),e.removeListener("drain",a),r.removeListener("end",o),r.removeListener("close",c),r.removeListener("error",u),e.removeListener("error",u),r.removeListener("end",l),r.removeListener("close",l),e.removeListener("close",l)}return r.on("error",u),e.on("error",u),r.on("end",l),r.on("close",l),e.on("close",l),e.emit("pipe",r),e}},function(e,t,r){"use strict";(function(t,n){var i=r(80);e.exports=w;var a,s=r(154);w.ReadableState=y;r(114).EventEmitter;var o=function(e,t){return e.listeners(t).length},c=r(158),u=r(116).Buffer,l=t.Uint8Array||function(){};var d=r(66);d.inherits=r(59);var f=r(533),p=void 0;p=f&&f.debuglog?f.debuglog("stream"):function(){};var h,m=r(534),g=r(159);d.inherits(w,c);var b=["error","close","destroy","pause","resume"];function y(e,t){e=e||{};var n=t instanceof(a=a||r(50));this.objectMode=!!e.objectMode,n&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var i=e.highWaterMark,s=e.readableHighWaterMark,o=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(s||0===s)?s:o,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new m,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(h||(h=r(160).StringDecoder),this.decoder=new h(e.encoding),this.encoding=e.encoding)}function w(e){if(a=a||r(50),!(this instanceof w))return new w(e);this._readableState=new y(e,this),this.readable=!0,e&&("function"==typeof e.read&&(this._read=e.read),"function"==typeof e.destroy&&(this._destroy=e.destroy)),c.call(this)}function T(e,t,r,n,i){var a,s=e._readableState;null===t?(s.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,S(e)}(e,s)):(i||(a=function(e,t){var r;n=t,u.isBuffer(n)||n instanceof l||"string"==typeof t||void 0===t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk"));var n;return r}(s,t)),a?e.emit("error",a):s.objectMode||t&&t.length>0?("string"==typeof t||s.objectMode||Object.getPrototypeOf(t)===u.prototype||(t=function(e){return u.from(e)}(t)),n?s.endEmitted?e.emit("error",new Error("stream.unshift() after end event")):v(e,s,t,!0):s.ended?e.emit("error",new Error("stream.push() after EOF")):(s.reading=!1,s.decoder&&!r?(t=s.decoder.write(t),s.objectMode||0!==t.length?v(e,s,t,!1):E(e,s)):v(e,s,t,!1))):n||(s.reading=!1));return function(e){return!e.ended&&(e.needReadable||e.lengtht.highWaterMark&&(t.highWaterMark=function(e){return e>=I?e=I:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function S(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(p("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?i.nextTick(C,e):C(e))}function C(e){p("emit readable"),e.emit("readable"),x(e)}function E(e,t){t.readingMore||(t.readingMore=!0,i.nextTick(_,e,t))}function _(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=t.length?(r=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):r=function(e,t,r){var n;ea.length?a.length:e;if(s===a.length?i+=a:i+=a.slice(0,e),0===(e-=s)){s===a.length?(++n,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=a.slice(s));break}++n}return t.length-=n,i}(e,t):function(e,t){var r=u.allocUnsafe(e),n=t.head,i=1;n.data.copy(r),e-=n.data.length;for(;n=n.next;){var a=n.data,s=e>a.length?a.length:e;if(a.copy(r,r.length-e,0,s),0===(e-=s)){s===a.length?(++i,n.next?t.head=n.next:t.head=t.tail=null):(t.head=n,n.data=a.slice(s));break}++i}return t.length-=i,r}(e,t);return n}(e,t.buffer,t.decoder),r);var r}function B(e){var t=e._readableState;if(t.length>0)throw new Error('"endReadable()" called on non-empty stream');t.endEmitted||(t.ended=!0,i.nextTick(M,t,e))}function M(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function D(e,t){for(var r=0,n=e.length;r=t.highWaterMark||t.ended))return p("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?B(this):S(this),null;if(0===(e=k(e,t))&&t.ended)return 0===t.length&&B(this),null;var n,i=t.needReadable;return p("need readable",i),(0===t.length||t.length-e0?P(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&&B(this)),null!==n&&this.emit("data",n),n},w.prototype._read=function(e){this.emit("error",new Error("_read() is not implemented"))},w.prototype.pipe=function(e,t){var r=this,a=this._readableState;switch(a.pipesCount){case 0:a.pipes=e;break;case 1:a.pipes=[a.pipes,e];break;default:a.pipes.push(e)}a.pipesCount+=1,p("pipe count=%d opts=%j",a.pipesCount,t);var c=(!t||!1!==t.end)&&e!==n.stdout&&e!==n.stderr?l:w;function u(t,n){p("onunpipe"),t===r&&n&&!1===n.hasUnpiped&&(n.hasUnpiped=!0,p("cleanup"),e.removeListener("close",b),e.removeListener("finish",y),e.removeListener("drain",d),e.removeListener("error",g),e.removeListener("unpipe",u),r.removeListener("end",l),r.removeListener("end",w),r.removeListener("data",m),f=!0,!a.awaitDrain||e._writableState&&!e._writableState.needDrain||d())}function l(){p("onend"),e.end()}a.endEmitted?i.nextTick(c):r.once("end",c),e.on("unpipe",u);var d=function(e){return function(){var t=e._readableState;p("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&o(e,"data")&&(t.flowing=!0,x(e))}}(r);e.on("drain",d);var f=!1;var h=!1;function m(t){p("ondata"),h=!1,!1!==e.write(t)||h||((1===a.pipesCount&&a.pipes===e||a.pipesCount>1&&-1!==D(a.pipes,e))&&!f&&(p("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,h=!0),r.pause())}function g(t){p("onerror",t),w(),e.removeListener("error",g),0===o(e,"error")&&e.emit("error",t)}function b(){e.removeListener("finish",y),w()}function y(){p("onfinish"),e.removeListener("close",b),w()}function w(){p("unpipe"),r.unpipe(e)}return r.on("data",m),function(e,t,r){if("function"==typeof e.prependListener)return e.prependListener(t,r);e._events&&e._events[t]?s(e._events[t])?e._events[t].unshift(r):e._events[t]=[r,e._events[t]]:e.on(t,r)}(e,"error",g),e.once("close",b),e.once("finish",y),e.emit("pipe",r),a.flowing||(p("pipe resume"),r.resume()),e},w.prototype.unpipe=function(e){var t=this._readableState,r={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,r),this);if(!e){var n=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var a=0;a>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function o(e){var t=this.lastTotal-this.lastNeed,r=function(e,t,r){if(128!=(192&t[0]))return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,"�"}}(this,e);return void 0!==r?r:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function c(e,t){if((e.length-t)%2==0){var r=e.toString("utf16le",t);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function u(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,r)}return t}function l(e,t){var r=(e.length-t)%3;return 0===r?e.toString("base64",t):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-r))}function d(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function f(e){return e.toString(this.encoding)}function p(e){return e&&e.length?this.write(e):""}t.StringDecoder=a,a.prototype.write=function(e){if(0===e.length)return"";var t,r;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0)return i>0&&(e.lastNeed=i-1),i;if(--n=0)return i>0&&(e.lastNeed=i-2),i;if(--n=0)return i>0&&(2===i?i=0:e.lastNeed=i-3),i;return 0}(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=r;var n=e.length-(r-this.lastNeed);return e.copy(this.lastChar,0,n),e.toString("utf8",t,n)},a.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},function(e,t,r){"use strict";e.exports=s;var n=r(50),i=r(66);function a(e,t){var r=this._transformState;r.transforming=!1;var n=r.writecb;if(!n)return this.emit("error",new Error("write callback called multiple times"));r.writechunk=null,r.writecb=null,null!=t&&this.push(t),n(e);var i=this._readableState;i.reading=!1,(i.needReadable||i.length({packetType:e.readUInt8(t),vorbis:new n.StringType(6,"ascii").get(e,t+1)})},t.IdentificationHeader={len:23,get:(e,t)=>({version:e.readUInt32LE(t+0),channelMode:e.readUInt8(t+4),sampleRate:e.readUInt32LE(t+5),bitrateMax:e.readUInt32LE(t+9),bitrateNominal:e.readUInt32LE(t+13),bitrateMin:e.readUInt32LE(t+17)})}}).call(this,r(9).Buffer)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(16),a=r(7)("music-metadata:parser:MP4:atom");t.Header={len:8,get:(e,t)=>{const r=n.UINT32_BE.get(e,t);if(r<0)throw new Error("Invalid atom header length");return{length:r,name:i.FourCcToken.get(e,t+4)}},put:(e,t,r)=>(n.UINT32_BE.put(e,t,r.length),i.FourCcToken.put(e,t+4,r.name))},t.ExtendedSize=n.UINT64_BE,t.ftyp={len:4,get:(e,t)=>({type:new n.StringType(4,"ascii").get(e,t)})},t.mhdr={len:8,get:(e,t)=>({version:n.UINT8.get(e,t+0),flags:n.UINT24_BE.get(e,t+1),nextItemID:n.UINT32_BE.get(e,t+4)})};class s{constructor(e,t,r){if(this.len=e,et&&a(`Warning: atom ${r} expected to be ${t}, but was actually ${e} bytes long.`)}}t.FixedLengthAtom=s;t.MdhdAtom=class extends s{constructor(e){super(e,24,"mdhd"),this.len=e}get(e,t){return{version:n.UINT8.get(e,t+0),flags:n.UINT24_BE.get(e,t+1),creationTime:n.UINT32_BE.get(e,t+4),modificationTime:n.UINT32_BE.get(e,t+8),timeScale:n.UINT32_BE.get(e,t+12),duration:n.UINT32_BE.get(e,t+16),language:n.UINT16_BE.get(e,t+20),quality:n.UINT16_BE.get(e,t+22)}}};t.MvhdAtom=class extends s{constructor(e){super(e,100,"mvhd"),this.len=e}get(e,t){return{version:n.UINT8.get(e,t+0),flags:n.UINT24_BE.get(e,t+1),creationTime:n.UINT32_BE.get(e,t+4),modificationTime:n.UINT32_BE.get(e,t+8),timeScale:n.UINT32_BE.get(e,t+12),duration:n.UINT32_BE.get(e,t+16),preferredRate:n.UINT32_BE.get(e,t+20),preferredVolume:n.UINT16_BE.get(e,t+24),previewTime:n.UINT32_BE.get(e,t+72),previewDuration:n.UINT32_BE.get(e,t+76),posterTime:n.UINT32_BE.get(e,t+80),selectionTime:n.UINT32_BE.get(e,t+84),selectionDuration:n.UINT32_BE.get(e,t+88),currentTime:n.UINT32_BE.get(e,t+92),nextTrackID:n.UINT32_BE.get(e,t+96)}}};t.DataAtom=class{constructor(e){this.len=e}get(e,t){return{type:{set:n.UINT8.get(e,t+0),type:n.UINT24_BE.get(e,t+1)},locale:n.UINT24_BE.get(e,t+4),value:new n.BufferType(this.len-8).get(e,t+8)}}};t.NameAtom=class{constructor(e){this.len=e}get(e,t){return{version:n.UINT8.get(e,t),flags:n.UINT24_BE.get(e,t+1),name:new n.StringType(this.len-4,"utf-8").get(e,t+4)}}};t.TrackHeaderAtom=class{constructor(e){this.len=e}get(e,t){return{version:n.UINT8.get(e,t),flags:n.UINT24_BE.get(e,t+1),creationTime:n.UINT32_BE.get(e,t+4),modificationTime:n.UINT32_BE.get(e,t+8),trackId:n.UINT32_BE.get(e,t+12),duration:n.UINT32_BE.get(e,t+20),layer:n.UINT16_BE.get(e,t+24),alternateGroup:n.UINT16_BE.get(e,t+26),volume:n.UINT16_BE.get(e,t+28)}}};const o={len:8,get:(e,t)=>({version:n.UINT8.get(e,t+0),flags:n.UINT24_BE.get(e,t+1),numberOfEntries:n.UINT32_BE.get(e,t+4)})};class c{constructor(e){this.len=e}get(e,t){return{dataFormat:i.FourCcToken.get(e,t),dataReferenceIndex:n.UINT16_BE.get(e,t+10),description:new n.BufferType(this.len-12).get(e,t+12)}}}t.StsdAtom=class{constructor(e){this.len=e}get(e,t){const r=o.get(e,t);t+=o.len;const i=[];for(let a=0;a({version:n.INT16_BE.get(e,t),revision:n.INT16_BE.get(e,t+2),vendor:n.INT32_BE.get(e,t+4)})},t.SoundSampleDescriptionV0={len:12,get:(e,t)=>({numAudioChannels:n.INT16_BE.get(e,t+0),sampleSize:n.INT16_BE.get(e,t+2),compressionId:n.INT16_BE.get(e,t+4),packetSize:n.INT16_BE.get(e,t+6),sampleRate:n.UINT16_BE.get(e,t+8)+n.UINT16_BE.get(e,t+10)/1e4})}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(495),i=r(498),a=r(576),s=r(577),o=n("music-metadata-browser:main");t.parseNodeStream=i.parseStream,t.parseReadableStream=async function(e,r,n){const i=new a.ReadableWeToNodeStream(e),s=await t.parseNodeStream(i,r,n);return o(`Completed parsing from stream bytesRead=${i.bytesRead} / fileSize=${n&&n.fileSize?n.fileSize:"?"}`),await i.close(),s},t.parseBuffer=i.parseBuffer,t.parseBlob=function(e,t){return function(e){return new Promise((t,r)=>{const n=new FileReader;n.onloadend=e=>{let r=e.target.result;r instanceof ArrayBuffer&&(r=s(new Uint8Array(e.target.result))),t(r)},n.onerror=e=>{r(new Error(e.type))},n.onabort=e=>{r(new Error(e.type))},n.readAsArrayBuffer(e)})}(e).then(r=>i.parseBuffer(r,e.type,t))},t.fetchFromUrl=async function(e,t){const r=await fetch(e),n=r.headers.get("Content-Type"),i=[];if(r.headers.forEach(e=>{i.push(e)}),r.ok){if(r.body){const e=await this.parseReadableStream(r.body,n,t);return o("Closing HTTP-readable-stream..."),r.body.locked||await r.body.cancel(),o("HTTP-readable-stream closed."),e}return this.parseBlob(await r.blob(),t)}throw new Error(`HTTP error status=${r.status}: ${r.statusText}`)},t.parseFromTokenizer=i.parseFromTokenizer,t.orderTags=i.orderTags,t.ratingToStars=i.ratingToStars},function(e,t,r){var i;(function(){var r=!1,a=function(e){return e instanceof a?e:this instanceof a?void(this.EXIFwrapped=e):new a(e)};e.exports&&(t=e.exports=a),t.EXIF=a;var s=a.Tags={36864:"ExifVersion",40960:"FlashpixVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",37121:"ComponentsConfiguration",37122:"CompressedBitsPerPixel",37500:"MakerNote",37510:"UserComment",40964:"RelatedSoundFile",36867:"DateTimeOriginal",36868:"DateTimeDigitized",37520:"SubsecTime",37521:"SubsecTimeOriginal",37522:"SubsecTimeDigitized",33434:"ExposureTime",33437:"FNumber",34850:"ExposureProgram",34852:"SpectralSensitivity",34855:"ISOSpeedRatings",34856:"OECF",37377:"ShutterSpeedValue",37378:"ApertureValue",37379:"BrightnessValue",37380:"ExposureBias",37381:"MaxApertureValue",37382:"SubjectDistance",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37396:"SubjectArea",37386:"FocalLength",41483:"FlashEnergy",41484:"SpatialFrequencyResponse",41486:"FocalPlaneXResolution",41487:"FocalPlaneYResolution",41488:"FocalPlaneResolutionUnit",41492:"SubjectLocation",41493:"ExposureIndex",41495:"SensingMethod",41728:"FileSource",41729:"SceneType",41730:"CFAPattern",41985:"CustomRendered",41986:"ExposureMode",41987:"WhiteBalance",41988:"DigitalZoomRation",41989:"FocalLengthIn35mmFilm",41990:"SceneCaptureType",41991:"GainControl",41992:"Contrast",41993:"Saturation",41994:"Sharpness",41995:"DeviceSettingDescription",41996:"SubjectDistanceRange",40965:"InteroperabilityIFDPointer",42016:"ImageUniqueID"},o=a.TiffTags={256:"ImageWidth",257:"ImageHeight",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer",40965:"InteroperabilityIFDPointer",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",274:"Orientation",277:"SamplesPerPixel",284:"PlanarConfiguration",530:"YCbCrSubSampling",531:"YCbCrPositioning",282:"XResolution",283:"YResolution",296:"ResolutionUnit",273:"StripOffsets",278:"RowsPerStrip",279:"StripByteCounts",513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",301:"TransferFunction",318:"WhitePoint",319:"PrimaryChromaticities",529:"YCbCrCoefficients",532:"ReferenceBlackWhite",306:"DateTime",270:"ImageDescription",271:"Make",272:"Model",305:"Software",315:"Artist",33432:"Copyright"},c=a.GPSTags={0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude",5:"GPSAltitudeRef",6:"GPSAltitude",7:"GPSTimeStamp",8:"GPSSatellites",9:"GPSStatus",10:"GPSMeasureMode",11:"GPSDOP",12:"GPSSpeedRef",13:"GPSSpeed",14:"GPSTrackRef",15:"GPSTrack",16:"GPSImgDirectionRef",17:"GPSImgDirection",18:"GPSMapDatum",19:"GPSDestLatitudeRef",20:"GPSDestLatitude",21:"GPSDestLongitudeRef",22:"GPSDestLongitude",23:"GPSDestBearingRef",24:"GPSDestBearing",25:"GPSDestDistanceRef",26:"GPSDestDistance",27:"GPSProcessingMethod",28:"GPSAreaInformation",29:"GPSDateStamp",30:"GPSDifferential"},u=a.IFD1Tags={256:"ImageWidth",257:"ImageHeight",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",273:"StripOffsets",274:"Orientation",277:"SamplesPerPixel",278:"RowsPerStrip",279:"StripByteCounts",282:"XResolution",283:"YResolution",284:"PlanarConfiguration",296:"ResolutionUnit",513:"JpegIFOffset",514:"JpegIFByteCount",529:"YCbCrCoefficients",530:"YCbCrSubSampling",531:"YCbCrPositioning",532:"ReferenceBlackWhite"},l=a.StringValues={ExposureProgram:{0:"Not defined",1:"Manual",2:"Normal program",3:"Aperture priority",4:"Shutter priority",5:"Creative program",6:"Action program",7:"Portrait mode",8:"Landscape mode"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{0:"Unknown",1:"Daylight",2:"Fluorescent",3:"Tungsten (incandescent light)",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 - 5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},SensingMethod:{1:"Not defined",2:"One-chip color area sensor",3:"Two-chip color area sensor",4:"Three-chip color area sensor",5:"Color sequential area sensor",7:"Trilinear sensor",8:"Color sequential linear sensor"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},SceneType:{1:"Directly photographed"},CustomRendered:{0:"Normal process",1:"Custom process"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},GainControl:{0:"None",1:"Low gain up",2:"High gain up",3:"Low gain down",4:"High gain down"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},SubjectDistanceRange:{0:"Unknown",1:"Macro",2:"Close view",3:"Distant view"},FileSource:{3:"DSC"},Components:{0:"",1:"Y",2:"Cb",3:"Cr",4:"R",5:"G",6:"B"}};function d(e){return!!e.exifdata}function f(e,t){function n(n){var i=p(n);e.exifdata=i||{};var s=function(e){var t=new DataView(e);r&&console.log("Got file of length "+e.byteLength);if(255!=t.getUint8(0)||216!=t.getUint8(1))return r&&console.log("Not a valid JPEG"),!1;var n=2,i=e.byteLength,a=function(e,t){return 56===e.getUint8(t)&&66===e.getUint8(t+1)&&73===e.getUint8(t+2)&&77===e.getUint8(t+3)&&4===e.getUint8(t+4)&&4===e.getUint8(t+5)};for(;n")+8,l=(c=c.substring(c.indexOf("4?p:t+8,s=[],c=0;c4?p:t+8,f-1);case 3:if(1==f)return e.getUint16(t+8,!i);for(a=f>2?p:t+8,s=[],c=0;ce.byteLength)return{};var a=g(e,t,t+i,u,n);if(a.Compression)switch(a.Compression){case 6:if(a.JpegIFOffset&&a.JpegIFByteCount){var s=t+a.JpegIFOffset,o=a.JpegIFByteCount;a.blob=new Blob([new Uint8Array(e.buffer,s,o)],{type:"image/jpeg"})}break;case 1:console.log("Thumbnail image format is TIFF, which is not implemented.");break;default:console.log("Unknown thumbnail image format '%s'",a.Compression)}else 2==a.PhotometricInterpretation&&console.log("Thumbnail image format is RGB, which is not implemented.");return a}(e,p,h,n),i}function T(e){var t={};if(1==e.nodeType){if(e.attributes.length>0){t["@attributes"]={};for(var r=0;r0)for(var r=0;r{if(!t.isBuffer(e))return{};let i={},a=e.indexOf(n);for(;-1!==a;){let t=(a=e.indexOf(n,a+n.byteLength))+n.byteLength,s=t+1,o=s+2,c=e.readUInt8(t),u=e.readUInt16BE(s);if(!r.has(c))continue;if(u>e.length-(o+u))throw new Error("Invalid IPTC directory");let l=r.get(c),d=e.slice(o,o+u).toString();null==i[l]?i[l]=d:Array.isArray(i[l])?i[l].push(d):i[l]=[i[l],d]}return i}}).call(this,r(9).Buffer)},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){e.exports=r(492)},function(e,t,r){"use strict";r.r(t),function(e){var t=r(293),n=r(294),i=r.n(n),a=r(295),s=r.n(a);window.mediaCloudReaderCache={readers:[],getFreeReader:function(){return this.readers.length>0?(console.log("Got cached reader."),this.readers.splice(0,1)[0]):new FileReader},cacheReader:function(e){this.readers.push(e)}},window.DirectUploadItem=Backbone.Model.extend({initialize:function(e){this.on("change:progress",this.updateProgress,this)},updateProgress:function(){var e=this.get("attachment"),t=this.get("progress");e.set({percent:t})},startUpload:function(){if("uploadToStorage"in DirectUploadItem.prototype){var e=this.get("file"),t=this.get("faces"),r=this.get("mimeType");this.get("isDirectUpload")?(console.log("Uploading to Cloud Storage"),this.uploadToStorage(e,t,r,this)):this.uploadToWordPress(e,t,this)}else alert("Direct upload is misconfigured.")},uploadToWordPress:function(e,t,r){console.log("Uploading to WordPress");var n=new FormData;n.append("action",_wpPluploadSettings.defaults.multipart_params.action),n.append("_wpnonce",_wpPluploadSettings.defaults.multipart_params._wpnonce),n.append("name",e.name),n.append("async-upload",e),jQuery.ajax({url:_wpPluploadSettings.defaults.url,method:"POST",contentType:!1,processData:!1,data:n,dataType:"json",xhr:function(){var e=jQuery.ajaxSettings.xhr();return e.upload.onprogress=function(e){r.set({progress:e.loaded/e.total*100})}.bind(this),e},success:function(e){e.hasOwnProperty("success")&&e.success?r.wordpressUploadFinished(e,t):r.uploadError()},error:function(e){r.uploadError()}})},finishWordpressUpload:function(e){var t=this.get("attachment");_.each(["file","loaded","size","percent"],function(e){t.unset(e)}),t.set(_.extend(e.data,{uploading:!1})),wp.media.model.Attachment.get(e.data.id,t),this.set({state:"done"}),wp.Uploader.queue.remove(t),wp.Uploader.queue.all(function(e){return!e.get("uploading")})&&wp.Uploader.queue.reset()},wordpressUploadFinished:function(e,t){if(null!=t){var r={action:"ilab_add_face_data",post_id:e.data.id,faces:t};$.post(ajaxurl,r,function(t){this.finishWordpressUpload(e)}.bind(this))}else this.finishWordpressUpload(e)},doUploadFinished:function(e,t,r){var n=this.get("attachment"),i={action:"ilab_upload_import_cloud_file",key:e};null!=r&&(i.metadata=r),console.log("Upload finished"),console.log(i),null!=t&&t.length>0&&(i.faces=t),$.post(ajaxurl,i,function(e){_.each(["file","loaded","size","percent"],function(e){n.unset(e)}),"success"==e.status?(n.set(_.extend(e.attachment,{uploading:!1})),wp.media.model.Attachment.get(e.attachment.id,n),this.set({state:"done"})):this.set({state:"error"}),wp.Uploader.queue.remove(n),wp.Uploader.queue.all(function(e){return!e.get("uploading")})&&wp.Uploader.queue.reset()}.bind(this))},mapID3Meta:function(e,t,r,n){r.hasOwnProperty(e)&&(n[t]=r[e])},mapIndexedID3Meta:function(e,t,r,n){r.hasOwnProperty(e)&&r[e].length>0&&(n[t]=r[e][0])},assignAudioMetadata:function(e,t){if(this.mapID3Meta("album","album",e.common,t),this.mapID3Meta("artist","artist",e.common,t),this.mapIndexedID3Meta("genre","genre",e.common,t),this.mapID3Meta("title","title",e.common,t),e.common.hasOwnProperty("track")&&null!=e.common.track.no&&(t.track_number=e.common.track.no),this.mapID3Meta("year","year",e.common,t),this.mapIndexedID3Meta("composer","composer",e.common,t),this.mapIndexedID3Meta("lyricist","lyricist",e.common,t),this.mapIndexedID3Meta("writer","writer",e.common,t),this.mapIndexedID3Meta("conductor","conductor",e.common,t),this.mapIndexedID3Meta("remixer","remixer",e.common,t),this.mapIndexedID3Meta("arranger","arranger",e.common,t),this.mapIndexedID3Meta("engineer","engineer",e.common,t),this.mapIndexedID3Meta("producer","producer",e.common,t),this.mapIndexedID3Meta("djmixer","dj_mixer",e.common,t),this.mapIndexedID3Meta("mixer","mixer",e.common,t),this.mapIndexedID3Meta("technician","technician",e.common,t),this.mapIndexedID3Meta("label","label",e.common,t),this.mapIndexedID3Meta("subtitle","subtitle",e.common,t),this.mapIndexedID3Meta("compilation","compilation",e.common,t),this.mapID3Meta("bpm","bpm",e.common,t),this.mapID3Meta("mood","mood",e.common,t),this.mapID3Meta("media","media",e.common,t),this.mapID3Meta("tvShow","tv_show",e.common,t),this.mapID3Meta("tvSeason","tv_season",e.common,t),this.mapID3Meta("tvEpisode","tv_episode",e.common,t),this.mapID3Meta("tvNetwork","tv_network",e.common,t),this.mapID3Meta("podcast","podcast",e.common,t),this.mapID3Meta("podcasturl","podcast_url",e.common,t),this.mapID3Meta("releasestatus","release_status",e.common,t),this.mapID3Meta("releasetype","release_type",e.common,t),this.mapID3Meta("releasecountry","release_country",e.common,t),this.mapID3Meta("language","language",e.common,t),this.mapID3Meta("copyright","copyright",e.common,t),this.mapID3Meta("license","license",e.common,t),this.mapID3Meta("encodedby","encoded_by",e.common,t),this.mapID3Meta("encodersettings","encoder_options",e.common,t),this.mapID3Meta("gapless","gapless",e.common,t),this.mapID3Meta("barcode","barcode",e.common,t),this.mapID3Meta("asin","asin",e.common,t),this.mapID3Meta("website","website",e.common,t),this.mapID3Meta("averageLevel","average_level",e.common,t),this.mapID3Meta("peakLevel","peak_level",e.common,t),this.mapID3Meta("bitrate","bitrate",e.format,t),this.mapID3Meta("codec","dataformat",e.format,t),this.mapID3Meta("codecProfile","bitrate_mode",e.format,t),this.mapID3Meta("lossless","lossless",e.format,t),this.mapID3Meta("numberOfChannels","channels",e.format,t),this.mapID3Meta("duration","length",e.format,t),this.mapID3Meta("sampleRate","sample_rate",e.format,t),e.common.hasOwnProperty("picture")&&e.common.picture.length>0){var r=e.common.picture[0];t.thumbnail={mimeType:r.format,data:r.data.toString("base64")},t.image=[{mime:r.format}]}},mapImageMeta:function(e,t,r,n,i){if(t.hasOwnProperty(r)){var a=t[r];if("string"==e){if(!(o="string"==typeof a||a instanceof String))return;n[i]=a.trim()}else if("strings"==e){if(o="string"==typeof a||a instanceof String){a=a.split(",");for(var s=0;s0&&(n[i]=a)}else if("date"==e){var o;if(!(o="string"==typeof a||a instanceof String))return;var c=a.split(" ");if(2!=c.length)return;var u=c[0].split(":");if(3!=u.length)return;var l=u[0],d=u[1],f=u[2],p=new Date("".concat(d,"/").concat(f,"/").concat(l," ").concat(c[1]));n[i]=(p.getTime()/1e3).toFixed(0)}else if("frac"==e){if(o)return;if(!("number"==typeof a||a instanceof Number))return;n[i]=a.numerator/a.denominator}else if("number"==e){if(o)return;if(!("number"==typeof a||a instanceof Number))return;n[i]=a}}},assignImageMetadata:function(e,t,r){console.log(e),console.log(t);var n={};this.mapImageMeta("string",e,"headline",n,"title"),this.mapImageMeta("string",e,"caption",n,"caption"),this.mapImageMeta("string",e,"credit",n,"credit"),this.mapImageMeta("string",e,"copyright",n,"copyright"),this.mapImageMeta("strings",e,"keywords",n,"keywords"),0!=t&&(this.mapImageMeta("string",t,"ImageDescription",n,"title"),n.hasOwnProperty("caption")||this.mapImageMeta("bytes",t,"UserComment",n,"caption"),n.hasOwnProperty("copyright")||this.mapImageMeta("bytes",t,"Copyright",n,"copyright"),this.mapImageMeta("string",t,"Artist",n,"credit"),n.hasOwnProperty("credit")||this.mapImageMeta("string",t,"Author",n,"credit"),this.mapImageMeta("string",t,"Copyright",n,"copyright"),this.mapImageMeta("string",t,"Model",n,"camera"),this.mapImageMeta("string",t,"ISOSpeedRatings",n,"iso"),this.mapImageMeta("number",t,"ISOSpeedRatings",n,"iso"),this.mapImageMeta("date",t,"DateTimeDigitized",n,"created_timestamp"),this.mapImageMeta("frac",t,"FocalLength",n,"focal_length"),this.mapImageMeta("frac",t,"FNumber",n,"aperture"),this.mapImageMeta("frac",t,"ExposureTime",n,"shutter_speed"),this.mapImageMeta("number",t,"Orientation",n,"orientation")),r.image_meta=n},uploadFinished:function(r,n){var a=this.get("attachment").get("file"),o={filesize:a.size},c=this.get("mimeType");if(0===c.indexOf("audio/")){var u=c.split("/")[1];o.fileformat=u,t.parseBlob(a,{duration:!0}).then(function(e){this.assignAudioMetadata(e,o),this.doUploadFinished(r,n,o)}.bind(this)).catch(function(e){this.doUploadFinished(r,n,o)}.bind(this))}else if(0==c.indexOf("image/")){var l=mediaCloudReaderCache.getFreeReader();l.onload=function(t){var a={};try{a=s()(e.from(l.result))}catch(e){console.log("IPTC Error",e)}var c=i.a.readFromBinaryFile(l.result);this.assignImageMetadata(a,c,o),mediaCloudReaderCache.cacheReader(l),this.doUploadFinished(r,n,o)}.bind(this),l.onerror=function(e){mediaCloudReaderCache.cacheReader(l),this.doUploadFinished(r,n,o)}.bind(this),l.readAsArrayBuffer(a)}else this.doUploadFinished(r,n,o)},uploadError:function(){this.set({state:"error"});var e=this.get("attachment");_.each(["file","loaded","size","percent"],function(t){e.unset(t)}),wp.Uploader.queue.remove(e),e.destroy()}}),window.DirectUploader=Backbone.Model.extend({initialize:function(e){this.totalFilesDropped=0,this.totalFilesUploaded=0,this.files=[],this.toBulkProcess=[],this.uploadingFiles=[],this.watchToken=0,this.settings=mediaCloudDirectUploadSettings},queueNext:function(){if(clearTimeout(this.watchToken),this.uploadingFiles.length0){for(var e=this.settings.maxUploads-this.uploadingFiles.length,t=0;t0){var r=this.files.shift();this.uploadingFiles.push(r),r.startUpload()}}else if(0==this.uploadingFiles.length&&this.toBulkProcess.length>0&&this.totalFilesDropped==this.totalFilesUploaded){var n={action:"ilab_upload_process_batch",batch:this.toBulkProcess};this.toBulkProcess=[],this.totalFilesDropped=0,this.totalFilesUploaded=0,$.post(ajaxurl,n,function(e){})}this.watchToken=setTimeout(this.queueNext.bind(this),500)},addFile:function(e){if(console.log("Adding File"),""==e.type)return!1;var t=e.type;"application/x-photoshop"==t&&(t="image/psd");var r=-1!=this.settings.allowedMimes.indexOf(t);console.log("Is Direct Upload?",r);var n=t.split("/"),i=n[0],a=n[1];a="jpg"==a?"jpeg":a,this.totalFilesDropped++;var s={file:e,uploading:!0,date:new Date,filename:e.name,isDirectUpload:r,menuOrder:0,uploadedTo:wp.media.model.settings.post.id,loaded:0,size:e.size,percent:0,type:i,subType:a},o=wp.media.model.Attachment.create(s);wp.Uploader.queue.add(o);var c=new DirectUploadItem({attachment:o,file:e,mimeType:t,isDirectUpload:r,progress:0,driver:this.settings.driver,faces:null,state:"waiting"});c.on("change:state",function(e,t){if("done"==t||"error"==t){this.totalFilesUploaded++,"done"==t&&this.toBulkProcess.push(o.id);var r=this.files.indexOf(c);r>-1&&this.files.splice(r),(r=this.uploadingFiles.indexOf(c))>-1&&this.uploadingFiles.splice(r),this.queueNext()}}.bind(this)),"undefined"!=typeof ILABFaceDetector?ILABFaceDetector(e,function(e){c.set("faces",e),this.files.push(c)}.bind(this)):this.files.push(c)}}),wp.media.view.UploaderWindow.prototype.__ready=wp.media.view.UploaderWindow.prototype.ready,wp.media.view.UploaderWindow.prototype.ready=function(){this.__ready(),this.directUploader=new DirectUploader({}),this.uploader.uploader.unbind("FilesAdded"),this.uploader.uploader.bind("FilesAdded",function(e,t){_.each(t,function(e){this.directUploader.addFile(e.getNative())}.bind(this)),this.directUploader.queueNext()}.bind(this))},wp.media.view.UploaderInline=wp.media.view.UploaderInline.extend({template:wp.template("media-cloud-direct-upload")})}.call(this,r(9).Buffer)},function(e,t,r){"use strict";t.byteLength=function(e){var t=u(e),r=t[0],n=t[1];return 3*(r+n)/4-n},t.toByteArray=function(e){for(var t,r=u(e),n=r[0],s=r[1],o=new a(function(e,t,r){return 3*(t+r)/4-r}(0,n,s)),c=0,l=s>0?n-4:n,d=0;d>16&255,o[c++]=t>>8&255,o[c++]=255&t;2===s&&(t=i[e.charCodeAt(d)]<<2|i[e.charCodeAt(d+1)]>>4,o[c++]=255&t);1===s&&(t=i[e.charCodeAt(d)]<<10|i[e.charCodeAt(d+1)]<<4|i[e.charCodeAt(d+2)]>>2,o[c++]=t>>8&255,o[c++]=255&t);return o},t.fromByteArray=function(e){for(var t,r=e.length,i=r%3,a=[],s=0,o=r-i;so?o:s+16383));1===i?(t=e[r-1],a.push(n[t>>2]+n[t<<4&63]+"==")):2===i&&(t=(e[r-2]<<8)+e[r-1],a.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+"="));return a.join("")};for(var n=[],i=[],a="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,c=s.length;o0)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");return-1===r&&(r=t),[r,r===t?0:4-r%4]}function l(e,t,r){for(var i,a,s=[],o=t;o>18&63]+n[a>>12&63]+n[a>>6&63]+n[63&a]);return s.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},function(e,t){t.read=function(e,t,r,n,i){var a,s,o=8*i-n-1,c=(1<>1,l=-7,d=r?i-1:0,f=r?-1:1,p=e[t+d];for(d+=f,a=p&(1<<-l)-1,p>>=-l,l+=o;l>0;a=256*a+e[t+d],d+=f,l-=8);for(s=a&(1<<-l)-1,a>>=-l,l+=n;l>0;s=256*s+e[t+d],d+=f,l-=8);if(0===a)a=1-u;else{if(a===c)return s?NaN:1/0*(p?-1:1);s+=Math.pow(2,n),a-=u}return(p?-1:1)*s*Math.pow(2,a-n)},t.write=function(e,t,r,n,i,a){var s,o,c,u=8*a-i-1,l=(1<>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,h=n?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(o=isNaN(t)?1:0,s=l):(s=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-s))<1&&(s--,c*=2),(t+=s+d>=1?f/c:f*Math.pow(2,1-d))*c>=2&&(s++,c/=2),s+d>=l?(o=0,s=l):s+d>=1?(o=(t*c-1)*Math.pow(2,i),s+=d):(o=t*Math.pow(2,d-1)*Math.pow(2,i),s=0));i>=8;e[r+p]=255&o,p+=h,o/=256,i-=8);for(s=s<0;e[r+p]=255&s,p+=h,s/=256,u-=8);e[r+p-h]|=128*m}},function(e,t,r){(function(n){t.log=function(...e){return"object"==typeof console&&console.log&&console.log(...e)},t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const r="color: "+this.color;t.splice(1,0,r,"color: inherit");let n=0,i=0;t[0].replace(/%[a-zA-Z%]/g,e=>{"%%"!==e&&(n++,"%c"===e&&(i=n))}),t.splice(i,0,r)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&void 0!==n&&"env"in n&&(e=n.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],e.exports=r(496)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}).call(this,r(38))},function(e,t,r){e.exports=function(e){function t(e){let t=0;for(let r=0;r{if("%%"===r)return r;o++;const a=n.formatters[i];if("function"==typeof a){const n=e[o];r=a.call(t,n),e.splice(o,1),o--}return r}),n.formatArgs.call(t,e),(t.log||n.log).apply(t,e)}return s.namespace=e,s.enabled=n.enabled(e),s.useColors=n.useColors(),s.color=t(e),s.destroy=i,s.extend=a,"function"==typeof n.init&&n.init(s),n.instances.push(s),s}function i(){const e=n.instances.indexOf(this);return-1!==e&&(n.instances.splice(e,1),!0)}function a(e,t){const r=n(this.namespace+(void 0===t?":":t)+e);return r.log=this.log,r}function s(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return n.debug=n,n.default=n,n.coerce=function(e){return e instanceof Error?e.stack||e.message:e},n.disable=function(){const e=[...n.names.map(s),...n.skips.map(s).map(e=>"-"+e)].join(",");return n.enable(""),e},n.enable=function(e){let t;n.save(e),n.names=[],n.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(t=0;t{n[t]=e[t]}),n.instances=[],n.names=[],n.skips=[],n.formatters={},n.selectColor=t,n.enable(n.load()),n}},function(e,t){var r=1e3,n=60*r,i=60*n,a=24*i,s=7*a,o=365.25*a;function c(e,t,r,n){var i=t>=1.5*r;return Math.round(e/r)+" "+n+(i?"s":"")}e.exports=function(e,t){t=t||{};var u=typeof e;if("string"===u&&e.length>0)return function(e){if((e=String(e)).length>100)return;var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(!t)return;var c=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*o;case"weeks":case"week":case"w":return c*s;case"days":case"day":case"d":return c*a;case"hours":case"hour":case"hrs":case"hr":case"h":return c*i;case"minutes":case"minute":case"mins":case"min":case"m":return c*n;case"seconds":case"second":case"secs":case"sec":case"s":return c*r;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(e);if("number"===u&&isFinite(e))return t.long?function(e){var t=Math.abs(e);if(t>=a)return c(e,t,a,"day");if(t>=i)return c(e,t,i,"hour");if(t>=n)return c(e,t,n,"minute");if(t>=r)return c(e,t,r,"second");return e+" ms"}(e):function(e){var t=Math.abs(e);if(t>=a)return Math.round(e/a)+"d";if(t>=i)return Math.round(e/i)+"h";if(t>=n)return Math.round(e/n)+"m";if(t>=r)return Math.round(e/r)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(79),i=r(510);function a(e,t,r){return!e.fileSize&&r.fileSize&&(e.fileSize=r.fileSize),i.ParserFactory.parse(e,t,r)}t.parseStream=function(e,t,r={}){return a(n.fromStream(e),t,r)},t.parseBuffer=function(e,t,r={}){return a(n.fromBuffer(e),t,r)},t.parseFromTokenizer=a,t.orderTags=function(e){const t={};for(const r of e)(t[r.id]=t[r.id]||[]).push(r.value);return t},t.ratingToStars=function(e){return void 0===e?0:1+Math.round(4*e)}},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(500),i=r(39),a=r(501),s=r(506)("strtok3:ReadStreamTokenizer");t.ReadStreamTokenizer=class extends n.AbstractTokenizer{constructor(e,t){super(),this.streamReader=new a.StreamReader(e),this.fileSize=t}async readBuffer(e,t=0,r=e.length,n){if(0===r)return 0;if(n){const i=n-this.position;if(i>0)return await this.ignore(n-this.position),this.readBuffer(e,t,r);if(i<0)throw new Error("Cannot read from a negative offset in a stream")}let s;try{s=await this.streamReader.read(e,t,r),this.position+=s}catch(e){throw e.message===a.endOfStream?new Error(i.endOfFile):e}if(s0){const a=e.alloc(n+i);return c=await this.peekBuffer(a,0,i+n,void 0,o),a.copy(t,r,i),c-i}if(i<0)throw new Error("Cannot peek from a negative offset in a stream")}try{c=await this.streamReader.peek(t,r,n)}catch(e){throw e.message===a.endOfStream?new Error(i.endOfFile):e}if(!o&&c{this.reject=t,this.resolve=e})}}t.endOfStream="End-Of-Stream";t.StreamReader=class{constructor(e){if(this.s=e,this.endOfStream=!1,this.peekQueue=[],!e.read||!e.once)throw new Error("Expected an instance of stream.Readable");this.s.once("end",()=>this.reject(new Error(t.endOfStream))),this.s.once("error",e=>this.reject(e)),this.s.once("close",()=>this.reject(new Error("Stream closed")))}async peek(e,t,r){const n=await this.read(e,t,r);return this.peekQueue.push(e.slice(t,t+n)),n}async read(e,r,n){if(0===n)return 0;if(0===this.peekQueue.length&&this.endOfStream)throw new Error(t.endOfStream);let i=n,a=0;for(;this.peekQueue.length>0&&i>0;){const t=this.peekQueue.pop(),n=Math.min(t.length,i);t.copy(e,r+a,0,n),a+=n,i-=n,n0&&!this.endOfStream&&(a+=await this._read(e,r+a,i)),a}async _read(e,t,r){n.ok(!this.request,"Concurrent read operation?");const a=this.s.read(r);return a?(a.copy(e,t),a.length):(this.request={buffer:e,offset:t,length:r,deferred:new i},this.s.once("readable",()=>{this.tryRead()}),this.request.deferred.promise.then(e=>(this.request=null,e)).catch(e=>{throw this.request=null,e}))}tryRead(){const e=this.s.read(this.request.length);e?(e.copy(this.request.buffer,this.request.offset),this.request.deferred.resolve(e.length)):this.s.once("readable",()=>{this.tryRead()})}reject(e){this.endOfStream=!0,this.request&&(this.request.deferred.reject(e),this.request=null)}}},function(e,t,r){"use strict";var n=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;function s(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach(function(e){n[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var r,o,c=s(e),u=1;u=a)return e;switch(e){case"%s":return String(n[r++]);case"%d":return Number(n[r++]);case"%j":try{return JSON.stringify(n[r++])}catch(e){return"[Circular]"}default:return e}}),c=n[r];r=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),h(r)?n.showHidden=r:r&&t._extend(n,r),y(n.showHidden)&&(n.showHidden=!1),y(n.depth)&&(n.depth=2),y(n.colors)&&(n.colors=!1),y(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=c),l(n,e,n.depth)}function c(e,t){var r=o.styles[t];return r?"["+o.colors[r][0]+"m"+e+"["+o.colors[r][1]+"m":e}function u(e,t){return e}function l(e,r,n){if(e.customInspect&&r&&k(r.inspect)&&r.inspect!==t.inspect&&(!r.constructor||r.constructor.prototype!==r)){var i=r.inspect(n,e);return b(i)||(i=l(e,i,n)),i}var a=function(e,t){if(y(t))return e.stylize("undefined","undefined");if(b(t)){var r="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(r,"string")}if(g(t))return e.stylize(""+t,"number");if(h(t))return e.stylize(""+t,"boolean");if(m(t))return e.stylize("null","null")}(e,r);if(a)return a;var s=Object.keys(r),o=function(e){var t={};return e.forEach(function(e,r){t[e]=!0}),t}(s);if(e.showHidden&&(s=Object.getOwnPropertyNames(r)),I(r)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return d(r);if(0===s.length){if(k(r)){var c=r.name?": "+r.name:"";return e.stylize("[Function"+c+"]","special")}if(w(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(v(r))return e.stylize(Date.prototype.toString.call(r),"date");if(I(r))return d(r)}var u,T="",S=!1,C=["{","}"];(p(r)&&(S=!0,C=["[","]"]),k(r))&&(T=" [Function"+(r.name?": "+r.name:"")+"]");return w(r)&&(T=" "+RegExp.prototype.toString.call(r)),v(r)&&(T=" "+Date.prototype.toUTCString.call(r)),I(r)&&(T=" "+d(r)),0!==s.length||S&&0!=r.length?n<0?w(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special"):(e.seen.push(r),u=S?function(e,t,r,n,i){for(var a=[],s=0,o=t.length;s=0&&0,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0)>60)return r[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+r[1];return r[0]+t+" "+e.join(", ")+" "+r[1]}(u,T,C)):C[0]+T+C[1]}function d(e){return"["+Error.prototype.toString.call(e)+"]"}function f(e,t,r,n,i,a){var s,o,c;if((c=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]}).get?o=c.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):c.set&&(o=e.stylize("[Setter]","special")),F(n,i)||(s="["+i+"]"),o||(e.seen.indexOf(c.value)<0?(o=m(r)?l(e,c.value,null):l(e,c.value,r-1)).indexOf("\n")>-1&&(o=a?o.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+o.split("\n").map(function(e){return" "+e}).join("\n")):o=e.stylize("[Circular]","special")),y(s)){if(a&&i.match(/^\d+$/))return o;(s=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+o}function p(e){return Array.isArray(e)}function h(e){return"boolean"==typeof e}function m(e){return null===e}function g(e){return"number"==typeof e}function b(e){return"string"==typeof e}function y(e){return void 0===e}function w(e){return T(e)&&"[object RegExp]"===S(e)}function T(e){return"object"==typeof e&&null!==e}function v(e){return T(e)&&"[object Date]"===S(e)}function I(e){return T(e)&&("[object Error]"===S(e)||e instanceof Error)}function k(e){return"function"==typeof e}function S(e){return Object.prototype.toString.call(e)}function C(e){return e<10?"0"+e.toString(10):e.toString(10)}t.debuglog=function(r){if(y(a)&&(a=e.env.NODE_DEBUG||""),r=r.toUpperCase(),!s[r])if(new RegExp("\\b"+r+"\\b","i").test(a)){var n=e.pid;s[r]=function(){var e=t.format.apply(t,arguments);console.error("%s %d: %s",r,n,e)}}else s[r]=function(){};return s[r]},t.inspect=o,o.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},o.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=p,t.isBoolean=h,t.isNull=m,t.isNullOrUndefined=function(e){return null==e},t.isNumber=g,t.isString=b,t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=y,t.isRegExp=w,t.isObject=T,t.isDate=v,t.isError=I,t.isFunction=k,t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=r(504);var E=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function _(){var e=new Date,t=[C(e.getHours()),C(e.getMinutes()),C(e.getSeconds())].join(":");return[e.getDate(),E[e.getMonth()],t].join(" ")}function F(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.log=function(){console.log("%s - %s",_(),t.format.apply(t,arguments))},t.inherits=r(505),t._extend=function(e,t){if(!t||!T(t))return e;for(var r=Object.keys(t),n=r.length;n--;)e[r[n]]=t[r[n]];return e};var A="undefined"!=typeof Symbol?Symbol("util.promisify.custom"):void 0;function x(e,t){if(!e){var r=new Error("Promise was rejected with a falsy value");r.reason=e,e=r}return t(e)}t.promisify=function(e){if("function"!=typeof e)throw new TypeError('The "original" argument must be of type Function');if(A&&e[A]){var t;if("function"!=typeof(t=e[A]))throw new TypeError('The "util.promisify.custom" argument must be of type Function');return Object.defineProperty(t,A,{value:t,enumerable:!1,writable:!1,configurable:!0}),t}function t(){for(var t,r,n=new Promise(function(e,n){t=e,r=n}),i=[],a=0;a{"%%"!==e&&(n++,"%c"===e&&(i=n))}),t.splice(i,0,r)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&void 0!==n&&"env"in n&&(e=n.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],e.exports=r(507)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}).call(this,r(38))},function(e,t,r){e.exports=function(e){function t(e){let t=0;for(let r=0;r{if("%%"===r)return r;o++;const a=n.formatters[i];if("function"==typeof a){const n=e[o];r=a.call(t,n),e.splice(o,1),o--}return r}),n.formatArgs.call(t,e),(t.log||n.log).apply(t,e)}return s.namespace=e,s.enabled=n.enabled(e),s.useColors=n.useColors(),s.color=t(e),s.destroy=i,s.extend=a,"function"==typeof n.init&&n.init(s),n.instances.push(s),s}function i(){const e=n.instances.indexOf(this);return-1!==e&&(n.instances.splice(e,1),!0)}function a(e,t){const r=n(this.namespace+(void 0===t?":":t)+e);return r.log=this.log,r}function s(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return n.debug=n,n.default=n,n.coerce=function(e){return e instanceof Error?e.stack||e.message:e},n.disable=function(){const e=[...n.names.map(s),...n.skips.map(s).map(e=>"-"+e)].join(",");return n.enable(""),e},n.enable=function(e){let t;n.save(e),n.names=[],n.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(t=0;t{n[t]=e[t]}),n.instances=[],n.names=[],n.skips=[],n.formatters={},n.selectColor=t,n.enable(n.load()),n}},function(e,t){var r=1e3,n=60*r,i=60*n,a=24*i,s=7*a,o=365.25*a;function c(e,t,r,n){var i=t>=1.5*r;return Math.round(e/r)+" "+n+(i?"s":"")}e.exports=function(e,t){t=t||{};var u=typeof e;if("string"===u&&e.length>0)return function(e){if((e=String(e)).length>100)return;var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(!t)return;var c=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*o;case"weeks":case"week":case"w":return c*s;case"days":case"day":case"d":return c*a;case"hours":case"hour":case"hrs":case"hr":case"h":return c*i;case"minutes":case"minute":case"mins":case"min":case"m":return c*n;case"seconds":case"second":case"secs":case"sec":case"s":return c*r;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(e);if("number"===u&&isFinite(e))return t.long?function(e){var t=Math.abs(e);if(t>=a)return c(e,t,a,"day");if(t>=i)return c(e,t,i,"hour");if(t>=n)return c(e,t,n,"minute");if(t>=r)return c(e,t,r,"second");return e+" ms"}(e):function(e){var t=Math.abs(e);if(t>=a)return Math.round(e/a)+"d";if(t>=i)return Math.round(e/i)+"h";if(t>=n)return Math.round(e/n)+"m";if(t>=r)return Math.round(e/r)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(39);t.BufferTokenizer=class{constructor(e){this.buffer=e,this.position=0,this.fileSize=e.length}async readBuffer(e,t,r,n){return this.position=n||this.position,this.peekBuffer(e,t,r,this.position).then(e=>(this.position+=e,e))}async peekBuffer(e,t,r,i,a=!1){i=i||this.position,r||(r=e.length);const s=Math.min(this.buffer.length-i,r);if(!a&&s[...e].map(e=>e.charCodeAt(0));const r=(e,t,r)=>String.fromCharCode(...e.slice(t,r));t.readUInt64LE=(e,t=0)=>{let r=e[t],n=1,i=0;for(;++i<8;)n*=256,r+=e[t+i]*n;return r},t.tarHeaderChecksumMatches=e=>{if(e.length<512)return!1;let t=256,n=0;for(let r=0;r<148;r++){const i=e[r];t+=i,n+=128&i}for(let r=156;r<512;r++){const i=e[r];t+=i,n+=128&i}const i=parseInt(r(e,148,154),8);return i===t||i===t-(n<<1)},t.multiByteIndexOf=(t,r,n=0)=>{if(e&&e.isBuffer(t))return t.indexOf(e.from(r),n);const i=(e,t,r)=>{for(let n=1;n=0;){if(i(t,r,a))return a;a=t.indexOf(r[0],a+1)}return-1},t.uint8ArrayUtf8ByteString=r}).call(this,r(9).Buffer)},function(e,t,r){"use strict";e.exports={extensions:["jpg","png","apng","gif","webp","flif","cr2","orf","arw","dng","nef","rw2","raf","tif","bmp","jxr","psd","zip","tar","rar","gz","bz2","7z","dmg","mp4","mid","mkv","webm","mov","avi","wmv","mpg","mp2","mp3","m4a","oga","ogg","ogv","opus","flac","wav","spx","amr","pdf","epub","exe","swf","rtf","wasm","woff","woff2","eot","ttf","otf","ico","flv","ps","xz","sqlite","nes","crx","xpi","cab","deb","ar","rpm","Z","lz","msi","mxf","mts","blend","bpg","docx","pptx","xlsx","3gp","3g2","jp2","jpm","jpx","mj2","aif","qcp","odt","ods","odp","xml","mobi","heic","cur","ktx","ape","wv","wmv","wma","dcm","ics","glb","pcap","dsf","lnk","alias","voc","ac3","m4v","m4p","m4b","f4v","f4p","f4b","f4a"],mimeTypes:["image/jpeg","image/png","image/gif","image/webp","image/flif","image/x-canon-cr2","image/tiff","image/bmp","image/vnd.ms-photo","image/vnd.adobe.photoshop","application/epub+zip","application/x-xpinstall","application/vnd.oasis.opendocument.text","application/vnd.oasis.opendocument.spreadsheet","application/vnd.oasis.opendocument.presentation","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/zip","application/x-tar","application/x-rar-compressed","application/gzip","application/x-bzip2","application/x-7z-compressed","application/x-apple-diskimage","video/mp4","audio/midi","video/x-matroska","video/webm","video/quicktime","video/vnd.avi","audio/vnd.wave","audio/qcelp","audio/x-ms-wma","video/x-ms-asf","application/vnd.ms-asf","video/mpeg","video/3gpp","audio/mpeg","audio/mp4","audio/opus","video/ogg","audio/ogg","application/ogg","audio/x-flac","audio/ape","audio/wavpack","audio/amr","application/pdf","application/x-msdownload","application/x-shockwave-flash","application/rtf","application/wasm","font/woff","font/woff2","application/vnd.ms-fontobject","font/ttf","font/otf","image/x-icon","video/x-flv","application/postscript","application/x-xz","application/x-sqlite3","application/x-nintendo-nes-rom","application/x-google-chrome-extension","application/vnd.ms-cab-compressed","application/x-deb","application/x-unix-archive","application/x-rpm","application/x-compress","application/x-lzip","application/x-msi","application/mxf","video/mp2t","application/x-blender","image/bpg","image/jp2","image/jpx","image/jpm","image/mj2","audio/aiff","application/xml","application/x-mobipocket-ebook","image/heif","image/heif-sequence","image/heic","image/heic-sequence","image/ktx","application/dicom","audio/x-musepack","text/calendar","model/gltf-binary","application/vnd.tcpdump.pcap","audio/x-dsf","application/x.ms.shortcut","application/x.apple.alias","audio/x-voc","audio/vnd.dolby.dd-raw","audio/x-m4a"]}},function(e,t,r){"use strict";var n=/; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g,i=/^[\u000b\u0020-\u007e\u0080-\u00ff]+$/,a=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,s=/\\([\u000b\u0020-\u00ff])/g,o=/([\\"])/g,c=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;function u(e){var t=String(e);if(a.test(t))return t;if(t.length>0&&!i.test(t))throw new TypeError("invalid parameter value");return'"'+t.replace(o,"\\$1")+'"'}function l(e){this.parameters=Object.create(null),this.type=e}t.format=function(e){if(!e||"object"!=typeof e)throw new TypeError("argument obj is required");var t=e.parameters,r=e.type;if(!r||!c.test(r))throw new TypeError("invalid type");var n=r;if(t&&"object"==typeof t)for(var i,s=Object.keys(t).sort(),o=0;o{if("%%"===r)return r;o++;const a=n.formatters[i];if("function"==typeof a){const n=e[o];r=a.call(t,n),e.splice(o,1),o--}return r}),n.formatArgs.call(t,e),(t.log||n.log).apply(t,e)}return s.namespace=e,s.enabled=n.enabled(e),s.useColors=n.useColors(),s.color=t(e),s.destroy=i,s.extend=a,"function"==typeof n.init&&n.init(s),n.instances.push(s),s}function i(){const e=n.instances.indexOf(this);return-1!==e&&(n.instances.splice(e,1),!0)}function a(e,t){const r=n(this.namespace+(void 0===t?":":t)+e);return r.log=this.log,r}function s(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return n.debug=n,n.default=n,n.coerce=function(e){return e instanceof Error?e.stack||e.message:e},n.disable=function(){const e=[...n.names.map(s),...n.skips.map(s).map(e=>"-"+e)].join(",");return n.enable(""),e},n.enable=function(e){let t;n.save(e),n.names=[],n.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(t=0;t{n[t]=e[t]}),n.instances=[],n.names=[],n.skips=[],n.formatters={},n.selectColor=t,n.enable(n.load()),n}},function(e,t){var r=1e3,n=60*r,i=60*n,a=24*i,s=7*a,o=365.25*a;function c(e,t,r,n){var i=t>=1.5*r;return Math.round(e/r)+" "+n+(i?"s":"")}e.exports=function(e,t){t=t||{};var u=typeof e;if("string"===u&&e.length>0)return function(e){if((e=String(e)).length>100)return;var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(!t)return;var c=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*o;case"weeks":case"week":case"w":return c*s;case"days":case"day":case"d":return c*a;case"hours":case"hour":case"hrs":case"hr":case"h":return c*i;case"minutes":case"minute":case"mins":case"min":case"m":return c*n;case"seconds":case"second":case"secs":case"sec":case"s":return c*r;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(e);if("number"===u&&isFinite(e))return t.long?function(e){var t=Math.abs(e);if(t>=a)return c(e,t,a,"day");if(t>=i)return c(e,t,i,"hour");if(t>=n)return c(e,t,n,"minute");if(t>=r)return c(e,t,r,"second");return e+" ms"}(e):function(e){var t=Math.abs(e);if(t>=a)return Math.round(e/a)+"d";if(t>=i)return Math.round(e/i)+"h";if(t>=n)return Math.round(e/n)+"m";if(t>=r)return Math.round(e/r)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(7),i=r(518),a=r(519),s=r(35),o=r(14),c=n("music-metadata:collector"),u=["APEv2","vorbis","ID3v2.4","ID3v2.3","ID3v2.2","exif","asf","iTunes","ID3v1"];function l(e){return e.length>2?e.slice(0,e.length-1).join(", ")+" & "+e[e.length-1]:e.join(" & ")}t.MetadataCollector=class{constructor(e){this.opts=e,this.format={tagTypes:[]},this.native={},this.common={track:{no:null,of:null},disk:{no:null,of:null}},this.commonOrigin={},this.originPriority={},this.tagMapper=new a.CombinedTagMapper;let t=1;for(const e of u)this.originPriority[e]=t++;this.originPriority.artificial=500,this.originPriority.id3v1=600}hasAny(){for(const e in this.native)return!0;return!1}setFormat(e,t){c(`format: ${e} = ${t}`),this.format[e]=t,this.opts.observer&&this.opts.observer({metadata:this,tag:{type:"format",id:e,value:t}})}addTag(e,t,r){c(`tag ${e}.${t} = ${r}`),this.native[e]||(this.format.tagTypes.push(e),this.native[e]=[]),this.native[e].push({id:t,value:r}),this.toCommon(e,t,r)}getNativeMetadata(){return{format:this.format,native:this.native}}postMap(e,t){switch(t.id){case"artist":if(this.commonOrigin.artist===this.originPriority[e])return this.postMap("artificial",{id:"artists",value:t.value});this.common.artists||this.setGenericTag("artificial",{id:"artists",value:t.value});break;case"artists":if(!(this.common.artist&&this.commonOrigin.artist!==this.originPriority.artificial||this.common.artists&&-1!==this.common.artists.indexOf(t.value))){const e={id:"artist",value:l((this.common.artists||[]).concat([t.value]))};this.setGenericTag("artificial",e)}break;case"genre":t.value=s.CommonTagMapper.parseGenre(t.value);break;case"picture":t.value.format=s.CommonTagMapper.fixPictureMimeType(t.value.format);break;case"totaltracks":return void(this.common.track.of=s.CommonTagMapper.toIntOrNull(t.value));case"totaldiscs":return void(this.common.disk.of=s.CommonTagMapper.toIntOrNull(t.value));case"track":case"disk":const r=this.common[t.id].of;return this.common[t.id]=s.CommonTagMapper.normalizeTrack(t.value),void(this.common[t.id].of=null!=r?r:this.common[t.id].of);case"year":case"originalyear":t.value=parseInt(t.value,10);break;case"date":const n=parseInt(t.value.substr(0,4),10);n&&!isNaN(n)&&(this.common.year=n);break;case"discogs_label_id":case"discogs_release_id":case"discogs_master_release_id":case"discogs_artist_id":case"discogs_votes":t.value="string"==typeof t.value?parseInt(t.value,10):t.value;break;case"replaygain_track_gain":case"replaygain_track_peak":t.value=o.toRatio(t.value);break;case"gapless":t.value="1"===t.value}this.setGenericTag(e,t)}toCommonMetadata(){return{format:this.format,native:this.opts.native?this.native:void 0,common:this.common}}toCommon(e,t,r){const n={id:t,value:r},i=this.tagMapper.mapTag(e,n);i&&this.postMap(e,i)}setGenericTag(e,t){c(`common.${t.id} = ${t.value}`);const r=this.commonOrigin[t.id]||1e3,n=this.originPriority[e];if(i.isSingleton(t.id)){if(!(n<=r))return c(`Ignore native tag (singleton): ${e}.${t.id} = ${t.value}`);this.common[t.id]=t.value,this.commonOrigin[t.id]=n}else if(n===r)i.isUnique(t.id)&&-1!==this.common[t.id].indexOf(t.value)?c(`Ignore duplicate value: ${e}.${t.id} = ${t.value}`):this.common[t.id].push(t.value);else{if(!(n{this.registerTagMapper(e)})}mapTag(e,t){if(this.tagMappers[e])return this.tagMappers[e].mapGenericTag(t);throw new Error("No generic tag mapper defined for tag-format: "+e)}registerTagMapper(e){for(const t of e.tagTypes)this.tagMappers[t]=e}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35),i={title:"title",artist:"artist",album:"album",year:"year",comment:"comment",track:"track",genre:"genre"};t.ID3v1TagMapper=class extends n.CommonTagMapper{constructor(){super(["ID3v1"],i)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});class n{static decode(e){let t="";for(const r in e)e.hasOwnProperty(r)&&(t+=n.codePointToString(n.singleByteDecoder(e[r])));return t}static inRange(e,t,r){return t<=e&&e<=r}static codePointToString(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}static singleByteDecoder(e){if(n.inRange(e,0,127))return e;const t=n.windows1252[e-128];if(null===t)throw Error("invaliding encoding");return t}}n.windows1252=[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],t.Windows1292Decoder=n},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35),i=r(14),a={TIT2:"title",TPE1:"artist","TXXX:Artists":"artists",TPE2:"albumartist",TALB:"album",TDRV:"date",TORY:"originalyear",TPOS:"disk",TCON:"genre",APIC:"picture",TCOM:"composer","USLT:description":"lyrics",TSOA:"albumsort",TSOT:"titlesort",TOAL:"originalalbum",TSOP:"artistsort",TSO2:"albumartistsort",TSOC:"composersort",TEXT:"lyricist","TXXX:Writer":"writer",TPE3:"conductor",TPE4:"remixer","IPLS:arranger":"arranger","IPLS:engineer":"engineer","IPLS:producer":"producer","IPLS:DJ-mix":"djmixer","IPLS:mix":"mixer",TPUB:"label",TIT1:"grouping",TIT3:"subtitle",TRCK:"track",TCMP:"compilation",POPM:"rating",TBPM:"bpm",TMED:"media","TXXX:CATALOGNUMBER":"catalognumber","TXXX:MusicBrainz Album Status":"releasestatus","TXXX:MusicBrainz Album Type":"releasetype","TXXX:MusicBrainz Album Release Country":"releasecountry","TXXX:RELEASECOUNTRY":"releasecountry","TXXX:SCRIPT":"script",TLAN:"language",TCOP:"copyright",WCOP:"license",TENC:"encodedby",TSSE:"encodersettings","TXXX:BARCODE":"barcode",TSRC:"isrc","TXXX:ASIN":"asin","TXXX:originalyear":"originalyear","UFID:http://musicbrainz.org":"musicbrainz_recordingid","TXXX:MusicBrainz Release Track Id":"musicbrainz_trackid","TXXX:MusicBrainz Album Id":"musicbrainz_albumid","TXXX:MusicBrainz Artist Id":"musicbrainz_artistid","TXXX:MusicBrainz Album Artist Id":"musicbrainz_albumartistid","TXXX:MusicBrainz Release Group Id":"musicbrainz_releasegroupid","TXXX:MusicBrainz Work Id":"musicbrainz_workid","TXXX:MusicBrainz TRM Id":"musicbrainz_trmid","TXXX:MusicBrainz Disc Id":"musicbrainz_discid","TXXX:ACOUSTID_ID":"acoustid_id","TXXX:Acoustid Id":"acoustid_id","TXXX:Acoustid Fingerprint":"acoustid_fingerprint","TXXX:MusicIP PUID":"musicip_puid","TXXX:MusicMagic Fingerprint":"musicip_fingerprint",WOAR:"website",TDRC:"date",TYER:"year",TDOR:"originaldate","TIPL:arranger":"arranger","TIPL:engineer":"engineer","TIPL:producer":"producer","TIPL:DJ-mix":"djmixer","TIPL:mix":"mixer",TMOO:"mood",SYLT:"lyrics",TSST:"discsubtitle",TKEY:"key",COMM:"comment",TOPE:"originalartist","PRIV:AverageLevel":"averageLevel","PRIV:PeakLevel":"peakLevel","TXXX:DISCOGS_ARTIST_ID":"discogs_artist_id","TXXX:DISCOGS_ARTISTS":"artists","TXXX:DISCOGS_ARTIST_NAME":"artists","TXXX:DISCOGS_ALBUM_ARTISTS":"albumartist","TXXX:DISCOGS_CATALOG":"catalognumber","TXXX:DISCOGS_COUNTRY":"releasecountry","TXXX:DISCOGS_DATE":"originaldate","TXXX:DISCOGS_LABEL":"label","TXXX:DISCOGS_LABEL_ID":"discogs_label_id","TXXX:DISCOGS_MASTER_RELEASE_ID":"discogs_master_release_id","TXXX:DISCOGS_RATING":"discogs_rating","TXXX:DISCOGS_RELEASED":"date","TXXX:DISCOGS_RELEASE_ID":"discogs_release_id","TXXX:DISCOGS_VOTES":"discogs_votes","TXXX:CATALOGID":"catalognumber","TXXX:STYLE":"genre","TXXX:replaygain_track_peak":"replaygain_track_peak","TXXX:replaygain_track_gain":"replaygain_track_gain"};class s extends n.CommonTagMapper{static toRating(e){return{source:e.email,rating:e.rating>0?(e.rating-1)/254*n.CommonTagMapper.maxRatingScore:void 0}}constructor(){super(["ID3v2.3","ID3v2.4"],a)}postMap(e){switch(e.id){case"UFID":"http://musicbrainz.org"===e.value.owner_identifier&&(e.id+=":"+e.value.owner_identifier,e.value=i.default.decodeString(e.value.identifier,"iso-8859-1"));break;case"PRIV":switch(e.value.owner_identifier){case"AverageLevel":case"PeakValue":e.id+=":"+e.value.owner_identifier,e.value=4===e.value.data.length?e.value.data.readUInt32LE(0):null}break;case"COMM":e.value=e.value?e.value.text:null;break;case"POPM":e.value=s.toRating(e.value)}}}t.ID3v24TagMapper=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35),i={Title:"title",Author:"artist","WM/AlbumArtist":"albumartist","WM/AlbumTitle":"album","WM/Year":"date","WM/OriginalReleaseTime":"originaldate","WM/OriginalReleaseYear":"originalyear",Description:"comment","WM/TrackNumber":"track","WM/PartOfSet":"disk","WM/Genre":"genre","WM/Composer":"composer","WM/Lyrics":"lyrics","WM/AlbumSortOrder":"albumsort","WM/TitleSortOrder":"titlesort","WM/ArtistSortOrder":"artistsort","WM/AlbumArtistSortOrder":"albumartistsort","WM/ComposerSortOrder":"composersort","WM/Writer":"lyricist","WM/Conductor":"conductor","WM/ModifiedBy":"remixer","WM/Engineer":"engineer","WM/Producer":"producer","WM/DJMixer":"djmixer","WM/Mixer":"mixer","WM/Publisher":"label","WM/ContentGroupDescription":"grouping","WM/SubTitle":"subtitle","WM/SetSubTitle":"discsubtitle","WM/IsCompilation":"compilation","WM/SharedUserRating":"rating","WM/BeatsPerMinute":"bpm","WM/Mood":"mood","WM/Media":"media","WM/CatalogNo":"catalognumber","MusicBrainz/Album Status":"releasestatus","MusicBrainz/Album Type":"releasetype","MusicBrainz/Album Release Country":"releasecountry","WM/Script":"script","WM/Language":"language",Copyright:"copyright",LICENSE:"license","WM/EncodedBy":"encodedby","WM/EncodingSettings":"encodersettings","WM/Barcode":"barcode","WM/ISRC":"isrc","MusicBrainz/Track Id":"musicbrainz_recordingid","MusicBrainz/Release Track Id":"musicbrainz_trackid","MusicBrainz/Album Id":"musicbrainz_albumid","MusicBrainz/Artist Id":"musicbrainz_artistid","MusicBrainz/Album Artist Id":"musicbrainz_albumartistid","MusicBrainz/Release Group Id":"musicbrainz_releasegroupid","MusicBrainz/Work Id":"musicbrainz_workid","MusicBrainz/TRM Id":"musicbrainz_trmid","MusicBrainz/Disc Id":"musicbrainz_discid","Acoustid/Id":"acoustid_id","Acoustid/Fingerprint":"acoustid_fingerprint","MusicIP/PUID":"musicip_puid","WM/ARTISTS":"artists","WM/InitialKey":"key",ASIN:"asin","WM/Work":"work","WM/AuthorURL":"website","WM/Picture":"picture"};class a extends n.CommonTagMapper{static toRating(e){return{rating:parseFloat(e+1)/5}}constructor(){super(["asf"],i)}postMap(e){switch(e.id){case"WM/SharedUserRating":const t=e.id.split(":");e.value=a.toRating(e.value),e.id=t[0]}}}t.AsfTagMapper=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35);t.id3v22TagMap={TT2:"title",TP1:"artist",TP2:"albumartist",TAL:"album",TYE:"year",COM:"comment",TRK:"track",TPA:"disk",TCO:"genre",PIC:"picture",TCM:"composer",TOR:"originaldate",TOT:"work",TXT:"lyricist",TP3:"conductor",TPB:"label",TT1:"grouping",TT3:"subtitle",TLA:"language",TCR:"copyright",WCP:"license",TEN:"encodedby",TSS:"encodersettings",WAR:"website","COM:iTunPGAP":"gapless"};t.ID3v22TagMapper=class extends n.CommonTagMapper{constructor(){super(["ID3v2.2"],t.id3v22TagMap)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35),i={Title:"title",Artist:"artist",Artists:"artists","Album Artist":"albumartist",Album:"album",Year:"date",Originalyear:"originalyear",Originaldate:"originaldate",Comment:"comment",Track:"track",Disc:"disk",DISCNUMBER:"disk",Genre:"genre","Cover Art (Front)":"picture","Cover Art (Back)":"picture",Composer:"composer",Lyrics:"lyrics",ALBUMSORT:"albumsort",TITLESORT:"titlesort",WORK:"work",ARTISTSORT:"artistsort",ALBUMARTISTSORT:"albumartistsort",COMPOSERSORT:"composersort",Lyricist:"lyricist",Writer:"writer",Conductor:"conductor",MixArtist:"remixer",Arranger:"arranger",Engineer:"engineer",Producer:"producer",DJMixer:"djmixer",Mixer:"mixer",Label:"label",Grouping:"grouping",Subtitle:"subtitle",DiscSubtitle:"discsubtitle",Compilation:"compilation",BPM:"bpm",Mood:"mood",Media:"media",CatalogNumber:"catalognumber",MUSICBRAINZ_ALBUMSTATUS:"releasestatus",MUSICBRAINZ_ALBUMTYPE:"releasetype",RELEASECOUNTRY:"releasecountry",Script:"script",Language:"language",Copyright:"copyright",LICENSE:"license",EncodedBy:"encodedby",EncoderSettings:"encodersettings",Barcode:"barcode",ISRC:"isrc",ASIN:"asin",musicbrainz_trackid:"musicbrainz_recordingid",musicbrainz_releasetrackid:"musicbrainz_trackid",MUSICBRAINZ_ALBUMID:"musicbrainz_albumid",MUSICBRAINZ_ARTISTID:"musicbrainz_artistid",MUSICBRAINZ_ALBUMARTISTID:"musicbrainz_albumartistid",MUSICBRAINZ_RELEASEGROUPID:"musicbrainz_releasegroupid",MUSICBRAINZ_WORKID:"musicbrainz_workid",MUSICBRAINZ_TRMID:"musicbrainz_trmid",MUSICBRAINZ_DISCID:"musicbrainz_discid",Acoustid_Id:"acoustid_id",ACOUSTID_FINGERPRINT:"acoustid_fingerprint",MUSICIP_PUID:"musicip_puid",Weblink:"website"};t.APEv2TagMapper=class extends n.CommonTagMapper{constructor(){const e={};for(const t in i)e[t.toUpperCase()]=i[t];super(["APEv2"],e)}getCommonName(e){return this.tagMap[e.toUpperCase()]}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35),i={"©nam":"title","©ART":"artist",aART:"albumartist","----:com.apple.iTunes:Band":"albumartist","©alb":"album","©day":"date","©cmt":"comment",trkn:"track",disk:"disk","©gen":"genre",covr:"picture","©wrt":"composer","©lyr":"lyrics",soal:"albumsort",sonm:"titlesort",soar:"artistsort",soaa:"albumartistsort",soco:"composersort","----:com.apple.iTunes:LYRICIST":"lyricist","----:com.apple.iTunes:CONDUCTOR":"conductor","----:com.apple.iTunes:REMIXER":"remixer","----:com.apple.iTunes:ENGINEER":"engineer","----:com.apple.iTunes:PRODUCER":"producer","----:com.apple.iTunes:DJMIXER":"djmixer","----:com.apple.iTunes:MIXER":"mixer","----:com.apple.iTunes:LABEL":"label","©grp":"grouping","----:com.apple.iTunes:SUBTITLE":"subtitle","----:com.apple.iTunes:DISCSUBTITLE":"discsubtitle",cpil:"compilation",tmpo:"bpm","----:com.apple.iTunes:MOOD":"mood","----:com.apple.iTunes:MEDIA":"media","----:com.apple.iTunes:CATALOGNUMBER":"catalognumber",tvsh:"tvShow",tvsn:"tvSeason",tves:"tvEpisode",sosn:"tvShowSort",tven:"tvEpisodeId",tvnn:"tvNetwork",pcst:"podcast",purl:"podcasturl","----:com.apple.iTunes:MusicBrainz Album Status":"releasestatus","----:com.apple.iTunes:MusicBrainz Album Type":"releasetype","----:com.apple.iTunes:MusicBrainz Album Release Country":"releasecountry","----:com.apple.iTunes:SCRIPT":"script","----:com.apple.iTunes:LANGUAGE":"language",cprt:"copyright","----:com.apple.iTunes:LICENSE":"license","©too":"encodedby",pgap:"gapless","----:com.apple.iTunes:BARCODE":"barcode","----:com.apple.iTunes:ISRC":"isrc","----:com.apple.iTunes:ASIN":"asin","----:com.apple.iTunes:NOTES":"comment","----:com.apple.iTunes:MusicBrainz Track Id":"musicbrainz_recordingid","----:com.apple.iTunes:MusicBrainz Release Track Id":"musicbrainz_trackid","----:com.apple.iTunes:MusicBrainz Album Id":"musicbrainz_albumid","----:com.apple.iTunes:MusicBrainz Artist Id":"musicbrainz_artistid","----:com.apple.iTunes:MusicBrainz Album Artist Id":"musicbrainz_albumartistid","----:com.apple.iTunes:MusicBrainz Release Group Id":"musicbrainz_releasegroupid","----:com.apple.iTunes:MusicBrainz Work Id":"musicbrainz_workid","----:com.apple.iTunes:MusicBrainz TRM Id":"musicbrainz_trmid","----:com.apple.iTunes:MusicBrainz Disc Id":"musicbrainz_discid","----:com.apple.iTunes:Acoustid Id":"acoustid_id","----:com.apple.iTunes:Acoustid Fingerprint":"acoustid_fingerprint","----:com.apple.iTunes:MusicIP PUID":"musicip_puid","----:com.apple.iTunes:fingerprint":"musicip_fingerprint",gnre:"genre","----:com.apple.iTunes:ALBUMARTISTSORT":"albumartistsort","----:com.apple.iTunes:ARTISTS":"artists","----:com.apple.iTunes:ORIGINALDATE":"originaldate","----:com.apple.iTunes:ORIGINALYEAR":"originalyear",desc:"description",ldes:"description"};t.tagType="iTunes";t.MP4TagMapper=class extends n.CommonTagMapper{constructor(){super([t.tagType],i)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35),i={TITLE:"title",ARTIST:"artist",ARTISTS:"artists",ALBUMARTIST:"albumartist",ALBUM:"album",DATE:"date",ORIGINALDATE:"originaldate",ORIGINALYEAR:"originalyear",COMMENT:"comment",TRACKNUMBER:"track",DISCNUMBER:"disk",GENRE:"genre",METADATA_BLOCK_PICTURE:"picture",COMPOSER:"composer",LYRICS:"lyrics",ALBUMSORT:"albumsort",TITLESORT:"titlesort",WORK:"work",ARTISTSORT:"artistsort",ALBUMARTISTSORT:"albumartistsort",COMPOSERSORT:"composersort",LYRICIST:"lyricist",WRITER:"writer",CONDUCTOR:"conductor",REMIXER:"remixer",ARRANGER:"arranger",ENGINEER:"engineer",PRODUCER:"producer",DJMIXER:"djmixer",MIXER:"mixer",LABEL:"label",GROUPING:"grouping",SUBTITLE:"subtitle",DISCSUBTITLE:"discsubtitle",TRACKTOTAL:"totaltracks",DISCTOTAL:"totaldiscs",COMPILATION:"compilation",RATING:"rating",BPM:"bpm",MOOD:"mood",MEDIA:"media",CATALOGNUMBER:"catalognumber",RELEASESTATUS:"releasestatus",RELEASETYPE:"releasetype",RELEASECOUNTRY:"releasecountry",SCRIPT:"script",LANGUAGE:"language",COPYRIGHT:"copyright",LICENSE:"license",ENCODEDBY:"encodedby",ENCODERSETTINGS:"encodersettings",BARCODE:"barcode",ISRC:"isrc",ASIN:"asin",MUSICBRAINZ_TRACKID:"musicbrainz_recordingid",MUSICBRAINZ_RELEASETRACKID:"musicbrainz_trackid",MUSICBRAINZ_ALBUMID:"musicbrainz_albumid",MUSICBRAINZ_ARTISTID:"musicbrainz_artistid",MUSICBRAINZ_ALBUMARTISTID:"musicbrainz_albumartistid",MUSICBRAINZ_RELEASEGROUPID:"musicbrainz_releasegroupid",MUSICBRAINZ_WORKID:"musicbrainz_workid",MUSICBRAINZ_TRMID:"musicbrainz_trmid",MUSICBRAINZ_DISCID:"musicbrainz_discid",ACOUSTID_ID:"acoustid_id",ACOUSTID_ID_FINGERPRINT:"acoustid_fingerprint",MUSICIP_PUID:"musicip_puid",WEBSITE:"website",NOTES:"notes",TOTALTRACKS:"totaltracks",TOTALDISCS:"totaldiscs",DISCOGS_ARTIST_ID:"discogs_artist_id",DISCOGS_ARTISTS:"artists",DISCOGS_ARTIST_NAME:"artists",DISCOGS_ALBUM_ARTISTS:"albumartist",DISCOGS_CATALOG:"catalognumber",DISCOGS_COUNTRY:"releasecountry",DISCOGS_DATE:"originaldate",DISCOGS_LABEL:"label",DISCOGS_LABEL_ID:"discogs_label_id",DISCOGS_MASTER_RELEASE_ID:"discogs_master_release_id",DISCOGS_RATING:"discogs_rating",DISCOGS_RELEASED:"date",DISCOGS_RELEASE_ID:"discogs_release_id",DISCOGS_VOTES:"discogs_votes",CATALOGID:"catalognumber",STYLE:"genre",REPLAYGAIN_TRACK_GAIN:"replaygain_track_gain",REPLAYGAIN_TRACK_PEAK:"replaygain_track_peak"};class a extends n.CommonTagMapper{static toRating(e,t){return{source:e?e.toLowerCase():e,rating:parseFloat(t)*n.CommonTagMapper.maxRatingScore}}constructor(){super(["vorbis"],i)}postMap(e){if(0===e.id.indexOf("RATING:")){const t=e.id.split(":");e.value=a.toRating(t[1],e.value),e.id=t[0]}}}t.VorbisTagMapper=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35);t.riffInfoTagMap={IART:"artist",ICRD:"date",INAM:"title",TITL:"title",IPRD:"album",ITRK:"track",COMM:"comment",ICMT:"comment",ICNT:"releasecountry",GNRE:"genre",IWRI:"writer",RATE:"rating",YEAR:"year",ISFT:"encodedby",CODE:"encodedby",TURL:"website",IGNR:"genre",IENG:"engineer",ITCH:"technician",IMED:"media",IRPD:"album"};t.RiffInfoTagMapper=class extends n.CommonTagMapper{constructor(){super(["exif"],t.riffInfoTagMap)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(7),a=r(39),s=r(79),o=r(64),c=r(16),u=r(23),l=r(531),d=r(532),f=r(113),p=i("music-metadata:parser:aiff");t.AIFFParser=class extends u.BasicParser{async parse(){if("FORM"!==(await this.tokenizer.readToken(d.Header)).chunkID)throw new Error("Invalid Chunk-ID, expected 'FORM'");const e=await this.tokenizer.readToken(c.FourCcToken);switch(e){case"AIFF":this.metadata.setFormat("container",e),this.isCompressed=!1;break;case"AIFC":this.metadata.setFormat("container","AIFF-C"),this.isCompressed=!0;break;default:throw Error("Unsupported AIFF type: "+e)}this.metadata.setFormat("lossless",!this.isCompressed);try{for(;;){const e=await this.tokenizer.readToken(d.Header);p(`Chunk id=${e.chunkID}`);const t=2*Math.round(e.chunkSize/2),r=await this.readData(e);await this.tokenizer.ignore(t-r)}}catch(e){if(e.message!==a.endOfFile)throw e}}async readData(e){switch(e.chunkID){case"COMM":const t=await this.tokenizer.readToken(new l.Common(e,this.isCompressed));return this.metadata.setFormat("bitsPerSample",t.sampleSize),this.metadata.setFormat("sampleRate",t.sampleRate),this.metadata.setFormat("numberOfChannels",t.numChannels),this.metadata.setFormat("numberOfSamples",t.numSampleFrames),this.metadata.setFormat("duration",t.numSampleFrames/t.sampleRate),this.metadata.setFormat("codec",t.compressionName),e.chunkSize;case"ID3 ":const r=await this.tokenizer.readToken(new n.BufferType(e.chunkSize)),i=new f.ID3Stream(r),a=s.fromStream(i);return await(new o.ID3v2Parser).parse(this.metadata,a,this.options),e.chunkSize;case"SSND":return this.metadata.format.duration&&this.metadata.setFormat("bitrate",8*e.chunkSize/this.metadata.format.duration),0;default:return 0}}}},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(7),i=r(2),a=r(14),s=r(65),o=n("music-metadata:id3v2:frame-parser"),c="iso-8859-1";class u{static readData(t,r,n,l){const{encoding:d,bom:f}=s.TextEncodingToken.get(t,0),p=t.length;let h=0,m=[];const g=u.getNullTerminatorLength(d);let b;const y={};switch(o(`Parsing tag type=${r}, encoding=${d}, bom=${f}`),"TXXX"!==r&&"T"===r[0]?"T*":r){case"T*":case"IPLS":const w=a.default.decodeString(t.slice(1),d).replace(/\x00+$/,"");switch(r){case"TMCL":case"TIPL":case"IPLS":m=u.splitValue(4,w),m=u.functionList(m);break;case"TRK":case"TRCK":case"TPOS":m=w;break;case"TCOM":case"TEXT":case"TOLY":case"TOPE":case"TPE1":case"TSRC":m=u.splitValue(n,w);break;default:m=n>=4?u.splitValue(n,w):[w]}break;case"TXXX":m={description:(m=u.readIdentifierAndData(t,h+1,p,d)).id,text:u.splitValue(n,a.default.decodeString(m.data,d).replace(/\x00+$/,""))};break;case"PIC":case"APIC":if(l){const r={};switch(h+=1,n){case 2:r.format=a.default.decodeString(t.slice(h,h+3),d),h+=3;break;case 3:case 4:b=a.default.findZero(t,h,p,c),r.format=a.default.decodeString(t.slice(h,b),c),h=b+1;break;default:throw new Error("Warning: unexpected major versionIndex: "+n)}r.format=u.fixPictureMimeType(r.format),r.type=s.AttachedPictureType[t[h]],h+=1,b=a.default.findZero(t,h,p,d),r.description=a.default.decodeString(t.slice(h,b),d),h=b+g,r.data=e.from(t.slice(h,p)),m=r}break;case"CNT":case"PCNT":m=i.UINT32_BE.get(t,0);break;case"SYLT":for(h+=7,m=[];h=5?t.readUInt32BE(h+1):void 0};break;case"GEOB":{b=a.default.findZero(t,h+1,p,d);const e=a.default.decodeString(t.slice(h+1,b),c);h=b+1,b=a.default.findZero(t,h,p-h,d);const r=a.default.decodeString(t.slice(h+1,b),c);h=b+1,b=a.default.findZero(t,h,p-h,d),m={type:e,filename:r,description:a.default.decodeString(t.slice(h+1,b),c),data:t.slice(h+1,p)};break}case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":m=a.default.decodeString(t.slice(h,b),d);break;case"WXXX":{b=a.default.findZero(t,h+1,p,d);const e=a.default.decodeString(t.slice(h+1,b),c);h=b+1,m={description:e,url:a.default.decodeString(t.slice(h,p-h),d)};break}case"MCDI":m=t.slice(0,p);break;default:o("Warning: unsupported id3v2-tag-type: "+r)}return m}static fixPictureMimeType(e){switch(e=e.toLocaleLowerCase()){case"jpg":return"image/jpeg";case"png":return"image/png"}return e}static functionList(e){const t={};for(let r=0;r+1=4?/\x00/g:/\//g);return u.trimArray(r)}static trimArray(e){for(let t=0;t=r,`COMMON CHUNK size should always be at least ${r}`),this.len=e.chunkSize}get(e,t){const r=e.readUInt16BE(t+8)-16398,i=e.readUInt16BE(t+8+2),s={numChannels:e.readUInt16BE(t),numSampleFrames:e.readUInt32BE(t+2),sampleSize:e.readUInt16BE(t+6),sampleRate:r<0?i>>Math.abs(r):i<22){const r=e.readInt8(t+22);if(23+r+(r+1)%2!==this.len)throw new Error("Illegal pstring length");s.compressionName=new n.StringType(r,"binary").get(e,t+23)}}else s.compressionName="PCM";return s}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(16);t.Header={len:8,get:(e,t)=>({chunkID:n.FourCcToken.get(e,t),chunkSize:e.readUInt32BE(t+4)})}},function(e,t){},function(e,t,r){"use strict";var n=r(116).Buffer,i=r(535);e.exports=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.head=null,this.tail=null,this.length=0}return e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return"";for(var t=this.head,r=""+t.data;t=t.next;)r+=e+t.data;return r},e.prototype.concat=function(e){if(0===this.length)return n.alloc(0);if(1===this.length)return this.head.data;for(var t,r,i,a=n.allocUnsafe(e>>>0),s=this.head,o=0;s;)t=s.data,r=a,i=o,t.copy(r,i),o+=s.data.length,s=s.next;return a},e}(),i&&i.inspect&&i.inspect.custom&&(e.exports.prototype[i.inspect.custom]=function(){var e=i.inspect({length:this.length});return this.constructor.name+" "+e})},function(e,t){},function(e,t,r){(function(e){var n=void 0!==e&&e||"undefined"!=typeof self&&self||window,i=Function.prototype.apply;function a(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new a(i.call(setTimeout,n,arguments),clearTimeout)},t.setInterval=function(){return new a(i.call(setInterval,n,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},a.prototype.unref=a.prototype.ref=function(){},a.prototype.close=function(){this._clearFn.call(n,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},r(537),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,r(24))},function(e,t,r){(function(e,t){!function(e,r){"use strict";if(!e.setImmediate){var n,i,a,s,o,c=1,u={},l=!1,d=e.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(e);f=f&&f.setTimeout?f:e,"[object process]"==={}.toString.call(e.process)?n=function(e){t.nextTick(function(){h(e)})}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,r=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=r,t}}()?e.MessageChannel?((a=new MessageChannel).port1.onmessage=function(e){h(e.data)},n=function(e){a.port2.postMessage(e)}):d&&"onreadystatechange"in d.createElement("script")?(i=d.documentElement,n=function(e){var t=d.createElement("script");t.onreadystatechange=function(){h(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):n=function(e){setTimeout(h,0,e)}:(s="setImmediate$"+Math.random()+"$",o=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(s)&&h(+t.data.slice(s.length))},e.addEventListener?e.addEventListener("message",o,!1):e.attachEvent("onmessage",o),n=function(t){e.postMessage(s+t,"*")}),f.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),r=0;r>1}}function s(e,t){return 0!=(e&1<({ID:i.FourCcToken.get(e,t),version:n.UINT32_LE.get(e,t+4)/1e3,descriptorBytes:n.UINT32_LE.get(e,t+8),headerBytes:n.UINT32_LE.get(e,t+12),seekTableBytes:n.UINT32_LE.get(e,t+16),headerDataBytes:n.UINT32_LE.get(e,t+20),apeFrameDataBytes:n.UINT32_LE.get(e,t+24),apeFrameDataBytesHigh:n.UINT32_LE.get(e,t+28),terminatingDataBytes:n.UINT32_LE.get(e,t+32),fileMD5:new n.BufferType(16).get(e,t+36)})},t.Header={len:24,get:(e,t)=>({compressionLevel:n.UINT16_LE.get(e,t),formatFlags:n.UINT16_LE.get(e,t+2),blocksPerFrame:n.UINT32_LE.get(e,t+4),finalFrameBlocks:n.UINT32_LE.get(e,t+8),totalFrames:n.UINT32_LE.get(e,t+12),bitsPerSample:n.UINT16_LE.get(e,t+16),channel:n.UINT16_LE.get(e,t+18),sampleRate:n.UINT32_LE.get(e,t+20)})},t.TagFooter={len:32,get:(e,t)=>({ID:new n.StringType(8,"ascii").get(e,t),version:n.UINT32_LE.get(e,t+8),size:n.UINT32_LE.get(e,t+12),fields:n.UINT32_LE.get(e,t+16),flags:a(n.UINT32_LE.get(e,t+20))})},t.TagItemHeader={len:8,get:(e,t)=>({size:n.UINT32_LE.get(e,t),flags:a(n.UINT32_LE.get(e,t+4))})},t.TagField=e=>new n.BufferType(e.size-t.TagFooter.len),t.parseTagFlags=a,t.isBitSet=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(162),i=r(547),a=r(7),s=r(23),o=a("music-metadata:parser:ASF"),c="asf";t.AsfParser=class extends s.BasicParser{async parse(){const e=await this.tokenizer.readToken(i.TopLevelHeaderObjectToken);if(!e.objectId.equals(n.default.HeaderObject))throw new Error("expected asf header; but was not found; got: "+e.objectId.str);try{await this.parseObjectHeader(e.numberOfHeaderObjects)}catch(e){o("Error while parsing ASF: %s",e)}}async parseObjectHeader(e){let t;do{const e=await this.tokenizer.readToken(i.HeaderObjectToken);switch(o("header GUID=%s",e.objectId.str),e.objectId.str){case i.FilePropertiesObject.guid.str:const r=await this.tokenizer.readToken(new i.FilePropertiesObject(e));this.metadata.setFormat("duration",r.playDuration/1e7),this.metadata.setFormat("bitrate",r.maximumBitrate);break;case i.StreamPropertiesObject.guid.str:const a=await this.tokenizer.readToken(new i.StreamPropertiesObject(e));this.metadata.setFormat("container","ASF/"+a.streamType);break;case i.HeaderExtensionObject.guid.str:const s=await this.tokenizer.readToken(new i.HeaderExtensionObject);await this.parseExtensionObject(s.extensionDataSize);break;case i.ContentDescriptionObjectState.guid.str:t=await this.tokenizer.readToken(new i.ContentDescriptionObjectState(e)),this.addTags(t);break;case i.ExtendedContentDescriptionObjectState.guid.str:t=await this.tokenizer.readToken(new i.ExtendedContentDescriptionObjectState(e)),this.addTags(t);break;case n.default.CodecListObject.str:case n.default.StreamBitratePropertiesObject.str:await this.tokenizer.ignore(e.objectSize-i.HeaderObjectToken.len);break;case n.default.PaddingObject.str:o("Padding: %s bytes",e.objectSize-i.HeaderObjectToken.len),await this.tokenizer.ignore(e.objectSize-i.HeaderObjectToken.len);break;default:this.warnings.push("Ignore ASF-Object-GUID: "+e.objectId.str),o("Ignore ASF-Object-GUID: %s",e.objectId.str),await this.tokenizer.readToken(new i.IgnoreObjectState(e))}}while(--e)}addTags(e){e.forEach(e=>{this.metadata.addTag(c,e.id,e.value)})}async parseExtensionObject(e){do{const t=await this.tokenizer.readToken(i.HeaderObjectToken);switch(t.objectId.str){case i.ExtendedStreamPropertiesObjectState.guid.str:await this.tokenizer.readToken(new i.ExtendedStreamPropertiesObjectState(t));break;case i.MetadataObjectState.guid.str:const e=await this.tokenizer.readToken(new i.MetadataObjectState(t));this.addTags(e);break;case i.MetadataLibraryObjectState.guid.str:const r=await this.tokenizer.readToken(new i.MetadataLibraryObjectState(t));this.addTags(r);break;case n.default.PaddingObject.str:await this.tokenizer.ignore(t.objectSize-i.HeaderObjectToken.len);break;case n.default.CompatibilityObject.str:this.tokenizer.ignore(t.objectSize-i.HeaderObjectToken.len);break;case n.default.ASF_Index_Placeholder_Object.str:await this.tokenizer.ignore(t.objectSize-i.HeaderObjectToken.len);break;default:this.warnings.push("Ignore ASF-Object-GUID: "+t.objectId.str),await this.tokenizer.readToken(new i.IgnoreObjectState(t))}e-=t.objectSize}while(e>0)}}},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(14),i=r(2),a=r(162),s=r(548),o=r(65);!function(e){e[e.UnicodeString=0]="UnicodeString",e[e.ByteArray=1]="ByteArray",e[e.Bool=2]="Bool",e[e.DWord=3]="DWord",e[e.QWord=4]="QWord",e[e.Word=5]="Word"}(t.DataType||(t.DataType={})),t.TopLevelHeaderObjectToken={len:30,get:(e,t)=>({objectId:a.default.fromBin(new i.BufferType(16).get(e,t)),objectSize:i.UINT64_LE.get(e,t+16),numberOfHeaderObjects:i.UINT32_LE.get(e,t+24)})},t.HeaderObjectToken={len:24,get:(e,t)=>({objectId:a.default.fromBin(new i.BufferType(16).get(e,t)),objectSize:i.UINT64_LE.get(e,t+16)})};class c{constructor(e){this.len=e.objectSize-t.HeaderObjectToken.len}postProcessTag(e,t,r,n){if("WM/Picture"===t)e.push({id:t,value:b.fromBuffer(n)});else{const i=s.AsfUtil.getParserForAttr(r);if(!i)throw new Error("unexpected value headerType: "+r);e.push({id:t,value:i(n)})}}}t.State=c;t.IgnoreObjectState=class extends c{constructor(e){super(e)}get(e,t){return null}};class u extends c{constructor(e){super(e)}get(e,t){return{fileId:a.default.fromBin(e,t),fileSize:i.UINT64_LE.get(e,t+16),creationDate:i.UINT64_LE.get(e,t+24),dataPacketsCount:i.UINT64_LE.get(e,t+32),playDuration:i.UINT64_LE.get(e,t+40),sendDuration:i.UINT64_LE.get(e,t+48),preroll:i.UINT64_LE.get(e,t+56),flags:{broadcast:n.default.strtokBITSET.get(e,t+64,24),seekable:n.default.strtokBITSET.get(e,t+64,25)},minimumDataPacketSize:i.UINT32_LE.get(e,t+68),maximumDataPacketSize:i.UINT32_LE.get(e,t+72),maximumBitrate:i.UINT32_LE.get(e,t+76)}}}u.guid=a.default.FilePropertiesObject,t.FilePropertiesObject=u;class l extends c{constructor(e){super(e)}get(e,t){return{streamType:a.default.decodeMediaType(a.default.fromBin(e,t)),errorCorrectionType:a.default.fromBin(e,t+8)}}}l.guid=a.default.StreamPropertiesObject,t.StreamPropertiesObject=l;class d{constructor(){this.len=22}get(e,t){return{reserved1:a.default.fromBin(e,t),reserved2:e.readUInt16LE(t+16),extensionDataSize:e.readUInt32LE(t+18)}}}d.guid=a.default.HeaderExtensionObject,t.HeaderExtensionObject=d;class f extends c{constructor(e){super(e)}get(e,t){const r=[];let n=t+10;for(let i=0;i0){const t=f.contentDescTags[i],o=n+a;r.push({id:t,value:s.AsfUtil.parseUnicodeAttr(e.slice(n,o))}),n=o}}return r}}f.guid=a.default.ContentDescriptionObject,f.contentDescTags=["Title","Author","Copyright","Description","Rating"],t.ContentDescriptionObjectState=f;class p extends c{constructor(e){super(e)}get(e,t){const r=[],n=e.readUInt16LE(t);let i=t+2;for(let t=0;t({lastBlock:n.default.strtokBITSET.get(e,t,7),type:n.default.getBitAllignedNumber(e,t,1,7),length:i.UINT24_BE.get(e,t+1)})},d.BlockStreamInfo={len:34,get:(e,t)=>({minimumBlockSize:i.UINT16_BE.get(e,t),maximumBlockSize:i.UINT16_BE.get(e,t+2)/1e3,minimumFrameSize:i.UINT24_BE.get(e,t+4),maximumFrameSize:i.UINT24_BE.get(e,t+7),sampleRate:i.UINT24_BE.get(e,t+10)>>4,channels:n.default.getBitAllignedNumber(e,t+12,4,3)+1,bitsPerSample:n.default.getBitAllignedNumber(e,t+12,7,5)+1,totalSamples:n.default.getBitAllignedNumber(e,t+13,4,36),fileMD5:new i.BufferType(16).get(e,t+18)})};class f{constructor(e){this.data=e,this.offset=0}readInt32(){const e=i.UINT32_LE.get(this.data,this.offset);return this.offset+=4,e}readStringUtf8(){const e=this.readInt32(),t=this.data.toString("utf8",this.offset,this.offset+e);return this.offset+=e,t}}},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(7),i=r(2),a=r(23),s=r(551),o=r(164),c=r(112),u=n("music-metadata:parser:MP4"),l="iTunes",d={raw:{lossy:!1,format:"raw"},MAC3:{lossy:!0,format:"MACE 3:1"},MAC6:{lossy:!0,format:"MACE 6:1"},ima4:{lossy:!0,format:"IMA 4:1"},ulaw:{lossy:!0,format:"uLaw 2:1"},alaw:{lossy:!0,format:"uLaw 2:1"},Qclp:{lossy:!0,format:"QUALCOMM PureVoice"},".mp3":{lossy:!0,format:"MPEG-1 layer 3"},alac:{lossy:!1,format:"ALAC"},"ac-3":{lossy:!0,format:"AC-3"},mp4a:{lossy:!0,format:"MPEG-4/AAC"},mp4s:{lossy:!0,format:"MP4S"},c608:{lossy:!0,format:"CEA-608"},c708:{lossy:!0,format:"CEA-708"}};function f(e,t,r){return r.indexOf(e)===t}class p extends a.BasicParser{static read_BE_Signed_Integer(e){return i.readIntBE(e,0,e.length)}static read_BE_Unsigned_Integer(e){return i.readUIntBE(e,0,e.length)}async parse(){this.formatList=[];const e=new s.Atom({name:"mp4",length:this.tokenizer.fileSize},!1,null);await e.readAtoms(this.tokenizer,async e=>{if(e.parent)switch(e.parent.header.name){case"ilst":case"":return this.parseMetadataItemData(e);case"stbl":switch(e.header.name){case"stsd":return this.parseAtom_stsd(e.dataLen);default:u(`Ignore: stbl/${e.header.name} atom`)}}switch(e.header.name){case"ftyp":const t=await this.parseAtom_ftyp(e.dataLen);u(`ftyp: ${t.join("/")}`);const r=t.filter(f).join("/");return void this.metadata.setFormat("container",r);case"mdhd":return this.parseAtom_mdhd(e);case"mvhd":return this.parseAtom_mvhd(e);case"mdat":this.audioLengthInBytes=e.dataLen,this.calculateBitRate()}await this.tokenizer.readToken(new i.IgnoreType(e.dataLen)),u(`Ignore atom data: path=${e.atomPath}, payload-len=${e.dataLen}`)},this.tokenizer.fileSize),this.metadata.setFormat("codec",this.formatList.filter(f).join("+"))}calculateBitRate(){this.audioLengthInBytes&&this.metadata.format.duration&&this.metadata.setFormat("bitrate",8*this.audioLengthInBytes/this.metadata.format.duration)}addTag(e,t){this.metadata.addTag(l,e,t)}addWarning(e){u("Warning:"+e),this.warnings.push(e)}parseMetadataItemData(e){let t=e.header.name;return e.readAtoms(this.tokenizer,async e=>{switch(e.header.name){case"data":return this.parseValueAtom(t,e);case"name":const r=await this.tokenizer.readToken(new o.NameAtom(e.dataLen));t+=":"+r.name;break;case"mean":const n=await this.tokenizer.readToken(new o.NameAtom(e.dataLen));t+=":"+n.name;break;default:const a=await this.tokenizer.readToken(new i.BufferType(e.dataLen));this.addWarning("Unsupported meta-item: "+t+"["+e.header.name+"] => value="+a.toString("hex")+" ascii="+a.toString("ascii"))}},e.dataLen)}async parseValueAtom(t,r){const n=await this.tokenizer.readToken(new o.DataAtom(r.header.length-o.Header.len));if(0!==n.type.set)throw new Error("Unsupported type-set != 0: "+n.type.set);switch(n.type.type){case 0:switch(t){case"trkn":case"disk":const e=i.UINT8.get(n.value,3),r=i.UINT8.get(n.value,5);this.addTag(t,e+"/"+r);break;case"gnre":const a=i.UINT8.get(n.value,1),s=c.Genres[a-1];this.addTag(t,s)}break;case 1:case 18:this.addTag(t,n.value.toString("utf-8"));break;case 13:if(this.options.skipCovers)break;this.addTag(t,{format:"image/jpeg",data:e.from(n.value)});break;case 14:if(this.options.skipCovers)break;this.addTag(t,{format:"image/png",data:e.from(n.value)});break;case 21:this.addTag(t,p.read_BE_Signed_Integer(n.value));break;case 22:this.addTag(t,p.read_BE_Unsigned_Integer(n.value));break;case 65:this.addTag(t,n.value.readInt8(0));break;case 66:this.addTag(t,n.value.readInt16BE(0));break;case 67:this.addTag(t,n.value.readInt32BE(0));break;default:this.addWarning(`atom key=${t}, has unknown well-known-type (data-type): ${n.type.type}`)}}async parseAtom_mvhd(e){const t=await this.tokenizer.readToken(new o.MvhdAtom(e.dataLen));this.parse_mxhd(t)}async parseAtom_mdhd(e){const t=await this.tokenizer.readToken(new o.MdhdAtom(e.dataLen));this.parse_mxhd(t)}parse_mxhd(e){if(e.timeScale&&!this.metadata.format.duration){const t=e.duration/e.timeScale;this.metadata.setFormat("duration",t),this.calculateBitRate()}}async parseAtom_ftyp(e){const t=await this.tokenizer.readToken(o.ftyp);if((e-=o.ftyp.len)>0){const r=await this.parseAtom_ftyp(e),n=t.type.replace(/\W/g,"");return n.length>0&&r.push(n),r}return[]}async parseAtom_stsd(e){const t=await this.tokenizer.readToken(new o.StsdAtom(e)),r=[];for(const e of t.table){const t=d[e.dataFormat];t?(this.parseSoundSampleDescription(e),this.metadata.setFormat("lossless",!t.lossy),r.push(t.format)):u(`Warning: data-format '${e.dataFormat}' missing in MP4Parser.encoderDict`)}r.length>0&&this.formatList.push(r.join("/"))}parseSoundSampleDescription(e){let t=0;const r=o.SoundSampleDescriptionVersion.get(e.description,t);if(t+=o.SoundSampleDescriptionVersion.len,0===r.version||1===r.version){const r=o.SoundSampleDescriptionV0.get(e.description,t);this.metadata.setFormat("sampleRate",r.sampleRate),this.metadata.setFormat("bitsPerSample",r.sampleSize),this.metadata.setFormat("numberOfChannels",r.numAudioChannels)}else u(`Warning: sound-sample-description ${r} not implemented`)}}t.MP4Parser=p}).call(this,r(9).Buffer)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(39),i=r(7),a=r(2),s=r(164),o=i("music-metadata:parser:MP4:Atom");class c{constructor(e,t,r){this.header=e,this.extended=t,this.parent=r,this.children=[],this.atomPath=(this.parent?this.parent.atomPath+"/":"")+this.header.name,this.dataLen=this.header.length-(t?16:8)}async readAtoms(e,t,r){const i=await this.readAtom(e,t);return this.children.push(i),void 0===r?this.readAtoms(e,t,r).catch(e=>{if(e.message!==n.endOfFile)throw e;o("Reached end-of-file")}):(r-=i.header.length)>0?this.readAtoms(e,t,r):void 0}async readAtom(e,t){const r=e.position,n=await e.readToken(s.Header),i=1===n.length;i&&(n.length=await e.readToken(s.ExtendedSize));const a=new c(n,i,this);return o(`parse atom name=${a.atomPath}, extended=${a.extended}, offset=${r}, len=${a.header.length}`),await a.readData(e,t),a}async readData(e,t){switch(this.header.name){case"moov":case"udta":case"trak":case"mdia":case"minf":case"stbl":case"":case"ilst":return this.readAtoms(e,t,this.dataLen);case"meta":return await e.readToken(new a.IgnoreType(4)),this.readAtoms(e,t,this.dataLen-4);case"mdhd":case"mvhd":case"tkhd":case"stsz":case"mdat":default:return t(this)}}}t.Atom=c},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(19),i=r(2),a=r(39),s=r(7),o=r(14),c=r(82),u=r(553),l=s("music-metadata:parser:mpeg"),d=1024,f={AudioObjectTypes:["AAC Main","AAC LC","AAC SSR","AAC LTP"],SamplingFrequencies:[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350,void 0,void 0,-1]},p=[void 0,["front-center"],["front-left","front-right"],["front-center","front-left","front-right"],["front-center","front-left","front-right","back-center"],["front-center","front-left","front-right","back-left","back-right"],["front-center","front-left","front-right","back-left","back-right","LFE-channel"],["front-center","front-left","front-right","side-left","side-right","back-left","back-right","LFE-channel"]];class h{constructor(e,t){this.versionIndex=o.default.getBitAllignedNumber(e,t+1,3,2),this.layer=h.LayerDescription[o.default.getBitAllignedNumber(e,t+1,5,2)],this.versionIndex>1&&0===this.layer?this.parseAdtsHeader(e,t):this.parseMpegHeader(e,t),this.isProtectedByCRC=!o.default.isBitSet(e,t+1,7)}calcDuration(e){return e*this.calcSamplesPerFrame()/this.samplingRate}calcSamplesPerFrame(){return h.samplesInFrameTable[1===this.version?0:1][this.layer]}calculateSideInfoLength(){if(3!==this.layer)return 2;if(3===this.channelModeIndex){if(1===this.version)return 17;if(2===this.version||2.5===this.version)return 9}else{if(1===this.version)return 32;if(2===this.version||2.5===this.version)return 17}}calcSlotSize(){return[null,4,1,1][this.layer]}parseMpegHeader(e,t){this.container="MPEG",this.bitrateIndex=o.default.getBitAllignedNumber(e,t+2,0,4),this.sampRateFreqIndex=o.default.getBitAllignedNumber(e,t+2,4,2),this.padding=o.default.isBitSet(e,t+2,6),this.privateBit=o.default.isBitSet(e,t+2,7),this.channelModeIndex=o.default.getBitAllignedNumber(e,t+3,0,2),this.modeExtension=o.default.getBitAllignedNumber(e,t+3,2,2),this.isCopyrighted=o.default.isBitSet(e,t+3,4),this.isOriginalMedia=o.default.isBitSet(e,t+3,5),this.emphasis=o.default.getBitAllignedNumber(e,t+3,7,2),this.version=h.VersionID[this.versionIndex],this.channelMode=h.ChannelMode[this.channelModeIndex],this.codec="MP"+this.layer;const r=this.calcBitrate();if(!r)throw new Error("Cannot determine bit-rate");if(this.bitrate=1e3*r,this.samplingRate=this.calcSamplingRate(),null==this.samplingRate)throw new Error("Cannot determine sampling-rate")}parseAdtsHeader(e,t){l("layer=0 => ADTS"),this.version=2===this.versionIndex?4:2,this.container="ADTS/MPEG-"+this.version;const r=o.default.getBitAllignedNumber(e,t+2,0,2);this.codec="AAC",this.codecProfile=f.AudioObjectTypes[r],l(`MPEG-4 audio-codec=${this.codec}`);const n=o.default.getBitAllignedNumber(e,t+2,2,4);this.samplingRate=f.SamplingFrequencies[n],l(`sampling-rate=${this.samplingRate}`);const i=o.default.getBitAllignedNumber(e,t+2,7,3);this.mp4ChannelConfig=p[i],l(`channel-config=${this.mp4ChannelConfig.join("+")}`),this.frameLength=o.default.getBitAllignedNumber(e,t+3,6,2)<<11}calcBitrate(){if(0===this.bitrateIndex)return null;if(15===this.bitrateIndex)return null;const e=this.version.toString()+this.layer;return h.bitrate_index[this.bitrateIndex][e]}calcSamplingRate(){return 3===this.sampRateFreqIndex?null:h.sampling_rate_freq_index[this.version][this.sampRateFreqIndex]}}h.SyncByte1=255,h.SyncByte2=224,h.VersionID=[2.5,null,2,1],h.LayerDescription=[0,3,2,1],h.ChannelMode=["stereo","joint_stereo","dual_channel","mono"],h.bitrate_index={1:{11:32,12:32,13:32,21:32,22:8,23:8},2:{11:64,12:48,13:40,21:48,22:16,23:16},3:{11:96,12:56,13:48,21:56,22:24,23:24},4:{11:128,12:64,13:56,21:64,22:32,23:32},5:{11:160,12:80,13:64,21:80,22:40,23:40},6:{11:192,12:96,13:80,21:96,22:48,23:48},7:{11:224,12:112,13:96,21:112,22:56,23:56},8:{11:256,12:128,13:112,21:128,22:64,23:64},9:{11:288,12:160,13:128,21:144,22:80,23:80},10:{11:320,12:192,13:160,21:160,22:96,23:96},11:{11:352,12:224,13:192,21:176,22:112,23:112},12:{11:384,12:256,13:224,21:192,22:128,23:128},13:{11:416,12:320,13:256,21:224,22:144,23:144},14:{11:448,12:384,13:320,21:256,22:160,23:160}},h.sampling_rate_freq_index={1:{0:44100,1:48e3,2:32e3},2:{0:22050,1:24e3,2:16e3},2.5:{0:11025,1:12e3,2:8e3}},h.samplesInFrameTable=[[0,384,1152,1152],[0,384,1152,576]];const m={len:4,get:(e,t)=>new h(e,t)};t.MpegParser=class extends c.AbstractID3Parser{constructor(){super(...arguments),this.frameCount=0,this.syncFrameCount=-1,this.countSkipFrameData=0,this.totalDataLength=0,this.bitrates=[],this.calculateEofDuration=!1,this.buf_frame_header=e.alloc(4),this.syncPeek={buf:e.alloc(d),len:0}}async _parse(){this.metadata.setFormat("lossless",!1);try{let e=!1;for(;!e;)await this.sync(),e=await this.parseCommonMpegHeader()}catch(e){if(e.message!==a.endOfFile)throw e;if(this.calculateEofDuration){const e=this.frameCount*this.samplesPerFrame;this.metadata.setFormat("numberOfSamples",e);const t=e/this.metadata.format.sampleRate;l(`Calculate duration at EOF: ${t} sec.`,t),this.metadata.setFormat("duration",t)}}}finalize(){const e=this.metadata.format,t=this.metadata.native.hasOwnProperty("ID3v1");if(e.duration&&this.tokenizer.fileSize){const r=this.tokenizer.fileSize-this.mpegOffset-(t?128:0);e.codecProfile&&"V"===e.codecProfile[0]&&this.metadata.setFormat("bitrate",8*r/e.duration)}else if(this.tokenizer.fileSize&&"CBR"===e.codecProfile){const r=this.tokenizer.fileSize-this.mpegOffset-(t?128:0),n=Math.round(r/this.frame_size)*this.samplesPerFrame;this.metadata.setFormat("numberOfSamples",n);const i=n/e.sampleRate;l("Calculate CBR duration based on file size: %s",i),this.metadata.setFormat("duration",i)}}async sync(){let e=!1;for(;;){let t=0;if(this.syncPeek.len=await this.tokenizer.peekBuffer(this.syncPeek.buf,0,d,this.tokenizer.position,!0),this.syncPeek.len<=256)throw new Error(a.endOfFile);if(0===this.syncPeek.len)throw new Error(a.endOfFile);for(;;){if(e&&224==(224&this.syncPeek.buf[t]))return this.buf_frame_header[0]=h.SyncByte1,this.buf_frame_header[1]=this.syncPeek.buf[t],await this.tokenizer.ignore(t),l(`Sync at offset=${this.tokenizer.position-1}, frameCount=${this.frameCount}`),this.syncFrameCount===this.frameCount&&(l(`Re-synced MPEG stream, frameCount=${this.frameCount}`),this.frameCount=0,this.frame_size=0),void(this.syncFrameCount=this.frameCount);if(e=!1,-1===(t=this.syncPeek.buf.indexOf(h.SyncByte1,t))){if(this.syncPeek.len=2&&0===e.layer?this.parseAdts(e):this.parseAudioFrameHeader(e)}async parseAudioFrameHeader(e){this.metadata.setFormat("numberOfChannels","mono"===e.channelMode?1:2),this.metadata.setFormat("bitrate",e.bitrate),this.frameCount<2e5&&l("offset=%s MP%s bitrate=%s sample-rate=%s",this.tokenizer.position-4,e.layer,e.bitrate,e.samplingRate);const t=e.calcSlotSize();if(null===t)throw new Error("invalid slot_size");const r=e.calcSamplesPerFrame();l(`samples_per_frame=${r}`);const n=r/8*e.bitrate/e.samplingRate+(e.padding?t:0);if(this.frame_size=Math.floor(n),this.audioFrameHeader=e,this.bitrates.push(e.bitrate),1===this.frameCount)return this.offset=m.len,await this.skipSideInformation(),!1;if(3===this.frameCount){if(this.areAllSame(this.bitrates)){if(this.samplesPerFrame=r,this.metadata.setFormat("codecProfile","CBR"),this.tokenizer.fileSize)return!0}else if(this.metadata.format.duration)return!0;if(!this.options.duration)return!0}return this.options.duration&&4===this.frameCount&&(this.samplesPerFrame=r,this.calculateEofDuration=!0),this.offset=4,e.isProtectedByCRC?(await this.parseCrc(),!1):(await this.skipSideInformation(),!1)}async parseAdts(t){const r=e.alloc(3);await this.tokenizer.readBuffer(r),t.frameLength+=o.default.getBitAllignedNumber(r,0,0,11),this.tokenizer.ignore(t.frameLength-7),this.totalDataLength+=t.frameLength,this.samplesPerFrame=1024;const n=t.samplingRate/this.samplesPerFrame,i=8*(0===this.frameCount?0:this.totalDataLength/this.frameCount)*n+.5;if(this.metadata.setFormat("codecProfile",t.codecProfile),this.metadata.setFormat("bitrate",i),t.mp4ChannelConfig&&this.metadata.setFormat("numberOfChannels",t.mp4ChannelConfig.length),l(`frame-count=${this.frameCount}, size=${t.frameLength} bytes, bit-rate=${i}`),3===this.frameCount){if(!this.options.duration)return!0;this.calculateEofDuration=!0}return!1}async parseCrc(){return this.crc=await this.tokenizer.readNumber(i.INT16_BE),this.offset+=2,this.skipSideInformation()}async skipSideInformation(){const e=this.audioFrameHeader.calculateSideInfoLength();await this.tokenizer.readToken(new i.BufferType(e)),this.offset+=e,await this.readXtraInfoHeader()}async readXtraInfoHeader(){const e=await this.tokenizer.readToken(u.InfoTagHeaderTag);switch(this.offset+=u.InfoTagHeaderTag.len,e){case"Info":return this.metadata.setFormat("codecProfile","CBR"),this.readXingInfoHeader();case"Xing":const t=await this.readXingInfoHeader(),r="V"+(100-t.vbrScale)/10;return this.metadata.setFormat("codecProfile",r),null;case"Xtra":break;case"LAME":const n=await this.tokenizer.readToken(u.LameEncoderVersion);return this.offset+=u.LameEncoderVersion.len,this.metadata.setFormat("tool","LAME "+n),await this.skipFrameData(this.frame_size-this.offset),null}const t=this.frame_size-this.offset;return t<0?this.warnings.push("Frame "+this.frameCount+"corrupt: negative frameDataLeft"):await this.skipFrameData(t),null}async readXingInfoHeader(){const e=await this.tokenizer.readToken(u.XingInfoTag);if(this.offset+=u.XingInfoTag.len,this.metadata.setFormat("tool",o.default.stripNulls(e.codec)),1==(1&e.headerFlags[3])){const t=this.audioFrameHeader.calcDuration(e.numFrames);return this.metadata.setFormat("duration",t),l("Get duration from Xing header: %s",this.metadata.format.duration),e}const t=this.frame_size-this.offset;return await this.skipFrameData(t),e}async skipFrameData(e){n.ok(e>=0,"frame-data-left cannot be negative"),await this.tokenizer.readToken(new i.IgnoreType(e)),this.countSkipFrameData+=e}areAllSame(e){const t=e[0];return e.every(e=>e===t)}}}).call(this,r(9).Buffer)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2);t.InfoTagHeaderTag=new n.StringType(4,"ascii"),t.LameEncoderVersion=new n.StringType(6,"ascii"),t.XingInfoTag={len:136,get:(e,t)=>({headerFlags:new n.BufferType(4).get(e,t),numFrames:n.UINT32_BE.get(e,t+4),streamSize:n.UINT32_BE.get(e,t+8),vbrScale:n.UINT32_BE.get(e,t+112),codec:new n.StringType(9,"ascii").get(e,t+116),infoTagRevision:n.UINT8.get(e,t+125)>>4,vbrMethod:15&n.UINT8.get(e,t+125)})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(7),i=r(2),a=r(555),s=r(557),o=r(82),c=n("music-metadata:parser:musepack");t.default=class extends o.AbstractID3Parser{async _parse(){let e;switch(await this.tokenizer.peekToken(new i.StringType(3,"binary"))){case"MP+":c("Musepack stream-version 7"),e=new s.MpcSv7Parser;break;case"MPC":c("Musepack stream-version 8"),e=new a.MpcSv8Parser;break;default:throw new Error("Invalid Musepack signature prefix")}return e.init(this.metadata,this.tokenizer,this.options),e.parse()}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(7),i=r(19),a=r(23),s=r(556),o=r(81),c=r(16),u=n("music-metadata:parser:musepack");t.MpcSv8Parser=class extends a.BasicParser{constructor(){super(...arguments),this.audioLength=0}async parse(){const e=await this.tokenizer.readToken(c.FourCcToken);return i.equal(e,"MPCK","Magic number"),this.metadata.setFormat("container","Musepack, SV8"),this.parsePacket()}async parsePacket(){const e=new s.StreamReader(this.tokenizer);for(;;){const t=await e.readPacketHeader();switch(u(`packet-header key=${t.key}, payloadLength=${t.payloadLength}`),t.key){case"SH":const r=await e.readStreamHeader(t.payloadLength);this.metadata.setFormat("numberOfSamples",r.sampleCount),this.metadata.setFormat("sampleRate",r.sampleFrequency),this.metadata.setFormat("duration",r.sampleCount/r.sampleFrequency),this.metadata.setFormat("numberOfChannels",r.channelCount);break;case"AP":this.audioLength+=t.payloadLength,await this.tokenizer.ignore(t.payloadLength);break;case"RG":case"EI":case"SO":case"ST":case"CT":await this.tokenizer.ignore(t.payloadLength);break;case"SE":return this.metadata.setFormat("bitrate",8*this.audioLength/this.metadata.format.duration),o.APEv2Parser.parseTagHeader(this.metadata,this.tokenizer,this.options);default:throw new Error(`Unexpected header: ${t.key}`)}}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(14),a=r(7)("music-metadata:parser:musepack:sv8"),s=new n.StringType(2,"binary"),o={len:5,get:(e,t)=>({crc:n.UINT32_LE.get(e,t),streamVersion:n.UINT8.get(e,t+4)})},c={len:2,get:(e,t)=>({sampleFrequency:[44100,48e3,37800,32e3][i.default.getBitAllignedNumber(e,t,0,3)],maxUsedBands:i.default.getBitAllignedNumber(e,t,3,5),channelCount:i.default.getBitAllignedNumber(e,t+1,0,4)+1,msUsed:i.default.isBitSet(e,t+1,4),audioBlockFrames:i.default.getBitAllignedNumber(e,t+1,5,3)})};t.StreamReader=class{constructor(e){this.tokenizer=e}async readPacketHeader(){const e=await this.tokenizer.readToken(s),t=await this.readVariableSizeField();return{key:e,payloadLength:t.value-2-t.len}}async readStreamHeader(e){const t={};a(`Reading SH at offset=${this.tokenizer.position}`);const r=await this.tokenizer.readToken(o);e-=o.len,Object.assign(t,r),a(`SH.streamVersion = ${r.streamVersion}`);const n=await this.readVariableSizeField();e-=n.len,t.sampleCount=n.value;const i=await this.readVariableSizeField();e-=i.len,t.beginningOfSilence=i.value;const s=await this.tokenizer.readToken(c);return e-=c.len,Object.assign(t,s),await this.tokenizer.ignore(e),t}async readVariableSizeField(e=1,t=0){let r=await this.tokenizer.readToken(n.UINT8);return 0==(128&r)?{len:e,value:t+r}:(r&=127,r+=t,this.readVariableSizeField(e+1,r<<7))}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(7),i=r(19),a=r(23),s=r(558),o=r(81),c=r(559),u=n("music-metadata:parser:musepack");t.MpcSv7Parser=class extends a.BasicParser{constructor(){super(...arguments),this.audioLength=0}async parse(){const e=await this.tokenizer.readToken(s.Header);i.equal(e.signature,"MP+","Magic number"),u(`stream-version=${e.streamMajorVersion}.${e.streamMinorVersion}`),this.metadata.setFormat("container","Musepack, SV7"),this.metadata.setFormat("sampleRate",e.sampleFrequency);const t=1152*(e.frameCount-1)+e.lastFrameLength;this.metadata.setFormat("numberOfSamples",t),this.duration=t/e.sampleFrequency,this.metadata.setFormat("duration",this.duration),this.bitreader=new c.BitReader(this.tokenizer),this.metadata.setFormat("numberOfChannels",e.midSideStereo||e.intensityStereo?2:1);const r=await this.bitreader.read(8);return this.metadata.setFormat("codec",(r/100).toFixed(2)),await this.skipAudioData(e.frameCount),u(`End of audio stream, switching to APEv2, offset=${this.tokenizer.position}`),o.APEv2Parser.parseTagHeader(this.metadata,this.tokenizer,this.options)}async skipAudioData(e){for(;e-- >0;){const e=await this.bitreader.read(20);this.audioLength+=20+e,await this.bitreader.ignore(e)}const t=await this.bitreader.read(11);this.audioLength+=t,this.metadata.setFormat("bitrate",this.audioLength/this.duration)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(14);t.Header={len:24,get:(e,t)=>{const r={signature:e.toString("binary",t,t+3),streamMinorVersion:i.default.getBitAllignedNumber(e,t+3,0,4),streamMajorVersion:i.default.getBitAllignedNumber(e,t+3,4,4),frameCount:n.UINT32_LE.get(e,t+4),maxLevel:n.UINT16_LE.get(e,t+8),sampleFrequency:[44100,48e3,37800,32e3][i.default.getBitAllignedNumber(e,t+10,0,2)],link:i.default.getBitAllignedNumber(e,t+10,2,2),profile:i.default.getBitAllignedNumber(e,t+10,4,4),maxBand:i.default.getBitAllignedNumber(e,t+11,0,6),intensityStereo:i.default.isBitSet(e,t+11,6),midSideStereo:i.default.isBitSet(e,t+11,7),titlePeak:n.UINT16_LE.get(e,t+12),titleGain:n.UINT16_LE.get(e,t+14),albumPeak:n.UINT16_LE.get(e,t+16),albumGain:n.UINT16_LE.get(e,t+18),lastFrameLength:n.UINT32_LE.get(e,t+20)>>>20&2047,trueGapless:i.default.isBitSet(e,t+23,0)};return r.lastFrameLength=r.trueGapless?n.UINT32_LE.get(e,20)>>>20&2047:0,r}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2);t.BitReader=class{constructor(e){this.tokenizer=e,this.pos=0,this.dword=void 0}async read(e){for(;void 0===this.dword;)this.dword=await this.tokenizer.readToken(n.UINT32_LE);let t=this.dword;return this.pos+=e,this.pos<32?(t>>>=32-this.pos)&(1<>>32-this.pos),t&(1<0){const t=32-this.pos;this.dword=void 0,e-=t,this.pos=0}const t=e%32,r=(e-t)/32;return await this.tokenizer.ignore(4*r),this.read(t)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(7),a=r(19),s=r(14),o=r(16),c=r(118),u=r(561),l=r(563),d=r(23),f=r(565),p=i("music-metadata:parser:ogg");class h{static sum(e,t,r){let n=0;for(let i=t;i0)return this.warnings.push("Invalid FourCC ID, maybe last OGG-page is not marked with last-page flag"),this.pageConsumer.flush();throw e}}}m.Header={len:27,get:(e,t)=>({capturePattern:o.FourCcToken.get(e,t),version:e.readUInt8(t+4),headerType:{continued:s.default.strtokBITSET.get(e,t+5,0),firstPage:s.default.strtokBITSET.get(e,t+5,1),lastPage:s.default.strtokBITSET.get(e,t+5,2)},absoluteGranulePosition:e.readIntLE(t+6,6),streamSerialNumber:n.UINT32_LE.get(e,t+14),pageSequenceNo:n.UINT32_LE.get(e,t+18),pageChecksum:n.UINT32_LE.get(e,t+22),page_segments:e.readUInt8(t+26)})},t.OggParser=m},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(562),a=r(118);t.OpusParser=class extends a.VorbisParser{constructor(e,t,r){super(e,t),this.tokenizer=r,this.lastPos=-1}parseFirstPage(e,t){if(this.metadata.setFormat("codec","Opus"),this.idHeader=new i.IdHeader(t.length).get(t,0),"OpusHead"!==this.idHeader.magicSignature)throw new Error("Illegal ogg/Opus magic-signature");this.metadata.setFormat("sampleRate",this.idHeader.inputSampleRate),this.metadata.setFormat("numberOfChannels",this.idHeader.channelCount)}parseFullPage(e){switch(new n.StringType(8,"ascii").get(e,0)){case"OpusTags":this.parseUserCommentList(e,8),this.lastPos=this.tokenizer.position}}calculateDuration(e){if(this.metadata.format.sampleRate&&e.absoluteGranulePosition>=0&&(this.metadata.setFormat("numberOfSamples",e.absoluteGranulePosition-this.idHeader.preSkip),this.metadata.setFormat("duration",this.metadata.format.numberOfSamples/this.idHeader.inputSampleRate),-1!==this.lastPos&&this.tokenizer.fileSize&&this.metadata.format.duration)){const e=this.tokenizer.fileSize-this.lastPos;this.metadata.setFormat("bitrate",8*e/this.metadata.format.duration)}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2);t.IdHeader=class{constructor(e){if(this.len=e,e<19)throw new Error("ID-header-page 0 should be at least 19 bytes long")}get(e,t){return{magicSignature:new n.StringType(8,"ascii").get(e,t+0),version:e.readUInt8(t+8),channelCount:e.readUInt8(t+9),preSkip:e.readInt16LE(t+10),inputSampleRate:e.readInt32LE(t+12),outputGain:e.readInt16LE(t+16),channelMapping:e.readUInt8(t+18)}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(7),i=r(564),a=r(118),s=n("music-metadata:parser:ogg:speex");t.SpeexParser=class extends a.VorbisParser{constructor(e,t,r){super(e,t),this.tokenizer=r}parseFirstPage(e,t){s("First Ogg/Speex page");const r=i.Header.get(t,0);this.metadata.setFormat("codec",`Speex ${r.version}`),this.metadata.setFormat("numberOfChannels",r.nb_channels),this.metadata.setFormat("sampleRate",r.rate),-1!==r.bitrate&&this.metadata.setFormat("bitrate",r.bitrate)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(14);t.Header={len:80,get:(e,t)=>({speex:new n.StringType(8,"ascii").get(e,t+0),version:i.default.trimRightNull(new n.StringType(20,"ascii").get(e,t+8)),version_id:e.readInt32LE(t+28),header_size:e.readInt32LE(t+32),rate:e.readInt32LE(t+36),mode:e.readInt32LE(t+40),mode_bitstream_version:e.readInt32LE(t+44),nb_channels:e.readInt32LE(t+48),bitrate:e.readInt32LE(t+52),frame_size:e.readInt32LE(t+56),vbr:e.readInt32LE(t+60),frames_per_packet:e.readInt32LE(t+64),extra_headers:e.readInt32LE(t+68),reserved1:e.readInt32LE(t+72),reserved2:e.readInt32LE(t+76)})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(7),i=r(566),a=n("music-metadata:parser:ogg:theora");t.TheoraParser=class{constructor(e,t,r){this.metadata=e,this.tokenizer=r}parsePage(e,t){e.headerType.firstPage&&this.parseFirstPage(e,t)}flush(){a("flush")}parseFirstPage(e,t){a("First Ogg/Theora page"),this.metadata.setFormat("codec","Theora");const r=i.IdentificationHeader.get(t,0);this.metadata.setFormat("bitrate",r.nombr)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2);t.IdentificationHeader={len:42,get:(e,t)=>({id:new n.StringType(7,"ascii").get(e,t),vmaj:e.readUInt8(t+7),vmin:e.readUInt8(t+8),vrev:e.readUInt8(t+9),vmbw:e.readUInt16BE(t+10),vmbh:e.readUInt16BE(t+17),nombr:n.UINT24_BE.get(e,t+37),nqual:e.readUInt8(t+40)})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(39),i=r(79),a=r(2),s=r(7),o=r(568),c=r(569),u=r(64),l=r(14),d=r(16),f=r(23),p=r(113),h=s("music-metadata:parser:RIFF");t.WaveParser=class extends f.BasicParser{async parse(){const e=await this.tokenizer.readToken(o.Header);if(h(`pos=${this.tokenizer.position}, parse: chunkID=${e.chunkID}`),"RIFF"===e.chunkID)return this.parseRiffChunk().catch(e=>{if(e.message!==n.endOfFile)throw e})}async parseRiffChunk(){const e=await this.tokenizer.readToken(d.FourCcToken);switch(this.metadata.setFormat("container",e),e){case"WAVE":return this.readWaveChunk();default:throw new Error(`Unsupported RIFF format: RIFF/${e}`)}}async readWaveChunk(){for(;;){const e=await this.tokenizer.readToken(o.Header);switch(this.header=e,h(`pos=${this.tokenizer.position}, readChunk: chunkID=RIFF/WAVE/${e.chunkID}`),e.chunkID){case"LIST":await this.parseListTag(e);break;case"fact":this.metadata.setFormat("lossless",!1),this.fact=await this.tokenizer.readToken(new c.FactChunk(e));break;case"fmt ":const t=await this.tokenizer.readToken(new c.Format(e));let r=c.WaveFormat[t.wFormatTag];r||(h("WAVE/non-PCM format="+t.wFormatTag),r="non-PCM ("+t.wFormatTag+")"),this.metadata.setFormat("codec",r),this.metadata.setFormat("bitsPerSample",t.wBitsPerSample),this.metadata.setFormat("sampleRate",t.nSamplesPerSec),this.metadata.setFormat("numberOfChannels",t.nChannels),this.metadata.setFormat("bitrate",t.nBlockAlign*t.nSamplesPerSec*8),this.blockAlign=t.nBlockAlign;break;case"id3 ":case"ID3 ":const n=await this.tokenizer.readToken(new a.BufferType(e.chunkSize)),s=new p.ID3Stream(n),o=i.fromStream(s);await(new u.ID3v2Parser).parse(this.metadata,o,this.options);break;case"data":!1!==this.metadata.format.lossless&&this.metadata.setFormat("lossless",!0);const l=this.fact?this.fact.dwSampleLength:e.chunkSize/this.blockAlign;this.metadata.setFormat("numberOfSamples",l),this.metadata.setFormat("duration",l/this.metadata.format.sampleRate),this.metadata.setFormat("bitrate",this.metadata.format.numberOfChannels*this.blockAlign*this.metadata.format.sampleRate),await this.tokenizer.ignore(e.chunkSize);break;default:h(`Ignore chunk: RIFF/${e.chunkID} of ${e.chunkSize} bytes`),this.warnings.push("Ignore chunk: RIFF/"+e.chunkID),await this.tokenizer.ignore(e.chunkSize)}this.header.chunkSize%2==1&&(h("Read odd padding byte"),await this.tokenizer.ignore(1))}}async parseListTag(e){const t=await this.tokenizer.readToken(d.FourCcToken);switch(h("pos=%s, parseListTag: chunkID=RIFF/WAVE/LIST/%s",this.tokenizer.position,t),t){case"INFO":return this.parseRiffInfoTags(e.chunkSize-4);case"adtl":default:return this.warnings.push("Ignore chunk: RIFF/WAVE/LIST/"+t),h("Ignoring chunkID=RIFF/WAVE/LIST/"+t),this.tokenizer.ignore(e.chunkSize-4)}}async parseRiffInfoTags(e){for(;e>=8;){const t=await this.tokenizer.readToken(o.Header),r=new o.ListInfoTagValue(t),n=await this.tokenizer.readToken(r);this.addTag(t.chunkID,l.default.stripNulls(n)),e-=8+r.len}if(0!==e)throw Error("Illegal remaining size: "+e)}addTag(e,t){this.metadata.addTag("exif",e,t)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(16);t.Header={len:8,get:(e,t)=>({chunkID:i.FourCcToken.get(e,t),chunkSize:e.readUInt32LE(t+4)})};t.ListInfoTagValue=class{constructor(e){this.tagHeader=e,this.len=e.chunkSize,this.len+=1&this.len}get(e,t){return new n.StringType(this.tagHeader.chunkSize,"ascii").get(e,t)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(19);!function(e){e[e.PCM=1]="PCM",e[e.ADPCM=2]="ADPCM",e[e.IEEE_FLOAT=3]="IEEE_FLOAT",e[e.MPEG_ADTS_AAC=5632]="MPEG_ADTS_AAC",e[e.MPEG_LOAS=5634]="MPEG_LOAS",e[e.RAW_AAC1=255]="RAW_AAC1",e[e.DOLBY_AC3_SPDIF=146]="DOLBY_AC3_SPDIF",e[e.DVM=8192]="DVM",e[e.RAW_SPORT=576]="RAW_SPORT",e[e.ESST_AC3=577]="ESST_AC3",e[e.DRM=9]="DRM",e[e.DTS2=8193]="DTS2",e[e.MPEG=80]="MPEG"}(t.WaveFormat||(t.WaveFormat={}));t.Format=class{constructor(e){n.ok(e.chunkSize>=16,"16 for PCM."),this.len=e.chunkSize}get(e,t){return{wFormatTag:e.readUInt16LE(t),nChannels:e.readUInt16LE(t+2),nSamplesPerSec:e.readUInt32LE(t+4),nAvgBytesPerSec:e.readUInt32LE(t+8),nBlockAlign:e.readUInt16LE(t+12),wBitsPerSample:e.readUInt16LE(t+14)}}};t.FactChunk=class{constructor(e){n.ok(e.chunkSize>=4,"minimum fact chunk size."),this.len=e.chunkSize}get(e,t){return{dwSampleLength:e.readUInt32LE(t)}}}},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(19),a=r(81),s=r(16),o=r(23),c=r(571),u=r(7)("music-metadata:parser:WavPack");t.WavPackParser=class extends o.BasicParser{async parse(){return this.audioDataSize=0,await this.parseWavPackBlocks(),a.APEv2Parser.parseTagHeader(this.metadata,this.tokenizer,this.options)}async parseWavPackBlocks(){do{if("wvpk"!==await this.tokenizer.peekToken(s.FourCcToken))break;const e=await this.tokenizer.readToken(c.WavPack.BlockHeaderToken);i.strictEqual(e.BlockID,"wvpk","WavPack Block-ID"),u(`WavPack header blockIndex=${e.blockIndex}, len=${c.WavPack.BlockHeaderToken.len}`),0!==e.blockIndex||this.metadata.format.container||(this.metadata.setFormat("container","WavPack"),this.metadata.setFormat("lossless",!e.flags.isHybrid),this.metadata.setFormat("bitsPerSample",e.flags.bitsPerSample),e.flags.isDSD||(this.metadata.setFormat("sampleRate",e.flags.samplingRate),this.metadata.setFormat("duration",e.totalSamples/e.flags.samplingRate)),this.metadata.setFormat("numberOfChannels",e.flags.isMono?1:2),this.metadata.setFormat("numberOfSamples",e.totalSamples),this.metadata.setFormat("codec",e.flags.isDSD?"DSD":"PCM"));const t=e.blockSize-(c.WavPack.BlockHeaderToken.len-8);0===e.blockIndex?await this.parseMetadataSubBlock(e,t):await this.tokenizer.ignore(t),e.blockSamples>0&&(this.audioDataSize+=e.blockSize)}while(!this.tokenizer.fileSize||this.tokenizer.fileSize-this.tokenizer.position>=c.WavPack.BlockHeaderToken.len);this.metadata.setFormat("bitrate",8*this.audioDataSize/this.metadata.format.duration)}async parseMetadataSubBlock(t,r){for(;r>c.WavPack.MetadataIdToken.len;){const a=await this.tokenizer.readToken(c.WavPack.MetadataIdToken),s=await this.tokenizer.readNumber(a.largeBlock?n.UINT24_LE:n.UINT8),o=e.alloc(2*s-(a.isOddSize?1:0));switch(await this.tokenizer.readBuffer(o,0,o.length),u(`Metadata Sub-Blocks functionId=0x${a.functionId.toString(16)}, id.largeBlock=${a.largeBlock},data-size=${o.length}`),a.functionId){case 0:break;case 14:u("ID_DSD_BLOCK");const e=1<>>t&4294967295>>>32-r}}s.BlockHeaderToken={len:32,get:(e,t)=>{const r=n.UINT32_LE.get(e,t+24),o={BlockID:i.FourCcToken.get(e,t),blockSize:n.UINT32_LE.get(e,t+4),version:n.UINT16_LE.get(e,t+8),totalSamples:(n.UINT8.get(e,t+11)<<32)+n.UINT32_LE.get(e,t+12),blockIndex:(n.UINT8.get(e,t+10)<<32)+n.UINT32_LE.get(e,t+16),blockSamples:n.UINT32_LE.get(e,t+20),flags:{bitsPerSample:8*(1+s.getBitAllignedNumber(r,0,2)),isMono:s.isBitSet(r,2),isHybrid:s.isBitSet(r,3),isJointStereo:s.isBitSet(r,4),crossChannel:s.isBitSet(r,5),hybridNoiseShaping:s.isBitSet(r,6),floatingPoint:s.isBitSet(r,7),samplingRate:a[s.getBitAllignedNumber(r,23,4)],isDSD:s.isBitSet(r,31)},crc:new n.BufferType(4).get(e,t+28)};return o.flags.isDSD&&(o.totalSamples*=8),o}},s.MetadataIdToken={len:1,get:(e,t)=>({functionId:s.getBitAllignedNumber(e[t],0,6),isOptional:s.isBitSet(e[t],5),isOddSize:s.isBitSet(e[t],6),largeBlock:s.isBitSet(e[t],7)})},t.WavPack=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(82),i=r(19),a=r(7),s=r(573),o=r(64),c=a("music-metadata:parser:DSF");t.DsfParser=class extends n.AbstractID3Parser{async _parse(){const e=this.tokenizer.position,t=await this.tokenizer.readToken(s.ChunkHeader);i.strictEqual(t.id,"DSD ","Invalid chunk signature"),this.metadata.setFormat("container","DSF"),this.metadata.setFormat("lossless",!0);const r=await this.tokenizer.readToken(s.DsdChunk);if(0!==r.metadataPointer)return c(`expect ID3v2 at offset=${r.metadataPointer}`),await this.parseChunks(r.fileSize-t.size),await this.tokenizer.ignore(r.metadataPointer-this.tokenizer.position-e),(new o.ID3v2Parser).parse(this.metadata,this.tokenizer,this.options);c("No ID3v2 tag present")}async parseChunks(e){for(;e>=s.ChunkHeader.len;){const t=await this.tokenizer.readToken(s.ChunkHeader);switch(c(`Parsing chunk name=${t.id} size=${t.size}`),t.id){case"fmt ":const e=await this.tokenizer.readToken(s.FormatChunk);this.metadata.setFormat("numberOfChannels",e.channelNum),this.metadata.setFormat("sampleRate",e.samplingFrequency),this.metadata.setFormat("bitsPerSample",e.bitsPerSample),this.metadata.setFormat("numberOfSamples",e.sampleCount),this.metadata.setFormat("duration",e.sampleCount/e.samplingFrequency);const r=e.bitsPerSample*e.samplingFrequency*e.channelNum;return void this.metadata.setFormat("bitrate",r);default:this.tokenizer.ignore(t.size-s.ChunkHeader.len)}e-=t.size}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(16);t.ChunkHeader={len:12,get:(e,t)=>({id:i.FourCcToken.get(e,t),size:n.UINT64_LE.get(e,t+4)})},t.DsdChunk={len:16,get:(e,t)=>({fileSize:n.INT64_LE.get(e,t),metadataPointer:n.INT64_LE.get(e,t+8)})},function(e){e[e.mono=1]="mono",e[e.stereo=2]="stereo",e[e.channels=3]="channels",e[e.quad=4]="quad",e[e["4 channels"]=5]="4 channels",e[e["5 channels"]=6]="5 channels",e[e["5.1 channels"]=7]="5.1 channels"}(t.ChannelType||(t.ChannelType={})),t.FormatChunk={len:40,get:(e,t)=>({formatVersion:n.INT32_LE.get(e,t),formatID:n.INT32_LE.get(e,t+4),channelType:n.INT32_LE.get(e,t+8),channelNum:n.INT32_LE.get(e,t+12),samplingFrequency:n.INT32_LE.get(e,t+16),bitsPerSample:n.INT32_LE.get(e,t+20),sampleCount:n.INT64_LE.get(e,t+24),blockSizePerChannel:n.INT32_LE.get(e,t+32)})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(19),i=r(2),a=r(7),s=r(16),o=r(23),c=r(113),u=r(575),l=r(79),d=r(64),f=a("music-metadata:parser:aiff");t.DsdiffParser=class extends o.BasicParser{async parse(){const e=await this.tokenizer.readToken(u.ChunkHeader);n.strictEqual(e.chunkID,"FRM8");const t=(await this.tokenizer.readToken(s.FourCcToken)).trim();switch(t){case"DSD":return this.metadata.setFormat("container",`DSDIFF/${t}`),this.metadata.setFormat("lossless",!0),this.readFmt8Chunks(e.chunkSize-s.FourCcToken.len);default:throw Error(`Unsupported DSDIFF type: ${t}`)}}async readFmt8Chunks(e){for(;e>=u.ChunkHeader.len;){const t=await this.tokenizer.readToken(u.ChunkHeader);f(`Chunk id=${t.chunkID}`),await this.readData(t),e-=u.ChunkHeader.len+t.chunkSize}}async readData(e){f(`Reading data of chunk[ID=${e.chunkID}, size=${e.chunkSize}]`);const t=this.tokenizer.position;switch(e.chunkID.trim()){case"FVER":const t=await this.tokenizer.readToken(i.UINT32_LE);f(`DSDIFF version=${t}`);break;case"PROP":const r=await this.tokenizer.readToken(s.FourCcToken);n.strictEqual(r,"SND "),await this.handleSoundPropertyChunks(e.chunkSize-s.FourCcToken.len);break;case"ID3":const a=await this.tokenizer.readToken(new i.BufferType(e.chunkSize)),o=new c.ID3Stream(a),u=l.fromStream(o);await(new d.ID3v2Parser).parse(this.metadata,u,this.options);break;default:f(`Ignore chunk[ID=${e.chunkID}, size=${e.chunkSize}]`);break;case"DSD":this.metadata.setFormat("numberOfSamples",8*e.chunkSize/this.metadata.format.numberOfChannels),this.metadata.setFormat("duration",this.metadata.format.numberOfSamples/this.metadata.format.sampleRate)}const r=e.chunkSize-(this.tokenizer.position-t);r>0&&(f(`After Parsing chunk, remaining ${r} bytes`),await this.tokenizer.ignore(r))}async handleSoundPropertyChunks(e){for(f(`Parsing sound-property-chunks, remainingSize=${e}`);e>0;){const t=await this.tokenizer.readToken(u.ChunkHeader);f(`Sound-property-chunk[ID=${t.chunkID}, size=${t.chunkSize}]`);const r=this.tokenizer.position;switch(t.chunkID.trim()){case"FS":const e=await this.tokenizer.readToken(i.UINT32_BE);this.metadata.setFormat("sampleRate",e);break;case"CHNL":const r=await this.tokenizer.readToken(i.UINT16_BE);this.metadata.setFormat("numberOfChannels",r),await this.handleChannelChunks(t.chunkSize-i.UINT16_BE.len);break;case"CMPR":const n=(await this.tokenizer.readToken(s.FourCcToken)).trim(),a=await this.tokenizer.readToken(i.UINT8),o=await this.tokenizer.readToken(new i.StringType(a,"ascii"));"DSD"===n&&(this.metadata.setFormat("lossless",!0),this.metadata.setFormat("bitsPerSample",1)),this.metadata.setFormat("codec",`${n} (${o})`);break;case"ABSS":const c=await this.tokenizer.readToken(i.UINT16_BE),u=await this.tokenizer.readToken(i.UINT8),l=await this.tokenizer.readToken(i.UINT8),d=await this.tokenizer.readToken(i.UINT32_BE);f(`ABSS ${c}:${u}:${l}.${d}`);break;case"LSCO":const p=await this.tokenizer.readToken(i.UINT16_BE);f(`LSCO lsConfig=${p}`);break;case"COMT":default:f(`Unknown sound-property-chunk[ID=${t.chunkID}, size=${t.chunkSize}]`),await this.tokenizer.ignore(t.chunkSize)}const n=t.chunkSize-(this.tokenizer.position-r);n>0&&(f(`After Parsing sound-property-chunk ${t.chunkSize}, remaining ${n} bytes`),await this.tokenizer.ignore(n)),e-=u.ChunkHeader.len+t.chunkSize,f(`Parsing sound-property-chunks, remainingSize=${e}`)}if(this.metadata.format.lossless&&this.metadata.format.sampleRate&&this.metadata.format.numberOfChannels&&this.metadata.format.bitsPerSample){const e=this.metadata.format.sampleRate*this.metadata.format.numberOfChannels*this.metadata.format.bitsPerSample;this.metadata.setFormat("bitrate",e)}}async handleChannelChunks(e){f(`Parsing channel-chunks, remainingSize=${e}`);const t=[];for(;e>=s.FourCcToken.len;){const r=await this.tokenizer.readToken(s.FourCcToken);f(`Channel[ID=${r}]`),t.push(r),e-=s.FourCcToken.len}return f(`Channels: ${t.join(", ")}`),t}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(16);t.ChunkHeader={len:12,get:(e,t)=>({chunkID:i.FourCcToken.get(e,t),chunkSize:n.INT64_BE.get(e,t+4)})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(156);t.ReadableWeToNodeStream=class extends n.Readable{constructor(e){super(),this.bytesRead=0,this.released=!1,this.reader=e.getReader()}async _read(){if(this.released)return void this.push(null);this.pendingRead=this.reader.read();const e=await this.pendingRead;delete this.pendingRead,e.done||this.released?this.push(null):(this.bytesRead+=e.value.length,this.push(e.value))}async waitForReadToComplete(){this.pendingRead&&await this.pendingRead}async close(){await this.syncAndRelease()}async syncAndRelease(){this.released=!0,await this.waitForReadToComplete(),await this.reader.releaseLock()}}},function(e,t,r){(function(t){var n=r(578).strict;e.exports=function(e){if(n(e)){var r=t.from(e.buffer);return e.byteLength!==e.buffer.byteLength&&(r=r.slice(e.byteOffset,e.byteOffset+e.byteLength)),r}return t.from(e)}}).call(this,r(9).Buffer)},function(e,t){e.exports=i,i.strict=a,i.loose=s;var r=Object.prototype.toString,n={"[object Int8Array]":!0,"[object Int16Array]":!0,"[object Int32Array]":!0,"[object Uint8Array]":!0,"[object Uint8ClampedArray]":!0,"[object Uint16Array]":!0,"[object Uint32Array]":!0,"[object Float32Array]":!0,"[object Float64Array]":!0};function i(e){return a(e)||s(e)}function a(e){return e instanceof Int8Array||e instanceof Int16Array||e instanceof Int32Array||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Uint16Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array}function s(e){return n[r.call(e)]}}]); \ No newline at end of file +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/",r(r.s=184)}([,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(6),i=(e,t,r,n)=>{if(t+r>e.length){if("function"!=typeof n)throw new Error("Buffer out of space and no valid flush() function found");return n(e,t),0}return t};t.UINT8={len:1,get:(e,t)=>e.readUInt8(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=255),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUInt8(r,s),s-t+this.len}},t.UINT16_LE={len:2,get:(e,t)=>e.readUInt16LE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=65535),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUInt16LE(r,s),s-t+this.len}},t.UINT16_BE={len:2,get:(e,t)=>e.readUInt16BE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=65535),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUInt16BE(r,s),s-t+this.len}},t.UINT24_LE={len:3,get:(e,t)=>e.readUIntLE(t,3),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=16777215),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUIntLE(r,s,3),s-t+this.len}},t.UINT24_BE={len:3,get:(e,t)=>e.readUIntBE(t,3),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=16777215),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUIntBE(r,s,3),s-t+this.len}},t.UINT32_LE={len:4,get:(e,t)=>e.readUInt32LE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=4294967295),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUInt32LE(r,s),s-t+this.len}},t.UINT32_BE={len:4,get:(e,t)=>e.readUInt32BE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=0&&r<=4294967295),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeUInt32BE(r,s),s-t+this.len}},t.INT8={len:1,get:(e,t)=>e.readInt8(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-128&&r<=127),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeInt8(r,s),s-t+this.len}},t.INT16_BE={len:2,get:(e,t)=>e.readInt16BE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-32768&&r<=32767),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeInt16BE(r,s),s-t+this.len}},t.INT16_LE={len:2,get:(e,t)=>e.readInt16LE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-32768&&r<=32767),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeInt16LE(r,s),s-t+this.len}},t.INT24_LE={len:3,get:(e,t)=>e.readIntLE(t,3),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-8388608&&r<=8388607),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeIntLE(r,s,3),s-t+this.len}},t.INT24_BE={len:3,get:(e,t)=>e.readIntBE(t,3),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-8388608&&r<=8388607),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeIntBE(r,s,3),s-t+this.len}},t.INT32_BE={len:4,get:(e,t)=>e.readInt32BE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-2147483648&&r<=2147483647),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeInt32BE(r,s),s-t+this.len}},t.INT32_LE={len:4,get:(e,t)=>e.readInt32LE(t),put(e,t,r,a){n.equal(typeof t,"number"),n.equal(typeof r,"number"),n.ok(r>=-2147483648&&r<=2147483647),n.ok(t>=0),n.ok(this.len<=e.length);const s=i(e,t,this.len,a);return e.writeInt32LE(r,s),s-t+this.len}},t.UINT64_LE={len:8,get(e,t){return function(e,t,r){r>>>=0;let n=e[t>>>=0],i=1,a=0;for(;++a>>=0;let i=1,a=0;e[r>>>=0]=255&t;for(;++a>>=0;let n=e[t>>>=0],i=1,a=0;for(;++a=(i*=128)&&(n-=Math.pow(2,8*r));return n}(e,t,this.len)},put(e,t,r){return s(e,r,t,this.len)}},t.UINT64_BE={len:8,get(e,t){return o(e,t,this.len)},put(e,t,r){return c(e,r,t,this.len)}},t.INT64_BE={len:8,get(e,t){return u(e,t,this.len)},put(e,t,r){return l(e,r,t,this.len)}};t.IgnoreType=class{constructor(e){this.len=e}get(e,t){return null}};t.BufferType=class{constructor(e){this.len=e}get(e,t){return e.slice(t,t+this.len)}};t.StringType=class{constructor(e,t){this.len=e,this.encoding=t}get(e,t){return e.toString(this.encoding,t,t+this.len)}};class a{constructor(e){this.len=e}static decode(e,t,r){let n="";for(let i=t;i>10),56320+(1023&e)))}static singleByteDecoder(e){if(a.inRange(e,0,127))return e;const t=a.windows1252[e-128];if(null===t)throw Error("invaliding encoding");return t}get(e,t=0){return a.decode(e,t,t+this.len)}}function s(e,t,r,n){t=+t;let i=0,a=1,s=0;for(e[r>>>=0]=255&t;++i>0)-s&255;return r+n}function o(e,t,r){r>>>=0;let n=e[(t>>>=0)+--r],i=1;for(;r>0&&(i*=256);)n+=e[t+--r]*i;return n}function c(e,t,r,n){t=+t;let i=(n>>>=0)-1,a=1;for(e[(r>>>=0)+i]=255&t;--i>=0&&(a*=256);)e[r+i]=t/a&255;return r+n}function u(e,t,r){let n=r>>>=0,i=1,a=e[(t>>>=0)+--n];for(;n>0&&(i*=256);)a+=e[t+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*r)),a}function l(e,t,r,n){t=+t;let i=n-1,a=1,s=0;for(e[(r>>>=0)+i]=255&t;--i>=0&&(a*=256);)t<0&&0===s&&0!==e[r+i+1]&&(s=1),e[r+i]=(t/a>>0)-s&255;return r+n}a.windows1252=[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],t.AnsiStringType=a,t.writeIntLE=s,t.readUIntBE=o,t.writeUIntBE=c,t.readIntBE=u,t.writeIntBE=l},function(e,t,r){(function(n){t.log=function(...e){return"object"==typeof console&&console.log&&console.log(...e)},t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const r="color: "+this.color;t.splice(1,0,r,"color: inherit");let n=0,i=0;t[0].replace(/%[a-zA-Z%]/g,e=>{"%%"!==e&&(n++,"%c"===e&&(i=n))}),t.splice(i,0,r)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&void 0!==n&&"env"in n&&(e=n.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],e.exports=r(208)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}).call(this,r(9))},function(e,t,r){"use strict";(function(e){var n=r(186),i=r(187),a=r(33);function s(){return c.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function o(e,t){if(s()=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|e}function h(e,t){if(c.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return j(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return q(e).length;default:if(n)return j(e).length;t=(""+t).toLowerCase(),n=!0}}function m(e,t,r){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return x(this,t,r);case"utf8":case"utf-8":return E(this,t,r);case"ascii":return F(this,t,r);case"latin1":case"binary":return A(this,t,r);case"base64":return C(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function g(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function b(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof t&&(t=c.from(t,n)),c.isBuffer(t))return 0===t.length?-1:y(e,t,r,n,i);if("number"==typeof t)return t&=255,c.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):y(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function y(e,t,r,n,i){var a,s=1,o=e.length,c=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;s=2,o/=2,c/=2,r/=2}function u(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(i){var l=-1;for(a=r;ao&&(r=o-c),a=r;a>=0;a--){for(var d=!0,f=0;fi&&(n=i):n=i;var a=t.length;if(a%2!=0)throw new TypeError("Invalid hex string");n>a/2&&(n=a/2);for(var s=0;s>8,i=r%256,a.push(i),a.push(n);return a}(t,e.length-r),e,r,n)}function C(e,t,r){return 0===t&&r===e.length?n.fromByteArray(e):n.fromByteArray(e.slice(t,r))}function E(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;i239?4:u>223?3:u>191?2:1;if(i+d<=r)switch(d){case 1:u<128&&(l=u);break;case 2:128==(192&(a=e[i+1]))&&(c=(31&u)<<6|63&a)>127&&(l=c);break;case 3:a=e[i+1],s=e[i+2],128==(192&a)&&128==(192&s)&&(c=(15&u)<<12|(63&a)<<6|63&s)>2047&&(c<55296||c>57343)&&(l=c);break;case 4:a=e[i+1],s=e[i+2],o=e[i+3],128==(192&a)&&128==(192&s)&&128==(192&o)&&(c=(15&u)<<18|(63&a)<<12|(63&s)<<6|63&o)>65535&&c<1114112&&(l=c)}null===l?(l=65533,d=1):l>65535&&(l-=65536,n.push(l>>>10&1023|55296),l=56320|1023&l),n.push(l),i+=d}return function(e){var t=e.length;if(t<=_)return String.fromCharCode.apply(String,e);var r="",n=0;for(;n0&&(e=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(e+=" ... ")),""},c.prototype.compare=function(e,t,r,n,i){if(!c.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),t<0||r>e.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(this===e)return 0;for(var a=(i>>>=0)-(n>>>=0),s=(r>>>=0)-(t>>>=0),o=Math.min(a,s),u=this.slice(n,i),l=e.slice(t,r),d=0;di)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var a=!1;;)switch(n){case"hex":return w(this,e,t,r);case"utf8":case"utf-8":return T(this,e,t,r);case"ascii":return v(this,e,t,r);case"latin1":case"binary":return I(this,e,t,r);case"base64":return k(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,r);default:if(a)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),a=!0}},c.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var _=4096;function F(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;in)&&(r=n);for(var i="",a=t;ar)throw new RangeError("Trying to access beyond buffer length")}function M(e,t,r,n,i,a){if(!c.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}function D(e,t,r,n){t<0&&(t=65535+t+1);for(var i=0,a=Math.min(e.length-r,2);i>>8*(n?i:1-i)}function O(e,t,r,n){t<0&&(t=4294967295+t+1);for(var i=0,a=Math.min(e.length-r,4);i>>8*(n?i:3-i)&255}function R(e,t,r,n,i,a){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function U(e,t,r,n,a){return a||R(e,0,r,4),i.write(e,t,r,n,23,4),r+4}function L(e,t,r,n,a){return a||R(e,0,r,8),i.write(e,t,r,n,52,8),r+8}c.prototype.slice=function(e,t){var r,n=this.length;if((e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t0&&(i*=256);)n+=this[e+--t]*i;return n},c.prototype.readUInt8=function(e,t){return t||B(e,1,this.length),this[e]},c.prototype.readUInt16LE=function(e,t){return t||B(e,2,this.length),this[e]|this[e+1]<<8},c.prototype.readUInt16BE=function(e,t){return t||B(e,2,this.length),this[e]<<8|this[e+1]},c.prototype.readUInt32LE=function(e,t){return t||B(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},c.prototype.readUInt32BE=function(e,t){return t||B(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},c.prototype.readIntLE=function(e,t,r){e|=0,t|=0,r||B(e,t,this.length);for(var n=this[e],i=1,a=0;++a=(i*=128)&&(n-=Math.pow(2,8*t)),n},c.prototype.readIntBE=function(e,t,r){e|=0,t|=0,r||B(e,t,this.length);for(var n=t,i=1,a=this[e+--n];n>0&&(i*=256);)a+=this[e+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*t)),a},c.prototype.readInt8=function(e,t){return t||B(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},c.prototype.readInt16LE=function(e,t){t||B(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},c.prototype.readInt16BE=function(e,t){t||B(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},c.prototype.readInt32LE=function(e,t){return t||B(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},c.prototype.readInt32BE=function(e,t){return t||B(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},c.prototype.readFloatLE=function(e,t){return t||B(e,4,this.length),i.read(this,e,!0,23,4)},c.prototype.readFloatBE=function(e,t){return t||B(e,4,this.length),i.read(this,e,!1,23,4)},c.prototype.readDoubleLE=function(e,t){return t||B(e,8,this.length),i.read(this,e,!0,52,8)},c.prototype.readDoubleBE=function(e,t){return t||B(e,8,this.length),i.read(this,e,!1,52,8)},c.prototype.writeUIntLE=function(e,t,r,n){(e=+e,t|=0,r|=0,n)||M(this,e,t,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[t]=255&e;++a=0&&(a*=256);)this[t+i]=e/a&255;return t+r},c.prototype.writeUInt8=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,1,255,0),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},c.prototype.writeUInt16LE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):D(this,e,t,!0),t+2},c.prototype.writeUInt16BE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):D(this,e,t,!1),t+2},c.prototype.writeUInt32LE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):O(this,e,t,!0),t+4},c.prototype.writeUInt32BE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):O(this,e,t,!1),t+4},c.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);M(this,e,t,r,i-1,-i)}var a=0,s=1,o=0;for(this[t]=255&e;++a>0)-o&255;return t+r},c.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);M(this,e,t,r,i-1,-i)}var a=r-1,s=1,o=0;for(this[t+a]=255&e;--a>=0&&(s*=256);)e<0&&0===o&&0!==this[t+a+1]&&(o=1),this[t+a]=(e/s>>0)-o&255;return t+r},c.prototype.writeInt8=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,1,127,-128),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},c.prototype.writeInt16LE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):D(this,e,t,!0),t+2},c.prototype.writeInt16BE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):D(this,e,t,!1),t+2},c.prototype.writeInt32LE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,4,2147483647,-2147483648),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):O(this,e,t,!0),t+4},c.prototype.writeInt32BE=function(e,t,r){return e=+e,t|=0,r||M(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):O(this,e,t,!1),t+4},c.prototype.writeFloatLE=function(e,t,r){return U(this,e,t,!0,r)},c.prototype.writeFloatBE=function(e,t,r){return U(this,e,t,!1,r)},c.prototype.writeDoubleLE=function(e,t,r){return L(this,e,t,!0,r)},c.prototype.writeDoubleBE=function(e,t,r){return L(this,e,t,!1,r)},c.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t=0;--i)e[i+t]=this[i+r];else if(a<1e3||!c.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(a=t;a55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(s+1===n){(t-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;a.push(r)}else if(r<2048){if((t-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function q(e){return n.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(z,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function H(e,t,r,n){for(var i=0;i=t.length||i>=e.length);++i)t[i+r]=e[i];return i}}).call(this,r(11))},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(6),i=r(214);class a{static findZero(e,t,r,n){let i=t;if("utf16"===n){for(;0!==e[i]||0!==e[i+1];){if(i>=r)return r;i+=2}return i}for(;0!==e[i];){if(i>=r)return r;i++}return i}static trimRightNull(e){const t=e.indexOf("\0");return-1===t?e:e.substr(0,t)}static swapBytes(e){const t=e.length;n.ok(0==(1&t),"Buffer length must be even");for(let r=0;r>i;const o=8-i,c=n-o;return c<0?s>>=8-i-n:c>0&&(s<<=c,s|=a.getBitAllignedNumber(e,t,r+o,c)),s}static isBitSet(e,t,r){return 1===a.getBitAllignedNumber(e,t,r,1)}static a2hex(e){const t=[];for(let r=0,n=e.length;r0!=(e[t]&1<e.trim().toLowerCase());if(t.length>=1){const e=parseFloat(t[0]);return 2===t.length&&"db"===t[1]?{dB:e,ratio:o(e)}:{dB:s(e),ratio:e}}}},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(4),i=/^[\w-©][\w-\x000-3]/;t.FourCcToken={len:4,get:(e,r)=>{const a=e.toString("binary",r,r+t.FourCcToken.len);if(!a.match(i))throw new Error(`FourCC contains invalid characters: ${n.default.a2hex(a)}`);return a},put:(t,r,n)=>{const i=e.from(n,"binary");if(4!==i.length)throw new Error("Invalid length");return i.copy(t,r)}}}).call(this,r(3).Buffer)},function(e,t,r){"use strict";(function(t){var n=r(195);function i(e,t){if(e===t)return 0;for(var r=e.length,n=t.length,i=0,a=Math.min(r,n);i=0;u--)if(l[u]!==d[u])return!1;for(u=l.length-1;u>=0;u--)if(o=l[u],!w(e[o],t[o],r,n))return!1;return!0}(e,t,r,n))}return r?e===t:e==t}function T(e){return"[object Arguments]"==Object.prototype.toString.call(e)}function v(e,t){if(!e||!t)return!1;if("[object RegExp]"==Object.prototype.toString.call(t))return t.test(e);try{if(e instanceof t)return!0}catch(e){}return!Error.isPrototypeOf(t)&&!0===t.call({},e)}function I(e,t,r,n){var i;if("function"!=typeof t)throw new TypeError('"block" argument must be a function');"string"==typeof r&&(n=r,r=null),i=function(e){var t;try{e()}catch(e){t=e}return t}(t),n=(r&&r.name?" ("+r.name+").":".")+(n?" "+n:"."),e&&!i&&b(i,r,"Missing expected exception"+n);var a="string"==typeof n,o=!e&&i&&!r;if((!e&&s.isError(i)&&a&&v(i,r)||o)&&b(i,r,"Got unwanted exception"+n),e&&i&&r&&!v(i,r)||!e&&i)throw i}f.AssertionError=function(e){this.name="AssertionError",this.actual=e.actual,this.expected=e.expected,this.operator=e.operator,e.message?(this.message=e.message,this.generatedMessage=!1):(this.message=function(e){return m(g(e.actual),128)+" "+e.operator+" "+m(g(e.expected),128)}(this),this.generatedMessage=!0);var t=e.stackStartFunction||b;if(Error.captureStackTrace)Error.captureStackTrace(this,t);else{var r=new Error;if(r.stack){var n=r.stack,i=h(t),a=n.indexOf("\n"+i);if(a>=0){var s=n.indexOf("\n",a+1);n=n.substring(s+1)}this.stack=n}}},s.inherits(f.AssertionError,Error),f.fail=b,f.ok=y,f.equal=function(e,t,r){e!=t&&b(e,t,r,"==",f.equal)},f.notEqual=function(e,t,r){e==t&&b(e,t,r,"!=",f.notEqual)},f.deepEqual=function(e,t,r){w(e,t,!1)||b(e,t,r,"deepEqual",f.deepEqual)},f.deepStrictEqual=function(e,t,r){w(e,t,!0)||b(e,t,r,"deepStrictEqual",f.deepStrictEqual)},f.notDeepEqual=function(e,t,r){w(e,t,!1)&&b(e,t,r,"notDeepEqual",f.notDeepEqual)},f.notDeepStrictEqual=function e(t,r,n){w(t,r,!0)&&b(t,r,n,"notDeepStrictEqual",e)},f.strictEqual=function(e,t,r){e!==t&&b(e,t,r,"===",f.strictEqual)},f.notStrictEqual=function(e,t,r){e===t&&b(e,t,r,"!==",f.notStrictEqual)},f.throws=function(e,t,r){I(!0,e,t,r)},f.doesNotThrow=function(e,t,r){I(!1,e,t,r)},f.ifError=function(e){if(e)throw e},f.strict=n(function e(t,r){t||b(t,!0,r,"==",e)},f,{equal:f.strictEqual,deepEqual:f.deepStrictEqual,notEqual:f.notStrictEqual,notDeepEqual:f.notDeepStrictEqual}),f.strict.strict=f.strict;var k=Object.keys||function(e){var t=[];for(var r in e)o.call(e,r)&&t.push(r);return t}}).call(this,r(11))},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.BasicParser=class{constructor(){this.warnings=[]}init(e,t,r){return this.metadata=e,this.tokenizer=t,this.options=r,this}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(24);class i{constructor(e,t){this.tagTypes=e,this.tagMap=t}static parseGenre(e){const t=e.trim().split(/\((.*?)\)/g).filter(e=>""!==e),r=[];for(let e of t)/^\d+$/.test(e)&&!isNaN(parseInt(e,10))&&(e=n.Genres[e]),r.push(e);return r.filter(e=>void 0!==e).join("/")}static fixPictureMimeType(e){switch(e=e.toLocaleLowerCase()){case"image/jpg":return"image/jpeg"}return e}static toIntOrNull(e){const t=parseInt(e,10);return isNaN(t)?null:t}static normalizeTrack(e){const t=e.toString().split("/");return{no:parseInt(t[0],10)||null,of:parseInt(t[1],10)||null}}mapGenericTag(e){e={id:e.id,value:e.value},this.postMap(e);const t=this.getCommonName(e.id);return t?{id:t,value:e.value}:null}getCommonName(e){return this.tagMap[e]}postMap(e){}}i.maxRatingScore=1,t.CommonTagMapper=i},function(e,t){var r,n,i=e.exports={};function a(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function o(e){if(r===setTimeout)return setTimeout(e,0);if((r===a||!r)&&setTimeout)return r=setTimeout,setTimeout(e,0);try{return r(e,0)}catch(t){try{return r.call(null,e,0)}catch(t){return r.call(this,e,0)}}}!function(){try{r="function"==typeof setTimeout?setTimeout:a}catch(e){r=a}try{n="function"==typeof clearTimeout?clearTimeout:s}catch(e){n=s}}();var c,u=[],l=!1,d=-1;function f(){l&&c&&(l=!1,c.length?u=c.concat(u):d=-1,u.length&&p())}function p(){if(!l){var e=o(f);l=!0;for(var t=u.length;t;){for(c=u,u=[];++d1)for(var r=1;r0?this.parseExtendedHeaderData(t,e.size):this.parseId3Data(this.id3Header.size-e.size)}async parseExtendedHeaderData(t,r){const n=e.alloc(t);return await this.tokenizer.readBuffer(n,0,t),this.parseId3Data(this.id3Header.size-r)}async parseId3Data(t){const r=e.alloc(t);await this.tokenizer.readBuffer(r,0,t);for(const e of this.parseMetadata(r))if("TXXX"===e.id)for(const t of e.value.text)this.addTag(o.makeDescriptionTagName(e.id,e.value.description),t);else if("COM"===e.id)for(const t of e.value)this.addTag(o.makeDescriptionTagName(e.id,t.description),t.text);else if(Array.isArray(e.value))for(const t of e.value)this.addTag(e.id,t);else this.addTag(e.id,e.value)}addTag(e,t){this.metadata.addTag(this.headerType,e,t)}parseMetadata(e){let t=0;const r=[];for(;t!==e.length;){const n=o.getFrameHeaderLength(this.id3Header.version.major);if(t+n>e.length)break;const i=e.slice(t,t+=n),a=o.readFrameHeader(i,this.id3Header.version.major);if(""===a.id||"\0\0\0\0"===a.id||-1==="ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(a.id[0]))break;const s=e.slice(t,t+=a.length),c=o.readFrameData(s,a,this.id3Header.version.major,!this.options.skipCovers);r.push({id:a.id,value:c})}return r}}t.ID3v2Parser=o}).call(this,r(3).Buffer)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(4);!function(e){e[e.Other=0]="Other",e[e["32x32 pixels 'file icon' (PNG only)"]=1]="32x32 pixels 'file icon' (PNG only)",e[e["Other file icon"]=2]="Other file icon",e[e["Cover (front)"]=3]="Cover (front)",e[e["Cover (back)"]=4]="Cover (back)",e[e["Leaflet page"]=5]="Leaflet page",e[e["Media (e.g. label side of CD)"]=6]="Media (e.g. label side of CD)",e[e["Lead artist/lead performer/soloist"]=7]="Lead artist/lead performer/soloist",e[e["Artist/performer"]=8]="Artist/performer",e[e.Conductor=9]="Conductor",e[e["Band/Orchestra"]=10]="Band/Orchestra",e[e.Composer=11]="Composer",e[e["Lyricist/text writer"]=12]="Lyricist/text writer",e[e["Recording Location"]=13]="Recording Location",e[e["During recording"]=14]="During recording",e[e["During performance"]=15]="During performance",e[e["Movie/video screen capture"]=16]="Movie/video screen capture",e[e["A bright coloured fish"]=17]="A bright coloured fish",e[e.Illustration=18]="Illustration",e[e["Band/artist logotype"]=19]="Band/artist logotype",e[e["Publisher/Studio logotype"]=20]="Publisher/Studio logotype"}(t.AttachedPictureType||(t.AttachedPictureType={})),t.UINT32SYNCSAFE={get:(e,t)=>127&e[t+3]|e[t+2]<<7|e[t+1]<<14|e[t]<<21,len:4},t.ID3v2Header={len:10,get:(e,r)=>({fileIdentifier:new n.StringType(3,"ascii").get(e,r),version:{major:n.INT8.get(e,r+3),revision:n.INT8.get(e,r+4)},flags:{raw:n.INT8.get(e,r+4),unsynchronisation:i.default.strtokBITSET.get(e,r+5,7),isExtendedHeader:i.default.strtokBITSET.get(e,r+5,6),expIndicator:i.default.strtokBITSET.get(e,r+5,5),footer:i.default.strtokBITSET.get(e,r+5,4)},size:t.UINT32SYNCSAFE.get(e,r+6)})},t.ExtendedHeader={len:10,get:(e,t)=>({size:n.UINT32_BE.get(e,t),extendedFlags:n.UINT16_BE.get(e,t+4),sizeOfPadding:n.UINT32_BE.get(e,t+6),crcDataPresent:i.default.strtokBITSET.get(e,t+4,31)})},t.TextEncodingToken={len:1,get:(e,t)=>{switch(e.readUInt8(t)){case 0:return{encoding:"iso-8859-1"};case 1:return{encoding:"utf16",bom:!0};case 2:return{encoding:"utf16",bom:!1};case 3:default:return{encoding:"utf8",bom:!1}}}}},function(e,t,r){(function(e){function r(e){return Object.prototype.toString.call(e)}t.isArray=function(e){return Array.isArray?Array.isArray(e):"[object Array]"===r(e)},t.isBoolean=function(e){return"boolean"==typeof e},t.isNull=function(e){return null===e},t.isNullOrUndefined=function(e){return null==e},t.isNumber=function(e){return"number"==typeof e},t.isString=function(e){return"string"==typeof e},t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=function(e){return void 0===e},t.isRegExp=function(e){return"[object RegExp]"===r(e)},t.isObject=function(e){return"object"==typeof e&&null!==e},t.isDate=function(e){return"[object Date]"===r(e)},t.isError=function(e){return"[object Error]"===r(e)||e instanceof Error},t.isFunction=function(e){return"function"==typeof e},t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=e.isBuffer}).call(this,r(3).Buffer)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(192),i=r(202);t.fromStream=function(e,t){return new n.ReadStreamTokenizer(e,t)},t.fromBuffer=function(e){return new i.BufferTokenizer(e)}},function(e,t,r){"use strict";(function(t){void 0===t||!t.version||0===t.version.indexOf("v0.")||0===t.version.indexOf("v1.")&&0!==t.version.indexOf("v1.8.")?e.exports={nextTick:function(e,r,n,i){if("function"!=typeof e)throw new TypeError('"callback" argument must be a function');var a,s,o=arguments.length;switch(o){case 0:case 1:return t.nextTick(e);case 2:return t.nextTick(function(){e.call(null,r)});case 3:return t.nextTick(function(){e.call(null,r,n)});case 4:return t.nextTick(function(){e.call(null,r,n,i)});default:for(a=new Array(o-1),s=0;s1?e.blocksPerFrame*(e.totalFrames-1):0;return(t+=e.finalFrameBlocks)/e.sampleRate}static async parseTagHeader(t,r,n){if(r.fileSize&&r.fileSize-r.position0?this.parseDescriptorExpansion(t):this.parseHeader());return await this.tokenizer.readToken(new a.IgnoreType(r.forwardBytes)),p.parseTagHeader(this.metadata,this.tokenizer,this.options)}async parseDescriptorExpansion(e){return await this.tokenizer.readToken(new a.IgnoreType(e)),this.parseHeader()}async parseHeader(){const e=await this.tokenizer.readToken(u.Header);return this.metadata.setFormat("lossless",!0),this.metadata.setFormat("container","Monkey's Audio"),this.metadata.setFormat("bitsPerSample",e.bitsPerSample),this.metadata.setFormat("sampleRate",e.sampleRate),this.metadata.setFormat("numberOfChannels",e.channel),this.metadata.setFormat("duration",p.calculateDuration(e)),{forwardBytes:this.ape.descriptor.seekTableBytes+this.ape.descriptor.headerDataBytes+this.ape.descriptor.apeFrameDataBytes+this.ape.descriptor.terminatingDataBytes}}}t.APEv2Parser=p}).call(this,r(3).Buffer)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(10),i=r(17),a=r(16),s=r(24),o=r(2),c=r(7),u=o("music-metadata:parser:ID3");t.AbstractID3Parser=class extends c.BasicParser{constructor(){super(...arguments),this.id3parser=new a.ID3v2Parser}static async startsWithID3v2Header(e){return"ID3"===(await e.peekToken(i.ID3v2Header)).fileIdentifier}parse(){return this.parseID3v2().catch(e=>{if(e.message!==n.endOfFile)throw e})}finalize(){}async parseID3v2(){if(await this.tryReadId3v2Headers(),u("End of ID3v2 header, go to MPEG-parser: pos=%s",this.tokenizer.position),await this._parse(),this.options.skipPostHeaders&&this.metadata.hasAny())this.finalize();else{const e=new s.ID3v1Parser;await e.init(this.metadata,this.tokenizer,this.options).parse(),this.finalize()}}async tryReadId3v2Headers(){if("ID3"===(await this.tokenizer.peekToken(i.ID3v2Header)).fileIdentifier)return u("Found ID3v2 header, pos=%s",this.tokenizer.position),await this.id3parser.parse(this.metadata,this.tokenizer,this.options),this.tryReadId3v2Headers()}}},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(4),a=r(1),s=r(7),o=n("music-metadata:parser:ID3v1");t.Genres=["Blues","Classic Rock","Country","Dance","Disco","Funk","Grunge","Hip-Hop","Jazz","Metal","New Age","Oldies","Other","Pop","R&B","Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska","Death Metal","Pranks","Soundtrack","Euro-Techno","Ambient","Trip-Hop","Vocal","Jazz+Funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound Clip","Gospel","Noise","Alt. Rock","Bass","Soul","Punk","Space","Meditative","Instrumental Pop","Instrumental Rock","Ethnic","Gothic","Darkwave","Techno-Industrial","Electronic","Pop-Folk","Eurodance","Dream","Southern Rock","Comedy","Cult","Gangsta Rap","Top 40","Christian Rap","Pop/Funk","Jungle","Native American","Cabaret","New Wave","Psychedelic","Rave","Showtunes","Trailer","Lo-Fi","Tribal","Acid Punk","Acid Jazz","Polka","Retro","Musical","Rock & Roll","Hard Rock","Folk","Folk/Rock","National Folk","Swing","Fast-Fusion","Bebob","Latin","Revival","Celtic","Bluegrass","Avantgarde","Gothic Rock","Progressive Rock","Psychedelic Rock","Symphonic Rock","Slow Rock","Big Band","Chorus","Easy Listening","Acoustic","Humour","Speech","Chanson","Opera","Chamber Music","Sonata","Symphony","Booty Bass","Primus","Porn Groove","Satire","Slow Jam","Club","Tango","Samba","Folklore","Ballad","Power Ballad","Rhythmic Soul","Freestyle","Duet","Punk Rock","Drum Solo","A Cappella","Euro-House","Dance Hall","Goa","Drum & Bass","Club-House","Hardcore","Terror","Indie","BritPop","Negerpunk","Polsk Punk","Beat","Christian Gangsta Rap","Heavy Metal","Black Metal","Crossover","Contemporary Christian","Christian Rock","Merengue","Salsa","Thrash Metal","Anime","JPop","Synthpop","Abstract","Art Rock","Baroque","Bhangra","Big Beat","Breakbeat","Chillout","Downtempo","Dub","EBM","Eclectic","Electro","Electroclash","Emo","Experimental","Garage","Global","IDM","Illbient","Industro-Goth","Jam Band","Krautrock","Leftfield","Lounge","Math Rock","New Romantic","Nu-Breakz","Post-Punk","Post-Rock","Psytrance","Shoegaze","Space Rock","Trop Rock","World Music","Neoclassical","Audiobook","Audio Theatre","Neue Deutsche Welle","Podcast","Indie Rock","G-Funk","Dubstep","Garage Rock","Psybient"];const c={len:128,get:(e,t)=>{const r=new u(3).get(e,t);return"TAG"===r?{header:r,title:new u(30).get(e,t+3),artist:new u(30).get(e,t+33),album:new u(30).get(e,t+63),year:new u(4).get(e,t+93),comment:new u(28).get(e,t+97),zeroByte:a.UINT8.get(e,t+127),track:a.UINT8.get(e,t+126),genre:a.UINT8.get(e,t+127)}:null}};class u extends a.StringType{constructor(e){super(e,"binary")}get(e,t){let r=super.get(e,t);return(r=(r=i.default.trimRightNull(r)).trim()).length>0?r:void 0}}class l extends s.BasicParser{static getGenre(e){if(ee)return void o("Already consumed the last 128 bytes");const t=await this.tokenizer.readToken(c,e);if(t){o("ID3v1 header found at: pos=%s",this.tokenizer.fileSize-c.len);for(const e of["title","artist","album","comment","track","year"])t[e]&&""!==t[e]&&this.addTag(e,t[e]);const e=l.getGenre(t.genre);e&&this.addTag("genre",e)}else o("ID3v1 header not found at: pos=%s",this.tokenizer.fileSize-c.len)}addTag(e,t){this.metadata.addTag("ID3v1",e,t)}}t.ID3v1Parser=l},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35);t.ID3Stream=class extends n.Readable{constructor(e){super(),this.buf=e}_read(){this.push(this.buf),this.push(null)}}},function(e,t,r){"use strict";var n,i="object"==typeof Reflect?Reflect:null,a=i&&"function"==typeof i.apply?i.apply:function(e,t,r){return Function.prototype.apply.call(e,t,r)};n=i&&"function"==typeof i.ownKeys?i.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function o(){o.init.call(this)}e.exports=o,o.EventEmitter=o,o.prototype._events=void 0,o.prototype._eventsCount=0,o.prototype._maxListeners=void 0;var c=10;function u(e){return void 0===e._maxListeners?o.defaultMaxListeners:e._maxListeners}function l(e,t,r,n){var i,a,s,o;if("function"!=typeof r)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof r);if(void 0===(a=e._events)?(a=e._events=Object.create(null),e._eventsCount=0):(void 0!==a.newListener&&(e.emit("newListener",t,r.listener?r.listener:r),a=e._events),s=a[t]),void 0===s)s=a[t]=r,++e._eventsCount;else if("function"==typeof s?s=a[t]=n?[r,s]:[s,r]:n?s.unshift(r):s.push(r),(i=u(e))>0&&s.length>i&&!s.warned){s.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=s.length,o=c,console&&console.warn&&console.warn(o)}return e}function d(e,t,r){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:r},i=function(){for(var e=[],t=0;t0&&(s=t[0]),s instanceof Error)throw s;var o=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw o.context=s,o}var c=i[e];if(void 0===c)return!1;if("function"==typeof c)a(c,this,t);else{var u=c.length,l=h(c,u);for(r=0;r=0;a--)if(r[a]===t||r[a].listener===t){s=r[a].listener,i=a;break}if(i<0)return this;0===i?r.shift():function(e,t){for(;t+1=0;n--)this.removeListener(e,t[n]);return this},o.prototype.listeners=function(e){return f(this,e,!0)},o.prototype.rawListeners=function(e){return f(this,e,!1)},o.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},o.prototype.listenerCount=p,o.prototype.eventNames=function(){return this._eventsCount>0?n(this._events):[]}},function(e,t,r){(t=e.exports=r(36)).Stream=t,t.Readable=t,t.Writable=r(29),t.Duplex=r(12),t.Transform=r(40),t.PassThrough=r(233)},function(e,t,r){var n=r(3),i=n.Buffer;function a(e,t){for(var r in e)t[r]=e[r]}function s(e,t,r){return i(e,t,r)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=n:(a(n,t),t.Buffer=s),a(i,s),s.from=function(e,t,r){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,r)},s.alloc=function(e,t,r){if("number"!=typeof e)throw new TypeError("Argument must be a number");var n=i(e);return void 0!==t?"string"==typeof r?n.fill(t,r):n.fill(t):n.fill(0),n},s.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},s.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return n.SlowBuffer(e)}},function(e,t,r){"use strict";(function(t,n,i){var a=r(20);function s(e){var t=this;this.next=null,this.entry=null,this.finish=function(){!function(e,t,r){var n=e.entry;e.entry=null;for(;n;){var i=n.callback;t.pendingcb--,i(r),n=n.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}(t,e)}}e.exports=y;var o,c=!t.browser&&["v0.10","v0.9."].indexOf(t.version.slice(0,5))>-1?n:a.nextTick;y.WritableState=b;var u=r(18);u.inherits=r(15);var l={deprecate:r(231)},d=r(37),f=r(28).Buffer,p=i.Uint8Array||function(){};var h,m=r(38);function g(){}function b(e,t){o=o||r(12),e=e||{};var n=t instanceof o;this.objectMode=!!e.objectMode,n&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var i=e.highWaterMark,u=e.writableHighWaterMark,l=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(u||0===u)?u:l,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var d=!1===e.decodeStrings;this.decodeStrings=!d,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var r=e._writableState,n=r.sync,i=r.writecb;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(r),t)!function(e,t,r,n,i){--t.pendingcb,r?(a.nextTick(i,n),a.nextTick(S,e,t),e._writableState.errorEmitted=!0,e.emit("error",n)):(i(n),e._writableState.errorEmitted=!0,e.emit("error",n),S(e,t))}(e,r,n,t,i);else{var s=I(r);s||r.corked||r.bufferProcessing||!r.bufferedRequest||v(e,r),n?c(T,e,r,s,i):T(e,r,s,i)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new s(this)}function y(e){if(o=o||r(12),!(h.call(y,this)||this instanceof o))return new y(e);this._writableState=new b(e,this),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev),"function"==typeof e.destroy&&(this._destroy=e.destroy),"function"==typeof e.final&&(this._final=e.final)),d.call(this)}function w(e,t,r,n,i,a,s){t.writelen=n,t.writecb=s,t.writing=!0,t.sync=!0,r?e._writev(i,t.onwrite):e._write(i,a,t.onwrite),t.sync=!1}function T(e,t,r,n){r||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit("drain"))}(e,t),t.pendingcb--,n(),S(e,t)}function v(e,t){t.bufferProcessing=!0;var r=t.bufferedRequest;if(e._writev&&r&&r.next){var n=t.bufferedRequestCount,i=new Array(n),a=t.corkedRequestsFree;a.entry=r;for(var o=0,c=!0;r;)i[o]=r,r.isBuf||(c=!1),r=r.next,o+=1;i.allBuffers=c,w(e,t,!0,t.length,i,"",a.finish),t.pendingcb++,t.lastBufferedRequest=null,a.next?(t.corkedRequestsFree=a.next,a.next=null):t.corkedRequestsFree=new s(t),t.bufferedRequestCount=0}else{for(;r;){var u=r.chunk,l=r.encoding,d=r.callback;if(w(e,t,!1,t.objectMode?1:u.length,u,l,d),r=r.next,t.bufferedRequestCount--,t.writing)break}null===r&&(t.lastBufferedRequest=null)}t.bufferedRequest=r,t.bufferProcessing=!1}function I(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function k(e,t){e._final(function(r){t.pendingcb--,r&&e.emit("error",r),t.prefinished=!0,e.emit("prefinish"),S(e,t)})}function S(e,t){var r=I(t);return r&&(!function(e,t){t.prefinished||t.finalCalled||("function"==typeof e._final?(t.pendingcb++,t.finalCalled=!0,a.nextTick(k,e,t)):(t.prefinished=!0,e.emit("prefinish")))}(e,t),0===t.pendingcb&&(t.finished=!0,e.emit("finish"))),r}u.inherits(y,d),b.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(b.prototype,"buffer",{get:l.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(e){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(h=Function.prototype[Symbol.hasInstance],Object.defineProperty(y,Symbol.hasInstance,{value:function(e){return!!h.call(this,e)||this===y&&(e&&e._writableState instanceof b)}})):h=function(e){return e instanceof this},y.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},y.prototype.write=function(e,t,r){var n,i=this._writableState,s=!1,o=!i.objectMode&&(n=e,f.isBuffer(n)||n instanceof p);return o&&!f.isBuffer(e)&&(e=function(e){return f.from(e)}(e)),"function"==typeof t&&(r=t,t=null),o?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=g),i.ended?function(e,t){var r=new Error("write after end");e.emit("error",r),a.nextTick(t,r)}(this,r):(o||function(e,t,r,n){var i=!0,s=!1;return null===r?s=new TypeError("May not write null values to stream"):"string"==typeof r||void 0===r||t.objectMode||(s=new TypeError("Invalid non-string/buffer chunk")),s&&(e.emit("error",s),a.nextTick(n,s),i=!1),i}(this,i,e,r))&&(i.pendingcb++,s=function(e,t,r,n,i,a){if(!r){var s=function(e,t,r){e.objectMode||!1===e.decodeStrings||"string"!=typeof t||(t=f.from(t,r));return t}(t,n,i);n!==s&&(r=!0,i="buffer",n=s)}var o=t.objectMode?1:n.length;t.length+=o;var c=t.length-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},Object.defineProperty(y.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),y.prototype._write=function(e,t,r){r(new Error("_write() is not implemented"))},y.prototype._writev=null,y.prototype.end=function(e,t,r){var n=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!=e&&this.write(e,t),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||function(e,t,r){t.ending=!0,S(e,t),r&&(t.finished?a.nextTick(r):e.once("finish",r));t.ended=!0,e.writable=!1}(this,n,r)},Object.defineProperty(y.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),y.prototype.destroy=m.destroy,y.prototype._undestroy=m.undestroy,y.prototype._destroy=function(e,t){this.end(),t(e)}}).call(this,r(9),r(229).setImmediate,r(11))},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(2),a=r(42),s=i("music-metadata:parser:ogg:vorbis1");t.VorbisParser=class{constructor(e,t){this.metadata=e,this.options=t,this.codecName="Vorbis I",this.pageSegments=[]}parsePage(t,r){if(t.headerType.firstPage)this.parseFirstPage(t,r);else{if(t.headerType.continued){if(0===this.pageSegments.length)throw new Error("Cannot continue on previous page");this.pageSegments.push(r)}if(t.headerType.lastPage||!t.headerType.continued){if(this.pageSegments.length>0){const t=e.concat(this.pageSegments);this.parseFullPage(t)}this.pageSegments=t.headerType.lastPage?[]:[r]}}t.headerType.lastPage&&this.calculateDuration(t)}flush(){this.parseFullPage(e.concat(this.pageSegments))}parseFirstPage(e,t){this.metadata.setFormat("codec","Vorbis I"),s("Parse first page");const r=a.CommonHeader.get(t,0);if("vorbis"!==r.vorbis)throw new Error("Metadata does not look like Vorbis");if(1!==r.packetType)throw new Error("First Ogg page should be type 1: the identification header");{const e=a.IdentificationHeader.get(t,a.CommonHeader.len);this.metadata.setFormat("sampleRate",e.sampleRate),this.metadata.setFormat("bitrate",e.bitrateNominal),this.metadata.setFormat("numberOfChannels",e.channelMode),s("sample-rate=%s[hz], bitrate=%s[b/s], channel-mode=%s",e.sampleRate,e.bitrateNominal,e.channelMode)}}parseFullPage(e){const t=a.CommonHeader.get(e,0);switch(s("Parse full page: type=%s, byteLength=%s",t.packetType,e.byteLength),t.packetType){case 3:return this.parseUserCommentList(e,a.CommonHeader.len)}}calculateDuration(e){this.metadata.format.sampleRate&&e.absoluteGranulePosition>=0&&(this.metadata.setFormat("numberOfSamples",e.absoluteGranulePosition),this.metadata.setFormat("duration",this.metadata.format.numberOfSamples/this.metadata.format.sampleRate))}parseUserCommentList(e,t){const r=n.UINT32_LE.get(e,t);t+=4,new n.StringType(r,"utf-8").get(e,t),t+=r;let i=n.UINT32_LE.get(e,t);for(t+=4;i-- >0;)t+=this.parseUserComment(e,t)}parseUserComment(e,t){const r=n.UINT32_LE.get(e,t),i=new n.StringType(r,"utf-8").get(e,t+4),o=i.indexOf("="),c=i.slice(0,o).toUpperCase();let u=i.slice(o+1);return"METADATA_BLOCK_PICTURE"===c&&(u=this.options.skipCovers?null:a.VorbisPictureToken.fromBase64(u)),null!==u&&(s("Push tag: id=%s, value=%s",c,u),this.metadata.addTag("vorbis",c,u)),n.UINT32_LE.len+r}}}).call(this,r(3).Buffer)},,,function(e,t){var r={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==r.call(e)}},function(module,exports,__webpack_require__){"use strict";(function(Buffer){const{multiByteIndexOf:multiByteIndexOf,stringToBytes:stringToBytes,readUInt64LE:readUInt64LE,tarHeaderChecksumMatches:tarHeaderChecksumMatches,uint8ArrayUtf8ByteString:uint8ArrayUtf8ByteString}=__webpack_require__(204),supported=__webpack_require__(205),xpiZipFilename=stringToBytes("META-INF/mozilla.rsa"),oxmlContentTypes=stringToBytes("[Content_Types].xml"),oxmlRels=stringToBytes("_rels/.rels"),fileType=e=>{if(!(e instanceof Uint8Array||e instanceof ArrayBuffer||Buffer.isBuffer(e)))throw new TypeError(`Expected the \`input\` argument to be of type \`Uint8Array\` or \`Buffer\` or \`ArrayBuffer\`, got \`${typeof e}\``);const t=e instanceof Uint8Array?e:new Uint8Array(e);if(!(t&&t.length>1))return;const r=(e,r)=>{r={offset:0,...r};for(let n=0;nr(stringToBytes(e),t);if(r([255,216,255]))return{ext:"jpg",mime:"image/jpeg"};if(r([137,80,78,71,13,10,26,10])){const e=33,r=t.findIndex((r,n)=>n>=e&&73===t[n]&&68===t[n+1]&&65===t[n+2]&&84===t[n+3]),n=t.subarray(e,r);return n.findIndex((e,t)=>97===n[t]&&99===n[t+1]&&84===n[t+2]&&76===n[t+3])>=0?{ext:"apng",mime:"image/apng"}:{ext:"png",mime:"image/png"}}if(r([71,73,70]))return{ext:"gif",mime:"image/gif"};if(r([87,69,66,80],{offset:8}))return{ext:"webp",mime:"image/webp"};if(r([70,76,73,70]))return{ext:"flif",mime:"image/flif"};if((r([73,73,42,0])||r([77,77,0,42]))&&r([67,82],{offset:8}))return{ext:"cr2",mime:"image/x-canon-cr2"};if(r([73,73,82,79,8,0,0,0,24]))return{ext:"orf",mime:"image/x-olympus-orf"};if(r([73,73,42,0])&&(r([16,251,134,1],{offset:4})||r([8,0,0,0,19,0],{offset:4})||r([8,0,0,0,18,0],{offset:4})))return{ext:"arw",mime:"image/x-sony-arw"};if(r([73,73,42,0,8,0,0,0])&&(r([45,0,254,0],{offset:8})||r([39,0,254,0],{offset:8})))return{ext:"dng",mime:"image/x-adobe-dng"};if(r([73,73,42,0])&&r([28,0,254,0],{offset:8}))return{ext:"nef",mime:"image/x-nikon-nef"};if(r([73,73,85,0,24,0,0,0,136,231,116,216]))return{ext:"rw2",mime:"image/x-panasonic-rw2"};if(n("FUJIFILMCCD-RAW"))return{ext:"raf",mime:"image/x-fujifilm-raf"};if(r([73,73,42,0])||r([77,77,0,42]))return{ext:"tif",mime:"image/tiff"};if(r([66,77]))return{ext:"bmp",mime:"image/bmp"};if(r([73,73,188]))return{ext:"jxr",mime:"image/vnd.ms-photo"};if(r([56,66,80,83]))return{ext:"psd",mime:"image/vnd.adobe.photoshop"};const i=[80,75,3,4];if(r(i)){if(r([109,105,109,101,116,121,112,101,97,112,112,108,105,99,97,116,105,111,110,47,101,112,117,98,43,122,105,112],{offset:30}))return{ext:"epub",mime:"application/epub+zip"};if(r(xpiZipFilename,{offset:30}))return{ext:"xpi",mime:"application/x-xpinstall"};if(n("mimetypeapplication/vnd.oasis.opendocument.text",{offset:30}))return{ext:"odt",mime:"application/vnd.oasis.opendocument.text"};if(n("mimetypeapplication/vnd.oasis.opendocument.spreadsheet",{offset:30}))return{ext:"ods",mime:"application/vnd.oasis.opendocument.spreadsheet"};if(n("mimetypeapplication/vnd.oasis.opendocument.presentation",{offset:30}))return{ext:"odp",mime:"application/vnd.oasis.opendocument.presentation"};let e,a=0,s=!1;do{const o=a+30;if(s||(s=r(oxmlContentTypes,{offset:o})||r(oxmlRels,{offset:o})),e||(n("word/",{offset:o})?e={ext:"docx",mime:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"}:n("ppt/",{offset:o})?e={ext:"pptx",mime:"application/vnd.openxmlformats-officedocument.presentationml.presentation"}:n("xl/",{offset:o})&&(e={ext:"xlsx",mime:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})),s&&e)return e;a=multiByteIndexOf(t,i,o)}while(a>=0);if(e)return e}if(r([80,75])&&(3===t[2]||5===t[2]||7===t[2])&&(4===t[3]||6===t[3]||8===t[3]))return{ext:"zip",mime:"application/zip"};if(r([48,48,48,48,48,48],{offset:148,mask:[248,248,248,248,248,248]})&&tarHeaderChecksumMatches(t))return{ext:"tar",mime:"application/x-tar"};if(r([82,97,114,33,26,7])&&(0===t[6]||1===t[6]))return{ext:"rar",mime:"application/x-rar-compressed"};if(r([31,139,8]))return{ext:"gz",mime:"application/gzip"};if(r([66,90,104]))return{ext:"bz2",mime:"application/x-bzip2"};if(r([55,122,188,175,39,28]))return{ext:"7z",mime:"application/x-7z-compressed"};if(r([120,1]))return{ext:"dmg",mime:"application/x-apple-diskimage"};if(r([102,114,101,101],{offset:4})||r([109,100,97,116],{offset:4})||r([109,111,111,118],{offset:4})||r([119,105,100,101],{offset:4}))return{ext:"mov",mime:"video/quicktime"};if(r([102,116,121,112],{offset:4})&&0!=(96&t[8])&&0!=(96&t[9])&&0!=(96&t[10])&&0!=(96&t[11])){const e=uint8ArrayUtf8ByteString(t,8,12);switch(e){case"mif1":return{ext:"heic",mime:"image/heif"};case"msf1":return{ext:"heic",mime:"image/heif-sequence"};case"heic":case"heix":return{ext:"heic",mime:"image/heic"};case"hevc":case"hevx":return{ext:"heic",mime:"image/heic-sequence"};case"qt ":return{ext:"mov",mime:"video/quicktime"};case"M4V ":case"M4VH":case"M4VP":return{ext:"m4v",mime:"video/x-m4v"};case"M4P ":return{ext:"m4p",mime:"video/mp4"};case"M4B ":return{ext:"m4b",mime:"audio/mp4"};case"M4A ":return{ext:"m4a",mime:"audio/x-m4a"};case"F4V ":return{ext:"f4v",mime:"video/mp4"};case"F4P ":return{ext:"f4p",mime:"video/mp4"};case"F4A ":return{ext:"f4a",mime:"audio/mp4"};case"F4B ":return{ext:"f4b",mime:"audio/mp4"};default:return e.startsWith("3g")?e.startsWith("3g2")?{ext:"3g2",mime:"video/3gpp2"}:{ext:"3gp",mime:"video/3gpp"}:{ext:"mp4",mime:"video/mp4"}}}if(r([77,84,104,100]))return{ext:"mid",mime:"audio/midi"};if(r([26,69,223,163])){const e=t.subarray(4,4100),r=e.findIndex((e,t,r)=>66===r[t]&&130===r[t+1]);if(-1!==r){const t=r+3,n=r=>[...r].every((r,n)=>e[t+n]===r.charCodeAt(0));if(n("matroska"))return{ext:"mkv",mime:"video/x-matroska"};if(n("webm"))return{ext:"webm",mime:"video/webm"}}}if(r([82,73,70,70])){if(r([65,86,73],{offset:8}))return{ext:"avi",mime:"video/vnd.avi"};if(r([87,65,86,69],{offset:8}))return{ext:"wav",mime:"audio/vnd.wave"};if(r([81,76,67,77],{offset:8}))return{ext:"qcp",mime:"audio/qcelp"}}if(r([48,38,178,117,142,102,207,17,166,217])){let e=30;do{const n=readUInt64LE(t,e+16);if(r([145,7,220,183,183,169,207,17,142,230,0,192,12,32,83,101],{offset:e})){if(r([64,158,105,248,77,91,207,17,168,253,0,128,95,92,68,43],{offset:e+24}))return{ext:"wma",mime:"audio/x-ms-wma"};if(r([192,239,25,188,77,91,207,17,168,253,0,128,95,92,68,43],{offset:e+24}))return{ext:"wmv",mime:"video/x-ms-asf"};break}e+=n}while(e+24<=t.length);return{ext:"asf",mime:"application/vnd.ms-asf"}}if(r([0,0,1,186])||r([0,0,1,179]))return{ext:"mpg",mime:"video/mpeg"};for(let e=0;e<2&&enew Promise((resolve,reject)=>{const stream=eval("require")("stream");readableStream.on("error",reject),readableStream.once("readable",()=>{const e=new stream.PassThrough,t=readableStream.read(module.exports.minimumBytes)||readableStream.read();try{e.fileType=fileType(t)}catch(e){reject(e)}readableStream.unshift(t),stream.pipeline?resolve(stream.pipeline(readableStream,e,()=>{})):resolve(readableStream.pipe(e))})}),Object.defineProperty(fileType,"extensions",{get:()=>new Set(supported.extensions)}),Object.defineProperty(fileType,"mimeTypes",{get:()=>new Set(supported.mimeTypes)})}).call(this,__webpack_require__(3).Buffer)},function(e,t,r){e.exports=i;var n=r(26).EventEmitter;function i(){n.call(this)}r(15)(i,n),i.Readable=r(27),i.Writable=r(234),i.Duplex=r(235),i.Transform=r(236),i.PassThrough=r(237),i.Stream=i,i.prototype.pipe=function(e,t){var r=this;function i(t){e.writable&&!1===e.write(t)&&r.pause&&r.pause()}function a(){r.readable&&r.resume&&r.resume()}r.on("data",i),e.on("drain",a),e._isStdio||t&&!1===t.end||(r.on("end",o),r.on("close",c));var s=!1;function o(){s||(s=!0,e.end())}function c(){s||(s=!0,"function"==typeof e.destroy&&e.destroy())}function u(e){if(l(),0===n.listenerCount(this,"error"))throw e}function l(){r.removeListener("data",i),e.removeListener("drain",a),r.removeListener("end",o),r.removeListener("close",c),r.removeListener("error",u),e.removeListener("error",u),r.removeListener("end",l),r.removeListener("close",l),e.removeListener("close",l)}return r.on("error",u),e.on("error",u),r.on("end",l),r.on("close",l),e.on("close",l),e.emit("pipe",r),e}},function(e,t,r){"use strict";(function(t,n){var i=r(20);e.exports=w;var a,s=r(33);w.ReadableState=y;r(26).EventEmitter;var o=function(e,t){return e.listeners(t).length},c=r(37),u=r(28).Buffer,l=t.Uint8Array||function(){};var d=r(18);d.inherits=r(15);var f=r(226),p=void 0;p=f&&f.debuglog?f.debuglog("stream"):function(){};var h,m=r(227),g=r(38);d.inherits(w,c);var b=["error","close","destroy","pause","resume"];function y(e,t){e=e||{};var n=t instanceof(a=a||r(12));this.objectMode=!!e.objectMode,n&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var i=e.highWaterMark,s=e.readableHighWaterMark,o=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(s||0===s)?s:o,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new m,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(h||(h=r(39).StringDecoder),this.decoder=new h(e.encoding),this.encoding=e.encoding)}function w(e){if(a=a||r(12),!(this instanceof w))return new w(e);this._readableState=new y(e,this),this.readable=!0,e&&("function"==typeof e.read&&(this._read=e.read),"function"==typeof e.destroy&&(this._destroy=e.destroy)),c.call(this)}function T(e,t,r,n,i){var a,s=e._readableState;null===t?(s.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,S(e)}(e,s)):(i||(a=function(e,t){var r;n=t,u.isBuffer(n)||n instanceof l||"string"==typeof t||void 0===t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk"));var n;return r}(s,t)),a?e.emit("error",a):s.objectMode||t&&t.length>0?("string"==typeof t||s.objectMode||Object.getPrototypeOf(t)===u.prototype||(t=function(e){return u.from(e)}(t)),n?s.endEmitted?e.emit("error",new Error("stream.unshift() after end event")):v(e,s,t,!0):s.ended?e.emit("error",new Error("stream.push() after EOF")):(s.reading=!1,s.decoder&&!r?(t=s.decoder.write(t),s.objectMode||0!==t.length?v(e,s,t,!1):E(e,s)):v(e,s,t,!1))):n||(s.reading=!1));return function(e){return!e.ended&&(e.needReadable||e.lengtht.highWaterMark&&(t.highWaterMark=function(e){return e>=I?e=I:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function S(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(p("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?i.nextTick(C,e):C(e))}function C(e){p("emit readable"),e.emit("readable"),x(e)}function E(e,t){t.readingMore||(t.readingMore=!0,i.nextTick(_,e,t))}function _(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=t.length?(r=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):r=function(e,t,r){var n;ea.length?a.length:e;if(s===a.length?i+=a:i+=a.slice(0,e),0===(e-=s)){s===a.length?(++n,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=a.slice(s));break}++n}return t.length-=n,i}(e,t):function(e,t){var r=u.allocUnsafe(e),n=t.head,i=1;n.data.copy(r),e-=n.data.length;for(;n=n.next;){var a=n.data,s=e>a.length?a.length:e;if(a.copy(r,r.length-e,0,s),0===(e-=s)){s===a.length?(++i,n.next?t.head=n.next:t.head=t.tail=null):(t.head=n,n.data=a.slice(s));break}++i}return t.length-=i,r}(e,t);return n}(e,t.buffer,t.decoder),r);var r}function B(e){var t=e._readableState;if(t.length>0)throw new Error('"endReadable()" called on non-empty stream');t.endEmitted||(t.ended=!0,i.nextTick(M,t,e))}function M(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function D(e,t){for(var r=0,n=e.length;r=t.highWaterMark||t.ended))return p("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?B(this):S(this),null;if(0===(e=k(e,t))&&t.ended)return 0===t.length&&B(this),null;var n,i=t.needReadable;return p("need readable",i),(0===t.length||t.length-e0?P(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&&B(this)),null!==n&&this.emit("data",n),n},w.prototype._read=function(e){this.emit("error",new Error("_read() is not implemented"))},w.prototype.pipe=function(e,t){var r=this,a=this._readableState;switch(a.pipesCount){case 0:a.pipes=e;break;case 1:a.pipes=[a.pipes,e];break;default:a.pipes.push(e)}a.pipesCount+=1,p("pipe count=%d opts=%j",a.pipesCount,t);var c=(!t||!1!==t.end)&&e!==n.stdout&&e!==n.stderr?l:w;function u(t,n){p("onunpipe"),t===r&&n&&!1===n.hasUnpiped&&(n.hasUnpiped=!0,p("cleanup"),e.removeListener("close",b),e.removeListener("finish",y),e.removeListener("drain",d),e.removeListener("error",g),e.removeListener("unpipe",u),r.removeListener("end",l),r.removeListener("end",w),r.removeListener("data",m),f=!0,!a.awaitDrain||e._writableState&&!e._writableState.needDrain||d())}function l(){p("onend"),e.end()}a.endEmitted?i.nextTick(c):r.once("end",c),e.on("unpipe",u);var d=function(e){return function(){var t=e._readableState;p("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&o(e,"data")&&(t.flowing=!0,x(e))}}(r);e.on("drain",d);var f=!1;var h=!1;function m(t){p("ondata"),h=!1,!1!==e.write(t)||h||((1===a.pipesCount&&a.pipes===e||a.pipesCount>1&&-1!==D(a.pipes,e))&&!f&&(p("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,h=!0),r.pause())}function g(t){p("onerror",t),w(),e.removeListener("error",g),0===o(e,"error")&&e.emit("error",t)}function b(){e.removeListener("finish",y),w()}function y(){p("onfinish"),e.removeListener("close",b),w()}function w(){p("unpipe"),r.unpipe(e)}return r.on("data",m),function(e,t,r){if("function"==typeof e.prependListener)return e.prependListener(t,r);e._events&&e._events[t]?s(e._events[t])?e._events[t].unshift(r):e._events[t]=[r,e._events[t]]:e.on(t,r)}(e,"error",g),e.once("close",b),e.once("finish",y),e.emit("pipe",r),a.flowing||(p("pipe resume"),r.resume()),e},w.prototype.unpipe=function(e){var t=this._readableState,r={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,r),this);if(!e){var n=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var a=0;a>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function o(e){var t=this.lastTotal-this.lastNeed,r=function(e,t,r){if(128!=(192&t[0]))return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,"�"}}(this,e);return void 0!==r?r:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function c(e,t){if((e.length-t)%2==0){var r=e.toString("utf16le",t);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function u(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,r)}return t}function l(e,t){var r=(e.length-t)%3;return 0===r?e.toString("base64",t):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-r))}function d(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function f(e){return e.toString(this.encoding)}function p(e){return e&&e.length?this.write(e):""}t.StringDecoder=a,a.prototype.write=function(e){if(0===e.length)return"";var t,r;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0)return i>0&&(e.lastNeed=i-1),i;if(--n=0)return i>0&&(e.lastNeed=i-2),i;if(--n=0)return i>0&&(2===i?i=0:e.lastNeed=i-3),i;return 0}(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=r;var n=e.length-(r-this.lastNeed);return e.copy(this.lastChar,0,n),e.toString("utf8",t,n)},a.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},function(e,t,r){"use strict";e.exports=s;var n=r(12),i=r(18);function a(e,t){var r=this._transformState;r.transforming=!1;var n=r.writecb;if(!n)return this.emit("error",new Error("write callback called multiple times"));r.writechunk=null,r.writecb=null,null!=t&&this.push(t),n(e);var i=this._readableState;i.reading=!1,(i.needReadable||i.length({packetType:e.readUInt8(t),vorbis:new n.StringType(6,"ascii").get(e,t+1)})},t.IdentificationHeader={len:23,get:(e,t)=>({version:e.readUInt32LE(t+0),channelMode:e.readUInt8(t+4),sampleRate:e.readUInt32LE(t+5),bitrateMax:e.readUInt32LE(t+9),bitrateNominal:e.readUInt32LE(t+13),bitrateMin:e.readUInt32LE(t+17)})}}).call(this,r(3).Buffer)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(5),a=r(2)("music-metadata:parser:MP4:atom");t.Header={len:8,get:(e,t)=>{const r=n.UINT32_BE.get(e,t);if(r<0)throw new Error("Invalid atom header length");return{length:r,name:i.FourCcToken.get(e,t+4)}},put:(e,t,r)=>(n.UINT32_BE.put(e,t,r.length),i.FourCcToken.put(e,t+4,r.name))},t.ExtendedSize=n.UINT64_BE,t.ftyp={len:4,get:(e,t)=>({type:new n.StringType(4,"ascii").get(e,t)})},t.mhdr={len:8,get:(e,t)=>({version:n.UINT8.get(e,t+0),flags:n.UINT24_BE.get(e,t+1),nextItemID:n.UINT32_BE.get(e,t+4)})};class s{constructor(e,t,r){if(this.len=e,et&&a(`Warning: atom ${r} expected to be ${t}, but was actually ${e} bytes long.`)}}t.FixedLengthAtom=s;t.MdhdAtom=class extends s{constructor(e){super(e,24,"mdhd"),this.len=e}get(e,t){return{version:n.UINT8.get(e,t+0),flags:n.UINT24_BE.get(e,t+1),creationTime:n.UINT32_BE.get(e,t+4),modificationTime:n.UINT32_BE.get(e,t+8),timeScale:n.UINT32_BE.get(e,t+12),duration:n.UINT32_BE.get(e,t+16),language:n.UINT16_BE.get(e,t+20),quality:n.UINT16_BE.get(e,t+22)}}};t.MvhdAtom=class extends s{constructor(e){super(e,100,"mvhd"),this.len=e}get(e,t){return{version:n.UINT8.get(e,t+0),flags:n.UINT24_BE.get(e,t+1),creationTime:n.UINT32_BE.get(e,t+4),modificationTime:n.UINT32_BE.get(e,t+8),timeScale:n.UINT32_BE.get(e,t+12),duration:n.UINT32_BE.get(e,t+16),preferredRate:n.UINT32_BE.get(e,t+20),preferredVolume:n.UINT16_BE.get(e,t+24),previewTime:n.UINT32_BE.get(e,t+72),previewDuration:n.UINT32_BE.get(e,t+76),posterTime:n.UINT32_BE.get(e,t+80),selectionTime:n.UINT32_BE.get(e,t+84),selectionDuration:n.UINT32_BE.get(e,t+88),currentTime:n.UINT32_BE.get(e,t+92),nextTrackID:n.UINT32_BE.get(e,t+96)}}};t.DataAtom=class{constructor(e){this.len=e}get(e,t){return{type:{set:n.UINT8.get(e,t+0),type:n.UINT24_BE.get(e,t+1)},locale:n.UINT24_BE.get(e,t+4),value:new n.BufferType(this.len-8).get(e,t+8)}}};t.NameAtom=class{constructor(e){this.len=e}get(e,t){return{version:n.UINT8.get(e,t),flags:n.UINT24_BE.get(e,t+1),name:new n.StringType(this.len-4,"utf-8").get(e,t+4)}}};t.TrackHeaderAtom=class{constructor(e){this.len=e}get(e,t){return{version:n.UINT8.get(e,t),flags:n.UINT24_BE.get(e,t+1),creationTime:n.UINT32_BE.get(e,t+4),modificationTime:n.UINT32_BE.get(e,t+8),trackId:n.UINT32_BE.get(e,t+12),duration:n.UINT32_BE.get(e,t+20),layer:n.UINT16_BE.get(e,t+24),alternateGroup:n.UINT16_BE.get(e,t+26),volume:n.UINT16_BE.get(e,t+28)}}};const o={len:8,get:(e,t)=>({version:n.UINT8.get(e,t+0),flags:n.UINT24_BE.get(e,t+1),numberOfEntries:n.UINT32_BE.get(e,t+4)})};class c{constructor(e){this.len=e}get(e,t){return{dataFormat:i.FourCcToken.get(e,t),dataReferenceIndex:n.UINT16_BE.get(e,t+10),description:new n.BufferType(this.len-12).get(e,t+12)}}}t.StsdAtom=class{constructor(e){this.len=e}get(e,t){const r=o.get(e,t);t+=o.len;const i=[];for(let a=0;a({version:n.INT16_BE.get(e,t),revision:n.INT16_BE.get(e,t+2),vendor:n.INT32_BE.get(e,t+4)})},t.SoundSampleDescriptionV0={len:12,get:(e,t)=>({numAudioChannels:n.INT16_BE.get(e,t+0),sampleSize:n.INT16_BE.get(e,t+2),compressionId:n.INT16_BE.get(e,t+4),packetSize:n.INT16_BE.get(e,t+6),sampleRate:n.UINT16_BE.get(e,t+8)+n.UINT16_BE.get(e,t+10)/1e4})}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(188),i=r(191),a=r(269),s=r(270),o=n("music-metadata-browser:main");t.parseNodeStream=i.parseStream,t.parseReadableStream=async function(e,r,n){const i=new a.ReadableWeToNodeStream(e),s=await t.parseNodeStream(i,r,n);return o(`Completed parsing from stream bytesRead=${i.bytesRead} / fileSize=${n&&n.fileSize?n.fileSize:"?"}`),await i.close(),s},t.parseBuffer=i.parseBuffer,t.parseBlob=function(e,t){return function(e){return new Promise((t,r)=>{const n=new FileReader;n.onloadend=e=>{let r=e.target.result;r instanceof ArrayBuffer&&(r=s(new Uint8Array(e.target.result))),t(r)},n.onerror=e=>{r(new Error(e.type))},n.onabort=e=>{r(new Error(e.type))},n.readAsArrayBuffer(e)})}(e).then(r=>i.parseBuffer(r,e.type,t))},t.fetchFromUrl=async function(e,t){const r=await fetch(e),n=r.headers.get("Content-Type"),i=[];if(r.headers.forEach(e=>{i.push(e)}),r.ok){if(r.body){const e=await this.parseReadableStream(r.body,n,t);return o("Closing HTTP-readable-stream..."),r.body.locked||await r.body.cancel(),o("HTTP-readable-stream closed."),e}return this.parseBlob(await r.blob(),t)}throw new Error(`HTTP error status=${r.status}: ${r.statusText}`)},t.parseFromTokenizer=i.parseFromTokenizer,t.orderTags=i.orderTags,t.ratingToStars=i.ratingToStars},function(e,t,r){var i;(function(){var r=!1,a=function(e){return e instanceof a?e:this instanceof a?void(this.EXIFwrapped=e):new a(e)};e.exports&&(t=e.exports=a),t.EXIF=a;var s=a.Tags={36864:"ExifVersion",40960:"FlashpixVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",37121:"ComponentsConfiguration",37122:"CompressedBitsPerPixel",37500:"MakerNote",37510:"UserComment",40964:"RelatedSoundFile",36867:"DateTimeOriginal",36868:"DateTimeDigitized",37520:"SubsecTime",37521:"SubsecTimeOriginal",37522:"SubsecTimeDigitized",33434:"ExposureTime",33437:"FNumber",34850:"ExposureProgram",34852:"SpectralSensitivity",34855:"ISOSpeedRatings",34856:"OECF",37377:"ShutterSpeedValue",37378:"ApertureValue",37379:"BrightnessValue",37380:"ExposureBias",37381:"MaxApertureValue",37382:"SubjectDistance",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37396:"SubjectArea",37386:"FocalLength",41483:"FlashEnergy",41484:"SpatialFrequencyResponse",41486:"FocalPlaneXResolution",41487:"FocalPlaneYResolution",41488:"FocalPlaneResolutionUnit",41492:"SubjectLocation",41493:"ExposureIndex",41495:"SensingMethod",41728:"FileSource",41729:"SceneType",41730:"CFAPattern",41985:"CustomRendered",41986:"ExposureMode",41987:"WhiteBalance",41988:"DigitalZoomRation",41989:"FocalLengthIn35mmFilm",41990:"SceneCaptureType",41991:"GainControl",41992:"Contrast",41993:"Saturation",41994:"Sharpness",41995:"DeviceSettingDescription",41996:"SubjectDistanceRange",40965:"InteroperabilityIFDPointer",42016:"ImageUniqueID"},o=a.TiffTags={256:"ImageWidth",257:"ImageHeight",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer",40965:"InteroperabilityIFDPointer",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",274:"Orientation",277:"SamplesPerPixel",284:"PlanarConfiguration",530:"YCbCrSubSampling",531:"YCbCrPositioning",282:"XResolution",283:"YResolution",296:"ResolutionUnit",273:"StripOffsets",278:"RowsPerStrip",279:"StripByteCounts",513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",301:"TransferFunction",318:"WhitePoint",319:"PrimaryChromaticities",529:"YCbCrCoefficients",532:"ReferenceBlackWhite",306:"DateTime",270:"ImageDescription",271:"Make",272:"Model",305:"Software",315:"Artist",33432:"Copyright"},c=a.GPSTags={0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude",5:"GPSAltitudeRef",6:"GPSAltitude",7:"GPSTimeStamp",8:"GPSSatellites",9:"GPSStatus",10:"GPSMeasureMode",11:"GPSDOP",12:"GPSSpeedRef",13:"GPSSpeed",14:"GPSTrackRef",15:"GPSTrack",16:"GPSImgDirectionRef",17:"GPSImgDirection",18:"GPSMapDatum",19:"GPSDestLatitudeRef",20:"GPSDestLatitude",21:"GPSDestLongitudeRef",22:"GPSDestLongitude",23:"GPSDestBearingRef",24:"GPSDestBearing",25:"GPSDestDistanceRef",26:"GPSDestDistance",27:"GPSProcessingMethod",28:"GPSAreaInformation",29:"GPSDateStamp",30:"GPSDifferential"},u=a.IFD1Tags={256:"ImageWidth",257:"ImageHeight",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",273:"StripOffsets",274:"Orientation",277:"SamplesPerPixel",278:"RowsPerStrip",279:"StripByteCounts",282:"XResolution",283:"YResolution",284:"PlanarConfiguration",296:"ResolutionUnit",513:"JpegIFOffset",514:"JpegIFByteCount",529:"YCbCrCoefficients",530:"YCbCrSubSampling",531:"YCbCrPositioning",532:"ReferenceBlackWhite"},l=a.StringValues={ExposureProgram:{0:"Not defined",1:"Manual",2:"Normal program",3:"Aperture priority",4:"Shutter priority",5:"Creative program",6:"Action program",7:"Portrait mode",8:"Landscape mode"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{0:"Unknown",1:"Daylight",2:"Fluorescent",3:"Tungsten (incandescent light)",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 - 5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},SensingMethod:{1:"Not defined",2:"One-chip color area sensor",3:"Two-chip color area sensor",4:"Three-chip color area sensor",5:"Color sequential area sensor",7:"Trilinear sensor",8:"Color sequential linear sensor"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},SceneType:{1:"Directly photographed"},CustomRendered:{0:"Normal process",1:"Custom process"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},GainControl:{0:"None",1:"Low gain up",2:"High gain up",3:"Low gain down",4:"High gain down"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},SubjectDistanceRange:{0:"Unknown",1:"Macro",2:"Close view",3:"Distant view"},FileSource:{3:"DSC"},Components:{0:"",1:"Y",2:"Cb",3:"Cr",4:"R",5:"G",6:"B"}};function d(e){return!!e.exifdata}function f(e,t){function n(n){var i=p(n);e.exifdata=i||{};var s=function(e){var t=new DataView(e);r&&console.log("Got file of length "+e.byteLength);if(255!=t.getUint8(0)||216!=t.getUint8(1))return r&&console.log("Not a valid JPEG"),!1;var n=2,i=e.byteLength,a=function(e,t){return 56===e.getUint8(t)&&66===e.getUint8(t+1)&&73===e.getUint8(t+2)&&77===e.getUint8(t+3)&&4===e.getUint8(t+4)&&4===e.getUint8(t+5)};for(;n")+8,l=(c=c.substring(c.indexOf("4?p:t+8,s=[],c=0;c4?p:t+8,f-1);case 3:if(1==f)return e.getUint16(t+8,!i);for(a=f>2?p:t+8,s=[],c=0;ce.byteLength)return{};var a=g(e,t,t+i,u,n);if(a.Compression)switch(a.Compression){case 6:if(a.JpegIFOffset&&a.JpegIFByteCount){var s=t+a.JpegIFOffset,o=a.JpegIFByteCount;a.blob=new Blob([new Uint8Array(e.buffer,s,o)],{type:"image/jpeg"})}break;case 1:console.log("Thumbnail image format is TIFF, which is not implemented.");break;default:console.log("Unknown thumbnail image format '%s'",a.Compression)}else 2==a.PhotometricInterpretation&&console.log("Thumbnail image format is RGB, which is not implemented.");return a}(e,p,h,n),i}function T(e){var t={};if(1==e.nodeType){if(e.attributes.length>0){t["@attributes"]={};for(var r=0;r0)for(var r=0;r{if(!t.isBuffer(e))return{};let i={},a=e.indexOf(n);for(;-1!==a;){let t=(a=e.indexOf(n,a+n.byteLength))+n.byteLength,s=t+1,o=s+2,c=e.readUInt8(t),u=e.readUInt16BE(s);if(!r.has(c))continue;if(u>e.length-(o+u))throw new Error("Invalid IPTC directory");let l=r.get(c),d=e.slice(o,o+u).toString();null==i[l]?i[l]=d:Array.isArray(i[l])?i[l].push(d):i[l]=[i[l],d]}return i}}).call(this,r(3).Buffer)},,,,,,,,,function(e,t,r){e.exports=r(185)},function(e,t,r){"use strict";r.r(t),function(e){var t=r(173),n=r(174),i=r.n(n),a=r(175),s=r.n(a);window.mediaCloudReaderCache={readers:[],getFreeReader:function(){return this.readers.length>0?(console.log("Got cached reader."),this.readers.splice(0,1)[0]):new FileReader},cacheReader:function(e){this.readers.push(e)}},window.DirectUploadItem=Backbone.Model.extend({initialize:function(e){this.on("change:progress",this.updateProgress,this)},updateProgress:function(){var e=this.get("attachment"),t=this.get("progress");e.set({percent:t})},startUpload:function(){if("uploadToStorage"in DirectUploadItem.prototype){var e=this.get("file"),t=this.get("faces"),r=this.get("mimeType");this.get("isDirectUpload")?(console.log("Uploading to Cloud Storage"),this.uploadToStorage(e,t,r,this)):this.uploadToWordPress(e,t,this)}else alert("Direct upload is misconfigured.")},uploadToWordPress:function(e,t,r){console.log("Uploading to WordPress");var n=new FormData;n.append("action",_wpPluploadSettings.defaults.multipart_params.action),n.append("_wpnonce",_wpPluploadSettings.defaults.multipart_params._wpnonce),n.append("name",e.name),n.append("async-upload",e),jQuery.ajax({url:_wpPluploadSettings.defaults.url,method:"POST",contentType:!1,processData:!1,data:n,dataType:"json",xhr:function(){var e=jQuery.ajaxSettings.xhr();return e.upload.onprogress=function(e){r.set({progress:e.loaded/e.total*100})}.bind(this),e},success:function(e){e.hasOwnProperty("success")&&e.success?r.wordpressUploadFinished(e,t):r.uploadError()},error:function(e){r.uploadError()}})},finishWordpressUpload:function(e){var t=this.get("attachment");_.each(["file","loaded","size","percent"],function(e){t.unset(e)}),t.set(_.extend(e.data,{uploading:!1})),wp.media.model.Attachment.get(e.data.id,t),this.set({state:"done"}),wp.Uploader.queue.remove(t),wp.Uploader.queue.all(function(e){return!e.get("uploading")})&&wp.Uploader.queue.reset()},wordpressUploadFinished:function(e,t){if(null!=t){var r={action:"ilab_add_face_data",post_id:e.data.id,faces:t};$.post(ajaxurl,r,function(t){this.finishWordpressUpload(e)}.bind(this))}else this.finishWordpressUpload(e)},doUploadFinished:function(e,t,r){var n=this.get("attachment"),i={action:"ilab_upload_import_cloud_file",key:e};null!=r&&(i.metadata=r),console.log("Upload finished"),console.log(i),null!=t&&t.length>0&&(i.faces=t),$.post(ajaxurl,i,function(e){_.each(["file","loaded","size","percent"],function(e){n.unset(e)}),"success"==e.status?(n.set(_.extend(e.attachment,{uploading:!1})),wp.media.model.Attachment.get(e.attachment.id,n),this.set({state:"done"})):this.set({state:"error"}),wp.Uploader.queue.remove(n),wp.Uploader.queue.all(function(e){return!e.get("uploading")})&&wp.Uploader.queue.reset()}.bind(this))},mapID3Meta:function(e,t,r,n){r.hasOwnProperty(e)&&(n[t]=r[e])},mapIndexedID3Meta:function(e,t,r,n){r.hasOwnProperty(e)&&r[e].length>0&&(n[t]=r[e][0])},assignAudioMetadata:function(e,t){if(this.mapID3Meta("album","album",e.common,t),this.mapID3Meta("artist","artist",e.common,t),this.mapIndexedID3Meta("genre","genre",e.common,t),this.mapID3Meta("title","title",e.common,t),e.common.hasOwnProperty("track")&&null!=e.common.track.no&&(t.track_number=e.common.track.no),this.mapID3Meta("year","year",e.common,t),this.mapIndexedID3Meta("composer","composer",e.common,t),this.mapIndexedID3Meta("lyricist","lyricist",e.common,t),this.mapIndexedID3Meta("writer","writer",e.common,t),this.mapIndexedID3Meta("conductor","conductor",e.common,t),this.mapIndexedID3Meta("remixer","remixer",e.common,t),this.mapIndexedID3Meta("arranger","arranger",e.common,t),this.mapIndexedID3Meta("engineer","engineer",e.common,t),this.mapIndexedID3Meta("producer","producer",e.common,t),this.mapIndexedID3Meta("djmixer","dj_mixer",e.common,t),this.mapIndexedID3Meta("mixer","mixer",e.common,t),this.mapIndexedID3Meta("technician","technician",e.common,t),this.mapIndexedID3Meta("label","label",e.common,t),this.mapIndexedID3Meta("subtitle","subtitle",e.common,t),this.mapIndexedID3Meta("compilation","compilation",e.common,t),this.mapID3Meta("bpm","bpm",e.common,t),this.mapID3Meta("mood","mood",e.common,t),this.mapID3Meta("media","media",e.common,t),this.mapID3Meta("tvShow","tv_show",e.common,t),this.mapID3Meta("tvSeason","tv_season",e.common,t),this.mapID3Meta("tvEpisode","tv_episode",e.common,t),this.mapID3Meta("tvNetwork","tv_network",e.common,t),this.mapID3Meta("podcast","podcast",e.common,t),this.mapID3Meta("podcasturl","podcast_url",e.common,t),this.mapID3Meta("releasestatus","release_status",e.common,t),this.mapID3Meta("releasetype","release_type",e.common,t),this.mapID3Meta("releasecountry","release_country",e.common,t),this.mapID3Meta("language","language",e.common,t),this.mapID3Meta("copyright","copyright",e.common,t),this.mapID3Meta("license","license",e.common,t),this.mapID3Meta("encodedby","encoded_by",e.common,t),this.mapID3Meta("encodersettings","encoder_options",e.common,t),this.mapID3Meta("gapless","gapless",e.common,t),this.mapID3Meta("barcode","barcode",e.common,t),this.mapID3Meta("asin","asin",e.common,t),this.mapID3Meta("website","website",e.common,t),this.mapID3Meta("averageLevel","average_level",e.common,t),this.mapID3Meta("peakLevel","peak_level",e.common,t),this.mapID3Meta("bitrate","bitrate",e.format,t),this.mapID3Meta("codec","dataformat",e.format,t),this.mapID3Meta("codecProfile","bitrate_mode",e.format,t),this.mapID3Meta("lossless","lossless",e.format,t),this.mapID3Meta("numberOfChannels","channels",e.format,t),this.mapID3Meta("duration","length",e.format,t),this.mapID3Meta("sampleRate","sample_rate",e.format,t),e.common.hasOwnProperty("picture")&&e.common.picture.length>0){var r=e.common.picture[0];t.thumbnail={mimeType:r.format,data:r.data.toString("base64")},t.image=[{mime:r.format}]}},mapImageMeta:function(e,t,r,n,i){if(t.hasOwnProperty(r)){var a=t[r];if("string"==e){if(!(o="string"==typeof a||a instanceof String))return;n[i]=a.trim()}else if("strings"==e){if(o="string"==typeof a||a instanceof String){a=a.split(",");for(var s=0;s0&&(n[i]=a)}else if("date"==e){var o;if(!(o="string"==typeof a||a instanceof String))return;var c=a.split(" ");if(2!=c.length)return;var u=c[0].split(":");if(3!=u.length)return;var l=u[0],d=u[1],f=u[2],p=new Date("".concat(d,"/").concat(f,"/").concat(l," ").concat(c[1]));n[i]=(p.getTime()/1e3).toFixed(0)}else if("frac"==e){if(o)return;if(!("number"==typeof a||a instanceof Number))return;n[i]=a.numerator/a.denominator}else if("number"==e){if(o)return;if(!("number"==typeof a||a instanceof Number))return;n[i]=a}}},assignImageMetadata:function(e,t,r){console.log(e),console.log(t);var n={};this.mapImageMeta("string",e,"headline",n,"title"),this.mapImageMeta("string",e,"caption",n,"caption"),this.mapImageMeta("string",e,"credit",n,"credit"),this.mapImageMeta("string",e,"copyright",n,"copyright"),this.mapImageMeta("strings",e,"keywords",n,"keywords"),0!=t&&(this.mapImageMeta("string",t,"ImageDescription",n,"title"),n.hasOwnProperty("caption")||this.mapImageMeta("bytes",t,"UserComment",n,"caption"),n.hasOwnProperty("copyright")||this.mapImageMeta("bytes",t,"Copyright",n,"copyright"),this.mapImageMeta("string",t,"Artist",n,"credit"),n.hasOwnProperty("credit")||this.mapImageMeta("string",t,"Author",n,"credit"),this.mapImageMeta("string",t,"Copyright",n,"copyright"),this.mapImageMeta("string",t,"Model",n,"camera"),this.mapImageMeta("string",t,"ISOSpeedRatings",n,"iso"),this.mapImageMeta("number",t,"ISOSpeedRatings",n,"iso"),this.mapImageMeta("date",t,"DateTimeDigitized",n,"created_timestamp"),this.mapImageMeta("frac",t,"FocalLength",n,"focal_length"),this.mapImageMeta("frac",t,"FNumber",n,"aperture"),this.mapImageMeta("frac",t,"ExposureTime",n,"shutter_speed"),this.mapImageMeta("number",t,"Orientation",n,"orientation")),r.image_meta=n},uploadFinished:function(r,n){var a=this.get("attachment").get("file"),o={filesize:a.size},c=this.get("mimeType");if(0===c.indexOf("audio/")){var u=c.split("/")[1];o.fileformat=u,t.parseBlob(a,{duration:!0}).then(function(e){this.assignAudioMetadata(e,o),this.doUploadFinished(r,n,o)}.bind(this)).catch(function(e){this.doUploadFinished(r,n,o)}.bind(this))}else if(0==c.indexOf("image/")){var l=mediaCloudReaderCache.getFreeReader();l.onload=function(t){var a={};try{a=s()(e.from(l.result))}catch(e){console.log("IPTC Error",e)}var c=i.a.readFromBinaryFile(l.result);this.assignImageMetadata(a,c,o),mediaCloudReaderCache.cacheReader(l),this.doUploadFinished(r,n,o)}.bind(this),l.onerror=function(e){mediaCloudReaderCache.cacheReader(l),this.doUploadFinished(r,n,o)}.bind(this),l.readAsArrayBuffer(a)}else this.doUploadFinished(r,n,o)},uploadError:function(){this.set({state:"error"});var e=this.get("attachment");_.each(["file","loaded","size","percent"],function(t){e.unset(t)}),wp.Uploader.queue.remove(e),e.destroy()}}),window.DirectUploader=Backbone.Model.extend({initialize:function(e){this.totalFilesDropped=0,this.totalFilesUploaded=0,this.files=[],this.toBulkProcess=[],this.uploadingFiles=[],this.watchToken=0,this.settings=mediaCloudDirectUploadSettings},queueNext:function(){if(clearTimeout(this.watchToken),this.uploadingFiles.length0){for(var e=this.settings.maxUploads-this.uploadingFiles.length,t=0;t0){var r=this.files.shift();this.uploadingFiles.push(r),r.startUpload()}}else if(0==this.uploadingFiles.length&&this.toBulkProcess.length>0&&this.totalFilesDropped==this.totalFilesUploaded){var n={action:"ilab_upload_process_batch",batch:this.toBulkProcess};this.toBulkProcess=[],this.totalFilesDropped=0,this.totalFilesUploaded=0,$.post(ajaxurl,n,function(e){})}this.watchToken=setTimeout(this.queueNext.bind(this),500)},addFile:function(e){if(console.log("Adding File"),""==e.type)return!1;var t=e.type;"application/x-photoshop"==t&&(t="image/psd");var r=-1!=this.settings.allowedMimes.indexOf(t);console.log("Is Direct Upload?",r);var n=t.split("/"),i=n[0],a=n[1];a="jpg"==a?"jpeg":a,this.totalFilesDropped++;var s={file:e,uploading:!0,date:new Date,filename:e.name,isDirectUpload:r,menuOrder:0,uploadedTo:wp.media.model.settings.post.id,loaded:0,size:e.size,percent:0,type:i,subType:a},o=wp.media.model.Attachment.create(s);wp.Uploader.queue.add(o);var c=new DirectUploadItem({attachment:o,file:e,mimeType:t,isDirectUpload:r,progress:0,driver:this.settings.driver,faces:null,state:"waiting"});c.on("change:state",function(e,t){if("done"==t||"error"==t){this.totalFilesUploaded++,"done"==t&&this.toBulkProcess.push(o.id);var r=this.files.indexOf(c);r>-1&&this.files.splice(r),(r=this.uploadingFiles.indexOf(c))>-1&&this.uploadingFiles.splice(r),this.queueNext()}}.bind(this)),"undefined"!=typeof ILABFaceDetector?ILABFaceDetector(e,function(e){c.set("faces",e),this.files.push(c)}.bind(this)):this.files.push(c)}}),wp.media.view.UploaderWindow.prototype.__ready=wp.media.view.UploaderWindow.prototype.ready,wp.media.view.UploaderWindow.prototype.ready=function(){this.__ready(),this.directUploader=new DirectUploader({}),this.uploader.uploader.unbind("FilesAdded"),this.uploader.uploader.bind("FilesAdded",function(e,t){_.each(t,function(e){this.directUploader.addFile(e.getNative())}.bind(this)),this.directUploader.queueNext()}.bind(this))},wp.media.view.UploaderInline=wp.media.view.UploaderInline.extend({template:wp.template("media-cloud-direct-upload")})}.call(this,r(3).Buffer)},function(e,t,r){"use strict";t.byteLength=function(e){var t=u(e),r=t[0],n=t[1];return 3*(r+n)/4-n},t.toByteArray=function(e){for(var t,r=u(e),n=r[0],s=r[1],o=new a(function(e,t,r){return 3*(t+r)/4-r}(0,n,s)),c=0,l=s>0?n-4:n,d=0;d>16&255,o[c++]=t>>8&255,o[c++]=255&t;2===s&&(t=i[e.charCodeAt(d)]<<2|i[e.charCodeAt(d+1)]>>4,o[c++]=255&t);1===s&&(t=i[e.charCodeAt(d)]<<10|i[e.charCodeAt(d+1)]<<4|i[e.charCodeAt(d+2)]>>2,o[c++]=t>>8&255,o[c++]=255&t);return o},t.fromByteArray=function(e){for(var t,r=e.length,i=r%3,a=[],s=0,o=r-i;so?o:s+16383));1===i?(t=e[r-1],a.push(n[t>>2]+n[t<<4&63]+"==")):2===i&&(t=(e[r-2]<<8)+e[r-1],a.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+"="));return a.join("")};for(var n=[],i=[],a="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,c=s.length;o0)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");return-1===r&&(r=t),[r,r===t?0:4-r%4]}function l(e,t,r){for(var i,a,s=[],o=t;o>18&63]+n[a>>12&63]+n[a>>6&63]+n[63&a]);return s.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},function(e,t){t.read=function(e,t,r,n,i){var a,s,o=8*i-n-1,c=(1<>1,l=-7,d=r?i-1:0,f=r?-1:1,p=e[t+d];for(d+=f,a=p&(1<<-l)-1,p>>=-l,l+=o;l>0;a=256*a+e[t+d],d+=f,l-=8);for(s=a&(1<<-l)-1,a>>=-l,l+=n;l>0;s=256*s+e[t+d],d+=f,l-=8);if(0===a)a=1-u;else{if(a===c)return s?NaN:1/0*(p?-1:1);s+=Math.pow(2,n),a-=u}return(p?-1:1)*s*Math.pow(2,a-n)},t.write=function(e,t,r,n,i,a){var s,o,c,u=8*a-i-1,l=(1<>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,h=n?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(o=isNaN(t)?1:0,s=l):(s=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-s))<1&&(s--,c*=2),(t+=s+d>=1?f/c:f*Math.pow(2,1-d))*c>=2&&(s++,c/=2),s+d>=l?(o=0,s=l):s+d>=1?(o=(t*c-1)*Math.pow(2,i),s+=d):(o=t*Math.pow(2,d-1)*Math.pow(2,i),s=0));i>=8;e[r+p]=255&o,p+=h,o/=256,i-=8);for(s=s<0;e[r+p]=255&s,p+=h,s/=256,u-=8);e[r+p-h]|=128*m}},function(e,t,r){(function(n){t.log=function(...e){return"object"==typeof console&&console.log&&console.log(...e)},t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const r="color: "+this.color;t.splice(1,0,r,"color: inherit");let n=0,i=0;t[0].replace(/%[a-zA-Z%]/g,e=>{"%%"!==e&&(n++,"%c"===e&&(i=n))}),t.splice(i,0,r)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&void 0!==n&&"env"in n&&(e=n.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],e.exports=r(189)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}).call(this,r(9))},function(e,t,r){e.exports=function(e){function t(e){let t=0;for(let r=0;r{if("%%"===r)return r;o++;const a=n.formatters[i];if("function"==typeof a){const n=e[o];r=a.call(t,n),e.splice(o,1),o--}return r}),n.formatArgs.call(t,e),(t.log||n.log).apply(t,e)}return s.namespace=e,s.enabled=n.enabled(e),s.useColors=n.useColors(),s.color=t(e),s.destroy=i,s.extend=a,"function"==typeof n.init&&n.init(s),n.instances.push(s),s}function i(){const e=n.instances.indexOf(this);return-1!==e&&(n.instances.splice(e,1),!0)}function a(e,t){const r=n(this.namespace+(void 0===t?":":t)+e);return r.log=this.log,r}function s(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return n.debug=n,n.default=n,n.coerce=function(e){return e instanceof Error?e.stack||e.message:e},n.disable=function(){const e=[...n.names.map(s),...n.skips.map(s).map(e=>"-"+e)].join(",");return n.enable(""),e},n.enable=function(e){let t;n.save(e),n.names=[],n.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(t=0;t{n[t]=e[t]}),n.instances=[],n.names=[],n.skips=[],n.formatters={},n.selectColor=t,n.enable(n.load()),n}},function(e,t){var r=1e3,n=60*r,i=60*n,a=24*i,s=7*a,o=365.25*a;function c(e,t,r,n){var i=t>=1.5*r;return Math.round(e/r)+" "+n+(i?"s":"")}e.exports=function(e,t){t=t||{};var u=typeof e;if("string"===u&&e.length>0)return function(e){if((e=String(e)).length>100)return;var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(!t)return;var c=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*o;case"weeks":case"week":case"w":return c*s;case"days":case"day":case"d":return c*a;case"hours":case"hour":case"hrs":case"hr":case"h":return c*i;case"minutes":case"minute":case"mins":case"min":case"m":return c*n;case"seconds":case"second":case"secs":case"sec":case"s":return c*r;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(e);if("number"===u&&isFinite(e))return t.long?function(e){var t=Math.abs(e);if(t>=a)return c(e,t,a,"day");if(t>=i)return c(e,t,i,"hour");if(t>=n)return c(e,t,n,"minute");if(t>=r)return c(e,t,r,"second");return e+" ms"}(e):function(e){var t=Math.abs(e);if(t>=a)return Math.round(e/a)+"d";if(t>=i)return Math.round(e/i)+"h";if(t>=n)return Math.round(e/n)+"m";if(t>=r)return Math.round(e/r)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(19),i=r(203);function a(e,t,r){return!e.fileSize&&r.fileSize&&(e.fileSize=r.fileSize),i.ParserFactory.parse(e,t,r)}t.parseStream=function(e,t,r={}){return a(n.fromStream(e),t,r)},t.parseBuffer=function(e,t,r={}){return a(n.fromBuffer(e),t,r)},t.parseFromTokenizer=a,t.orderTags=function(e){const t={};for(const r of e)(t[r.id]=t[r.id]||[]).push(r.value);return t},t.ratingToStars=function(e){return void 0===e?0:1+Math.round(4*e)}},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(193),i=r(10),a=r(194),s=r(199)("strtok3:ReadStreamTokenizer");t.ReadStreamTokenizer=class extends n.AbstractTokenizer{constructor(e,t){super(),this.streamReader=new a.StreamReader(e),this.fileSize=t}async readBuffer(e,t=0,r=e.length,n){if(0===r)return 0;if(n){const i=n-this.position;if(i>0)return await this.ignore(n-this.position),this.readBuffer(e,t,r);if(i<0)throw new Error("Cannot read from a negative offset in a stream")}let s;try{s=await this.streamReader.read(e,t,r),this.position+=s}catch(e){throw e.message===a.endOfStream?new Error(i.endOfFile):e}if(s0){const a=e.alloc(n+i);return c=await this.peekBuffer(a,0,i+n,void 0,o),a.copy(t,r,i),c-i}if(i<0)throw new Error("Cannot peek from a negative offset in a stream")}try{c=await this.streamReader.peek(t,r,n)}catch(e){throw e.message===a.endOfStream?new Error(i.endOfFile):e}if(!o&&c{this.reject=t,this.resolve=e})}}t.endOfStream="End-Of-Stream";t.StreamReader=class{constructor(e){if(this.s=e,this.endOfStream=!1,this.peekQueue=[],!e.read||!e.once)throw new Error("Expected an instance of stream.Readable");this.s.once("end",()=>this.reject(new Error(t.endOfStream))),this.s.once("error",e=>this.reject(e)),this.s.once("close",()=>this.reject(new Error("Stream closed")))}async peek(e,t,r){const n=await this.read(e,t,r);return this.peekQueue.push(e.slice(t,t+n)),n}async read(e,r,n){if(0===n)return 0;if(0===this.peekQueue.length&&this.endOfStream)throw new Error(t.endOfStream);let i=n,a=0;for(;this.peekQueue.length>0&&i>0;){const t=this.peekQueue.pop(),n=Math.min(t.length,i);t.copy(e,r+a,0,n),a+=n,i-=n,n0&&!this.endOfStream&&(a+=await this._read(e,r+a,i)),a}async _read(e,t,r){n.ok(!this.request,"Concurrent read operation?");const a=this.s.read(r);return a?(a.copy(e,t),a.length):(this.request={buffer:e,offset:t,length:r,deferred:new i},this.s.once("readable",()=>{this.tryRead()}),this.request.deferred.promise.then(e=>(this.request=null,e)).catch(e=>{throw this.request=null,e}))}tryRead(){const e=this.s.read(this.request.length);e?(e.copy(this.request.buffer,this.request.offset),this.request.deferred.resolve(e.length)):this.s.once("readable",()=>{this.tryRead()})}reject(e){this.endOfStream=!0,this.request&&(this.request.deferred.reject(e),this.request=null)}}},function(e,t,r){"use strict";var n=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;function s(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach(function(e){n[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var r,o,c=s(e),u=1;u=a)return e;switch(e){case"%s":return String(n[r++]);case"%d":return Number(n[r++]);case"%j":try{return JSON.stringify(n[r++])}catch(e){return"[Circular]"}default:return e}}),c=n[r];r=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),h(r)?n.showHidden=r:r&&t._extend(n,r),y(n.showHidden)&&(n.showHidden=!1),y(n.depth)&&(n.depth=2),y(n.colors)&&(n.colors=!1),y(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=c),l(n,e,n.depth)}function c(e,t){var r=o.styles[t];return r?"["+o.colors[r][0]+"m"+e+"["+o.colors[r][1]+"m":e}function u(e,t){return e}function l(e,r,n){if(e.customInspect&&r&&k(r.inspect)&&r.inspect!==t.inspect&&(!r.constructor||r.constructor.prototype!==r)){var i=r.inspect(n,e);return b(i)||(i=l(e,i,n)),i}var a=function(e,t){if(y(t))return e.stylize("undefined","undefined");if(b(t)){var r="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(r,"string")}if(g(t))return e.stylize(""+t,"number");if(h(t))return e.stylize(""+t,"boolean");if(m(t))return e.stylize("null","null")}(e,r);if(a)return a;var s=Object.keys(r),o=function(e){var t={};return e.forEach(function(e,r){t[e]=!0}),t}(s);if(e.showHidden&&(s=Object.getOwnPropertyNames(r)),I(r)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return d(r);if(0===s.length){if(k(r)){var c=r.name?": "+r.name:"";return e.stylize("[Function"+c+"]","special")}if(w(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(v(r))return e.stylize(Date.prototype.toString.call(r),"date");if(I(r))return d(r)}var u,T="",S=!1,C=["{","}"];(p(r)&&(S=!0,C=["[","]"]),k(r))&&(T=" [Function"+(r.name?": "+r.name:"")+"]");return w(r)&&(T=" "+RegExp.prototype.toString.call(r)),v(r)&&(T=" "+Date.prototype.toUTCString.call(r)),I(r)&&(T=" "+d(r)),0!==s.length||S&&0!=r.length?n<0?w(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special"):(e.seen.push(r),u=S?function(e,t,r,n,i){for(var a=[],s=0,o=t.length;s=0&&0,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0)>60)return r[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+r[1];return r[0]+t+" "+e.join(", ")+" "+r[1]}(u,T,C)):C[0]+T+C[1]}function d(e){return"["+Error.prototype.toString.call(e)+"]"}function f(e,t,r,n,i,a){var s,o,c;if((c=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]}).get?o=c.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):c.set&&(o=e.stylize("[Setter]","special")),F(n,i)||(s="["+i+"]"),o||(e.seen.indexOf(c.value)<0?(o=m(r)?l(e,c.value,null):l(e,c.value,r-1)).indexOf("\n")>-1&&(o=a?o.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+o.split("\n").map(function(e){return" "+e}).join("\n")):o=e.stylize("[Circular]","special")),y(s)){if(a&&i.match(/^\d+$/))return o;(s=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+o}function p(e){return Array.isArray(e)}function h(e){return"boolean"==typeof e}function m(e){return null===e}function g(e){return"number"==typeof e}function b(e){return"string"==typeof e}function y(e){return void 0===e}function w(e){return T(e)&&"[object RegExp]"===S(e)}function T(e){return"object"==typeof e&&null!==e}function v(e){return T(e)&&"[object Date]"===S(e)}function I(e){return T(e)&&("[object Error]"===S(e)||e instanceof Error)}function k(e){return"function"==typeof e}function S(e){return Object.prototype.toString.call(e)}function C(e){return e<10?"0"+e.toString(10):e.toString(10)}t.debuglog=function(r){if(y(a)&&(a=e.env.NODE_DEBUG||""),r=r.toUpperCase(),!s[r])if(new RegExp("\\b"+r+"\\b","i").test(a)){var n=e.pid;s[r]=function(){var e=t.format.apply(t,arguments);console.error("%s %d: %s",r,n,e)}}else s[r]=function(){};return s[r]},t.inspect=o,o.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},o.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=p,t.isBoolean=h,t.isNull=m,t.isNullOrUndefined=function(e){return null==e},t.isNumber=g,t.isString=b,t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=y,t.isRegExp=w,t.isObject=T,t.isDate=v,t.isError=I,t.isFunction=k,t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=r(197);var E=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function _(){var e=new Date,t=[C(e.getHours()),C(e.getMinutes()),C(e.getSeconds())].join(":");return[e.getDate(),E[e.getMonth()],t].join(" ")}function F(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.log=function(){console.log("%s - %s",_(),t.format.apply(t,arguments))},t.inherits=r(198),t._extend=function(e,t){if(!t||!T(t))return e;for(var r=Object.keys(t),n=r.length;n--;)e[r[n]]=t[r[n]];return e};var A="undefined"!=typeof Symbol?Symbol("util.promisify.custom"):void 0;function x(e,t){if(!e){var r=new Error("Promise was rejected with a falsy value");r.reason=e,e=r}return t(e)}t.promisify=function(e){if("function"!=typeof e)throw new TypeError('The "original" argument must be of type Function');if(A&&e[A]){var t;if("function"!=typeof(t=e[A]))throw new TypeError('The "util.promisify.custom" argument must be of type Function');return Object.defineProperty(t,A,{value:t,enumerable:!1,writable:!1,configurable:!0}),t}function t(){for(var t,r,n=new Promise(function(e,n){t=e,r=n}),i=[],a=0;a{"%%"!==e&&(n++,"%c"===e&&(i=n))}),t.splice(i,0,r)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&void 0!==n&&"env"in n&&(e=n.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],e.exports=r(200)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}).call(this,r(9))},function(e,t,r){e.exports=function(e){function t(e){let t=0;for(let r=0;r{if("%%"===r)return r;o++;const a=n.formatters[i];if("function"==typeof a){const n=e[o];r=a.call(t,n),e.splice(o,1),o--}return r}),n.formatArgs.call(t,e),(t.log||n.log).apply(t,e)}return s.namespace=e,s.enabled=n.enabled(e),s.useColors=n.useColors(),s.color=t(e),s.destroy=i,s.extend=a,"function"==typeof n.init&&n.init(s),n.instances.push(s),s}function i(){const e=n.instances.indexOf(this);return-1!==e&&(n.instances.splice(e,1),!0)}function a(e,t){const r=n(this.namespace+(void 0===t?":":t)+e);return r.log=this.log,r}function s(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return n.debug=n,n.default=n,n.coerce=function(e){return e instanceof Error?e.stack||e.message:e},n.disable=function(){const e=[...n.names.map(s),...n.skips.map(s).map(e=>"-"+e)].join(",");return n.enable(""),e},n.enable=function(e){let t;n.save(e),n.names=[],n.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(t=0;t{n[t]=e[t]}),n.instances=[],n.names=[],n.skips=[],n.formatters={},n.selectColor=t,n.enable(n.load()),n}},function(e,t){var r=1e3,n=60*r,i=60*n,a=24*i,s=7*a,o=365.25*a;function c(e,t,r,n){var i=t>=1.5*r;return Math.round(e/r)+" "+n+(i?"s":"")}e.exports=function(e,t){t=t||{};var u=typeof e;if("string"===u&&e.length>0)return function(e){if((e=String(e)).length>100)return;var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(!t)return;var c=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*o;case"weeks":case"week":case"w":return c*s;case"days":case"day":case"d":return c*a;case"hours":case"hour":case"hrs":case"hr":case"h":return c*i;case"minutes":case"minute":case"mins":case"min":case"m":return c*n;case"seconds":case"second":case"secs":case"sec":case"s":return c*r;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(e);if("number"===u&&isFinite(e))return t.long?function(e){var t=Math.abs(e);if(t>=a)return c(e,t,a,"day");if(t>=i)return c(e,t,i,"hour");if(t>=n)return c(e,t,n,"minute");if(t>=r)return c(e,t,r,"second");return e+" ms"}(e):function(e){var t=Math.abs(e);if(t>=a)return Math.round(e/a)+"d";if(t>=i)return Math.round(e/i)+"h";if(t>=n)return Math.round(e/n)+"m";if(t>=r)return Math.round(e/r)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(10);t.BufferTokenizer=class{constructor(e){this.buffer=e,this.position=0,this.fileSize=e.length}async readBuffer(e,t,r,n){return this.position=n||this.position,this.peekBuffer(e,t,r,this.position).then(e=>(this.position+=e,e))}async peekBuffer(e,t,r,i,a=!1){i=i||this.position,r||(r=e.length);const s=Math.min(this.buffer.length-i,r);if(!a&&s[...e].map(e=>e.charCodeAt(0));const r=(e,t,r)=>String.fromCharCode(...e.slice(t,r));t.readUInt64LE=(e,t=0)=>{let r=e[t],n=1,i=0;for(;++i<8;)n*=256,r+=e[t+i]*n;return r},t.tarHeaderChecksumMatches=e=>{if(e.length<512)return!1;let t=256,n=0;for(let r=0;r<148;r++){const i=e[r];t+=i,n+=128&i}for(let r=156;r<512;r++){const i=e[r];t+=i,n+=128&i}const i=parseInt(r(e,148,154),8);return i===t||i===t-(n<<1)},t.multiByteIndexOf=(t,r,n=0)=>{if(e&&e.isBuffer(t))return t.indexOf(e.from(r),n);const i=(e,t,r)=>{for(let n=1;n=0;){if(i(t,r,a))return a;a=t.indexOf(r[0],a+1)}return-1},t.uint8ArrayUtf8ByteString=r}).call(this,r(3).Buffer)},function(e,t,r){"use strict";e.exports={extensions:["jpg","png","apng","gif","webp","flif","cr2","orf","arw","dng","nef","rw2","raf","tif","bmp","jxr","psd","zip","tar","rar","gz","bz2","7z","dmg","mp4","mid","mkv","webm","mov","avi","wmv","mpg","mp2","mp3","m4a","oga","ogg","ogv","opus","flac","wav","spx","amr","pdf","epub","exe","swf","rtf","wasm","woff","woff2","eot","ttf","otf","ico","flv","ps","xz","sqlite","nes","crx","xpi","cab","deb","ar","rpm","Z","lz","msi","mxf","mts","blend","bpg","docx","pptx","xlsx","3gp","3g2","jp2","jpm","jpx","mj2","aif","qcp","odt","ods","odp","xml","mobi","heic","cur","ktx","ape","wv","wmv","wma","dcm","ics","glb","pcap","dsf","lnk","alias","voc","ac3","m4v","m4p","m4b","f4v","f4p","f4b","f4a"],mimeTypes:["image/jpeg","image/png","image/gif","image/webp","image/flif","image/x-canon-cr2","image/tiff","image/bmp","image/vnd.ms-photo","image/vnd.adobe.photoshop","application/epub+zip","application/x-xpinstall","application/vnd.oasis.opendocument.text","application/vnd.oasis.opendocument.spreadsheet","application/vnd.oasis.opendocument.presentation","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/zip","application/x-tar","application/x-rar-compressed","application/gzip","application/x-bzip2","application/x-7z-compressed","application/x-apple-diskimage","video/mp4","audio/midi","video/x-matroska","video/webm","video/quicktime","video/vnd.avi","audio/vnd.wave","audio/qcelp","audio/x-ms-wma","video/x-ms-asf","application/vnd.ms-asf","video/mpeg","video/3gpp","audio/mpeg","audio/mp4","audio/opus","video/ogg","audio/ogg","application/ogg","audio/x-flac","audio/ape","audio/wavpack","audio/amr","application/pdf","application/x-msdownload","application/x-shockwave-flash","application/rtf","application/wasm","font/woff","font/woff2","application/vnd.ms-fontobject","font/ttf","font/otf","image/x-icon","video/x-flv","application/postscript","application/x-xz","application/x-sqlite3","application/x-nintendo-nes-rom","application/x-google-chrome-extension","application/vnd.ms-cab-compressed","application/x-deb","application/x-unix-archive","application/x-rpm","application/x-compress","application/x-lzip","application/x-msi","application/mxf","video/mp2t","application/x-blender","image/bpg","image/jp2","image/jpx","image/jpm","image/mj2","audio/aiff","application/xml","application/x-mobipocket-ebook","image/heif","image/heif-sequence","image/heic","image/heic-sequence","image/ktx","application/dicom","audio/x-musepack","text/calendar","model/gltf-binary","application/vnd.tcpdump.pcap","audio/x-dsf","application/x.ms.shortcut","application/x.apple.alias","audio/x-voc","audio/vnd.dolby.dd-raw","audio/x-m4a"]}},function(e,t,r){"use strict";var n=/; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g,i=/^[\u000b\u0020-\u007e\u0080-\u00ff]+$/,a=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,s=/\\([\u000b\u0020-\u00ff])/g,o=/([\\"])/g,c=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;function u(e){var t=String(e);if(a.test(t))return t;if(t.length>0&&!i.test(t))throw new TypeError("invalid parameter value");return'"'+t.replace(o,"\\$1")+'"'}function l(e){this.parameters=Object.create(null),this.type=e}t.format=function(e){if(!e||"object"!=typeof e)throw new TypeError("argument obj is required");var t=e.parameters,r=e.type;if(!r||!c.test(r))throw new TypeError("invalid type");var n=r;if(t&&"object"==typeof t)for(var i,s=Object.keys(t).sort(),o=0;o{if("%%"===r)return r;o++;const a=n.formatters[i];if("function"==typeof a){const n=e[o];r=a.call(t,n),e.splice(o,1),o--}return r}),n.formatArgs.call(t,e),(t.log||n.log).apply(t,e)}return s.namespace=e,s.enabled=n.enabled(e),s.useColors=n.useColors(),s.color=t(e),s.destroy=i,s.extend=a,"function"==typeof n.init&&n.init(s),n.instances.push(s),s}function i(){const e=n.instances.indexOf(this);return-1!==e&&(n.instances.splice(e,1),!0)}function a(e,t){const r=n(this.namespace+(void 0===t?":":t)+e);return r.log=this.log,r}function s(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return n.debug=n,n.default=n,n.coerce=function(e){return e instanceof Error?e.stack||e.message:e},n.disable=function(){const e=[...n.names.map(s),...n.skips.map(s).map(e=>"-"+e)].join(",");return n.enable(""),e},n.enable=function(e){let t;n.save(e),n.names=[],n.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(t=0;t{n[t]=e[t]}),n.instances=[],n.names=[],n.skips=[],n.formatters={},n.selectColor=t,n.enable(n.load()),n}},function(e,t){var r=1e3,n=60*r,i=60*n,a=24*i,s=7*a,o=365.25*a;function c(e,t,r,n){var i=t>=1.5*r;return Math.round(e/r)+" "+n+(i?"s":"")}e.exports=function(e,t){t=t||{};var u=typeof e;if("string"===u&&e.length>0)return function(e){if((e=String(e)).length>100)return;var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(!t)return;var c=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*o;case"weeks":case"week":case"w":return c*s;case"days":case"day":case"d":return c*a;case"hours":case"hour":case"hrs":case"hr":case"h":return c*i;case"minutes":case"minute":case"mins":case"min":case"m":return c*n;case"seconds":case"second":case"secs":case"sec":case"s":return c*r;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(e);if("number"===u&&isFinite(e))return t.long?function(e){var t=Math.abs(e);if(t>=a)return c(e,t,a,"day");if(t>=i)return c(e,t,i,"hour");if(t>=n)return c(e,t,n,"minute");if(t>=r)return c(e,t,r,"second");return e+" ms"}(e):function(e){var t=Math.abs(e);if(t>=a)return Math.round(e/a)+"d";if(t>=i)return Math.round(e/i)+"h";if(t>=n)return Math.round(e/n)+"m";if(t>=r)return Math.round(e/r)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(211),a=r(212),s=r(8),o=r(4),c=n("music-metadata:collector"),u=["APEv2","vorbis","ID3v2.4","ID3v2.3","ID3v2.2","exif","asf","iTunes","ID3v1"];function l(e){return e.length>2?e.slice(0,e.length-1).join(", ")+" & "+e[e.length-1]:e.join(" & ")}t.MetadataCollector=class{constructor(e){this.opts=e,this.format={tagTypes:[]},this.native={},this.common={track:{no:null,of:null},disk:{no:null,of:null}},this.commonOrigin={},this.originPriority={},this.tagMapper=new a.CombinedTagMapper;let t=1;for(const e of u)this.originPriority[e]=t++;this.originPriority.artificial=500,this.originPriority.id3v1=600}hasAny(){for(const e in this.native)return!0;return!1}setFormat(e,t){c(`format: ${e} = ${t}`),this.format[e]=t,this.opts.observer&&this.opts.observer({metadata:this,tag:{type:"format",id:e,value:t}})}addTag(e,t,r){c(`tag ${e}.${t} = ${r}`),this.native[e]||(this.format.tagTypes.push(e),this.native[e]=[]),this.native[e].push({id:t,value:r}),this.toCommon(e,t,r)}getNativeMetadata(){return{format:this.format,native:this.native}}postMap(e,t){switch(t.id){case"artist":if(this.commonOrigin.artist===this.originPriority[e])return this.postMap("artificial",{id:"artists",value:t.value});this.common.artists||this.setGenericTag("artificial",{id:"artists",value:t.value});break;case"artists":if(!(this.common.artist&&this.commonOrigin.artist!==this.originPriority.artificial||this.common.artists&&-1!==this.common.artists.indexOf(t.value))){const e={id:"artist",value:l((this.common.artists||[]).concat([t.value]))};this.setGenericTag("artificial",e)}break;case"genre":t.value=s.CommonTagMapper.parseGenre(t.value);break;case"picture":t.value.format=s.CommonTagMapper.fixPictureMimeType(t.value.format);break;case"totaltracks":return void(this.common.track.of=s.CommonTagMapper.toIntOrNull(t.value));case"totaldiscs":return void(this.common.disk.of=s.CommonTagMapper.toIntOrNull(t.value));case"track":case"disk":const r=this.common[t.id].of;return this.common[t.id]=s.CommonTagMapper.normalizeTrack(t.value),void(this.common[t.id].of=null!=r?r:this.common[t.id].of);case"year":case"originalyear":t.value=parseInt(t.value,10);break;case"date":const n=parseInt(t.value.substr(0,4),10);n&&!isNaN(n)&&(this.common.year=n);break;case"discogs_label_id":case"discogs_release_id":case"discogs_master_release_id":case"discogs_artist_id":case"discogs_votes":t.value="string"==typeof t.value?parseInt(t.value,10):t.value;break;case"replaygain_track_gain":case"replaygain_track_peak":t.value=o.toRatio(t.value);break;case"gapless":t.value="1"===t.value}this.setGenericTag(e,t)}toCommonMetadata(){return{format:this.format,native:this.opts.native?this.native:void 0,common:this.common}}toCommon(e,t,r){const n={id:t,value:r},i=this.tagMapper.mapTag(e,n);i&&this.postMap(e,i)}setGenericTag(e,t){c(`common.${t.id} = ${t.value}`);const r=this.commonOrigin[t.id]||1e3,n=this.originPriority[e];if(i.isSingleton(t.id)){if(!(n<=r))return c(`Ignore native tag (singleton): ${e}.${t.id} = ${t.value}`);this.common[t.id]=t.value,this.commonOrigin[t.id]=n}else if(n===r)i.isUnique(t.id)&&-1!==this.common[t.id].indexOf(t.value)?c(`Ignore duplicate value: ${e}.${t.id} = ${t.value}`):this.common[t.id].push(t.value);else{if(!(n{this.registerTagMapper(e)})}mapTag(e,t){if(this.tagMappers[e])return this.tagMappers[e].mapGenericTag(t);throw new Error("No generic tag mapper defined for tag-format: "+e)}registerTagMapper(e){for(const t of e.tagTypes)this.tagMappers[t]=e}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8),i={title:"title",artist:"artist",album:"album",year:"year",comment:"comment",track:"track",genre:"genre"};t.ID3v1TagMapper=class extends n.CommonTagMapper{constructor(){super(["ID3v1"],i)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});class n{static decode(e){let t="";for(const r in e)e.hasOwnProperty(r)&&(t+=n.codePointToString(n.singleByteDecoder(e[r])));return t}static inRange(e,t,r){return t<=e&&e<=r}static codePointToString(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}static singleByteDecoder(e){if(n.inRange(e,0,127))return e;const t=n.windows1252[e-128];if(null===t)throw Error("invaliding encoding");return t}}n.windows1252=[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],t.Windows1292Decoder=n},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8),i=r(4),a={TIT2:"title",TPE1:"artist","TXXX:Artists":"artists",TPE2:"albumartist",TALB:"album",TDRV:"date",TORY:"originalyear",TPOS:"disk",TCON:"genre",APIC:"picture",TCOM:"composer","USLT:description":"lyrics",TSOA:"albumsort",TSOT:"titlesort",TOAL:"originalalbum",TSOP:"artistsort",TSO2:"albumartistsort",TSOC:"composersort",TEXT:"lyricist","TXXX:Writer":"writer",TPE3:"conductor",TPE4:"remixer","IPLS:arranger":"arranger","IPLS:engineer":"engineer","IPLS:producer":"producer","IPLS:DJ-mix":"djmixer","IPLS:mix":"mixer",TPUB:"label",TIT1:"grouping",TIT3:"subtitle",TRCK:"track",TCMP:"compilation",POPM:"rating",TBPM:"bpm",TMED:"media","TXXX:CATALOGNUMBER":"catalognumber","TXXX:MusicBrainz Album Status":"releasestatus","TXXX:MusicBrainz Album Type":"releasetype","TXXX:MusicBrainz Album Release Country":"releasecountry","TXXX:RELEASECOUNTRY":"releasecountry","TXXX:SCRIPT":"script",TLAN:"language",TCOP:"copyright",WCOP:"license",TENC:"encodedby",TSSE:"encodersettings","TXXX:BARCODE":"barcode",TSRC:"isrc","TXXX:ASIN":"asin","TXXX:originalyear":"originalyear","UFID:http://musicbrainz.org":"musicbrainz_recordingid","TXXX:MusicBrainz Release Track Id":"musicbrainz_trackid","TXXX:MusicBrainz Album Id":"musicbrainz_albumid","TXXX:MusicBrainz Artist Id":"musicbrainz_artistid","TXXX:MusicBrainz Album Artist Id":"musicbrainz_albumartistid","TXXX:MusicBrainz Release Group Id":"musicbrainz_releasegroupid","TXXX:MusicBrainz Work Id":"musicbrainz_workid","TXXX:MusicBrainz TRM Id":"musicbrainz_trmid","TXXX:MusicBrainz Disc Id":"musicbrainz_discid","TXXX:ACOUSTID_ID":"acoustid_id","TXXX:Acoustid Id":"acoustid_id","TXXX:Acoustid Fingerprint":"acoustid_fingerprint","TXXX:MusicIP PUID":"musicip_puid","TXXX:MusicMagic Fingerprint":"musicip_fingerprint",WOAR:"website",TDRC:"date",TYER:"year",TDOR:"originaldate","TIPL:arranger":"arranger","TIPL:engineer":"engineer","TIPL:producer":"producer","TIPL:DJ-mix":"djmixer","TIPL:mix":"mixer",TMOO:"mood",SYLT:"lyrics",TSST:"discsubtitle",TKEY:"key",COMM:"comment",TOPE:"originalartist","PRIV:AverageLevel":"averageLevel","PRIV:PeakLevel":"peakLevel","TXXX:DISCOGS_ARTIST_ID":"discogs_artist_id","TXXX:DISCOGS_ARTISTS":"artists","TXXX:DISCOGS_ARTIST_NAME":"artists","TXXX:DISCOGS_ALBUM_ARTISTS":"albumartist","TXXX:DISCOGS_CATALOG":"catalognumber","TXXX:DISCOGS_COUNTRY":"releasecountry","TXXX:DISCOGS_DATE":"originaldate","TXXX:DISCOGS_LABEL":"label","TXXX:DISCOGS_LABEL_ID":"discogs_label_id","TXXX:DISCOGS_MASTER_RELEASE_ID":"discogs_master_release_id","TXXX:DISCOGS_RATING":"discogs_rating","TXXX:DISCOGS_RELEASED":"date","TXXX:DISCOGS_RELEASE_ID":"discogs_release_id","TXXX:DISCOGS_VOTES":"discogs_votes","TXXX:CATALOGID":"catalognumber","TXXX:STYLE":"genre","TXXX:replaygain_track_peak":"replaygain_track_peak","TXXX:replaygain_track_gain":"replaygain_track_gain"};class s extends n.CommonTagMapper{static toRating(e){return{source:e.email,rating:e.rating>0?(e.rating-1)/254*n.CommonTagMapper.maxRatingScore:void 0}}constructor(){super(["ID3v2.3","ID3v2.4"],a)}postMap(e){switch(e.id){case"UFID":"http://musicbrainz.org"===e.value.owner_identifier&&(e.id+=":"+e.value.owner_identifier,e.value=i.default.decodeString(e.value.identifier,"iso-8859-1"));break;case"PRIV":switch(e.value.owner_identifier){case"AverageLevel":case"PeakValue":e.id+=":"+e.value.owner_identifier,e.value=4===e.value.data.length?e.value.data.readUInt32LE(0):null}break;case"COMM":e.value=e.value?e.value.text:null;break;case"POPM":e.value=s.toRating(e.value)}}}t.ID3v24TagMapper=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8),i={Title:"title",Author:"artist","WM/AlbumArtist":"albumartist","WM/AlbumTitle":"album","WM/Year":"date","WM/OriginalReleaseTime":"originaldate","WM/OriginalReleaseYear":"originalyear",Description:"comment","WM/TrackNumber":"track","WM/PartOfSet":"disk","WM/Genre":"genre","WM/Composer":"composer","WM/Lyrics":"lyrics","WM/AlbumSortOrder":"albumsort","WM/TitleSortOrder":"titlesort","WM/ArtistSortOrder":"artistsort","WM/AlbumArtistSortOrder":"albumartistsort","WM/ComposerSortOrder":"composersort","WM/Writer":"lyricist","WM/Conductor":"conductor","WM/ModifiedBy":"remixer","WM/Engineer":"engineer","WM/Producer":"producer","WM/DJMixer":"djmixer","WM/Mixer":"mixer","WM/Publisher":"label","WM/ContentGroupDescription":"grouping","WM/SubTitle":"subtitle","WM/SetSubTitle":"discsubtitle","WM/IsCompilation":"compilation","WM/SharedUserRating":"rating","WM/BeatsPerMinute":"bpm","WM/Mood":"mood","WM/Media":"media","WM/CatalogNo":"catalognumber","MusicBrainz/Album Status":"releasestatus","MusicBrainz/Album Type":"releasetype","MusicBrainz/Album Release Country":"releasecountry","WM/Script":"script","WM/Language":"language",Copyright:"copyright",LICENSE:"license","WM/EncodedBy":"encodedby","WM/EncodingSettings":"encodersettings","WM/Barcode":"barcode","WM/ISRC":"isrc","MusicBrainz/Track Id":"musicbrainz_recordingid","MusicBrainz/Release Track Id":"musicbrainz_trackid","MusicBrainz/Album Id":"musicbrainz_albumid","MusicBrainz/Artist Id":"musicbrainz_artistid","MusicBrainz/Album Artist Id":"musicbrainz_albumartistid","MusicBrainz/Release Group Id":"musicbrainz_releasegroupid","MusicBrainz/Work Id":"musicbrainz_workid","MusicBrainz/TRM Id":"musicbrainz_trmid","MusicBrainz/Disc Id":"musicbrainz_discid","Acoustid/Id":"acoustid_id","Acoustid/Fingerprint":"acoustid_fingerprint","MusicIP/PUID":"musicip_puid","WM/ARTISTS":"artists","WM/InitialKey":"key",ASIN:"asin","WM/Work":"work","WM/AuthorURL":"website","WM/Picture":"picture"};class a extends n.CommonTagMapper{static toRating(e){return{rating:parseFloat(e+1)/5}}constructor(){super(["asf"],i)}postMap(e){switch(e.id){case"WM/SharedUserRating":const t=e.id.split(":");e.value=a.toRating(e.value),e.id=t[0]}}}t.AsfTagMapper=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8);t.id3v22TagMap={TT2:"title",TP1:"artist",TP2:"albumartist",TAL:"album",TYE:"year",COM:"comment",TRK:"track",TPA:"disk",TCO:"genre",PIC:"picture",TCM:"composer",TOR:"originaldate",TOT:"work",TXT:"lyricist",TP3:"conductor",TPB:"label",TT1:"grouping",TT3:"subtitle",TLA:"language",TCR:"copyright",WCP:"license",TEN:"encodedby",TSS:"encodersettings",WAR:"website","COM:iTunPGAP":"gapless"};t.ID3v22TagMapper=class extends n.CommonTagMapper{constructor(){super(["ID3v2.2"],t.id3v22TagMap)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8),i={Title:"title",Artist:"artist",Artists:"artists","Album Artist":"albumartist",Album:"album",Year:"date",Originalyear:"originalyear",Originaldate:"originaldate",Comment:"comment",Track:"track",Disc:"disk",DISCNUMBER:"disk",Genre:"genre","Cover Art (Front)":"picture","Cover Art (Back)":"picture",Composer:"composer",Lyrics:"lyrics",ALBUMSORT:"albumsort",TITLESORT:"titlesort",WORK:"work",ARTISTSORT:"artistsort",ALBUMARTISTSORT:"albumartistsort",COMPOSERSORT:"composersort",Lyricist:"lyricist",Writer:"writer",Conductor:"conductor",MixArtist:"remixer",Arranger:"arranger",Engineer:"engineer",Producer:"producer",DJMixer:"djmixer",Mixer:"mixer",Label:"label",Grouping:"grouping",Subtitle:"subtitle",DiscSubtitle:"discsubtitle",Compilation:"compilation",BPM:"bpm",Mood:"mood",Media:"media",CatalogNumber:"catalognumber",MUSICBRAINZ_ALBUMSTATUS:"releasestatus",MUSICBRAINZ_ALBUMTYPE:"releasetype",RELEASECOUNTRY:"releasecountry",Script:"script",Language:"language",Copyright:"copyright",LICENSE:"license",EncodedBy:"encodedby",EncoderSettings:"encodersettings",Barcode:"barcode",ISRC:"isrc",ASIN:"asin",musicbrainz_trackid:"musicbrainz_recordingid",musicbrainz_releasetrackid:"musicbrainz_trackid",MUSICBRAINZ_ALBUMID:"musicbrainz_albumid",MUSICBRAINZ_ARTISTID:"musicbrainz_artistid",MUSICBRAINZ_ALBUMARTISTID:"musicbrainz_albumartistid",MUSICBRAINZ_RELEASEGROUPID:"musicbrainz_releasegroupid",MUSICBRAINZ_WORKID:"musicbrainz_workid",MUSICBRAINZ_TRMID:"musicbrainz_trmid",MUSICBRAINZ_DISCID:"musicbrainz_discid",Acoustid_Id:"acoustid_id",ACOUSTID_FINGERPRINT:"acoustid_fingerprint",MUSICIP_PUID:"musicip_puid",Weblink:"website"};t.APEv2TagMapper=class extends n.CommonTagMapper{constructor(){const e={};for(const t in i)e[t.toUpperCase()]=i[t];super(["APEv2"],e)}getCommonName(e){return this.tagMap[e.toUpperCase()]}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8),i={"©nam":"title","©ART":"artist",aART:"albumartist","----:com.apple.iTunes:Band":"albumartist","©alb":"album","©day":"date","©cmt":"comment",trkn:"track",disk:"disk","©gen":"genre",covr:"picture","©wrt":"composer","©lyr":"lyrics",soal:"albumsort",sonm:"titlesort",soar:"artistsort",soaa:"albumartistsort",soco:"composersort","----:com.apple.iTunes:LYRICIST":"lyricist","----:com.apple.iTunes:CONDUCTOR":"conductor","----:com.apple.iTunes:REMIXER":"remixer","----:com.apple.iTunes:ENGINEER":"engineer","----:com.apple.iTunes:PRODUCER":"producer","----:com.apple.iTunes:DJMIXER":"djmixer","----:com.apple.iTunes:MIXER":"mixer","----:com.apple.iTunes:LABEL":"label","©grp":"grouping","----:com.apple.iTunes:SUBTITLE":"subtitle","----:com.apple.iTunes:DISCSUBTITLE":"discsubtitle",cpil:"compilation",tmpo:"bpm","----:com.apple.iTunes:MOOD":"mood","----:com.apple.iTunes:MEDIA":"media","----:com.apple.iTunes:CATALOGNUMBER":"catalognumber",tvsh:"tvShow",tvsn:"tvSeason",tves:"tvEpisode",sosn:"tvShowSort",tven:"tvEpisodeId",tvnn:"tvNetwork",pcst:"podcast",purl:"podcasturl","----:com.apple.iTunes:MusicBrainz Album Status":"releasestatus","----:com.apple.iTunes:MusicBrainz Album Type":"releasetype","----:com.apple.iTunes:MusicBrainz Album Release Country":"releasecountry","----:com.apple.iTunes:SCRIPT":"script","----:com.apple.iTunes:LANGUAGE":"language",cprt:"copyright","----:com.apple.iTunes:LICENSE":"license","©too":"encodedby",pgap:"gapless","----:com.apple.iTunes:BARCODE":"barcode","----:com.apple.iTunes:ISRC":"isrc","----:com.apple.iTunes:ASIN":"asin","----:com.apple.iTunes:NOTES":"comment","----:com.apple.iTunes:MusicBrainz Track Id":"musicbrainz_recordingid","----:com.apple.iTunes:MusicBrainz Release Track Id":"musicbrainz_trackid","----:com.apple.iTunes:MusicBrainz Album Id":"musicbrainz_albumid","----:com.apple.iTunes:MusicBrainz Artist Id":"musicbrainz_artistid","----:com.apple.iTunes:MusicBrainz Album Artist Id":"musicbrainz_albumartistid","----:com.apple.iTunes:MusicBrainz Release Group Id":"musicbrainz_releasegroupid","----:com.apple.iTunes:MusicBrainz Work Id":"musicbrainz_workid","----:com.apple.iTunes:MusicBrainz TRM Id":"musicbrainz_trmid","----:com.apple.iTunes:MusicBrainz Disc Id":"musicbrainz_discid","----:com.apple.iTunes:Acoustid Id":"acoustid_id","----:com.apple.iTunes:Acoustid Fingerprint":"acoustid_fingerprint","----:com.apple.iTunes:MusicIP PUID":"musicip_puid","----:com.apple.iTunes:fingerprint":"musicip_fingerprint",gnre:"genre","----:com.apple.iTunes:ALBUMARTISTSORT":"albumartistsort","----:com.apple.iTunes:ARTISTS":"artists","----:com.apple.iTunes:ORIGINALDATE":"originaldate","----:com.apple.iTunes:ORIGINALYEAR":"originalyear",desc:"description",ldes:"description"};t.tagType="iTunes";t.MP4TagMapper=class extends n.CommonTagMapper{constructor(){super([t.tagType],i)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8),i={TITLE:"title",ARTIST:"artist",ARTISTS:"artists",ALBUMARTIST:"albumartist",ALBUM:"album",DATE:"date",ORIGINALDATE:"originaldate",ORIGINALYEAR:"originalyear",COMMENT:"comment",TRACKNUMBER:"track",DISCNUMBER:"disk",GENRE:"genre",METADATA_BLOCK_PICTURE:"picture",COMPOSER:"composer",LYRICS:"lyrics",ALBUMSORT:"albumsort",TITLESORT:"titlesort",WORK:"work",ARTISTSORT:"artistsort",ALBUMARTISTSORT:"albumartistsort",COMPOSERSORT:"composersort",LYRICIST:"lyricist",WRITER:"writer",CONDUCTOR:"conductor",REMIXER:"remixer",ARRANGER:"arranger",ENGINEER:"engineer",PRODUCER:"producer",DJMIXER:"djmixer",MIXER:"mixer",LABEL:"label",GROUPING:"grouping",SUBTITLE:"subtitle",DISCSUBTITLE:"discsubtitle",TRACKTOTAL:"totaltracks",DISCTOTAL:"totaldiscs",COMPILATION:"compilation",RATING:"rating",BPM:"bpm",MOOD:"mood",MEDIA:"media",CATALOGNUMBER:"catalognumber",RELEASESTATUS:"releasestatus",RELEASETYPE:"releasetype",RELEASECOUNTRY:"releasecountry",SCRIPT:"script",LANGUAGE:"language",COPYRIGHT:"copyright",LICENSE:"license",ENCODEDBY:"encodedby",ENCODERSETTINGS:"encodersettings",BARCODE:"barcode",ISRC:"isrc",ASIN:"asin",MUSICBRAINZ_TRACKID:"musicbrainz_recordingid",MUSICBRAINZ_RELEASETRACKID:"musicbrainz_trackid",MUSICBRAINZ_ALBUMID:"musicbrainz_albumid",MUSICBRAINZ_ARTISTID:"musicbrainz_artistid",MUSICBRAINZ_ALBUMARTISTID:"musicbrainz_albumartistid",MUSICBRAINZ_RELEASEGROUPID:"musicbrainz_releasegroupid",MUSICBRAINZ_WORKID:"musicbrainz_workid",MUSICBRAINZ_TRMID:"musicbrainz_trmid",MUSICBRAINZ_DISCID:"musicbrainz_discid",ACOUSTID_ID:"acoustid_id",ACOUSTID_ID_FINGERPRINT:"acoustid_fingerprint",MUSICIP_PUID:"musicip_puid",WEBSITE:"website",NOTES:"notes",TOTALTRACKS:"totaltracks",TOTALDISCS:"totaldiscs",DISCOGS_ARTIST_ID:"discogs_artist_id",DISCOGS_ARTISTS:"artists",DISCOGS_ARTIST_NAME:"artists",DISCOGS_ALBUM_ARTISTS:"albumartist",DISCOGS_CATALOG:"catalognumber",DISCOGS_COUNTRY:"releasecountry",DISCOGS_DATE:"originaldate",DISCOGS_LABEL:"label",DISCOGS_LABEL_ID:"discogs_label_id",DISCOGS_MASTER_RELEASE_ID:"discogs_master_release_id",DISCOGS_RATING:"discogs_rating",DISCOGS_RELEASED:"date",DISCOGS_RELEASE_ID:"discogs_release_id",DISCOGS_VOTES:"discogs_votes",CATALOGID:"catalognumber",STYLE:"genre",REPLAYGAIN_TRACK_GAIN:"replaygain_track_gain",REPLAYGAIN_TRACK_PEAK:"replaygain_track_peak"};class a extends n.CommonTagMapper{static toRating(e,t){return{source:e?e.toLowerCase():e,rating:parseFloat(t)*n.CommonTagMapper.maxRatingScore}}constructor(){super(["vorbis"],i)}postMap(e){if(0===e.id.indexOf("RATING:")){const t=e.id.split(":");e.value=a.toRating(t[1],e.value),e.id=t[0]}}}t.VorbisTagMapper=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8);t.riffInfoTagMap={IART:"artist",ICRD:"date",INAM:"title",TITL:"title",IPRD:"album",ITRK:"track",COMM:"comment",ICMT:"comment",ICNT:"releasecountry",GNRE:"genre",IWRI:"writer",RATE:"rating",YEAR:"year",ISFT:"encodedby",CODE:"encodedby",TURL:"website",IGNR:"genre",IENG:"engineer",ITCH:"technician",IMED:"media",IRPD:"album"};t.RiffInfoTagMapper=class extends n.CommonTagMapper{constructor(){super(["exif"],t.riffInfoTagMap)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(2),a=r(10),s=r(19),o=r(16),c=r(5),u=r(7),l=r(224),d=r(225),f=r(25),p=i("music-metadata:parser:aiff");t.AIFFParser=class extends u.BasicParser{async parse(){if("FORM"!==(await this.tokenizer.readToken(d.Header)).chunkID)throw new Error("Invalid Chunk-ID, expected 'FORM'");const e=await this.tokenizer.readToken(c.FourCcToken);switch(e){case"AIFF":this.metadata.setFormat("container",e),this.isCompressed=!1;break;case"AIFC":this.metadata.setFormat("container","AIFF-C"),this.isCompressed=!0;break;default:throw Error("Unsupported AIFF type: "+e)}this.metadata.setFormat("lossless",!this.isCompressed);try{for(;;){const e=await this.tokenizer.readToken(d.Header);p(`Chunk id=${e.chunkID}`);const t=2*Math.round(e.chunkSize/2),r=await this.readData(e);await this.tokenizer.ignore(t-r)}}catch(e){if(e.message!==a.endOfFile)throw e}}async readData(e){switch(e.chunkID){case"COMM":const t=await this.tokenizer.readToken(new l.Common(e,this.isCompressed));return this.metadata.setFormat("bitsPerSample",t.sampleSize),this.metadata.setFormat("sampleRate",t.sampleRate),this.metadata.setFormat("numberOfChannels",t.numChannels),this.metadata.setFormat("numberOfSamples",t.numSampleFrames),this.metadata.setFormat("duration",t.numSampleFrames/t.sampleRate),this.metadata.setFormat("codec",t.compressionName),e.chunkSize;case"ID3 ":const r=await this.tokenizer.readToken(new n.BufferType(e.chunkSize)),i=new f.ID3Stream(r),a=s.fromStream(i);return await(new o.ID3v2Parser).parse(this.metadata,a,this.options),e.chunkSize;case"SSND":return this.metadata.format.duration&&this.metadata.setFormat("bitrate",8*e.chunkSize/this.metadata.format.duration),0;default:return 0}}}},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(1),a=r(4),s=r(17),o=n("music-metadata:id3v2:frame-parser"),c="iso-8859-1";class u{static readData(t,r,n,l){const{encoding:d,bom:f}=s.TextEncodingToken.get(t,0),p=t.length;let h=0,m=[];const g=u.getNullTerminatorLength(d);let b;const y={};switch(o(`Parsing tag type=${r}, encoding=${d}, bom=${f}`),"TXXX"!==r&&"T"===r[0]?"T*":r){case"T*":case"IPLS":const w=a.default.decodeString(t.slice(1),d).replace(/\x00+$/,"");switch(r){case"TMCL":case"TIPL":case"IPLS":m=u.splitValue(4,w),m=u.functionList(m);break;case"TRK":case"TRCK":case"TPOS":m=w;break;case"TCOM":case"TEXT":case"TOLY":case"TOPE":case"TPE1":case"TSRC":m=u.splitValue(n,w);break;default:m=n>=4?u.splitValue(n,w):[w]}break;case"TXXX":m={description:(m=u.readIdentifierAndData(t,h+1,p,d)).id,text:u.splitValue(n,a.default.decodeString(m.data,d).replace(/\x00+$/,""))};break;case"PIC":case"APIC":if(l){const r={};switch(h+=1,n){case 2:r.format=a.default.decodeString(t.slice(h,h+3),d),h+=3;break;case 3:case 4:b=a.default.findZero(t,h,p,c),r.format=a.default.decodeString(t.slice(h,b),c),h=b+1;break;default:throw new Error("Warning: unexpected major versionIndex: "+n)}r.format=u.fixPictureMimeType(r.format),r.type=s.AttachedPictureType[t[h]],h+=1,b=a.default.findZero(t,h,p,d),r.description=a.default.decodeString(t.slice(h,b),d),h=b+g,r.data=e.from(t.slice(h,p)),m=r}break;case"CNT":case"PCNT":m=i.UINT32_BE.get(t,0);break;case"SYLT":for(h+=7,m=[];h=5?t.readUInt32BE(h+1):void 0};break;case"GEOB":{b=a.default.findZero(t,h+1,p,d);const e=a.default.decodeString(t.slice(h+1,b),c);h=b+1,b=a.default.findZero(t,h,p-h,d);const r=a.default.decodeString(t.slice(h+1,b),c);h=b+1,b=a.default.findZero(t,h,p-h,d),m={type:e,filename:r,description:a.default.decodeString(t.slice(h+1,b),c),data:t.slice(h+1,p)};break}case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":m=a.default.decodeString(t.slice(h,b),d);break;case"WXXX":{b=a.default.findZero(t,h+1,p,d);const e=a.default.decodeString(t.slice(h+1,b),c);h=b+1,m={description:e,url:a.default.decodeString(t.slice(h,p-h),d)};break}case"MCDI":m=t.slice(0,p);break;default:o("Warning: unsupported id3v2-tag-type: "+r)}return m}static fixPictureMimeType(e){switch(e=e.toLocaleLowerCase()){case"jpg":return"image/jpeg";case"png":return"image/png"}return e}static functionList(e){const t={};for(let r=0;r+1=4?/\x00/g:/\//g);return u.trimArray(r)}static trimArray(e){for(let t=0;t=r,`COMMON CHUNK size should always be at least ${r}`),this.len=e.chunkSize}get(e,t){const r=e.readUInt16BE(t+8)-16398,i=e.readUInt16BE(t+8+2),s={numChannels:e.readUInt16BE(t),numSampleFrames:e.readUInt32BE(t+2),sampleSize:e.readUInt16BE(t+6),sampleRate:r<0?i>>Math.abs(r):i<22){const r=e.readInt8(t+22);if(23+r+(r+1)%2!==this.len)throw new Error("Illegal pstring length");s.compressionName=new n.StringType(r,"binary").get(e,t+23)}}else s.compressionName="PCM";return s}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(5);t.Header={len:8,get:(e,t)=>({chunkID:n.FourCcToken.get(e,t),chunkSize:e.readUInt32BE(t+4)})}},function(e,t){},function(e,t,r){"use strict";var n=r(28).Buffer,i=r(228);e.exports=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.head=null,this.tail=null,this.length=0}return e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return"";for(var t=this.head,r=""+t.data;t=t.next;)r+=e+t.data;return r},e.prototype.concat=function(e){if(0===this.length)return n.alloc(0);if(1===this.length)return this.head.data;for(var t,r,i,a=n.allocUnsafe(e>>>0),s=this.head,o=0;s;)t=s.data,r=a,i=o,t.copy(r,i),o+=s.data.length,s=s.next;return a},e}(),i&&i.inspect&&i.inspect.custom&&(e.exports.prototype[i.inspect.custom]=function(){var e=i.inspect({length:this.length});return this.constructor.name+" "+e})},function(e,t){},function(e,t,r){(function(e){var n=void 0!==e&&e||"undefined"!=typeof self&&self||window,i=Function.prototype.apply;function a(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new a(i.call(setTimeout,n,arguments),clearTimeout)},t.setInterval=function(){return new a(i.call(setInterval,n,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},a.prototype.unref=a.prototype.ref=function(){},a.prototype.close=function(){this._clearFn.call(n,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},r(230),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,r(11))},function(e,t,r){(function(e,t){!function(e,r){"use strict";if(!e.setImmediate){var n,i,a,s,o,c=1,u={},l=!1,d=e.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(e);f=f&&f.setTimeout?f:e,"[object process]"==={}.toString.call(e.process)?n=function(e){t.nextTick(function(){h(e)})}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,r=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=r,t}}()?e.MessageChannel?((a=new MessageChannel).port1.onmessage=function(e){h(e.data)},n=function(e){a.port2.postMessage(e)}):d&&"onreadystatechange"in d.createElement("script")?(i=d.documentElement,n=function(e){var t=d.createElement("script");t.onreadystatechange=function(){h(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):n=function(e){setTimeout(h,0,e)}:(s="setImmediate$"+Math.random()+"$",o=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(s)&&h(+t.data.slice(s.length))},e.addEventListener?e.addEventListener("message",o,!1):e.attachEvent("onmessage",o),n=function(t){e.postMessage(s+t,"*")}),f.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),r=0;r>1}}function s(e,t){return 0!=(e&1<({ID:i.FourCcToken.get(e,t),version:n.UINT32_LE.get(e,t+4)/1e3,descriptorBytes:n.UINT32_LE.get(e,t+8),headerBytes:n.UINT32_LE.get(e,t+12),seekTableBytes:n.UINT32_LE.get(e,t+16),headerDataBytes:n.UINT32_LE.get(e,t+20),apeFrameDataBytes:n.UINT32_LE.get(e,t+24),apeFrameDataBytesHigh:n.UINT32_LE.get(e,t+28),terminatingDataBytes:n.UINT32_LE.get(e,t+32),fileMD5:new n.BufferType(16).get(e,t+36)})},t.Header={len:24,get:(e,t)=>({compressionLevel:n.UINT16_LE.get(e,t),formatFlags:n.UINT16_LE.get(e,t+2),blocksPerFrame:n.UINT32_LE.get(e,t+4),finalFrameBlocks:n.UINT32_LE.get(e,t+8),totalFrames:n.UINT32_LE.get(e,t+12),bitsPerSample:n.UINT16_LE.get(e,t+16),channel:n.UINT16_LE.get(e,t+18),sampleRate:n.UINT32_LE.get(e,t+20)})},t.TagFooter={len:32,get:(e,t)=>({ID:new n.StringType(8,"ascii").get(e,t),version:n.UINT32_LE.get(e,t+8),size:n.UINT32_LE.get(e,t+12),fields:n.UINT32_LE.get(e,t+16),flags:a(n.UINT32_LE.get(e,t+20))})},t.TagItemHeader={len:8,get:(e,t)=>({size:n.UINT32_LE.get(e,t),flags:a(n.UINT32_LE.get(e,t+4))})},t.TagField=e=>new n.BufferType(e.size-t.TagFooter.len),t.parseTagFlags=a,t.isBitSet=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(41),i=r(240),a=r(2),s=r(7),o=a("music-metadata:parser:ASF"),c="asf";t.AsfParser=class extends s.BasicParser{async parse(){const e=await this.tokenizer.readToken(i.TopLevelHeaderObjectToken);if(!e.objectId.equals(n.default.HeaderObject))throw new Error("expected asf header; but was not found; got: "+e.objectId.str);try{await this.parseObjectHeader(e.numberOfHeaderObjects)}catch(e){o("Error while parsing ASF: %s",e)}}async parseObjectHeader(e){let t;do{const e=await this.tokenizer.readToken(i.HeaderObjectToken);switch(o("header GUID=%s",e.objectId.str),e.objectId.str){case i.FilePropertiesObject.guid.str:const r=await this.tokenizer.readToken(new i.FilePropertiesObject(e));this.metadata.setFormat("duration",r.playDuration/1e7),this.metadata.setFormat("bitrate",r.maximumBitrate);break;case i.StreamPropertiesObject.guid.str:const a=await this.tokenizer.readToken(new i.StreamPropertiesObject(e));this.metadata.setFormat("container","ASF/"+a.streamType);break;case i.HeaderExtensionObject.guid.str:const s=await this.tokenizer.readToken(new i.HeaderExtensionObject);await this.parseExtensionObject(s.extensionDataSize);break;case i.ContentDescriptionObjectState.guid.str:t=await this.tokenizer.readToken(new i.ContentDescriptionObjectState(e)),this.addTags(t);break;case i.ExtendedContentDescriptionObjectState.guid.str:t=await this.tokenizer.readToken(new i.ExtendedContentDescriptionObjectState(e)),this.addTags(t);break;case n.default.CodecListObject.str:case n.default.StreamBitratePropertiesObject.str:await this.tokenizer.ignore(e.objectSize-i.HeaderObjectToken.len);break;case n.default.PaddingObject.str:o("Padding: %s bytes",e.objectSize-i.HeaderObjectToken.len),await this.tokenizer.ignore(e.objectSize-i.HeaderObjectToken.len);break;default:this.warnings.push("Ignore ASF-Object-GUID: "+e.objectId.str),o("Ignore ASF-Object-GUID: %s",e.objectId.str),await this.tokenizer.readToken(new i.IgnoreObjectState(e))}}while(--e)}addTags(e){e.forEach(e=>{this.metadata.addTag(c,e.id,e.value)})}async parseExtensionObject(e){do{const t=await this.tokenizer.readToken(i.HeaderObjectToken);switch(t.objectId.str){case i.ExtendedStreamPropertiesObjectState.guid.str:await this.tokenizer.readToken(new i.ExtendedStreamPropertiesObjectState(t));break;case i.MetadataObjectState.guid.str:const e=await this.tokenizer.readToken(new i.MetadataObjectState(t));this.addTags(e);break;case i.MetadataLibraryObjectState.guid.str:const r=await this.tokenizer.readToken(new i.MetadataLibraryObjectState(t));this.addTags(r);break;case n.default.PaddingObject.str:await this.tokenizer.ignore(t.objectSize-i.HeaderObjectToken.len);break;case n.default.CompatibilityObject.str:this.tokenizer.ignore(t.objectSize-i.HeaderObjectToken.len);break;case n.default.ASF_Index_Placeholder_Object.str:await this.tokenizer.ignore(t.objectSize-i.HeaderObjectToken.len);break;default:this.warnings.push("Ignore ASF-Object-GUID: "+t.objectId.str),await this.tokenizer.readToken(new i.IgnoreObjectState(t))}e-=t.objectSize}while(e>0)}}},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(4),i=r(1),a=r(41),s=r(241),o=r(17);!function(e){e[e.UnicodeString=0]="UnicodeString",e[e.ByteArray=1]="ByteArray",e[e.Bool=2]="Bool",e[e.DWord=3]="DWord",e[e.QWord=4]="QWord",e[e.Word=5]="Word"}(t.DataType||(t.DataType={})),t.TopLevelHeaderObjectToken={len:30,get:(e,t)=>({objectId:a.default.fromBin(new i.BufferType(16).get(e,t)),objectSize:i.UINT64_LE.get(e,t+16),numberOfHeaderObjects:i.UINT32_LE.get(e,t+24)})},t.HeaderObjectToken={len:24,get:(e,t)=>({objectId:a.default.fromBin(new i.BufferType(16).get(e,t)),objectSize:i.UINT64_LE.get(e,t+16)})};class c{constructor(e){this.len=e.objectSize-t.HeaderObjectToken.len}postProcessTag(e,t,r,n){if("WM/Picture"===t)e.push({id:t,value:b.fromBuffer(n)});else{const i=s.AsfUtil.getParserForAttr(r);if(!i)throw new Error("unexpected value headerType: "+r);e.push({id:t,value:i(n)})}}}t.State=c;t.IgnoreObjectState=class extends c{constructor(e){super(e)}get(e,t){return null}};class u extends c{constructor(e){super(e)}get(e,t){return{fileId:a.default.fromBin(e,t),fileSize:i.UINT64_LE.get(e,t+16),creationDate:i.UINT64_LE.get(e,t+24),dataPacketsCount:i.UINT64_LE.get(e,t+32),playDuration:i.UINT64_LE.get(e,t+40),sendDuration:i.UINT64_LE.get(e,t+48),preroll:i.UINT64_LE.get(e,t+56),flags:{broadcast:n.default.strtokBITSET.get(e,t+64,24),seekable:n.default.strtokBITSET.get(e,t+64,25)},minimumDataPacketSize:i.UINT32_LE.get(e,t+68),maximumDataPacketSize:i.UINT32_LE.get(e,t+72),maximumBitrate:i.UINT32_LE.get(e,t+76)}}}u.guid=a.default.FilePropertiesObject,t.FilePropertiesObject=u;class l extends c{constructor(e){super(e)}get(e,t){return{streamType:a.default.decodeMediaType(a.default.fromBin(e,t)),errorCorrectionType:a.default.fromBin(e,t+8)}}}l.guid=a.default.StreamPropertiesObject,t.StreamPropertiesObject=l;class d{constructor(){this.len=22}get(e,t){return{reserved1:a.default.fromBin(e,t),reserved2:e.readUInt16LE(t+16),extensionDataSize:e.readUInt32LE(t+18)}}}d.guid=a.default.HeaderExtensionObject,t.HeaderExtensionObject=d;class f extends c{constructor(e){super(e)}get(e,t){const r=[];let n=t+10;for(let i=0;i0){const t=f.contentDescTags[i],o=n+a;r.push({id:t,value:s.AsfUtil.parseUnicodeAttr(e.slice(n,o))}),n=o}}return r}}f.guid=a.default.ContentDescriptionObject,f.contentDescTags=["Title","Author","Copyright","Description","Rating"],t.ContentDescriptionObjectState=f;class p extends c{constructor(e){super(e)}get(e,t){const r=[],n=e.readUInt16LE(t);let i=t+2;for(let t=0;t({lastBlock:n.default.strtokBITSET.get(e,t,7),type:n.default.getBitAllignedNumber(e,t,1,7),length:i.UINT24_BE.get(e,t+1)})},d.BlockStreamInfo={len:34,get:(e,t)=>({minimumBlockSize:i.UINT16_BE.get(e,t),maximumBlockSize:i.UINT16_BE.get(e,t+2)/1e3,minimumFrameSize:i.UINT24_BE.get(e,t+4),maximumFrameSize:i.UINT24_BE.get(e,t+7),sampleRate:i.UINT24_BE.get(e,t+10)>>4,channels:n.default.getBitAllignedNumber(e,t+12,4,3)+1,bitsPerSample:n.default.getBitAllignedNumber(e,t+12,7,5)+1,totalSamples:n.default.getBitAllignedNumber(e,t+13,4,36),fileMD5:new i.BufferType(16).get(e,t+18)})};class f{constructor(e){this.data=e,this.offset=0}readInt32(){const e=i.UINT32_LE.get(this.data,this.offset);return this.offset+=4,e}readStringUtf8(){const e=this.readInt32(),t=this.data.toString("utf8",this.offset,this.offset+e);return this.offset+=e,t}}},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(1),a=r(7),s=r(244),o=r(43),c=r(24),u=n("music-metadata:parser:MP4"),l="iTunes",d={raw:{lossy:!1,format:"raw"},MAC3:{lossy:!0,format:"MACE 3:1"},MAC6:{lossy:!0,format:"MACE 6:1"},ima4:{lossy:!0,format:"IMA 4:1"},ulaw:{lossy:!0,format:"uLaw 2:1"},alaw:{lossy:!0,format:"uLaw 2:1"},Qclp:{lossy:!0,format:"QUALCOMM PureVoice"},".mp3":{lossy:!0,format:"MPEG-1 layer 3"},alac:{lossy:!1,format:"ALAC"},"ac-3":{lossy:!0,format:"AC-3"},mp4a:{lossy:!0,format:"MPEG-4/AAC"},mp4s:{lossy:!0,format:"MP4S"},c608:{lossy:!0,format:"CEA-608"},c708:{lossy:!0,format:"CEA-708"}};function f(e,t,r){return r.indexOf(e)===t}class p extends a.BasicParser{static read_BE_Signed_Integer(e){return i.readIntBE(e,0,e.length)}static read_BE_Unsigned_Integer(e){return i.readUIntBE(e,0,e.length)}async parse(){this.formatList=[];const e=new s.Atom({name:"mp4",length:this.tokenizer.fileSize},!1,null);await e.readAtoms(this.tokenizer,async e=>{if(e.parent)switch(e.parent.header.name){case"ilst":case"":return this.parseMetadataItemData(e);case"stbl":switch(e.header.name){case"stsd":return this.parseAtom_stsd(e.dataLen);default:u(`Ignore: stbl/${e.header.name} atom`)}}switch(e.header.name){case"ftyp":const t=await this.parseAtom_ftyp(e.dataLen);u(`ftyp: ${t.join("/")}`);const r=t.filter(f).join("/");return void this.metadata.setFormat("container",r);case"mdhd":return this.parseAtom_mdhd(e);case"mvhd":return this.parseAtom_mvhd(e);case"mdat":this.audioLengthInBytes=e.dataLen,this.calculateBitRate()}await this.tokenizer.readToken(new i.IgnoreType(e.dataLen)),u(`Ignore atom data: path=${e.atomPath}, payload-len=${e.dataLen}`)},this.tokenizer.fileSize),this.metadata.setFormat("codec",this.formatList.filter(f).join("+"))}calculateBitRate(){this.audioLengthInBytes&&this.metadata.format.duration&&this.metadata.setFormat("bitrate",8*this.audioLengthInBytes/this.metadata.format.duration)}addTag(e,t){this.metadata.addTag(l,e,t)}addWarning(e){u("Warning:"+e),this.warnings.push(e)}parseMetadataItemData(e){let t=e.header.name;return e.readAtoms(this.tokenizer,async e=>{switch(e.header.name){case"data":return this.parseValueAtom(t,e);case"name":const r=await this.tokenizer.readToken(new o.NameAtom(e.dataLen));t+=":"+r.name;break;case"mean":const n=await this.tokenizer.readToken(new o.NameAtom(e.dataLen));t+=":"+n.name;break;default:const a=await this.tokenizer.readToken(new i.BufferType(e.dataLen));this.addWarning("Unsupported meta-item: "+t+"["+e.header.name+"] => value="+a.toString("hex")+" ascii="+a.toString("ascii"))}},e.dataLen)}async parseValueAtom(t,r){const n=await this.tokenizer.readToken(new o.DataAtom(r.header.length-o.Header.len));if(0!==n.type.set)throw new Error("Unsupported type-set != 0: "+n.type.set);switch(n.type.type){case 0:switch(t){case"trkn":case"disk":const e=i.UINT8.get(n.value,3),r=i.UINT8.get(n.value,5);this.addTag(t,e+"/"+r);break;case"gnre":const a=i.UINT8.get(n.value,1),s=c.Genres[a-1];this.addTag(t,s)}break;case 1:case 18:this.addTag(t,n.value.toString("utf-8"));break;case 13:if(this.options.skipCovers)break;this.addTag(t,{format:"image/jpeg",data:e.from(n.value)});break;case 14:if(this.options.skipCovers)break;this.addTag(t,{format:"image/png",data:e.from(n.value)});break;case 21:this.addTag(t,p.read_BE_Signed_Integer(n.value));break;case 22:this.addTag(t,p.read_BE_Unsigned_Integer(n.value));break;case 65:this.addTag(t,n.value.readInt8(0));break;case 66:this.addTag(t,n.value.readInt16BE(0));break;case 67:this.addTag(t,n.value.readInt32BE(0));break;default:this.addWarning(`atom key=${t}, has unknown well-known-type (data-type): ${n.type.type}`)}}async parseAtom_mvhd(e){const t=await this.tokenizer.readToken(new o.MvhdAtom(e.dataLen));this.parse_mxhd(t)}async parseAtom_mdhd(e){const t=await this.tokenizer.readToken(new o.MdhdAtom(e.dataLen));this.parse_mxhd(t)}parse_mxhd(e){if(e.timeScale&&!this.metadata.format.duration){const t=e.duration/e.timeScale;this.metadata.setFormat("duration",t),this.calculateBitRate()}}async parseAtom_ftyp(e){const t=await this.tokenizer.readToken(o.ftyp);if((e-=o.ftyp.len)>0){const r=await this.parseAtom_ftyp(e),n=t.type.replace(/\W/g,"");return n.length>0&&r.push(n),r}return[]}async parseAtom_stsd(e){const t=await this.tokenizer.readToken(new o.StsdAtom(e)),r=[];for(const e of t.table){const t=d[e.dataFormat];t?(this.parseSoundSampleDescription(e),this.metadata.setFormat("lossless",!t.lossy),r.push(t.format)):u(`Warning: data-format '${e.dataFormat}' missing in MP4Parser.encoderDict`)}r.length>0&&this.formatList.push(r.join("/"))}parseSoundSampleDescription(e){let t=0;const r=o.SoundSampleDescriptionVersion.get(e.description,t);if(t+=o.SoundSampleDescriptionVersion.len,0===r.version||1===r.version){const r=o.SoundSampleDescriptionV0.get(e.description,t);this.metadata.setFormat("sampleRate",r.sampleRate),this.metadata.setFormat("bitsPerSample",r.sampleSize),this.metadata.setFormat("numberOfChannels",r.numAudioChannels)}else u(`Warning: sound-sample-description ${r} not implemented`)}}t.MP4Parser=p}).call(this,r(3).Buffer)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(10),i=r(2),a=r(1),s=r(43),o=i("music-metadata:parser:MP4:Atom");class c{constructor(e,t,r){this.header=e,this.extended=t,this.parent=r,this.children=[],this.atomPath=(this.parent?this.parent.atomPath+"/":"")+this.header.name,this.dataLen=this.header.length-(t?16:8)}async readAtoms(e,t,r){const i=await this.readAtom(e,t);return this.children.push(i),void 0===r?this.readAtoms(e,t,r).catch(e=>{if(e.message!==n.endOfFile)throw e;o("Reached end-of-file")}):(r-=i.header.length)>0?this.readAtoms(e,t,r):void 0}async readAtom(e,t){const r=e.position,n=await e.readToken(s.Header),i=1===n.length;i&&(n.length=await e.readToken(s.ExtendedSize));const a=new c(n,i,this);return o(`parse atom name=${a.atomPath}, extended=${a.extended}, offset=${r}, len=${a.header.length}`),await a.readData(e,t),a}async readData(e,t){switch(this.header.name){case"moov":case"udta":case"trak":case"mdia":case"minf":case"stbl":case"":case"ilst":return this.readAtoms(e,t,this.dataLen);case"meta":return await e.readToken(new a.IgnoreType(4)),this.readAtoms(e,t,this.dataLen-4);case"mdhd":case"mvhd":case"tkhd":case"stsz":case"mdat":default:return t(this)}}}t.Atom=c},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(6),i=r(1),a=r(10),s=r(2),o=r(4),c=r(22),u=r(246),l=s("music-metadata:parser:mpeg"),d=1024,f={AudioObjectTypes:["AAC Main","AAC LC","AAC SSR","AAC LTP"],SamplingFrequencies:[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350,void 0,void 0,-1]},p=[void 0,["front-center"],["front-left","front-right"],["front-center","front-left","front-right"],["front-center","front-left","front-right","back-center"],["front-center","front-left","front-right","back-left","back-right"],["front-center","front-left","front-right","back-left","back-right","LFE-channel"],["front-center","front-left","front-right","side-left","side-right","back-left","back-right","LFE-channel"]];class h{constructor(e,t){this.versionIndex=o.default.getBitAllignedNumber(e,t+1,3,2),this.layer=h.LayerDescription[o.default.getBitAllignedNumber(e,t+1,5,2)],this.versionIndex>1&&0===this.layer?this.parseAdtsHeader(e,t):this.parseMpegHeader(e,t),this.isProtectedByCRC=!o.default.isBitSet(e,t+1,7)}calcDuration(e){return e*this.calcSamplesPerFrame()/this.samplingRate}calcSamplesPerFrame(){return h.samplesInFrameTable[1===this.version?0:1][this.layer]}calculateSideInfoLength(){if(3!==this.layer)return 2;if(3===this.channelModeIndex){if(1===this.version)return 17;if(2===this.version||2.5===this.version)return 9}else{if(1===this.version)return 32;if(2===this.version||2.5===this.version)return 17}}calcSlotSize(){return[null,4,1,1][this.layer]}parseMpegHeader(e,t){this.container="MPEG",this.bitrateIndex=o.default.getBitAllignedNumber(e,t+2,0,4),this.sampRateFreqIndex=o.default.getBitAllignedNumber(e,t+2,4,2),this.padding=o.default.isBitSet(e,t+2,6),this.privateBit=o.default.isBitSet(e,t+2,7),this.channelModeIndex=o.default.getBitAllignedNumber(e,t+3,0,2),this.modeExtension=o.default.getBitAllignedNumber(e,t+3,2,2),this.isCopyrighted=o.default.isBitSet(e,t+3,4),this.isOriginalMedia=o.default.isBitSet(e,t+3,5),this.emphasis=o.default.getBitAllignedNumber(e,t+3,7,2),this.version=h.VersionID[this.versionIndex],this.channelMode=h.ChannelMode[this.channelModeIndex],this.codec="MP"+this.layer;const r=this.calcBitrate();if(!r)throw new Error("Cannot determine bit-rate");if(this.bitrate=1e3*r,this.samplingRate=this.calcSamplingRate(),null==this.samplingRate)throw new Error("Cannot determine sampling-rate")}parseAdtsHeader(e,t){l("layer=0 => ADTS"),this.version=2===this.versionIndex?4:2,this.container="ADTS/MPEG-"+this.version;const r=o.default.getBitAllignedNumber(e,t+2,0,2);this.codec="AAC",this.codecProfile=f.AudioObjectTypes[r],l(`MPEG-4 audio-codec=${this.codec}`);const n=o.default.getBitAllignedNumber(e,t+2,2,4);this.samplingRate=f.SamplingFrequencies[n],l(`sampling-rate=${this.samplingRate}`);const i=o.default.getBitAllignedNumber(e,t+2,7,3);this.mp4ChannelConfig=p[i],l(`channel-config=${this.mp4ChannelConfig.join("+")}`),this.frameLength=o.default.getBitAllignedNumber(e,t+3,6,2)<<11}calcBitrate(){if(0===this.bitrateIndex)return null;if(15===this.bitrateIndex)return null;const e=this.version.toString()+this.layer;return h.bitrate_index[this.bitrateIndex][e]}calcSamplingRate(){return 3===this.sampRateFreqIndex?null:h.sampling_rate_freq_index[this.version][this.sampRateFreqIndex]}}h.SyncByte1=255,h.SyncByte2=224,h.VersionID=[2.5,null,2,1],h.LayerDescription=[0,3,2,1],h.ChannelMode=["stereo","joint_stereo","dual_channel","mono"],h.bitrate_index={1:{11:32,12:32,13:32,21:32,22:8,23:8},2:{11:64,12:48,13:40,21:48,22:16,23:16},3:{11:96,12:56,13:48,21:56,22:24,23:24},4:{11:128,12:64,13:56,21:64,22:32,23:32},5:{11:160,12:80,13:64,21:80,22:40,23:40},6:{11:192,12:96,13:80,21:96,22:48,23:48},7:{11:224,12:112,13:96,21:112,22:56,23:56},8:{11:256,12:128,13:112,21:128,22:64,23:64},9:{11:288,12:160,13:128,21:144,22:80,23:80},10:{11:320,12:192,13:160,21:160,22:96,23:96},11:{11:352,12:224,13:192,21:176,22:112,23:112},12:{11:384,12:256,13:224,21:192,22:128,23:128},13:{11:416,12:320,13:256,21:224,22:144,23:144},14:{11:448,12:384,13:320,21:256,22:160,23:160}},h.sampling_rate_freq_index={1:{0:44100,1:48e3,2:32e3},2:{0:22050,1:24e3,2:16e3},2.5:{0:11025,1:12e3,2:8e3}},h.samplesInFrameTable=[[0,384,1152,1152],[0,384,1152,576]];const m={len:4,get:(e,t)=>new h(e,t)};t.MpegParser=class extends c.AbstractID3Parser{constructor(){super(...arguments),this.frameCount=0,this.syncFrameCount=-1,this.countSkipFrameData=0,this.totalDataLength=0,this.bitrates=[],this.calculateEofDuration=!1,this.buf_frame_header=e.alloc(4),this.syncPeek={buf:e.alloc(d),len:0}}async _parse(){this.metadata.setFormat("lossless",!1);try{let e=!1;for(;!e;)await this.sync(),e=await this.parseCommonMpegHeader()}catch(e){if(e.message!==a.endOfFile)throw e;if(this.calculateEofDuration){const e=this.frameCount*this.samplesPerFrame;this.metadata.setFormat("numberOfSamples",e);const t=e/this.metadata.format.sampleRate;l(`Calculate duration at EOF: ${t} sec.`,t),this.metadata.setFormat("duration",t)}}}finalize(){const e=this.metadata.format,t=this.metadata.native.hasOwnProperty("ID3v1");if(e.duration&&this.tokenizer.fileSize){const r=this.tokenizer.fileSize-this.mpegOffset-(t?128:0);e.codecProfile&&"V"===e.codecProfile[0]&&this.metadata.setFormat("bitrate",8*r/e.duration)}else if(this.tokenizer.fileSize&&"CBR"===e.codecProfile){const r=this.tokenizer.fileSize-this.mpegOffset-(t?128:0),n=Math.round(r/this.frame_size)*this.samplesPerFrame;this.metadata.setFormat("numberOfSamples",n);const i=n/e.sampleRate;l("Calculate CBR duration based on file size: %s",i),this.metadata.setFormat("duration",i)}}async sync(){let e=!1;for(;;){let t=0;if(this.syncPeek.len=await this.tokenizer.peekBuffer(this.syncPeek.buf,0,d,this.tokenizer.position,!0),this.syncPeek.len<=256)throw new Error(a.endOfFile);if(0===this.syncPeek.len)throw new Error(a.endOfFile);for(;;){if(e&&224==(224&this.syncPeek.buf[t]))return this.buf_frame_header[0]=h.SyncByte1,this.buf_frame_header[1]=this.syncPeek.buf[t],await this.tokenizer.ignore(t),l(`Sync at offset=${this.tokenizer.position-1}, frameCount=${this.frameCount}`),this.syncFrameCount===this.frameCount&&(l(`Re-synced MPEG stream, frameCount=${this.frameCount}`),this.frameCount=0,this.frame_size=0),void(this.syncFrameCount=this.frameCount);if(e=!1,-1===(t=this.syncPeek.buf.indexOf(h.SyncByte1,t))){if(this.syncPeek.len=2&&0===e.layer?this.parseAdts(e):this.parseAudioFrameHeader(e)}async parseAudioFrameHeader(e){this.metadata.setFormat("numberOfChannels","mono"===e.channelMode?1:2),this.metadata.setFormat("bitrate",e.bitrate),this.frameCount<2e5&&l("offset=%s MP%s bitrate=%s sample-rate=%s",this.tokenizer.position-4,e.layer,e.bitrate,e.samplingRate);const t=e.calcSlotSize();if(null===t)throw new Error("invalid slot_size");const r=e.calcSamplesPerFrame();l(`samples_per_frame=${r}`);const n=r/8*e.bitrate/e.samplingRate+(e.padding?t:0);if(this.frame_size=Math.floor(n),this.audioFrameHeader=e,this.bitrates.push(e.bitrate),1===this.frameCount)return this.offset=m.len,await this.skipSideInformation(),!1;if(3===this.frameCount){if(this.areAllSame(this.bitrates)){if(this.samplesPerFrame=r,this.metadata.setFormat("codecProfile","CBR"),this.tokenizer.fileSize)return!0}else if(this.metadata.format.duration)return!0;if(!this.options.duration)return!0}return this.options.duration&&4===this.frameCount&&(this.samplesPerFrame=r,this.calculateEofDuration=!0),this.offset=4,e.isProtectedByCRC?(await this.parseCrc(),!1):(await this.skipSideInformation(),!1)}async parseAdts(t){const r=e.alloc(3);await this.tokenizer.readBuffer(r),t.frameLength+=o.default.getBitAllignedNumber(r,0,0,11),this.tokenizer.ignore(t.frameLength-7),this.totalDataLength+=t.frameLength,this.samplesPerFrame=1024;const n=t.samplingRate/this.samplesPerFrame,i=8*(0===this.frameCount?0:this.totalDataLength/this.frameCount)*n+.5;if(this.metadata.setFormat("codecProfile",t.codecProfile),this.metadata.setFormat("bitrate",i),t.mp4ChannelConfig&&this.metadata.setFormat("numberOfChannels",t.mp4ChannelConfig.length),l(`frame-count=${this.frameCount}, size=${t.frameLength} bytes, bit-rate=${i}`),3===this.frameCount){if(!this.options.duration)return!0;this.calculateEofDuration=!0}return!1}async parseCrc(){return this.crc=await this.tokenizer.readNumber(i.INT16_BE),this.offset+=2,this.skipSideInformation()}async skipSideInformation(){const e=this.audioFrameHeader.calculateSideInfoLength();await this.tokenizer.readToken(new i.BufferType(e)),this.offset+=e,await this.readXtraInfoHeader()}async readXtraInfoHeader(){const e=await this.tokenizer.readToken(u.InfoTagHeaderTag);switch(this.offset+=u.InfoTagHeaderTag.len,e){case"Info":return this.metadata.setFormat("codecProfile","CBR"),this.readXingInfoHeader();case"Xing":const t=await this.readXingInfoHeader(),r="V"+(100-t.vbrScale)/10;return this.metadata.setFormat("codecProfile",r),null;case"Xtra":break;case"LAME":const n=await this.tokenizer.readToken(u.LameEncoderVersion);return this.offset+=u.LameEncoderVersion.len,this.metadata.setFormat("tool","LAME "+n),await this.skipFrameData(this.frame_size-this.offset),null}const t=this.frame_size-this.offset;return t<0?this.warnings.push("Frame "+this.frameCount+"corrupt: negative frameDataLeft"):await this.skipFrameData(t),null}async readXingInfoHeader(){const e=await this.tokenizer.readToken(u.XingInfoTag);if(this.offset+=u.XingInfoTag.len,this.metadata.setFormat("tool",o.default.stripNulls(e.codec)),1==(1&e.headerFlags[3])){const t=this.audioFrameHeader.calcDuration(e.numFrames);return this.metadata.setFormat("duration",t),l("Get duration from Xing header: %s",this.metadata.format.duration),e}const t=this.frame_size-this.offset;return await this.skipFrameData(t),e}async skipFrameData(e){n.ok(e>=0,"frame-data-left cannot be negative"),await this.tokenizer.readToken(new i.IgnoreType(e)),this.countSkipFrameData+=e}areAllSame(e){const t=e[0];return e.every(e=>e===t)}}}).call(this,r(3).Buffer)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1);t.InfoTagHeaderTag=new n.StringType(4,"ascii"),t.LameEncoderVersion=new n.StringType(6,"ascii"),t.XingInfoTag={len:136,get:(e,t)=>({headerFlags:new n.BufferType(4).get(e,t),numFrames:n.UINT32_BE.get(e,t+4),streamSize:n.UINT32_BE.get(e,t+8),vbrScale:n.UINT32_BE.get(e,t+112),codec:new n.StringType(9,"ascii").get(e,t+116),infoTagRevision:n.UINT8.get(e,t+125)>>4,vbrMethod:15&n.UINT8.get(e,t+125)})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(1),a=r(248),s=r(250),o=r(22),c=n("music-metadata:parser:musepack");t.default=class extends o.AbstractID3Parser{async _parse(){let e;switch(await this.tokenizer.peekToken(new i.StringType(3,"binary"))){case"MP+":c("Musepack stream-version 7"),e=new s.MpcSv7Parser;break;case"MPC":c("Musepack stream-version 8"),e=new a.MpcSv8Parser;break;default:throw new Error("Invalid Musepack signature prefix")}return e.init(this.metadata,this.tokenizer,this.options),e.parse()}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(6),a=r(7),s=r(249),o=r(21),c=r(5),u=n("music-metadata:parser:musepack");t.MpcSv8Parser=class extends a.BasicParser{constructor(){super(...arguments),this.audioLength=0}async parse(){const e=await this.tokenizer.readToken(c.FourCcToken);return i.equal(e,"MPCK","Magic number"),this.metadata.setFormat("container","Musepack, SV8"),this.parsePacket()}async parsePacket(){const e=new s.StreamReader(this.tokenizer);for(;;){const t=await e.readPacketHeader();switch(u(`packet-header key=${t.key}, payloadLength=${t.payloadLength}`),t.key){case"SH":const r=await e.readStreamHeader(t.payloadLength);this.metadata.setFormat("numberOfSamples",r.sampleCount),this.metadata.setFormat("sampleRate",r.sampleFrequency),this.metadata.setFormat("duration",r.sampleCount/r.sampleFrequency),this.metadata.setFormat("numberOfChannels",r.channelCount);break;case"AP":this.audioLength+=t.payloadLength,await this.tokenizer.ignore(t.payloadLength);break;case"RG":case"EI":case"SO":case"ST":case"CT":await this.tokenizer.ignore(t.payloadLength);break;case"SE":return this.metadata.setFormat("bitrate",8*this.audioLength/this.metadata.format.duration),o.APEv2Parser.parseTagHeader(this.metadata,this.tokenizer,this.options);default:throw new Error(`Unexpected header: ${t.key}`)}}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(4),a=r(2)("music-metadata:parser:musepack:sv8"),s=new n.StringType(2,"binary"),o={len:5,get:(e,t)=>({crc:n.UINT32_LE.get(e,t),streamVersion:n.UINT8.get(e,t+4)})},c={len:2,get:(e,t)=>({sampleFrequency:[44100,48e3,37800,32e3][i.default.getBitAllignedNumber(e,t,0,3)],maxUsedBands:i.default.getBitAllignedNumber(e,t,3,5),channelCount:i.default.getBitAllignedNumber(e,t+1,0,4)+1,msUsed:i.default.isBitSet(e,t+1,4),audioBlockFrames:i.default.getBitAllignedNumber(e,t+1,5,3)})};t.StreamReader=class{constructor(e){this.tokenizer=e}async readPacketHeader(){const e=await this.tokenizer.readToken(s),t=await this.readVariableSizeField();return{key:e,payloadLength:t.value-2-t.len}}async readStreamHeader(e){const t={};a(`Reading SH at offset=${this.tokenizer.position}`);const r=await this.tokenizer.readToken(o);e-=o.len,Object.assign(t,r),a(`SH.streamVersion = ${r.streamVersion}`);const n=await this.readVariableSizeField();e-=n.len,t.sampleCount=n.value;const i=await this.readVariableSizeField();e-=i.len,t.beginningOfSilence=i.value;const s=await this.tokenizer.readToken(c);return e-=c.len,Object.assign(t,s),await this.tokenizer.ignore(e),t}async readVariableSizeField(e=1,t=0){let r=await this.tokenizer.readToken(n.UINT8);return 0==(128&r)?{len:e,value:t+r}:(r&=127,r+=t,this.readVariableSizeField(e+1,r<<7))}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(6),a=r(7),s=r(251),o=r(21),c=r(252),u=n("music-metadata:parser:musepack");t.MpcSv7Parser=class extends a.BasicParser{constructor(){super(...arguments),this.audioLength=0}async parse(){const e=await this.tokenizer.readToken(s.Header);i.equal(e.signature,"MP+","Magic number"),u(`stream-version=${e.streamMajorVersion}.${e.streamMinorVersion}`),this.metadata.setFormat("container","Musepack, SV7"),this.metadata.setFormat("sampleRate",e.sampleFrequency);const t=1152*(e.frameCount-1)+e.lastFrameLength;this.metadata.setFormat("numberOfSamples",t),this.duration=t/e.sampleFrequency,this.metadata.setFormat("duration",this.duration),this.bitreader=new c.BitReader(this.tokenizer),this.metadata.setFormat("numberOfChannels",e.midSideStereo||e.intensityStereo?2:1);const r=await this.bitreader.read(8);return this.metadata.setFormat("codec",(r/100).toFixed(2)),await this.skipAudioData(e.frameCount),u(`End of audio stream, switching to APEv2, offset=${this.tokenizer.position}`),o.APEv2Parser.parseTagHeader(this.metadata,this.tokenizer,this.options)}async skipAudioData(e){for(;e-- >0;){const e=await this.bitreader.read(20);this.audioLength+=20+e,await this.bitreader.ignore(e)}const t=await this.bitreader.read(11);this.audioLength+=t,this.metadata.setFormat("bitrate",this.audioLength/this.duration)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(4);t.Header={len:24,get:(e,t)=>{const r={signature:e.toString("binary",t,t+3),streamMinorVersion:i.default.getBitAllignedNumber(e,t+3,0,4),streamMajorVersion:i.default.getBitAllignedNumber(e,t+3,4,4),frameCount:n.UINT32_LE.get(e,t+4),maxLevel:n.UINT16_LE.get(e,t+8),sampleFrequency:[44100,48e3,37800,32e3][i.default.getBitAllignedNumber(e,t+10,0,2)],link:i.default.getBitAllignedNumber(e,t+10,2,2),profile:i.default.getBitAllignedNumber(e,t+10,4,4),maxBand:i.default.getBitAllignedNumber(e,t+11,0,6),intensityStereo:i.default.isBitSet(e,t+11,6),midSideStereo:i.default.isBitSet(e,t+11,7),titlePeak:n.UINT16_LE.get(e,t+12),titleGain:n.UINT16_LE.get(e,t+14),albumPeak:n.UINT16_LE.get(e,t+16),albumGain:n.UINT16_LE.get(e,t+18),lastFrameLength:n.UINT32_LE.get(e,t+20)>>>20&2047,trueGapless:i.default.isBitSet(e,t+23,0)};return r.lastFrameLength=r.trueGapless?n.UINT32_LE.get(e,20)>>>20&2047:0,r}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1);t.BitReader=class{constructor(e){this.tokenizer=e,this.pos=0,this.dword=void 0}async read(e){for(;void 0===this.dword;)this.dword=await this.tokenizer.readToken(n.UINT32_LE);let t=this.dword;return this.pos+=e,this.pos<32?(t>>>=32-this.pos)&(1<>>32-this.pos),t&(1<0){const t=32-this.pos;this.dword=void 0,e-=t,this.pos=0}const t=e%32,r=(e-t)/32;return await this.tokenizer.ignore(4*r),this.read(t)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(2),a=r(6),s=r(4),o=r(5),c=r(30),u=r(254),l=r(256),d=r(7),f=r(258),p=i("music-metadata:parser:ogg");class h{static sum(e,t,r){let n=0;for(let i=t;i0)return this.warnings.push("Invalid FourCC ID, maybe last OGG-page is not marked with last-page flag"),this.pageConsumer.flush();throw e}}}m.Header={len:27,get:(e,t)=>({capturePattern:o.FourCcToken.get(e,t),version:e.readUInt8(t+4),headerType:{continued:s.default.strtokBITSET.get(e,t+5,0),firstPage:s.default.strtokBITSET.get(e,t+5,1),lastPage:s.default.strtokBITSET.get(e,t+5,2)},absoluteGranulePosition:e.readIntLE(t+6,6),streamSerialNumber:n.UINT32_LE.get(e,t+14),pageSequenceNo:n.UINT32_LE.get(e,t+18),pageChecksum:n.UINT32_LE.get(e,t+22),page_segments:e.readUInt8(t+26)})},t.OggParser=m},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(255),a=r(30);t.OpusParser=class extends a.VorbisParser{constructor(e,t,r){super(e,t),this.tokenizer=r,this.lastPos=-1}parseFirstPage(e,t){if(this.metadata.setFormat("codec","Opus"),this.idHeader=new i.IdHeader(t.length).get(t,0),"OpusHead"!==this.idHeader.magicSignature)throw new Error("Illegal ogg/Opus magic-signature");this.metadata.setFormat("sampleRate",this.idHeader.inputSampleRate),this.metadata.setFormat("numberOfChannels",this.idHeader.channelCount)}parseFullPage(e){switch(new n.StringType(8,"ascii").get(e,0)){case"OpusTags":this.parseUserCommentList(e,8),this.lastPos=this.tokenizer.position}}calculateDuration(e){if(this.metadata.format.sampleRate&&e.absoluteGranulePosition>=0&&(this.metadata.setFormat("numberOfSamples",e.absoluteGranulePosition-this.idHeader.preSkip),this.metadata.setFormat("duration",this.metadata.format.numberOfSamples/this.idHeader.inputSampleRate),-1!==this.lastPos&&this.tokenizer.fileSize&&this.metadata.format.duration)){const e=this.tokenizer.fileSize-this.lastPos;this.metadata.setFormat("bitrate",8*e/this.metadata.format.duration)}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1);t.IdHeader=class{constructor(e){if(this.len=e,e<19)throw new Error("ID-header-page 0 should be at least 19 bytes long")}get(e,t){return{magicSignature:new n.StringType(8,"ascii").get(e,t+0),version:e.readUInt8(t+8),channelCount:e.readUInt8(t+9),preSkip:e.readInt16LE(t+10),inputSampleRate:e.readInt32LE(t+12),outputGain:e.readInt16LE(t+16),channelMapping:e.readUInt8(t+18)}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(257),a=r(30),s=n("music-metadata:parser:ogg:speex");t.SpeexParser=class extends a.VorbisParser{constructor(e,t,r){super(e,t),this.tokenizer=r}parseFirstPage(e,t){s("First Ogg/Speex page");const r=i.Header.get(t,0);this.metadata.setFormat("codec",`Speex ${r.version}`),this.metadata.setFormat("numberOfChannels",r.nb_channels),this.metadata.setFormat("sampleRate",r.rate),-1!==r.bitrate&&this.metadata.setFormat("bitrate",r.bitrate)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(4);t.Header={len:80,get:(e,t)=>({speex:new n.StringType(8,"ascii").get(e,t+0),version:i.default.trimRightNull(new n.StringType(20,"ascii").get(e,t+8)),version_id:e.readInt32LE(t+28),header_size:e.readInt32LE(t+32),rate:e.readInt32LE(t+36),mode:e.readInt32LE(t+40),mode_bitstream_version:e.readInt32LE(t+44),nb_channels:e.readInt32LE(t+48),bitrate:e.readInt32LE(t+52),frame_size:e.readInt32LE(t+56),vbr:e.readInt32LE(t+60),frames_per_packet:e.readInt32LE(t+64),extra_headers:e.readInt32LE(t+68),reserved1:e.readInt32LE(t+72),reserved2:e.readInt32LE(t+76)})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(2),i=r(259),a=n("music-metadata:parser:ogg:theora");t.TheoraParser=class{constructor(e,t,r){this.metadata=e,this.tokenizer=r}parsePage(e,t){e.headerType.firstPage&&this.parseFirstPage(e,t)}flush(){a("flush")}parseFirstPage(e,t){a("First Ogg/Theora page"),this.metadata.setFormat("codec","Theora");const r=i.IdentificationHeader.get(t,0);this.metadata.setFormat("bitrate",r.nombr)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1);t.IdentificationHeader={len:42,get:(e,t)=>({id:new n.StringType(7,"ascii").get(e,t),vmaj:e.readUInt8(t+7),vmin:e.readUInt8(t+8),vrev:e.readUInt8(t+9),vmbw:e.readUInt16BE(t+10),vmbh:e.readUInt16BE(t+17),nombr:n.UINT24_BE.get(e,t+37),nqual:e.readUInt8(t+40)})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(10),i=r(19),a=r(1),s=r(2),o=r(261),c=r(262),u=r(16),l=r(4),d=r(5),f=r(7),p=r(25),h=s("music-metadata:parser:RIFF");t.WaveParser=class extends f.BasicParser{async parse(){const e=await this.tokenizer.readToken(o.Header);if(h(`pos=${this.tokenizer.position}, parse: chunkID=${e.chunkID}`),"RIFF"===e.chunkID)return this.parseRiffChunk().catch(e=>{if(e.message!==n.endOfFile)throw e})}async parseRiffChunk(){const e=await this.tokenizer.readToken(d.FourCcToken);switch(this.metadata.setFormat("container",e),e){case"WAVE":return this.readWaveChunk();default:throw new Error(`Unsupported RIFF format: RIFF/${e}`)}}async readWaveChunk(){for(;;){const e=await this.tokenizer.readToken(o.Header);switch(this.header=e,h(`pos=${this.tokenizer.position}, readChunk: chunkID=RIFF/WAVE/${e.chunkID}`),e.chunkID){case"LIST":await this.parseListTag(e);break;case"fact":this.metadata.setFormat("lossless",!1),this.fact=await this.tokenizer.readToken(new c.FactChunk(e));break;case"fmt ":const t=await this.tokenizer.readToken(new c.Format(e));let r=c.WaveFormat[t.wFormatTag];r||(h("WAVE/non-PCM format="+t.wFormatTag),r="non-PCM ("+t.wFormatTag+")"),this.metadata.setFormat("codec",r),this.metadata.setFormat("bitsPerSample",t.wBitsPerSample),this.metadata.setFormat("sampleRate",t.nSamplesPerSec),this.metadata.setFormat("numberOfChannels",t.nChannels),this.metadata.setFormat("bitrate",t.nBlockAlign*t.nSamplesPerSec*8),this.blockAlign=t.nBlockAlign;break;case"id3 ":case"ID3 ":const n=await this.tokenizer.readToken(new a.BufferType(e.chunkSize)),s=new p.ID3Stream(n),o=i.fromStream(s);await(new u.ID3v2Parser).parse(this.metadata,o,this.options);break;case"data":!1!==this.metadata.format.lossless&&this.metadata.setFormat("lossless",!0);const l=this.fact?this.fact.dwSampleLength:e.chunkSize/this.blockAlign;this.metadata.setFormat("numberOfSamples",l),this.metadata.setFormat("duration",l/this.metadata.format.sampleRate),this.metadata.setFormat("bitrate",this.metadata.format.numberOfChannels*this.blockAlign*this.metadata.format.sampleRate),await this.tokenizer.ignore(e.chunkSize);break;default:h(`Ignore chunk: RIFF/${e.chunkID} of ${e.chunkSize} bytes`),this.warnings.push("Ignore chunk: RIFF/"+e.chunkID),await this.tokenizer.ignore(e.chunkSize)}this.header.chunkSize%2==1&&(h("Read odd padding byte"),await this.tokenizer.ignore(1))}}async parseListTag(e){const t=await this.tokenizer.readToken(d.FourCcToken);switch(h("pos=%s, parseListTag: chunkID=RIFF/WAVE/LIST/%s",this.tokenizer.position,t),t){case"INFO":return this.parseRiffInfoTags(e.chunkSize-4);case"adtl":default:return this.warnings.push("Ignore chunk: RIFF/WAVE/LIST/"+t),h("Ignoring chunkID=RIFF/WAVE/LIST/"+t),this.tokenizer.ignore(e.chunkSize-4)}}async parseRiffInfoTags(e){for(;e>=8;){const t=await this.tokenizer.readToken(o.Header),r=new o.ListInfoTagValue(t),n=await this.tokenizer.readToken(r);this.addTag(t.chunkID,l.default.stripNulls(n)),e-=8+r.len}if(0!==e)throw Error("Illegal remaining size: "+e)}addTag(e,t){this.metadata.addTag("exif",e,t)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(5);t.Header={len:8,get:(e,t)=>({chunkID:i.FourCcToken.get(e,t),chunkSize:e.readUInt32LE(t+4)})};t.ListInfoTagValue=class{constructor(e){this.tagHeader=e,this.len=e.chunkSize,this.len+=1&this.len}get(e,t){return new n.StringType(this.tagHeader.chunkSize,"ascii").get(e,t)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(6);!function(e){e[e.PCM=1]="PCM",e[e.ADPCM=2]="ADPCM",e[e.IEEE_FLOAT=3]="IEEE_FLOAT",e[e.MPEG_ADTS_AAC=5632]="MPEG_ADTS_AAC",e[e.MPEG_LOAS=5634]="MPEG_LOAS",e[e.RAW_AAC1=255]="RAW_AAC1",e[e.DOLBY_AC3_SPDIF=146]="DOLBY_AC3_SPDIF",e[e.DVM=8192]="DVM",e[e.RAW_SPORT=576]="RAW_SPORT",e[e.ESST_AC3=577]="ESST_AC3",e[e.DRM=9]="DRM",e[e.DTS2=8193]="DTS2",e[e.MPEG=80]="MPEG"}(t.WaveFormat||(t.WaveFormat={}));t.Format=class{constructor(e){n.ok(e.chunkSize>=16,"16 for PCM."),this.len=e.chunkSize}get(e,t){return{wFormatTag:e.readUInt16LE(t),nChannels:e.readUInt16LE(t+2),nSamplesPerSec:e.readUInt32LE(t+4),nAvgBytesPerSec:e.readUInt32LE(t+8),nBlockAlign:e.readUInt16LE(t+12),wBitsPerSample:e.readUInt16LE(t+14)}}};t.FactChunk=class{constructor(e){n.ok(e.chunkSize>=4,"minimum fact chunk size."),this.len=e.chunkSize}get(e,t){return{dwSampleLength:e.readUInt32LE(t)}}}},function(e,t,r){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(6),a=r(21),s=r(5),o=r(7),c=r(264),u=r(2)("music-metadata:parser:WavPack");t.WavPackParser=class extends o.BasicParser{async parse(){return this.audioDataSize=0,await this.parseWavPackBlocks(),a.APEv2Parser.parseTagHeader(this.metadata,this.tokenizer,this.options)}async parseWavPackBlocks(){do{if("wvpk"!==await this.tokenizer.peekToken(s.FourCcToken))break;const e=await this.tokenizer.readToken(c.WavPack.BlockHeaderToken);i.strictEqual(e.BlockID,"wvpk","WavPack Block-ID"),u(`WavPack header blockIndex=${e.blockIndex}, len=${c.WavPack.BlockHeaderToken.len}`),0!==e.blockIndex||this.metadata.format.container||(this.metadata.setFormat("container","WavPack"),this.metadata.setFormat("lossless",!e.flags.isHybrid),this.metadata.setFormat("bitsPerSample",e.flags.bitsPerSample),e.flags.isDSD||(this.metadata.setFormat("sampleRate",e.flags.samplingRate),this.metadata.setFormat("duration",e.totalSamples/e.flags.samplingRate)),this.metadata.setFormat("numberOfChannels",e.flags.isMono?1:2),this.metadata.setFormat("numberOfSamples",e.totalSamples),this.metadata.setFormat("codec",e.flags.isDSD?"DSD":"PCM"));const t=e.blockSize-(c.WavPack.BlockHeaderToken.len-8);0===e.blockIndex?await this.parseMetadataSubBlock(e,t):await this.tokenizer.ignore(t),e.blockSamples>0&&(this.audioDataSize+=e.blockSize)}while(!this.tokenizer.fileSize||this.tokenizer.fileSize-this.tokenizer.position>=c.WavPack.BlockHeaderToken.len);this.metadata.setFormat("bitrate",8*this.audioDataSize/this.metadata.format.duration)}async parseMetadataSubBlock(t,r){for(;r>c.WavPack.MetadataIdToken.len;){const a=await this.tokenizer.readToken(c.WavPack.MetadataIdToken),s=await this.tokenizer.readNumber(a.largeBlock?n.UINT24_LE:n.UINT8),o=e.alloc(2*s-(a.isOddSize?1:0));switch(await this.tokenizer.readBuffer(o,0,o.length),u(`Metadata Sub-Blocks functionId=0x${a.functionId.toString(16)}, id.largeBlock=${a.largeBlock},data-size=${o.length}`),a.functionId){case 0:break;case 14:u("ID_DSD_BLOCK");const e=1<>>t&4294967295>>>32-r}}s.BlockHeaderToken={len:32,get:(e,t)=>{const r=n.UINT32_LE.get(e,t+24),o={BlockID:i.FourCcToken.get(e,t),blockSize:n.UINT32_LE.get(e,t+4),version:n.UINT16_LE.get(e,t+8),totalSamples:(n.UINT8.get(e,t+11)<<32)+n.UINT32_LE.get(e,t+12),blockIndex:(n.UINT8.get(e,t+10)<<32)+n.UINT32_LE.get(e,t+16),blockSamples:n.UINT32_LE.get(e,t+20),flags:{bitsPerSample:8*(1+s.getBitAllignedNumber(r,0,2)),isMono:s.isBitSet(r,2),isHybrid:s.isBitSet(r,3),isJointStereo:s.isBitSet(r,4),crossChannel:s.isBitSet(r,5),hybridNoiseShaping:s.isBitSet(r,6),floatingPoint:s.isBitSet(r,7),samplingRate:a[s.getBitAllignedNumber(r,23,4)],isDSD:s.isBitSet(r,31)},crc:new n.BufferType(4).get(e,t+28)};return o.flags.isDSD&&(o.totalSamples*=8),o}},s.MetadataIdToken={len:1,get:(e,t)=>({functionId:s.getBitAllignedNumber(e[t],0,6),isOptional:s.isBitSet(e[t],5),isOddSize:s.isBitSet(e[t],6),largeBlock:s.isBitSet(e[t],7)})},t.WavPack=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(22),i=r(6),a=r(2),s=r(266),o=r(16),c=a("music-metadata:parser:DSF");t.DsfParser=class extends n.AbstractID3Parser{async _parse(){const e=this.tokenizer.position,t=await this.tokenizer.readToken(s.ChunkHeader);i.strictEqual(t.id,"DSD ","Invalid chunk signature"),this.metadata.setFormat("container","DSF"),this.metadata.setFormat("lossless",!0);const r=await this.tokenizer.readToken(s.DsdChunk);if(0!==r.metadataPointer)return c(`expect ID3v2 at offset=${r.metadataPointer}`),await this.parseChunks(r.fileSize-t.size),await this.tokenizer.ignore(r.metadataPointer-this.tokenizer.position-e),(new o.ID3v2Parser).parse(this.metadata,this.tokenizer,this.options);c("No ID3v2 tag present")}async parseChunks(e){for(;e>=s.ChunkHeader.len;){const t=await this.tokenizer.readToken(s.ChunkHeader);switch(c(`Parsing chunk name=${t.id} size=${t.size}`),t.id){case"fmt ":const e=await this.tokenizer.readToken(s.FormatChunk);this.metadata.setFormat("numberOfChannels",e.channelNum),this.metadata.setFormat("sampleRate",e.samplingFrequency),this.metadata.setFormat("bitsPerSample",e.bitsPerSample),this.metadata.setFormat("numberOfSamples",e.sampleCount),this.metadata.setFormat("duration",e.sampleCount/e.samplingFrequency);const r=e.bitsPerSample*e.samplingFrequency*e.channelNum;return void this.metadata.setFormat("bitrate",r);default:this.tokenizer.ignore(t.size-s.ChunkHeader.len)}e-=t.size}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(5);t.ChunkHeader={len:12,get:(e,t)=>({id:i.FourCcToken.get(e,t),size:n.UINT64_LE.get(e,t+4)})},t.DsdChunk={len:16,get:(e,t)=>({fileSize:n.INT64_LE.get(e,t),metadataPointer:n.INT64_LE.get(e,t+8)})},function(e){e[e.mono=1]="mono",e[e.stereo=2]="stereo",e[e.channels=3]="channels",e[e.quad=4]="quad",e[e["4 channels"]=5]="4 channels",e[e["5 channels"]=6]="5 channels",e[e["5.1 channels"]=7]="5.1 channels"}(t.ChannelType||(t.ChannelType={})),t.FormatChunk={len:40,get:(e,t)=>({formatVersion:n.INT32_LE.get(e,t),formatID:n.INT32_LE.get(e,t+4),channelType:n.INT32_LE.get(e,t+8),channelNum:n.INT32_LE.get(e,t+12),samplingFrequency:n.INT32_LE.get(e,t+16),bitsPerSample:n.INT32_LE.get(e,t+20),sampleCount:n.INT64_LE.get(e,t+24),blockSizePerChannel:n.INT32_LE.get(e,t+32)})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(6),i=r(1),a=r(2),s=r(5),o=r(7),c=r(25),u=r(268),l=r(19),d=r(16),f=a("music-metadata:parser:aiff");t.DsdiffParser=class extends o.BasicParser{async parse(){const e=await this.tokenizer.readToken(u.ChunkHeader);n.strictEqual(e.chunkID,"FRM8");const t=(await this.tokenizer.readToken(s.FourCcToken)).trim();switch(t){case"DSD":return this.metadata.setFormat("container",`DSDIFF/${t}`),this.metadata.setFormat("lossless",!0),this.readFmt8Chunks(e.chunkSize-s.FourCcToken.len);default:throw Error(`Unsupported DSDIFF type: ${t}`)}}async readFmt8Chunks(e){for(;e>=u.ChunkHeader.len;){const t=await this.tokenizer.readToken(u.ChunkHeader);f(`Chunk id=${t.chunkID}`),await this.readData(t),e-=u.ChunkHeader.len+t.chunkSize}}async readData(e){f(`Reading data of chunk[ID=${e.chunkID}, size=${e.chunkSize}]`);const t=this.tokenizer.position;switch(e.chunkID.trim()){case"FVER":const t=await this.tokenizer.readToken(i.UINT32_LE);f(`DSDIFF version=${t}`);break;case"PROP":const r=await this.tokenizer.readToken(s.FourCcToken);n.strictEqual(r,"SND "),await this.handleSoundPropertyChunks(e.chunkSize-s.FourCcToken.len);break;case"ID3":const a=await this.tokenizer.readToken(new i.BufferType(e.chunkSize)),o=new c.ID3Stream(a),u=l.fromStream(o);await(new d.ID3v2Parser).parse(this.metadata,u,this.options);break;default:f(`Ignore chunk[ID=${e.chunkID}, size=${e.chunkSize}]`);break;case"DSD":this.metadata.setFormat("numberOfSamples",8*e.chunkSize/this.metadata.format.numberOfChannels),this.metadata.setFormat("duration",this.metadata.format.numberOfSamples/this.metadata.format.sampleRate)}const r=e.chunkSize-(this.tokenizer.position-t);r>0&&(f(`After Parsing chunk, remaining ${r} bytes`),await this.tokenizer.ignore(r))}async handleSoundPropertyChunks(e){for(f(`Parsing sound-property-chunks, remainingSize=${e}`);e>0;){const t=await this.tokenizer.readToken(u.ChunkHeader);f(`Sound-property-chunk[ID=${t.chunkID}, size=${t.chunkSize}]`);const r=this.tokenizer.position;switch(t.chunkID.trim()){case"FS":const e=await this.tokenizer.readToken(i.UINT32_BE);this.metadata.setFormat("sampleRate",e);break;case"CHNL":const r=await this.tokenizer.readToken(i.UINT16_BE);this.metadata.setFormat("numberOfChannels",r),await this.handleChannelChunks(t.chunkSize-i.UINT16_BE.len);break;case"CMPR":const n=(await this.tokenizer.readToken(s.FourCcToken)).trim(),a=await this.tokenizer.readToken(i.UINT8),o=await this.tokenizer.readToken(new i.StringType(a,"ascii"));"DSD"===n&&(this.metadata.setFormat("lossless",!0),this.metadata.setFormat("bitsPerSample",1)),this.metadata.setFormat("codec",`${n} (${o})`);break;case"ABSS":const c=await this.tokenizer.readToken(i.UINT16_BE),u=await this.tokenizer.readToken(i.UINT8),l=await this.tokenizer.readToken(i.UINT8),d=await this.tokenizer.readToken(i.UINT32_BE);f(`ABSS ${c}:${u}:${l}.${d}`);break;case"LSCO":const p=await this.tokenizer.readToken(i.UINT16_BE);f(`LSCO lsConfig=${p}`);break;case"COMT":default:f(`Unknown sound-property-chunk[ID=${t.chunkID}, size=${t.chunkSize}]`),await this.tokenizer.ignore(t.chunkSize)}const n=t.chunkSize-(this.tokenizer.position-r);n>0&&(f(`After Parsing sound-property-chunk ${t.chunkSize}, remaining ${n} bytes`),await this.tokenizer.ignore(n)),e-=u.ChunkHeader.len+t.chunkSize,f(`Parsing sound-property-chunks, remainingSize=${e}`)}if(this.metadata.format.lossless&&this.metadata.format.sampleRate&&this.metadata.format.numberOfChannels&&this.metadata.format.bitsPerSample){const e=this.metadata.format.sampleRate*this.metadata.format.numberOfChannels*this.metadata.format.bitsPerSample;this.metadata.setFormat("bitrate",e)}}async handleChannelChunks(e){f(`Parsing channel-chunks, remainingSize=${e}`);const t=[];for(;e>=s.FourCcToken.len;){const r=await this.tokenizer.readToken(s.FourCcToken);f(`Channel[ID=${r}]`),t.push(r),e-=s.FourCcToken.len}return f(`Channels: ${t.join(", ")}`),t}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(1),i=r(5);t.ChunkHeader={len:12,get:(e,t)=>({chunkID:i.FourCcToken.get(e,t),chunkSize:n.INT64_BE.get(e,t+4)})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(35);t.ReadableWeToNodeStream=class extends n.Readable{constructor(e){super(),this.bytesRead=0,this.released=!1,this.reader=e.getReader()}async _read(){if(this.released)return void this.push(null);this.pendingRead=this.reader.read();const e=await this.pendingRead;delete this.pendingRead,e.done||this.released?this.push(null):(this.bytesRead+=e.value.length,this.push(e.value))}async waitForReadToComplete(){this.pendingRead&&await this.pendingRead}async close(){await this.syncAndRelease()}async syncAndRelease(){this.released=!0,await this.waitForReadToComplete(),await this.reader.releaseLock()}}},function(e,t,r){(function(t){var n=r(271).strict;e.exports=function(e){if(n(e)){var r=t.from(e.buffer);return e.byteLength!==e.buffer.byteLength&&(r=r.slice(e.byteOffset,e.byteOffset+e.byteLength)),r}return t.from(e)}}).call(this,r(3).Buffer)},function(e,t){e.exports=i,i.strict=a,i.loose=s;var r=Object.prototype.toString,n={"[object Int8Array]":!0,"[object Int16Array]":!0,"[object Int32Array]":!0,"[object Uint8Array]":!0,"[object Uint8ClampedArray]":!0,"[object Uint16Array]":!0,"[object Uint32Array]":!0,"[object Float32Array]":!0,"[object Float64Array]":!0};function i(e){return a(e)||s(e)}function a(e){return e instanceof Int8Array||e instanceof Int16Array||e instanceof Int32Array||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Uint16Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array}function s(e){return n[r.call(e)]}}]); \ No newline at end of file diff --git a/public/js/ilab-media-grid.js b/public/js/ilab-media-grid.js index 241da540..1b530b37 100755 --- a/public/js/ilab-media-grid.js +++ b/public/js/ilab-media-grid.js @@ -1 +1 @@ -!function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=483)}({483:function(e,t,n){e.exports=n(484)},484:function(e,t){function n(e,t,n){return t>=e.left&&t<=e.right&&n>=e.top&&n<=e.bottom}!function(e){var t=function(){e(".info-panel-tabs").each(function(){var t=e(this),n=null,i=null;t.find("li").each(function(){var t=e(this),o=e("#"+t.data("tab-target"));t.hasClass("active")&&(n=t,i=o),t.on("click",function(e){n!=t&&(n.removeClass("active"),i.css({display:"none"}),t.addClass("active"),o.css({display:""}),n=t,i=o)})})});var t=null;e(".info-file-info-size").each(function(){t||(t=e(this))}),e("#ilab-other-sizes").on("change",function(n){var i=e("#info-size-"+e(this).val());i!=t&&(t.css({display:"none"}),i.css({display:""}),t=i)}),e(".ilab-info-regenerate-thumbnails").on("click",function(t){var n=e(this);return!(n.data("imgix-enabled")&&!confirm("You are currently using Imgix, which makes this function rather unnecessary. Are you sure you want to continue?"))&&(e(document).trigger("ilab-regeneration-started"),t.preventDefault(),n.css({display:"none"}),e("#ilab-info-regenerate-status").css({display:""}),e.post(ajaxurl,{action:"ilab_regenerate_thumbnails_manual",post_id:n.data("post-id")},function(t){n.css({display:""}),e("#ilab-info-regenerate-status").css({display:"none"}),"success"!=t.status&&alert("There was a problem trying to regenerate the thumbnails. Please try again."),e(document).trigger("ilab-regeneration-ended")}),!1)})};t();var i=!0,o=!0,a=e('
    '),s=e(''),r=e('
    '),l=e('
    '),d=e('
    '),u=null,c=!1,p=0,f=function(){if(i){var n=e(this),o=n.data("post-id");n.data("mime-type").startsWith("image")?s.removeClass("ilab-popup-document"):s.addClass("ilab-popup-document"),c=!1,e("li.attachment").each(function(){var t=e(this);t.data("id")==o?(t.removeClass("info-unfocused"),t.addClass("info-focused")):(t.removeClass("info-focused"),t.addClass("info-unfocused"))}),r.text(""),r.append(a);var p=this.getBoundingClientRect(),f=document.body.scrollTop+(p.top+p.height/2-s.height()/2);f-=28;var m=Math.max(document.documentElement.clientHeight,window.innerHeight||0),h=Math.max(document.documentElement.clientWidth,window.innerWidth||0),g=document.body.scrollTop+m-40,v=0;f+s.height()>g?(v=f+s.height()-g,f=g-s.height()):f=e.left&&t<=e.right&&n>=e.top&&n<=e.bottom}!function(e){var t=function(){e(".info-panel-tabs").each(function(){var t=e(this),n=null,i=null;t.find("li").each(function(){var t=e(this),o=e("#"+t.data("tab-target"));t.hasClass("active")&&(n=t,i=o),t.on("click",function(e){n!=t&&(n.removeClass("active"),i.css({display:"none"}),t.addClass("active"),o.css({display:""}),n=t,i=o)})})});var t=null;e(".info-file-info-size").each(function(){t||(t=e(this))}),e("#ilab-other-sizes").on("change",function(n){var i=e("#info-size-"+e(this).val());i!=t&&(t.css({display:"none"}),i.css({display:""}),t=i)}),e(".ilab-info-regenerate-thumbnails").on("click",function(t){var n=e(this);return!(n.data("imgix-enabled")&&!confirm("You are currently using Imgix, which makes this function rather unnecessary. Are you sure you want to continue?"))&&(e(document).trigger("ilab-regeneration-started"),t.preventDefault(),n.css({display:"none"}),e("#ilab-info-regenerate-status").css({display:""}),e.post(ajaxurl,{action:"ilab_regenerate_thumbnails_manual",post_id:n.data("post-id")},function(t){n.css({display:""}),e("#ilab-info-regenerate-status").css({display:"none"}),"success"!=t.status&&alert("There was a problem trying to regenerate the thumbnails. Please try again."),e(document).trigger("ilab-regeneration-ended")}),!1)})};t();var i=!0,o=!0,a=e('
    '),s=e(''),r=e('
    '),l=e('
    '),u=e('
    '),d=null,c=!1,p=0,f=function(){if(i){var n=e(this),o=n.data("post-id");n.data("mime-type").startsWith("image")?s.removeClass("ilab-popup-document"):s.addClass("ilab-popup-document"),c=!1,e("li.attachment").each(function(){var t=e(this);t.data("id")==o?(t.removeClass("info-unfocused"),t.addClass("info-focused")):(t.removeClass("info-focused"),t.addClass("info-unfocused"))}),r.text(""),r.append(a);var p=this.getBoundingClientRect(),f=document.body.scrollTop+(p.top+p.height/2-s.height()/2);f-=28;var m=Math.max(document.documentElement.clientHeight,window.innerHeight||0),h=Math.max(document.documentElement.clientWidth,window.innerWidth||0),g=document.body.scrollTop+m-40,v=0;f+s.height()>g?(v=f+s.height()-g,f=g-s.height()):f>4&15]+e[15&t]}}}},593:function(t,e,i){t.exports=i(594)},594:function(t,e,i){"use strict";i(595),i(597)},595:function(t,e,i){"use strict";i(596),window.ILabCrop=function(t,e){this.settings=e,this.modalContainer=t("#ilabm-container-"+e.modal_id),this.cropper=this.modalContainer.find(".ilabc-cropper"),this.cropperData={},this.modal_id=e.modal_id,this.aspectCheckboxContainer=t("#ilab-crop-aspect-checkbox-container"),this.aspectCheckboxContainer.css({visibility:"hidden"});var i=this;t("#ilab-crop-aspect-checkbox").on("change",function(t){i.settings.isCrop||(this.checked?i.cropper.cropper("setAspectRatio",i.settings.aspect_ratio):i.cropper.cropper("setAspectRatio",Number.NaN))}),this.modalContainer.find(".ilabm-editor-tabs").ilabTabs({currentValue:this.settings.size,tabSelected:function(t){ILabModal.loadURL(t.data("url"),!0,function(t){this.bindUI(t)}.bind(this))}.bind(this)}),this.modalContainer.find(".ilabc-button-crop").on("click",function(t){return t.preventDefault(),this.crop(),!1}.bind(this)),this.modalContainer.find(".ilabc-button-reset-crop").on("click",function(t){return t.preventDefault(),this.resetCrop(),!1}.bind(this)),this.updatePreviewWidth=function(){var t=this.modalContainer.find(".ilab-crop-preview-title").width();this.modalContainer.find(".ilab-crop-preview").css({height:t/this.settings.aspect_ratio+"px",width:t+"px"})}.bind(this),this.bindUI=function(e){if(this.settings=e,e.isCrop?this.aspectCheckboxContainer.css({visibility:"hidden"}):this.aspectCheckboxContainer.css({visibility:"visible"}),this.cropper.cropper("destroy"),this.cropper.off("built.cropper"),e.hasOwnProperty("cropped_src")&&null!==e.cropped_src&&this.modalContainer.find(".ilab-current-crop-img").attr("src",e.cropped_src),e.hasOwnProperty("size_title")&&null!==e.size_title&&this.modalContainer.find(".ilabc-crop-size-title").text("Current "+e.size_title+" ("+e.min_width+" x "+e.min_height+")"),void 0!==e.aspect_ratio){if(this.updatePreviewWidth(),void 0!==e.prev_crop_x&&null!==e.prev_crop_x)this.cropperData={x:e.prev_crop_x,y:e.prev_crop_y,width:e.prev_crop_width,height:e.prev_crop_height};else if(2==e.crop_axis.length){var i=0,a=0;"center"==e.crop_axis[0]?i=e.image_width/2-e.real_crop_width/2:"right"==e.crop_axis[0]&&(i=e.image_width-e.real_crop_width),"center"==e.crop_axis[1]?a=e.image_height/2-e.real_crop_height/2:"right"==e.crop_axis[1]&&(a=e.image_height-e.real_crop_height),this.cropperData={x:i,y:a,width:e.real_crop_width,height:e.real_crop_height}}var n=e.aspect_ratio;e.isCrop||t("#ilab-crop-aspect-checkbox")[0].checked||(n=Number.NaN),this.cropper.on("built.cropper",function(){this.updatePreviewWidth()}.bind(this)).on("crop.cropper",function(t){}).cropper({viewMode:1,dragMode:"none",aspectRatio:n,minWidth:e.min_width,minHeight:e.min_height,modal:!0,movable:!1,cropBoxMovable:!0,zoomable:!1,zoomOnWheel:!1,zoomOnTouch:!1,autoCropArea:1,data:this.cropperData,checkImageOrigin:!1,checkCrossOrigin:!1,responsive:!0,restore:!0,preview:"#ilabm-container-"+this.modal_id+" .ilab-crop-preview"})}}.bind(this),this.crop=function(){this.displayStatus("Saving crop ...");var t=this.cropper.cropper("getData");t.action="ilab_perform_crop",t.post=this.settings.image_id,t.size=this.settings.size,jQuery.post(ajaxurl,t,function(t){var e=this.modalContainer.find(".ilab-current-crop-img");"ok"==t.status?e.attr("src")==t.src?this.hideStatus():(e.one("load",function(){this.hideStatus()}.bind(this)),e.attr("src",t.src),wp.media.model.Attachments.all._byId[this.settings.image_id].get("sizes")[this.settings.size].url=t.src):this.hideStatus()}.bind(this))}.bind(this),this.resetCrop=function(){this.displayStatus("Resetting crop ..."),this.cropper.cropper("reset");var t=this.cropper.cropper("getData");t.action="ilab_reset_crop",t.post=this.settings.image_id,t.size=this.settings.size,jQuery.post(ajaxurl,t,function(t){var e=this.modalContainer.find(".ilab-current-crop-img");"ok"==t.status?e.attr("src")==t.src?this.hideStatus():(e.one("load",function(){this.hideStatus()}.bind(this)),e.attr("src",t.src),wp.media.model.Attachments.all._byId[this.settings.image_id].get("sizes")[this.settings.size].url=t.src):this.hideStatus()}.bind(this))}.bind(this),this.displayStatus=function(t){this.modalContainer.find(".ilabm-status-label").text(t),this.modalContainer.find(".ilabm-status-container").removeClass("is-hidden")}.bind(this),this.hideStatus=function(){this.modalContainer.find(".ilabm-status-container").addClass("is-hidden")}.bind(this),this.bindUI(e)}},596:function(t,e,i){var a,n,o,s;function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function h(t){return(h="function"==typeof Symbol&&"symbol"===r(Symbol.iterator)?function(t){return r(t)}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":r(t)})(t)}s=function(t){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t;var e="undefined"!=typeof window,i=e?window:{},a="cropper-hidden",n=i.PointerEvent?"pointerdown":"touchstart mousedown",o=i.PointerEvent?"pointermove":"touchmove mousemove",s=i.PointerEvent?"pointerup pointercancel":"touchend touchcancel mouseup",r=/^(?:e|w|s|n|se|sw|ne|nw|all|crop|move|zoom)$/,c=/^data:/,l=/^data:image\/jpeg;base64,/,d=/^(?:img|canvas)$/i,p={viewMode:0,dragMode:"crop",aspectRatio:NaN,data:null,preview:"",responsive:!0,restore:!0,checkCrossOrigin:!0,checkOrientation:!0,modal:!0,guides:!0,center:!0,highlight:!0,background:!0,autoCrop:!0,autoCropArea:.8,movable:!0,rotatable:!0,scalable:!0,zoomable:!0,zoomOnTouch:!0,zoomOnWheel:!0,wheelZoomRatio:.1,cropBoxMovable:!0,cropBoxResizable:!0,toggleDragModeOnDblclick:!0,minCanvasWidth:0,minCanvasHeight:0,minCropBoxWidth:0,minCropBoxHeight:0,minContainerWidth:200,minContainerHeight:100,ready:null,cropstart:null,cropmove:null,cropend:null,crop:null,zoom:null},u="function"==typeof Symbol&&"symbol"===h(Symbol.iterator)?function(t){return h(t)}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":h(t)},m=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},f=function(){function t(t,e){for(var i=0;i1?e-1:0),a=1;a0&&i.forEach(function(e){x(e)&&Object.keys(e).forEach(function(i){t[i]=e[i]})}),t},I=/\.\d*(?:0|9){12}\d*$/i;function S(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e11;return I.test(t)?Math.round(t*e)/e:t}var B=/^(?:width|height|left|top|marginLeft|marginTop)$/;function P(t,e){var i=t.style;k(e,function(t,e){B.test(e)&&b(t)&&(t+="px"),i[e]=t})}function O(t,e){if(e)if(b(t.length))k(t,function(t){O(t,e)});else if(t.classList)t.classList.add(e);else{var i=t.className.trim();i?i.indexOf(e)<0&&(t.className=i+" "+e):t.className=e}}function _(t,e){e&&(b(t.length)?k(t,function(t){_(t,e)}):t.classList?t.classList.remove(e):t.className.indexOf(e)>=0&&(t.className=t.className.replace(e,"")))}function T(t,e,i){e&&(b(t.length)?k(t,function(t){T(t,e,i)}):i?O(t,e):_(t,e))}var E=/([a-z\d])([A-Z])/g;function z(t){return t.replace(E,"$1-$2").toLowerCase()}function L(t,e){return x(t[e])?t[e]:t.dataset?t.dataset[e]:t.getAttribute("data-"+z(e))}function W(t,e,i){x(i)?t[e]=i:t.dataset?t.dataset[e]=i:t.setAttribute("data-"+z(e),i)}function A(t,e){if(x(t[e]))try{delete t[e]}catch(i){t[e]=void 0}else if(t.dataset)try{delete t.dataset[e]}catch(i){t.dataset[e]=void 0}else t.removeAttribute("data-"+z(e))}var N=/\s\s*/,H=function(){var t=!1;if(e){var a=!1,n=function(){},o=Object.defineProperty({},"once",{get:function(){return t=!0,a},set:function(t){a=t}});i.addEventListener("test",n,o),i.removeEventListener("test",n,o)}return t}();function j(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=i;e.trim().split(N).forEach(function(e){if(!H){var o=t.listeners;o&&o[e]&&o[e][i]&&(n=o[e][i],delete o[e][i],0===Object.keys(o[e]).length&&delete o[e],0===Object.keys(o).length&&delete t.listeners)}t.removeEventListener(e,n,a)})}function R(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=i;e.trim().split(N).forEach(function(e){if(a.once&&!H){var o=t.listeners,s=void 0===o?{}:o;n=function(){for(var o=arguments.length,r=Array(o),h=0;h1&&void 0!==arguments[1]?arguments[1]:"contain",o=function(t){return K(t)&&t>0};if(o(a)&&o(i)){var s=i*e;"contain"===n&&s>a||"cover"===n&&s=8&&(o=h+l)}}}if(o){var d=e.getUint16(o,a),p=void 0,u=void 0;for(u=0;ut.width?3===i?r=t.height*s:h=t.width/s:3===i?h=t.width/s:r=t.height*s;var c={aspectRatio:s,naturalWidth:n,naturalHeight:o,width:r,height:h};c.left=(t.width-r)/2,c.top=(t.height-h)/2,c.oldLeft=c.left,c.oldTop=c.top,this.canvasData=c,this.limited=1===i||2===i,this.limitCanvas(!0,!0),this.initialImageData=D({},e),this.initialCanvasData=D({},c)},limitCanvas:function(t,e){var i=this.options,a=this.containerData,n=this.canvasData,o=this.cropBoxData,s=i.viewMode,r=n.aspectRatio,h=this.cropped&&o;if(t){var c=Number(i.minCanvasWidth)||0,l=Number(i.minCanvasHeight)||0;s>1?(c=Math.max(c,a.width),l=Math.max(l,a.height),3===s&&(l*r>c?c=l*r:l=c/r)):s>0&&(c?c=Math.max(c,h?o.width:0):l?l=Math.max(l,h?o.height:0):h&&(c=o.width,(l=o.height)*r>c?c=l*r:l=c/r));var d=Z({aspectRatio:r,width:c,height:l});c=d.width,l=d.height,n.minWidth=c,n.minHeight=l,n.maxWidth=1/0,n.maxHeight=1/0}if(e)if(s){var p=a.width-n.width,u=a.height-n.height;n.minLeft=Math.min(0,p),n.minTop=Math.min(0,u),n.maxLeft=Math.max(0,p),n.maxTop=Math.max(0,u),h&&this.limited&&(n.minLeft=Math.min(o.left,o.left+(o.width-n.width)),n.minTop=Math.min(o.top,o.top+(o.height-n.height)),n.maxLeft=o.left,n.maxTop=o.top,2===s&&(n.width>=a.width&&(n.minLeft=Math.min(0,p),n.maxLeft=Math.max(0,p)),n.height>=a.height&&(n.minTop=Math.min(0,u),n.maxTop=Math.max(0,u))))}else n.minLeft=-n.width,n.minTop=-n.height,n.maxLeft=a.width,n.maxTop=a.height},renderCanvas:function(t,e){var i=this.canvasData,a=this.imageData;if(e){var n=function(t){var e=t.width,i=t.height,a=t.degree;if(90==(a=Math.abs(a)%180))return{width:i,height:e};var n=a%90*Math.PI/180,o=Math.sin(n),s=Math.cos(n),r=e*s+i*o,h=e*o+i*s;return a>90?{width:h,height:r}:{width:r,height:h}}({width:a.naturalWidth*Math.abs(a.scaleX||1),height:a.naturalHeight*Math.abs(a.scaleY||1),degree:a.rotate||0}),o=n.width,s=n.height,r=i.width*(o/i.naturalWidth),h=i.height*(s/i.naturalHeight);i.left-=(r-i.width)/2,i.top-=(h-i.height)/2,i.width=r,i.height=h,i.aspectRatio=o/s,i.naturalWidth=o,i.naturalHeight=s,this.limitCanvas(!0,!1)}(i.width>i.maxWidth||i.widthi.maxHeight||i.heighte.width?n.height=n.width/i:n.width=n.height*i),this.cropBoxData=n,this.limitCropBox(!0,!0),n.width=Math.min(Math.max(n.width,n.minWidth),n.maxWidth),n.height=Math.min(Math.max(n.height,n.minHeight),n.maxHeight),n.width=Math.max(n.minWidth,n.width*a),n.height=Math.max(n.minHeight,n.height*a),n.left=e.left+(e.width-n.width)/2,n.top=e.top+(e.height-n.height)/2,n.oldLeft=n.left,n.oldTop=n.top,this.initialCropBoxData=D({},n)},limitCropBox:function(t,e){var i=this.options,a=this.containerData,n=this.canvasData,o=this.cropBoxData,s=this.limited,r=i.aspectRatio;if(t){var h=Number(i.minCropBoxWidth)||0,c=Number(i.minCropBoxHeight)||0,l=Math.min(a.width,s?n.width:a.width),d=Math.min(a.height,s?n.height:a.height);h=Math.min(h,a.width),c=Math.min(c,a.height),r&&(h&&c?c*r>h?c=h/r:h=c*r:h?c=h/r:c&&(h=c*r),d*r>l?d=l/r:l=d*r),o.minWidth=Math.min(h,l),o.minHeight=Math.min(c,d),o.maxWidth=l,o.maxHeight=d}e&&(s?(o.minLeft=Math.max(0,n.left),o.minTop=Math.max(0,n.top),o.maxLeft=Math.min(a.width,n.left+n.width)-o.width,o.maxTop=Math.min(a.height,n.top+n.height)-o.height):(o.minLeft=0,o.minTop=0,o.maxLeft=a.width-o.width,o.maxTop=a.height-o.height))},renderCropBox:function(){var t=this.options,e=this.containerData,i=this.cropBoxData;(i.width>i.maxWidth||i.widthi.maxHeight||i.height=e.width&&i.height>=e.height?"move":"all"),P(this.cropBox,D({width:i.width,height:i.height},Q({translateX:i.left,translateY:i.top}))),this.cropped&&this.limited&&this.limitCanvas(!0,!0),this.disabled||this.output()},output:function(){this.preview(),X(this.element,"crop",this.getData())}},at={initPreview:function(){var t=this.crossOrigin,e=this.options.preview,i=t?this.crossOriginUrl:this.url,a=document.createElement("img");if(t&&(a.crossOrigin=t),a.src=i,this.viewBox.appendChild(a),this.viewBoxImage=a,e){var n=e;"string"==typeof e?n=this.element.ownerDocument.querySelectorAll(e):e.querySelector&&(n=[e]),this.previews=n,k(n,function(e){var a=document.createElement("img");W(e,"preview",{width:e.offsetWidth,height:e.offsetHeight,html:e.innerHTML}),t&&(a.crossOrigin=t),a.src=i,a.style.cssText='display:block;width:100%;height:auto;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important;image-orientation:0deg!important;"',e.innerHTML="",e.appendChild(a)})}},resetPreview:function(){k(this.previews,function(t){var e=L(t,"preview");P(t,{width:e.width,height:e.height}),t.innerHTML=e.html,A(t,"preview")})},preview:function(){var t=this.imageData,e=this.canvasData,i=this.cropBoxData,a=i.width,n=i.height,o=t.width,s=t.height,r=i.left-e.left-t.left,h=i.top-e.top-t.top;this.cropped&&!this.disabled&&(P(this.viewBoxImage,D({width:o,height:s},Q(D({translateX:-r,translateY:-h},t)))),k(this.previews,function(e){var i=L(e,"preview"),c=i.width,l=i.height,d=c,p=l,u=1;a&&(p=n*(u=c/a)),n&&p>l&&(d=a*(u=l/n),p=l),P(e,{width:d,height:p}),P(e.getElementsByTagName("img")[0],D({width:o*u,height:s*u},Q(D({translateX:-r*u,translateY:-h*u},t))))}))}},nt={bind:function(){var t=this.element,e=this.options,i=this.cropper;M(e.cropstart)&&R(t,"cropstart",e.cropstart),M(e.cropmove)&&R(t,"cropmove",e.cropmove),M(e.cropend)&&R(t,"cropend",e.cropend),M(e.crop)&&R(t,"crop",e.crop),M(e.zoom)&&R(t,"zoom",e.zoom),R(i,n,this.onCropStart=this.cropStart.bind(this)),e.zoomable&&e.zoomOnWheel&&R(i,"wheel mousewheel DOMMouseScroll",this.onWheel=this.wheel.bind(this)),e.toggleDragModeOnDblclick&&R(i,"dblclick",this.onDblclick=this.dblclick.bind(this)),R(t.ownerDocument,o,this.onCropMove=this.cropMove.bind(this)),R(t.ownerDocument,s,this.onCropEnd=this.cropEnd.bind(this)),e.responsive&&R(window,"resize",this.onResize=this.resize.bind(this))},unbind:function(){var t=this.element,e=this.options,i=this.cropper;M(e.cropstart)&&j(t,"cropstart",e.cropstart),M(e.cropmove)&&j(t,"cropmove",e.cropmove),M(e.cropend)&&j(t,"cropend",e.cropend),M(e.crop)&&j(t,"crop",e.crop),M(e.zoom)&&j(t,"zoom",e.zoom),j(i,n,this.onCropStart),e.zoomable&&e.zoomOnWheel&&j(i,"wheel mousewheel DOMMouseScroll",this.onWheel),e.toggleDragModeOnDblclick&&j(i,"dblclick",this.onDblclick),j(t.ownerDocument,o,this.onCropMove),j(t.ownerDocument,s,this.onCropEnd),e.responsive&&j(window,"resize",this.onResize)}},ot={resize:function(){var t=this.options,e=this.container,i=this.containerData,a=Number(t.minContainerWidth)||200,n=Number(t.minContainerHeight)||100;if(!(this.disabled||i.width<=a||i.height<=n)){var o=e.offsetWidth/i.width;if(1!==o||e.offsetHeight!==i.height){var s=void 0,r=void 0;t.restore&&(s=this.getCanvasData(),r=this.getCropBoxData()),this.render(),t.restore&&(this.setCanvasData(k(s,function(t,e){s[e]=t*o})),this.setCropBoxData(k(r,function(t,e){r[e]=t*o})))}}},dblclick:function(){var t,e;this.disabled||"none"===this.options.dragMode||this.setDragMode((t=this.dragBox,e="cropper-crop",(t.classList?t.classList.contains(e):t.className.indexOf(e)>-1)?"move":"crop"))},wheel:function(t){var e=this,i=Number(this.options.wheelZoomRatio)||.1,a=1;this.disabled||(t.preventDefault(),this.wheeling||(this.wheeling=!0,setTimeout(function(){e.wheeling=!1},50),t.deltaY?a=t.deltaY>0?1:-1:t.wheelDelta?a=-t.wheelDelta/120:t.detail&&(a=t.detail>0?1:-1),this.zoom(-a*i,t)))},cropStart:function(t){if(!this.disabled){var e=this.options,i=this.pointers,a=void 0;t.changedTouches?k(t.changedTouches,function(t){i[t.identifier]=$(t)}):i[t.pointerId||0]=$(t),a=Object.keys(i).length>1&&e.zoomable&&e.zoomOnTouch?"zoom":L(t.target,"action"),r.test(a)&&!1!==X(this.element,"cropstart",{originalEvent:t,action:a})&&(t.preventDefault(),this.action=a,this.cropping=!1,"crop"===a&&(this.cropping=!0,O(this.dragBox,"cropper-modal")))}},cropMove:function(t){var e=this.action;if(!this.disabled&&e){var i=this.pointers;t.preventDefault(),!1!==X(this.element,"cropmove",{originalEvent:t,action:e})&&(t.changedTouches?k(t.changedTouches,function(t){D(i[t.identifier],$(t,!0))}):D(i[t.pointerId||0],$(t,!0)),this.change(t))}},cropEnd:function(t){if(!this.disabled){var e=this.action,i=this.pointers;t.changedTouches?k(t.changedTouches,function(t){delete i[t.identifier]}):delete i[t.pointerId||0],e&&(t.preventDefault(),Object.keys(i).length||(this.action=""),this.cropping&&(this.cropping=!1,T(this.dragBox,"cropper-modal",this.cropped&&this.options.modal)),X(this.element,"cropend",{originalEvent:t,action:e}))}}},st={change:function(t){var e=this.options,i=this.canvasData,n=this.containerData,o=this.cropBoxData,s=this.pointers,r=this.action,h=e.aspectRatio,c=o.left,l=o.top,d=o.width,p=o.height,u=c+d,m=l+p,f=0,g=0,v=n.width,b=n.height,w=!0,x=void 0;!h&&t.shiftKey&&(h=d&&p?d/p:1),this.limited&&(f=o.minLeft,g=o.minTop,v=f+Math.min(n.width,i.width,i.left+i.width),b=g+Math.min(n.height,i.height,i.top+i.height));var y=s[Object.keys(s)[0]],C={x:y.endX-y.startX,y:y.endY-y.startY},M=function(t){switch(t){case"e":u+C.x>v&&(C.x=v-u);break;case"w":c+C.xb&&(C.y=b-m)}};switch(r){case"all":c+=C.x,l+=C.y;break;case"e":if(C.x>=0&&(u>=v||h&&(l<=g||m>=b))){w=!1;break}M("e"),d+=C.x,h&&(p=d/h,l-=C.x/h/2),d<0&&(r="w",d=0);break;case"n":if(C.y<=0&&(l<=g||h&&(c<=f||u>=v))){w=!1;break}M("n"),p-=C.y,l+=C.y,h&&(d=p*h,c+=C.y*h/2),p<0&&(r="s",p=0);break;case"w":if(C.x<=0&&(c<=f||h&&(l<=g||m>=b))){w=!1;break}M("w"),d-=C.x,c+=C.x,h&&(p=d/h,l+=C.x/h/2),d<0&&(r="e",d=0);break;case"s":if(C.y>=0&&(m>=b||h&&(c<=f||u>=v))){w=!1;break}M("s"),p+=C.y,h&&(d=p*h,c-=C.y*h/2),p<0&&(r="n",p=0);break;case"ne":if(h){if(C.y<=0&&(l<=g||u>=v)){w=!1;break}M("n"),p-=C.y,l+=C.y,d=p*h}else M("n"),M("e"),C.x>=0?ug&&(p-=C.y,l+=C.y):(p-=C.y,l+=C.y);d<0&&p<0?(r="sw",p=0,d=0):d<0?(r="nw",d=0):p<0&&(r="se",p=0);break;case"nw":if(h){if(C.y<=0&&(l<=g||c<=f)){w=!1;break}M("n"),p-=C.y,l+=C.y,d=p*h,c+=C.y*h}else M("n"),M("w"),C.x<=0?c>f?(d-=C.x,c+=C.x):C.y<=0&&l<=g&&(w=!1):(d-=C.x,c+=C.x),C.y<=0?l>g&&(p-=C.y,l+=C.y):(p-=C.y,l+=C.y);d<0&&p<0?(r="se",p=0,d=0):d<0?(r="ne",d=0):p<0&&(r="sw",p=0);break;case"sw":if(h){if(C.x<=0&&(c<=f||m>=b)){w=!1;break}M("w"),d-=C.x,c+=C.x,p=d/h}else M("s"),M("w"),C.x<=0?c>f?(d-=C.x,c+=C.x):C.y>=0&&m>=b&&(w=!1):(d-=C.x,c+=C.x),C.y>=0?m=0&&(u>=v||m>=b)){w=!1;break}M("e"),p=(d+=C.x)/h}else M("s"),M("e"),C.x>=0?u=0&&m>=b&&(w=!1):d+=C.x,C.y>=0?m0?r=C.y>0?"se":"ne":C.x<0&&(c-=d,r=C.y>0?"sw":"nw"),C.y<0&&(l-=p),this.cropped||(_(this.cropBox,a),this.cropped=!0,this.limited&&this.limitCropBox(!0,!0))}w&&(o.width=d,o.height=p,o.left=c,o.top=l,this.action=r,this.renderCropBox()),k(s,function(t){t.startX=t.endX,t.startY=t.endY})}},rt={crop:function(){return!this.ready||this.cropped||this.disabled||(this.cropped=!0,this.limitCropBox(!0,!0),this.options.modal&&O(this.dragBox,"cropper-modal"),_(this.cropBox,a),this.setCropBoxData(this.initialCropBoxData)),this},reset:function(){return this.ready&&!this.disabled&&(this.imageData=D({},this.initialImageData),this.canvasData=D({},this.initialCanvasData),this.cropBoxData=D({},this.initialCropBoxData),this.renderCanvas(),this.cropped&&this.renderCropBox()),this},clear:function(){return this.cropped&&!this.disabled&&(D(this.cropBoxData,{left:0,top:0,width:0,height:0}),this.cropped=!1,this.renderCropBox(),this.limitCanvas(!0,!0),this.renderCanvas(),_(this.dragBox,"cropper-modal"),O(this.cropBox,a)),this},replace:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!this.disabled&&t&&(this.isImg&&(this.element.src=t),e?(this.url=t,this.image.src=t,this.ready&&(this.viewBoxImage.src=t,k(this.previews,function(e){e.getElementsByTagName("img")[0].src=t}))):(this.isImg&&(this.replaced=!0),this.options.data=null,this.uncreate(),this.load(t))),this},enable:function(){return this.ready&&this.disabled&&(this.disabled=!1,_(this.cropper,"cropper-disabled")),this},disable:function(){return this.ready&&!this.disabled&&(this.disabled=!0,O(this.cropper,"cropper-disabled")),this},destroy:function(){var t=this.element;return L(t,"cropper")?(this.isImg&&this.replaced&&(t.src=this.originalUrl),this.uncreate(),A(t,"cropper"),this):this},move:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.canvasData,a=i.left,n=i.top;return this.moveTo(w(t)?t:a+Number(t),w(e)?e:n+Number(e))},moveTo:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.canvasData,a=!1;return t=Number(t),e=Number(e),this.ready&&!this.disabled&&this.options.movable&&(b(t)&&(i.left=t,a=!0),b(e)&&(i.top=e,a=!0),a&&this.renderCanvas(!0)),this},zoom:function(t,e){var i=this.canvasData;return t=(t=Number(t))<0?1/(1-t):1+t,this.zoomTo(i.width*t/i.naturalWidth,null,e)},zoomTo:function(t,e,i){var a=this.options,n=this.canvasData,o=n.width,s=n.height,r=n.naturalWidth,h=n.naturalHeight;if((t=Number(t))>=0&&this.ready&&!this.disabled&&a.zoomable){var c=r*t,l=h*t;if(!1===X(this.element,"zoom",{originalEvent:i,oldRatio:o/r,ratio:c/r}))return this;if(i){var d=this.pointers,p=Y(this.cropper),u=d&&Object.keys(d).length?function(t){var e=0,i=0,a=0;return k(t,function(t){var n=t.startX,o=t.startY;e+=n,i+=o,a+=1}),{pageX:e/=a,pageY:i/=a}}(d):{pageX:i.pageX,pageY:i.pageY};n.left-=(c-o)*((u.pageX-p.left-n.left)/o),n.top-=(l-s)*((u.pageY-p.top-n.top)/s)}else C(e)&&b(e.x)&&b(e.y)?(n.left-=(c-o)*((e.x-n.left)/o),n.top-=(l-s)*((e.y-n.top)/s)):(n.left-=(c-o)/2,n.top-=(l-s)/2);n.width=c,n.height=l,this.renderCanvas(!0)}return this},rotate:function(t){return this.rotateTo((this.imageData.rotate||0)+Number(t))},rotateTo:function(t){return b(t=Number(t))&&this.ready&&!this.disabled&&this.options.rotatable&&(this.imageData.rotate=t%360,this.renderCanvas(!0,!0)),this},scaleX:function(t){var e=this.imageData.scaleY;return this.scale(t,b(e)?e:1)},scaleY:function(t){var e=this.imageData.scaleX;return this.scale(b(e)?e:1,t)},scale:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.imageData,a=!1;return t=Number(t),e=Number(e),this.ready&&!this.disabled&&this.options.scalable&&(b(t)&&(i.scaleX=t,a=!0),b(e)&&(i.scaleY=e,a=!0),a&&this.renderCanvas(!0,!0)),this},getData:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=this.options,i=this.imageData,a=this.canvasData,n=this.cropBoxData,o=void 0;if(this.ready&&this.cropped){o={x:n.left-a.left,y:n.top-a.top,width:n.width,height:n.height};var s=i.width/i.naturalWidth;k(o,function(e,i){e/=s,o[i]=t?Math.round(e):e})}else o={x:0,y:0,width:0,height:0};return e.rotatable&&(o.rotate=i.rotate||0),e.scalable&&(o.scaleX=i.scaleX||1,o.scaleY=i.scaleY||1),o},setData:function(t){var e=this.options,i=this.imageData,a=this.canvasData,n={};if(this.ready&&!this.disabled&&C(t)){var o=!1;e.rotatable&&b(t.rotate)&&t.rotate!==i.rotate&&(i.rotate=t.rotate,o=!0),e.scalable&&(b(t.scaleX)&&t.scaleX!==i.scaleX&&(i.scaleX=t.scaleX,o=!0),b(t.scaleY)&&t.scaleY!==i.scaleY&&(i.scaleY=t.scaleY,o=!0)),o&&this.renderCanvas(!0,!0);var s=i.width/i.naturalWidth;b(t.x)&&(n.left=t.x*s+a.left),b(t.y)&&(n.top=t.y*s+a.top),b(t.width)&&(n.width=t.width*s),b(t.height)&&(n.height=t.height*s),this.setCropBoxData(n)}return this},getContainerData:function(){return this.ready?D({},this.containerData):{}},getImageData:function(){return this.sized?D({},this.imageData):{}},getCanvasData:function(){var t=this.canvasData,e={};return this.ready&&k(["left","top","width","height","naturalWidth","naturalHeight"],function(i){e[i]=t[i]}),e},setCanvasData:function(t){var e=this.canvasData,i=e.aspectRatio;return this.ready&&!this.disabled&&C(t)&&(b(t.left)&&(e.left=t.left),b(t.top)&&(e.top=t.top),b(t.width)?(e.width=t.width,e.height=t.width/i):b(t.height)&&(e.height=t.height,e.width=t.height*i),this.renderCanvas(!0)),this},getCropBoxData:function(){var t=this.cropBoxData,e=void 0;return this.ready&&this.cropped&&(e={left:t.left,top:t.top,width:t.width,height:t.height}),e||{}},setCropBoxData:function(t){var e=this.cropBoxData,i=this.options.aspectRatio,a=void 0,n=void 0;return this.ready&&this.cropped&&!this.disabled&&C(t)&&(b(t.left)&&(e.left=t.left),b(t.top)&&(e.top=t.top),b(t.width)&&t.width!==e.width&&(a=!0,e.width=t.width),b(t.height)&&t.height!==e.height&&(n=!0,e.height=t.height),i&&(a?e.height=e.width/i:n&&(e.width=e.height*i)),this.renderCropBox()),this},getCroppedCanvas:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!this.ready||!window.HTMLCanvasElement)return null;var e=this.canvasData,i=J(this.image,this.imageData,e,t);if(!this.cropped)return i;var a=this.getData(),n=a.x,o=a.y,s=a.width,r=a.height,h=i.width/Math.floor(e.naturalWidth);1!==h&&(n*=h,o*=h,s*=h,r*=h);var c=s/r,l=Z({aspectRatio:c,width:t.maxWidth||1/0,height:t.maxHeight||1/0}),d=Z({aspectRatio:c,width:t.minWidth||0,height:t.minHeight||0},"cover"),p=Z({aspectRatio:c,width:t.width||(1!==h?i.width:s),height:t.height||(1!==h?i.height:r)}),u=p.width,m=p.height;u=Math.min(l.width,Math.max(d.width,u)),m=Math.min(l.height,Math.max(d.height,m));var f=document.createElement("canvas"),v=f.getContext("2d");f.width=S(u),f.height=S(m),v.fillStyle=t.fillColor||"transparent",v.fillRect(0,0,u,m);var b=t.imageSmoothingEnabled,w=void 0===b||b,x=t.imageSmoothingQuality;v.imageSmoothingEnabled=w,x&&(v.imageSmoothingQuality=x);var y=i.width,C=i.height,M=n,k=o,D=void 0,I=void 0,B=void 0,P=void 0,O=void 0,_=void 0;M<=-s||M>y?(M=0,D=0,B=0,O=0):M<=0?(B=-M,M=0,O=D=Math.min(y,s+M)):M<=y&&(B=0,O=D=Math.min(s,y-M)),D<=0||k<=-r||k>C?(k=0,I=0,P=0,_=0):k<=0?(P=-k,k=0,_=I=Math.min(C,r+k)):k<=C&&(P=0,_=I=Math.min(r,C-k));var T=[M,k,D,I];if(O>0&&_>0){var E=u/s;T.push(B*E,P*E,O*E,_*E)}return v.drawImage.apply(v,[i].concat(g(T.map(function(t){return Math.floor(S(t))})))),f},setAspectRatio:function(t){var e=this.options;return this.disabled||w(t)||(e.aspectRatio=Math.max(0,t)||NaN,this.ready&&(this.initCropBox(),this.cropped&&this.renderCropBox())),this},setDragMode:function(t){var e=this.options,i=this.dragBox,a=this.face;if(this.ready&&!this.disabled){var n="crop"===t,o=e.movable&&"move"===t;t=n||o?t:"none",e.dragMode=t,W(i,"action",t),T(i,"cropper-crop",n),T(i,"cropper-move",o),e.cropBoxMovable||(W(a,"action",t),T(a,"cropper-crop",n),T(a,"cropper-move",o))}return this}},ht=i.Cropper,ct=function(){function t(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(m(this,t),!e||!d.test(e.tagName))throw new Error("The first argument is required and must be an or element.");this.element=e,this.options=D({},p,C(i)&&i),this.cropped=!1,this.disabled=!1,this.pointers={},this.ready=!1,this.reloading=!1,this.replaced=!1,this.sized=!1,this.sizing=!1,this.init()}return f(t,[{key:"init",value:function(){var t=this.element,e=t.tagName.toLowerCase(),i=void 0;if(!L(t,"cropper")){if(W(t,"cropper",this),"img"===e){if(this.isImg=!0,i=t.getAttribute("src")||"",this.originalUrl=i,!i)return;i=t.src}else"canvas"===e&&window.HTMLCanvasElement&&(i=t.toDataURL());this.load(i)}}},{key:"load",value:function(t){var e=this;if(t){this.url=t,this.imageData={};var i=this.element,a=this.options;if(a.checkOrientation&&window.ArrayBuffer)if(c.test(t))l.test(t)?this.read((n=t.replace(tt,""),o=atob(n),s=new ArrayBuffer(o.length),k(r=new Uint8Array(s),function(t,e){r[e]=o.charCodeAt(e)}),s)):this.clone();else{var n,o,s,r,h=new XMLHttpRequest;this.reloading=!0,this.xhr=h;var d=function(){e.reloading=!1,e.xhr=null};h.ontimeout=d,h.onabort=d,h.onerror=function(){d(),e.clone()},h.onload=function(){d(),e.read(h.response)},a.checkCrossOrigin&&V(t)&&i.crossOrigin&&(t=q(t)),h.open("get",t),h.responseType="arraybuffer",h.withCredentials="use-credentials"===i.crossOrigin,h.send()}else this.clone()}}},{key:"read",value:function(t){var e=this.options,i=this.imageData,a=et(t),n=0,o=1,s=1;if(a>1){this.url=function(t,e){var i=new Uint8Array(t),a="";return k(i,function(t){a+=G(t)}),"data:"+e+";base64,"+btoa(a)}(t,"image/jpeg");var r=function(t){var e=0,i=1,a=1;switch(t){case 2:i=-1;break;case 3:e=-180;break;case 4:a=-1;break;case 5:e=90,a=-1;break;case 6:e=90;break;case 7:e=90,i=-1;break;case 8:e=-90}return{rotate:e,scaleX:i,scaleY:a}}(a);n=r.rotate,o=r.scaleX,s=r.scaleY}e.rotatable&&(i.rotate=n),e.scalable&&(i.scaleX=o,i.scaleY=s),this.clone()}},{key:"clone",value:function(){var t=this.element,e=this.url,i=void 0,a=void 0;this.options.checkCrossOrigin&&V(e)&&((i=t.crossOrigin)?a=e:(i="anonymous",a=q(e))),this.crossOrigin=i,this.crossOriginUrl=a;var n=document.createElement("img");i&&(n.crossOrigin=i),n.src=a||e;var o=this.start.bind(this),s=this.stop.bind(this);this.image=n,this.onStart=o,this.onStop=s,this.isImg?t.complete?this.timeout=setTimeout(o,0):R(t,"load",o,{once:!0}):(n.onload=o,n.onerror=s,O(n,"cropper-hide"),t.parentNode.insertBefore(n,t.nextSibling))}},{key:"start",value:function(t){var e=this,a=this.isImg?this.element:this.image;t&&(a.onload=null,a.onerror=null),this.sizing=!0;var n=i.navigator&&/(Macintosh|iPhone|iPod|iPad).*AppleWebKit/i.test(i.navigator.userAgent),o=function(t,i){D(e.imageData,{naturalWidth:t,naturalHeight:i,aspectRatio:t/i}),e.sizing=!1,e.sized=!0,e.build()};if(!a.naturalWidth||n){var s=document.createElement("img"),r=document.body||document.documentElement;this.sizingImage=s,s.onload=function(){o(s.width,s.height),n||r.removeChild(s)},s.src=a.src,n||(s.style.cssText="left:0;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;opacity:0;position:absolute;top:0;z-index:-1;",r.appendChild(s))}else o(a.naturalWidth,a.naturalHeight)}},{key:"stop",value:function(){var t=this.image;t.onload=null,t.onerror=null,t.parentNode.removeChild(t),this.image=null}},{key:"build",value:function(){if(this.sized&&!this.ready){var t=this.element,e=this.options,i=this.image,n=t.parentNode,o=document.createElement("div");o.innerHTML='
    ';var s=o.querySelector(".cropper-container"),r=s.querySelector(".cropper-canvas"),h=s.querySelector(".cropper-drag-box"),c=s.querySelector(".cropper-crop-box"),l=c.querySelector(".cropper-face");this.container=n,this.cropper=s,this.canvas=r,this.dragBox=h,this.cropBox=c,this.viewBox=s.querySelector(".cropper-view-box"),this.face=l,r.appendChild(i),O(t,a),n.insertBefore(s,t.nextSibling),this.isImg||_(i,"cropper-hide"),this.initPreview(),this.bind(),e.aspectRatio=Math.max(0,e.aspectRatio)||NaN,e.viewMode=Math.max(0,Math.min(3,Math.round(e.viewMode)))||0,O(c,a),e.guides||O(c.getElementsByClassName("cropper-dashed"),a),e.center||O(c.getElementsByClassName("cropper-center"),a),e.background&&O(s,"cropper-bg"),e.highlight||O(l,"cropper-invisible"),e.cropBoxMovable&&(O(l,"cropper-move"),W(l,"action","all")),e.cropBoxResizable||(O(c.getElementsByClassName("cropper-line"),a),O(c.getElementsByClassName("cropper-point"),a)),this.render(),this.ready=!0,this.setDragMode(e.dragMode),e.autoCrop&&this.crop(),this.setData(e.data),M(e.ready)&&R(t,"ready",e.ready,{once:!0}),X(t,"ready")}}},{key:"unbuild",value:function(){this.ready&&(this.ready=!1,this.unbind(),this.resetPreview(),this.cropper.parentNode.removeChild(this.cropper),_(this.element,a))}},{key:"uncreate",value:function(){var t=this.element;this.ready?(this.unbuild(),this.ready=!1,this.cropped=!1):this.sizing?(this.sizingImage.onload=null,this.sizing=!1,this.sized=!1):this.reloading?this.xhr.abort():this.isImg?t.complete?clearTimeout(this.timeout):j(t,"load",this.onStart):this.image&&this.stop()}}],[{key:"noConflict",value:function(){return window.Cropper=ht,t}},{key:"setDefaults",value:function(t){D(p,C(t)&&t)}}]),t}();if(D(ct.prototype,it,at,nt,ot,st,rt),t.fn){var lt=t.fn.cropper;t.fn.cropper=function(e){for(var i=arguments.length,a=Array(i>1?i-1:0),n=1;n
    "),this.container=this.popup.querySelector(".ilab-popup-contents"),this.popup.querySelector(".ilab-popup-close").addEventListener("click",this.closeClick.bind(this)),document.body.appendChild(this.popup)}setContent(e){this.container.innerHTML="",this.container.appendChild(e)}show(){this.visible||(this.visible=!0,this.popup.classList.remove("hidden"))}hide(){this.visible&&(this.visible=!1,this.popup.classList.add("hidden"))}closeClick(e){return e.preventDefault(),this.hide(),!1}}},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=a(310),n=a(313),r=a(314);class i{constructor(e){this.runningTasks=[],this.pastTasks=[],this.scheduledTasks=[],this.optionsModals={},this.statusNonce=null,this.ele=e,this.statusNonce=e.dataset.statusNonce,this.runningTaskTable=document.getElementById("running-tasks"),this.runningTaskContainer=this.runningTaskTable.querySelector("tbody"),this.runningNoResults=this.runningTaskTable.parentElement.querySelector("div.no-results"),this.cancelAllButton=document.querySelector("div.task-list.running-tasks button.button-cancel-all"),this.cancelAllButton.addEventListener("click",this.cancelAllTasks.bind(this)),this.pastTaskTable=document.getElementById("past-tasks"),this.pastTaskContainer=this.pastTaskTable.querySelector("tbody"),this.pastNoResults=this.pastTaskTable.parentElement.querySelector("div.no-results"),this.clearHistoryButton=document.querySelector("div.task-list.past-tasks button.button-clear-history"),this.clearHistoryButton.addEventListener("click",this.clearHistory.bind(this)),this.scheduledTaskTable=document.getElementById("scheduled-tasks"),this.scheduledTaskContainer=this.scheduledTaskTable.querySelector("tbody"),this.scheduledNoResults=this.scheduledTaskTable.parentElement.querySelector("div.no-results");let t=document.getElementById("task-manager-running-tasks");if(null!=t){JSON.parse(t.innerText).forEach(e=>{let t=new s.default(e);this.runningTaskContainer.append(t.tr),this.runningTasks.push(t)})}0==this.runningTasks.length?this.runningNoResults.style.display=null:(this.cancelAllButton.removeAttribute("disabled"),this.runningTaskTable.style.display=null);let a=document.getElementById("task-manager-past-tasks");if(null!=a){JSON.parse(a.innerText).forEach(e=>{let t=new s.default(e);this.pastTaskContainer.append(t.tr),this.pastTasks.push(t)})}0==this.pastTasks.length?this.pastNoResults.style.display=null:(this.clearHistoryButton.removeAttribute("disabled"),this.pastTaskTable.style.display=null);let i=document.getElementById("task-manager-scheduled-tasks");if(null!=i){JSON.parse(i.innerText).forEach(e=>{let t=new r.default(e,this.scheduledItemRemoved.bind(this));this.scheduledTaskContainer.append(t.tr),this.scheduledTasks.push(t)})}0==this.scheduledTasks.length?this.scheduledNoResults.style.display=null:this.scheduledTaskTable.style.display=null,this.ele.querySelectorAll("button.button-start-task").forEach(e=>{e.addEventListener("click",this.startTask.bind(this))}),document.querySelectorAll("script[data-options-for]").forEach(e=>{let t=e.dataset.optionsFor;this.optionsModals[t]=new n.default(e)}),this.checkStatus()}startTask(e){e.preventDefault();let t=e.currentTarget,a=t.dataset.taskId,s=t.dataset.nonce;if(t.dataset.hasOwnProperty("hasOptions")&&"1"==t.dataset.hasOptions&&this.optionsModals.hasOwnProperty(a)){let e=this.optionsModals[a];e.show(n=>{this.doStartTask(e,t,a,s,n)},()=>{e.hide()})}else confirm("Start this task?")&&this.doStartTask(null,t,a,s,null);return!1}doStartTask(e,t,a,s,n){null!=t&&t.setAttribute("disabled","disabled");let r={action:"mcloud_start_task",taskId:a,nonce:s};null!=n&&(r.options=n),jQuery.post(ajaxurl,r,a=>{null!=t&&t.removeAttribute("disabled"),null!=e&&(e.resetActions(),e.hide()),"ok"!=a.status&&(a.hasOwnProperty("message")?alert(a.message):alert("Error starting task."))})}scheduledItemRemoved(e){let t=this.scheduledTasks.indexOf(e);-1!=t&&this.scheduledTasks.splice(t,1),console.log("Scheduled item removed",e,t),this.scheduledTaskTable.style.display=this.scheduledTasks.length>0?null:"none",this.scheduledNoResults.style.display=this.scheduledTasks.length>0?"none":null}checkStatus(){let e=[],t=[];this.runningTasks.forEach(t=>{e.push(t.data.id)}),this.scheduledTasks.forEach(e=>{t.push(e.data.id)});let a={action:"mcloud_all_task_statuses",currentTaskIds:e,currentScheduledIds:t,nonce:this.statusNonce};jQuery.post(ajaxurl,a,e=>{e.hasOwnProperty("status")&&"ok"==e.status&&(e.hasOwnProperty("currentTasks")&&e.currentTasks.forEach(e=>{this.runningTasks.forEach(t=>{t.data.id==e.id&&(t.data=e)})}),e.hasOwnProperty("newTasks")&&e.newTasks.forEach(e=>{let t=new s.default(e);this.runningTaskContainer.append(t.tr),this.runningTasks.push(t),this.scheduledTasks.forEach(t=>{t.data.tuid==e.tuid&&0==t.data.recurring&&(t.tr.remove(),this.scheduledTasks.splice(this.scheduledTasks.indexOf(t),1))})}),e.hasOwnProperty("completeTasks")&&(e.completeTasks.forEach(e=>{this.runningTasks.forEach(t=>{t.data.id==e.id&&(t.tr.remove(),t.data=e,this.pastTaskContainer.insertBefore(t.tr,this.pastTaskContainer.childNodes[0]),this.pastTasks.push(t),this.runningTasks.splice(this.runningTasks.indexOf(t),1))})}),this.pastTasks.length>0&&(this.clearHistoryButton.removeAttribute("disabled"),this.pastTaskTable.style.display=null,this.pastNoResults.style.display="none")),e.hasOwnProperty("currentScheduled")&&e.currentScheduled.forEach(e=>{this.scheduledTasks.forEach(t=>{t.data.id==e.id&&(t.data=e)})}),e.hasOwnProperty("newScheduled")&&e.newScheduled.forEach(e=>{let t=new r.default(e,this.scheduledItemRemoved.bind(this));this.scheduledTaskContainer.append(t.tr),this.scheduledTasks.push(t)}),e.hasOwnProperty("deletedScheduledIds")&&e.deletedScheduledIds.forEach(e=>{this.scheduledTasks.forEach(t=>{t.data.id==e&&(t.tr.remove(),this.scheduledTasks.splice(this.scheduledTasks.indexOf(t),1))})}),this.runningTasks.length>0?this.cancelAllButton.removeAttribute("disabled"):this.cancelAllButton.setAttribute("disabled","disabled"),this.runningTaskTable.style.display=this.runningTasks.length>0?null:"none",this.runningNoResults.style.display=this.runningTasks.length>0?"none":null,this.scheduledTaskTable.style.display=this.scheduledTasks.length>0?null:"none",this.scheduledNoResults.style.display=this.scheduledTasks.length>0?"none":null),setTimeout(this.checkStatus.bind(this),2e3)})}cancelAllTasks(e){e.preventDefault();let t=this.cancelAllButton.innerText;this.cancelAllButton.setAttribute("disabled","disable"),this.cancelAllButton.innerText="Cancelling ...";let a={action:"mcloud_cancel_all_tasks",nonce:this.cancelAllButton.dataset.cancelAllNonce};return jQuery.post(ajaxurl,a,e=>{this.cancelAllButton.innerText=t}),!1}clearHistory(e){e.preventDefault();let t=this.clearHistoryButton.innerText;this.clearHistoryButton.setAttribute("disabled","disabled"),this.clearHistoryButton.innerText="Clearing History ...";let a={action:"mcloud_clear_task_history",nonce:this.clearHistoryButton.dataset.clearHistoryNonce};return jQuery.post(ajaxurl,a,e=>{this.pastTasks.forEach(e=>{e.tr.remove()}),this.pastTasks=[],this.clearHistoryButton.innerText=t,this.clearHistoryButton.setAttribute("disabled","disabled"),this.pastTaskTable.style.display="none",this.pastNoResults.style.display=null}),!1}static bind(){let e=document.getElementById("task-manager");null!=e&&new i(e)}}t.default=i},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=a(0);class n{constructor(e){this.tr=null,null==n.runningTemplate&&(n.runningTemplate=wp.template("running-task-template")),null==n.pastTemplate&&(n.pastTemplate=wp.template("past-task-template")),this._data=e,this.createTemplate()}get data(){return this._data}set data(e){let t=this.majorStatusChanged(e);this._data=e,t?this.createTemplate():this.updateTemplate()}majorStatusChanged(e){return console.log(e),e.state>=100&&this._data.state<100}createTemplate(){let e;e=this._data.state>=100?n.pastTemplate(this._data):n.runningTemplate(this._data);let t,a=document.createElement("tbody");if(a.innerHTML=e,this.tr=a.querySelector("tr"),t=this.tr.querySelector("td.started")){let e=null==this._data.startTime||0==this._data.startTime?new Date:new Date(this._data.startTimeFormat);t.innerText=s(e).format("M/D/YYYY h:mm a")}if((t=this.tr.querySelector("td.completed"))&&null!=this._data.endTime){let e=new Date(this._data.endTimeFormat);t.innerText=s(e).format("M/D/YYYY h:mm a")}(t=this.tr.querySelector(".button-cancel-task"))&&t.addEventListener("click",e=>{e.preventDefault(),t.setAttribute("disabled","disabled"),t.innerText="Cancelling ..";let a={action:"mcloud_cancel_task",taskId:this._data.id,nonce:t.dataset.cancelNonce};return jQuery.post(ajaxurl,a,e=>{"error"==e.status&&(alert(e.message),t.removeAttribute("disabled"),t.innerText="Cancel")}),!1}),this.updateTemplate()}updateTemplate(){let e;if((e=this.tr.querySelector("td.total-time"))&&this._data.duration>0){let t=s.duration(this._data.duration,"seconds");t.minutes()<1?e.innerText=t.asSeconds().toFixed(0)+" seconds":e.innerText=t.humanize()}if((e=this.tr.querySelector("td.remaining"))&&this._data.remaining>0){let t=s.duration(this._data.remaining,"seconds");t.minutes()<1?e.innerText=t.asSeconds().toFixed(0).replace("-","")+" seconds":e.innerText=t.humanize()}if((e=this.tr.querySelector("td.status"))&&(console.log(e),e.innerText=this._data.stateName),e=this.tr.querySelector("td.time-per")){let t=s.duration(this._data.timePer,"seconds");t.minutes()<1?e.innerText=t.asSeconds().toFixed(1).replace(/\.?0+$/,"")+" seconds":e.innerText=t.humanize()}(e=this.tr.querySelector("td.memory-per"))&&(console.log(this._data.memoryPerString),"false"==this._data.memoryPerString?e.innerText="—":e.innerText=this._data.memoryPerString),(e=this.tr.querySelector("td.current"))&&(e.innerText=this._data.currentItem+" of "+this._data.totalItems);let t=this.tr.querySelector("td.progress > div.progress-bar > .bar"),a=this.tr.querySelector("td.progress > div.progress-bar > .amount");0==this._data.totalItems?(t.style.width=this._data.currentItem/this._data.totalItems+"%",a.innerText=""):(t.style.width=this._data.currentItem/this._data.totalItems*100+"%",a.innerText=(this._data.currentItem/this._data.totalItems*100).toFixed(0)+"%")}}n.runningTemplate=null,n.pastTemplate=null,t.default=n},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,a){var s={"./af":45,"./af.js":45,"./ar":46,"./ar-dz":47,"./ar-dz.js":47,"./ar-kw":48,"./ar-kw.js":48,"./ar-ly":49,"./ar-ly.js":49,"./ar-ma":50,"./ar-ma.js":50,"./ar-sa":51,"./ar-sa.js":51,"./ar-tn":52,"./ar-tn.js":52,"./ar.js":46,"./az":53,"./az.js":53,"./be":54,"./be.js":54,"./bg":55,"./bg.js":55,"./bm":56,"./bm.js":56,"./bn":57,"./bn.js":57,"./bo":58,"./bo.js":58,"./br":59,"./br.js":59,"./bs":60,"./bs.js":60,"./ca":61,"./ca.js":61,"./cs":62,"./cs.js":62,"./cv":63,"./cv.js":63,"./cy":64,"./cy.js":64,"./da":65,"./da.js":65,"./de":66,"./de-at":67,"./de-at.js":67,"./de-ch":68,"./de-ch.js":68,"./de.js":66,"./dv":69,"./dv.js":69,"./el":70,"./el.js":70,"./en-SG":71,"./en-SG.js":71,"./en-au":72,"./en-au.js":72,"./en-ca":73,"./en-ca.js":73,"./en-gb":74,"./en-gb.js":74,"./en-ie":75,"./en-ie.js":75,"./en-il":76,"./en-il.js":76,"./en-nz":77,"./en-nz.js":77,"./eo":78,"./eo.js":78,"./es":79,"./es-do":80,"./es-do.js":80,"./es-us":81,"./es-us.js":81,"./es.js":79,"./et":82,"./et.js":82,"./eu":83,"./eu.js":83,"./fa":84,"./fa.js":84,"./fi":85,"./fi.js":85,"./fo":86,"./fo.js":86,"./fr":87,"./fr-ca":88,"./fr-ca.js":88,"./fr-ch":89,"./fr-ch.js":89,"./fr.js":87,"./fy":90,"./fy.js":90,"./ga":91,"./ga.js":91,"./gd":92,"./gd.js":92,"./gl":93,"./gl.js":93,"./gom-latn":94,"./gom-latn.js":94,"./gu":95,"./gu.js":95,"./he":96,"./he.js":96,"./hi":97,"./hi.js":97,"./hr":98,"./hr.js":98,"./hu":99,"./hu.js":99,"./hy-am":100,"./hy-am.js":100,"./id":101,"./id.js":101,"./is":102,"./is.js":102,"./it":103,"./it-ch":104,"./it-ch.js":104,"./it.js":103,"./ja":105,"./ja.js":105,"./jv":106,"./jv.js":106,"./ka":107,"./ka.js":107,"./kk":108,"./kk.js":108,"./km":109,"./km.js":109,"./kn":110,"./kn.js":110,"./ko":111,"./ko.js":111,"./ku":112,"./ku.js":112,"./ky":113,"./ky.js":113,"./lb":114,"./lb.js":114,"./lo":115,"./lo.js":115,"./lt":116,"./lt.js":116,"./lv":117,"./lv.js":117,"./me":118,"./me.js":118,"./mi":119,"./mi.js":119,"./mk":120,"./mk.js":120,"./ml":121,"./ml.js":121,"./mn":122,"./mn.js":122,"./mr":123,"./mr.js":123,"./ms":124,"./ms-my":125,"./ms-my.js":125,"./ms.js":124,"./mt":126,"./mt.js":126,"./my":127,"./my.js":127,"./nb":128,"./nb.js":128,"./ne":129,"./ne.js":129,"./nl":130,"./nl-be":131,"./nl-be.js":131,"./nl.js":130,"./nn":132,"./nn.js":132,"./pa-in":133,"./pa-in.js":133,"./pl":134,"./pl.js":134,"./pt":135,"./pt-br":136,"./pt-br.js":136,"./pt.js":135,"./ro":137,"./ro.js":137,"./ru":138,"./ru.js":138,"./sd":139,"./sd.js":139,"./se":140,"./se.js":140,"./si":141,"./si.js":141,"./sk":142,"./sk.js":142,"./sl":143,"./sl.js":143,"./sq":144,"./sq.js":144,"./sr":145,"./sr-cyrl":146,"./sr-cyrl.js":146,"./sr.js":145,"./ss":147,"./ss.js":147,"./sv":148,"./sv.js":148,"./sw":149,"./sw.js":149,"./ta":150,"./ta.js":150,"./te":151,"./te.js":151,"./tet":152,"./tet.js":152,"./tg":153,"./tg.js":153,"./th":154,"./th.js":154,"./tl-ph":155,"./tl-ph.js":155,"./tlh":156,"./tlh.js":156,"./tr":157,"./tr.js":157,"./tzl":158,"./tzl.js":158,"./tzm":159,"./tzm-latn":160,"./tzm-latn.js":160,"./tzm.js":159,"./ug-cn":161,"./ug-cn.js":161,"./uk":162,"./uk.js":162,"./ur":163,"./ur.js":163,"./uz":164,"./uz-latn":165,"./uz-latn.js":165,"./uz.js":164,"./vi":166,"./vi.js":166,"./x-pseudo":167,"./x-pseudo.js":167,"./yo":168,"./yo.js":168,"./zh-cn":169,"./zh-cn.js":169,"./zh-hk":170,"./zh-hk.js":170,"./zh-tw":171,"./zh-tw.js":171};function n(e){var t=r(e);return a(t)}function r(e){if(!a.o(s,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return s[e]}n.keys=function(){return Object.keys(s)},n.resolve=r,e.exports=n,n.id=312},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=a(23),n=a(44),r=a(172);t.default=class{constructor(e){this.modalEle=null,this.showHideTimeout=0,this.form=null,this.modalEle=s.default.createElement(e.innerText),this.modalEle.querySelectorAll(".option-ui-browser").forEach(e=>{new n.default(e)}),this.modalEle.querySelectorAll(".option-ui-media-select").forEach(e=>{new r.default(e)}),this.form=this.modalEle.querySelector("form"),this.modalEle.querySelectorAll(".button-modal-cancel").forEach(e=>{e.addEventListener("click",e=>(e.preventDefault(),this.cancelled&&this.cancelled(),!1))}),this.modalEle.querySelectorAll(".button-modal-run-task").forEach(e=>{e.addEventListener("click",t=>(t.preventDefault(),e.setAttribute("disabled","disabled"),this.started&&this.started(this.options()),!1))}),console.log(this.modalEle)}show(e,t){this.resetActions(),this.started=e,this.cancelled=t,this.modalEle.classList.add("invisible"),document.body.append(this.modalEle),clearTimeout(this.showHideTimeout),this.showHideTimeout=setTimeout(()=>{this.modalEle.classList.remove("invisible")},1e3/30)}hide(){this.modalEle.classList.add("invisible"),clearTimeout(this.showHideTimeout),this.showHideTimeout=setTimeout(()=>{this.modalEle.remove()},500)}resetActions(){this.modalEle.querySelectorAll("button[disabled]").forEach(e=>{e.removeAttribute("disabled")})}options(){let e={};return this.form.querySelectorAll("input[type=checkbox]").forEach(function(t){console.log(t),t.checked&&(e[t.name]=1)}),this.form.querySelectorAll("select").forEach(function(t){console.log(t),e[t.name]=t.value}),this.form.querySelectorAll("input[type=text]").forEach(function(t){console.log(t),e[t.name]=t.value}),this.form.querySelectorAll("input[type=number]").forEach(function(t){console.log(t),e[t.name]=t.value}),this.form.querySelectorAll("input[type=hidden]").forEach(function(t){console.log(t),e[t.name]=t.value}),e}}},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});class s{constructor(e,t){this.tr=null,this.canUpdate=!0,null==s.template&&(s.template=wp.template("scheduled-task-template")),this.removed=t,this._data=e,this.createTemplate()}get data(){return this._data}set data(e){if(this._data=e,!this.canUpdate)return;let t=this.tr;this.createTemplate(),null!=t&&t.parentElement.replaceChild(this.tr,t)}createTemplate(){let e=s.template(this._data),t=document.createElement("tbody");t.innerHTML=e,this.tr=t.querySelector("tr"),this.deleteButton=this.tr.querySelector("button.button-delete-task"),this.deleteButton&&(this.deleteNonce=this.deleteButton.dataset.deleteNonce,this.deleteButton.addEventListener("click",this.deleteTask.bind(this))),this.executeButton=this.tr.querySelector("button.button-execute-task"),this.executeButton&&(this.executeNonce=this.executeButton.dataset.executeNonce,this.executeButton.addEventListener("click",this.executeTask.bind(this)))}deleteTask(e){e.preventDefault(),this.deleteButton.setAttribute("disabled","disabled"),this.deleteButton.innerText="Deleting ...",this.canUpdate=!1;let t={action:"mcloud_delete_scheduled_task",taskId:this._data.id,nonce:this.deleteNonce};return jQuery.post(ajaxurl,t,e=>{this._data=null,this.tr.remove(),this.removed(this)}),!1}executeTask(e){e.preventDefault(),this.executeButton.setAttribute("disabled","disabled"),this.executeButton.innerText="Executing ...",this.canUpdate=!1;let t={action:"mcloud_execute_scheduled_task",taskId:this._data.id,nonce:this.executeNonce};return jQuery.post(ajaxurl,t,e=>{this._data=null,this.tr.remove(),this.removed(this)}),!1}}s.template=null,t.default=s},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=a(316),n=a(23);class r{constructor(e){this.task=null,this.lastId=null,this.displayedThumbs=[],this.ele=e,this.info=e.querySelector("div.task-info");let t=document.getElementById("task-batch-running-task");this.config=JSON.parse(t.innerText),this.task=this.config.task,this.progress=new s.default(this.config,e.querySelector("div.task-progress")),this.progress.onCancel(this.cancelTask.bind(this)),this.thumbnailContainer=e.querySelector("div.progress-thumbnails-container"),this.optionsContainer=document.getElementById("task-options"),this.startTaskButton=e.querySelector("button.button-start-task"),this.startTaskButton.addEventListener("click",e=>(e.preventDefault(),this.startTask(),!1)),null!=this.task?(this.info.style.display="none",this.progress.show(),this.checkStatus()):this.info.style.display=null,console.log(this)}startTask(){this.startTaskButton.setAttribute("disabled","disabled");let e={action:"mcloud_start_task",taskId:this.config.identifier,nonce:this.config.startNonce},t=this.options();null!=t&&(e.options=t),console.log(e),jQuery.post(ajaxurl,e,e=>{console.log(e),this.startTaskButton.removeAttribute("disabled"),"ok"==e.status&&e.hasOwnProperty("task")?(this.progress.task=this.task=e.task,this.info.style.display="none",this.progress.show(),setTimeout(this.checkStatus.bind(this),2e3)):e.hasOwnProperty("message")?alert(e.message):alert("Error starting task.")})}cancelTask(){let e={action:"mcloud_cancel_task",taskId:this.task.id,nonce:this.config.cancelNonce};return jQuery.post(ajaxurl,e,e=>{if("error"==e.status)return alert(e.message),void this.progress.enableCancel();this.progress.task=this.task=null,this.info.style.display=null,this.progress.hide()}),!1}checkStatus(){if(null==this.task)return;let e={action:"mcloud_task_status",taskId:this.task.id,nonce:this.config.statusNonce};jQuery.post(ajaxurl,e,e=>{if(e.hasOwnProperty("task")){if(e.task.state>=100)return this.progress.hide(),this.info.style.display=null,100==e.task.state?alert("Task has completed successfully."):101==e.task.state&&alert("There was an error completing the task."),void(this.progress.task=this.task=null);this.progress.task=this.task=e.task,this.displayThumbnail(),console.log(this.task)}setTimeout(this.checkStatus.bind(this),2e3)})}options(){let e={};return null==this.optionsContainer?e:(this.optionsContainer.querySelectorAll("input[type=checkbox]").forEach(function(t){console.log(t),t.checked&&(e[t.name]=1)}),this.optionsContainer.querySelectorAll("select").forEach(function(t){console.log(t),e[t.name]=t.value}),this.optionsContainer.querySelectorAll("input[type=text]").forEach(function(t){console.log(t),e[t.name]=t.value}),this.optionsContainer.querySelectorAll("input[type=hidden]").forEach(function(t){console.log(t),e[t.name]=t.value}),e)}displayThumbnail(){if(this.task.currentItem==this.lastId)return;let e=null;if(this.task.isIcon)e=n.default.createElement('");else{if(null==this.task.currentThumb)return;e=n.default.createElement('")}if(this.lastId=this.task.currentItem,this.thumbnailContainer.prepend(e),setTimeout(()=>{e.classList.remove("invisible")},100),this.displayedThumbs.forEach(function(e,t){e.style.transform="translateX("+160*(t+1)+"px)"}.bind(this)),this.displayedThumbs.unshift(e),this.displayedThumbs.length>=20){this.displayedThumbs.pop().remove()}}static bind(){let e=document.getElementById("task-batch");null!=e&&new r(e)}}t.default=r},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=a(0);t.default=class{constructor(e,t){this.ele=t,this.config=e,this.progressLabel=this.ele.querySelector("p.progress"),this.statusLabel=this.ele.querySelector("p.status"),this.currentLabel=this.ele.querySelector("p.current"),this.remainingItemsLabel=this.ele.querySelector("p.remaining-items"),this.totalItemsLabel=this.ele.querySelector("p.total-items"),this.elapsedLabel=this.ele.querySelector("p.elapsed"),this.remainingLabel=this.ele.querySelector("p.remaining"),this.perItemLabel=this.ele.querySelector("p.per-item"),this.progressBar=this.ele.querySelector("div.progress-container > div.progress-bar"),this.cancelButton=this.ele.querySelector("button.button-cancel-task"),this.task=e.task}get task(){return this._task}set task(e){this._task=e,null!=this._task&&this.updateProgress()}updateProgress(){if(null==this._task)return this.cancelButton.removeAttribute("disabled"),this.progressLabel.innerText="",this.statusLabel.innerText="",this.currentLabel.innerText="",this.remainingItemsLabel.innerText="",this.totalItemsLabel.innerText="",this.elapsedLabel.innerText="",this.remainingLabel.innerText="",this.perItemLabel.innerText="",void(this.progressBar.style.width="0%");this._task.state>=100?this.cancelButton.setAttribute("disabled","disabled"):this.cancelButton.removeAttribute("disabled");let e=this._task.totalItems>0?this._task.currentItem/this._task.totalItems:0;this.progressLabel.innerText=(100*e).toFixed(0)+"%",this.statusLabel.innerText=this._task.stateName,this.remainingItemsLabel.innerText=(this._task.totalItems-this._task.currentItem).toLocaleString(void 0,{maximumFractionDigits:0}),this.currentLabel.innerText=this._task.currentItem.toLocaleString(void 0,{maximumFractionDigits:0}),this.totalItemsLabel.innerText=this._task.totalItems.toLocaleString(void 0,{maximumFractionDigits:0}),this.assignDuration(this.remainingLabel,this._task.remaining),this.assignDuration(this.elapsedLabel,this._task.duration),this.assignDuration(this.perItemLabel,this._task.timePer),this.progressBar.style.width=100*e+"%"}show(){this.ele.style.display=null}hide(){this.ele.style.display="none"}enableCancel(){this.cancelButton.removeAttribute("disabled")}onCancel(e){this.ele.querySelector("button.button-cancel-task").addEventListener("click",t=>(this.cancelButton.setAttribute("disabled","disabled"),t.preventDefault(),e(),!1))}assignDuration(e,t){let a=s.duration(t,"seconds");a.minutes()<1?e.innerText=a.asSeconds().toFixed(0)+" seconds":e.innerText=a.humanize()}}}]); \ No newline at end of file diff --git a/public/js/media-cloud-docs.js b/public/js/media-cloud-docs.js deleted file mode 100755 index 6e2fe9e8..00000000 --- a/public/js/media-cloud-docs.js +++ /dev/null @@ -1 +0,0 @@ -!function(t){var n={};function r(e){if(n[e])return n[e].exports;var i=n[e]={i:e,l:!1,exports:{}};return t[e].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=t,r.c=n,r.d=function(t,n,e){r.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:e})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,n){if(1&n&&(t=r(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var e=Object.create(null);if(r.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var i in t)r.d(e,i,function(n){return t[n]}.bind(null,i));return e},r.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(n,"a",n),n},r.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},r.p="/",r(r.s=296)}([,function(t,n,r){var e=r(3),i=r(11),o=r(21),u=r(17),c=r(26),f=function(t,n,r){var a,s,l,h,p=t&f.F,v=t&f.G,y=t&f.S,d=t&f.P,g=t&f.B,x=v?e:y?e[n]||(e[n]={}):(e[n]||{}).prototype,m=v?i:i[n]||(i[n]={}),b=m.prototype||(m.prototype={});for(a in v&&(r=n),r)l=((s=!p&&x&&void 0!==x[a])?x:r)[a],h=g&&s?c(l,e):d&&"function"==typeof l?c(Function.call,l):l,x&&u(x,a,l,t&f.U),m[a]!=l&&o(m,a,h),d&&b[a]!=l&&(b[a]=l)};e.core=i,f.F=1,f.G=2,f.S=4,f.P=8,f.B=16,f.W=32,f.U=64,f.R=128,t.exports=f},,function(t,n){var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,r){var e=r(6);t.exports=function(t){if(!e(t))throw TypeError(t+" is not an object!");return t}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},,function(t,n,r){var e=r(67)("wks"),i=r(41),o=r(3).Symbol,u="function"==typeof o;(t.exports=function(t){return e[t]||(e[t]=u&&o[t]||(u?o:i)("Symbol."+t))}).store=e},,function(t,n,r){var e=r(28),i=Math.min;t.exports=function(t){return t>0?i(e(t),9007199254740991):0}},function(t,n){var r=t.exports={version:"2.6.9"};"number"==typeof __e&&(__e=r)},function(t,n,r){t.exports=!r(4)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,n,r){var e=r(5),i=r(121),o=r(36),u=Object.defineProperty;n.f=r(12)?Object.defineProperty:function(t,n,r){if(e(t),n=o(n,!0),e(r),i)try{return u(t,n,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(t[n]=r.value),t}},,function(t,n,r){var e=r(33);t.exports=function(t){return Object(e(t))}},,function(t,n,r){var e=r(3),i=r(21),o=r(20),u=r(41)("src"),c=r(302),f=(""+c).split("toString");r(11).inspectSource=function(t){return c.call(t)},(t.exports=function(t,n,r,c){var a="function"==typeof r;a&&(o(r,"name")||i(r,"name",n)),t[n]!==r&&(a&&(o(r,u)||i(r,u,t[n]?""+t[n]:f.join(String(n)))),t===e?t[n]=r:c?t[n]?t[n]=r:i(t,n,r):(delete t[n],i(t,n,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[u]||c.call(this)})},function(t,n,r){var e=r(1),i=r(4),o=r(33),u=/"/g,c=function(t,n,r,e){var i=String(o(t)),c="<"+n;return""!==r&&(c+=" "+r+'="'+String(e).replace(u,""")+'"'),c+">"+i+""};t.exports=function(t,n){var r={};r[t]=n(c),e(e.P+e.F*i(function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3}),"String",r)}},,function(t,n){var r={}.hasOwnProperty;t.exports=function(t,n){return r.call(t,n)}},function(t,n,r){var e=r(13),i=r(40);t.exports=r(12)?function(t,n,r){return e.f(t,n,i(1,r))}:function(t,n,r){return t[n]=r,t}},function(t,n,r){var e=r(60),i=r(33);t.exports=function(t){return e(i(t))}},,function(t,n){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(t){"object"==typeof window&&(r=window)}t.exports=r},function(t,n,r){"use strict";var e=r(4);t.exports=function(t,n){return!!t&&e(function(){n?t.call(null,function(){},1):t.call(null)})}},function(t,n,r){var e=r(27);t.exports=function(t,n,r){if(e(t),void 0===n)return t;switch(r){case 1:return function(r){return t.call(n,r)};case 2:return function(r,e){return t.call(n,r,e)};case 3:return function(r,e,i){return t.call(n,r,e,i)}}return function(){return t.apply(n,arguments)}}},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,n){var r=Math.ceil,e=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?e:r)(t)}},function(t,n,r){var e=r(61),i=r(40),o=r(22),u=r(36),c=r(20),f=r(121),a=Object.getOwnPropertyDescriptor;n.f=r(12)?a:function(t,n){if(t=o(t),n=u(n,!0),f)try{return a(t,n)}catch(t){}if(c(t,n))return i(!e.f.call(t,n),t[n])}},function(t,n,r){var e=r(1),i=r(11),o=r(4);t.exports=function(t,n){var r=(i.Object||{})[t]||Object[t],u={};u[t]=n(r),e(e.S+e.F*o(function(){r(1)}),"Object",u)}},function(t,n,r){var e=r(26),i=r(60),o=r(15),u=r(10),c=r(137);t.exports=function(t,n){var r=1==t,f=2==t,a=3==t,s=4==t,l=6==t,h=5==t||l,p=n||c;return function(n,c,v){for(var y,d,g=o(n),x=i(g),m=e(c,v,3),b=u(x.length),w=0,S=r?p(n,b):f?p(n,0):void 0;b>w;w++)if((h||w in x)&&(d=m(y=x[w],w,g),t))if(r)S[w]=d;else if(d)switch(t){case 3:return!0;case 5:return y;case 6:return w;case 2:S.push(y)}else if(s)return!1;return l?-1:a||s?s:S}}},function(t,n){var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},function(t,n){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,n,r){"use strict";if(r(12)){var e=r(42),i=r(3),o=r(4),u=r(1),c=r(78),f=r(107),a=r(26),s=r(57),l=r(40),h=r(21),p=r(58),v=r(28),y=r(10),d=r(148),g=r(44),x=r(36),m=r(20),b=r(62),w=r(6),S=r(15),_=r(99),E=r(45),O=r(47),P=r(46).f,F=r(101),M=r(41),A=r(8),j=r(31),I=r(68),N=r(63),T=r(103),L=r(55),R=r(71),k=r(56),C=r(102),D=r(139),W=r(13),B=r(29),G=W.f,U=B.f,V=i.RangeError,z=i.TypeError,Y=i.Uint8Array,q=Array.prototype,$=f.ArrayBuffer,K=f.DataView,J=j(0),X=j(2),H=j(3),Z=j(4),Q=j(5),tt=j(6),nt=I(!0),rt=I(!1),et=T.values,it=T.keys,ot=T.entries,ut=q.lastIndexOf,ct=q.reduce,ft=q.reduceRight,at=q.join,st=q.sort,lt=q.slice,ht=q.toString,pt=q.toLocaleString,vt=A("iterator"),yt=A("toStringTag"),dt=M("typed_constructor"),gt=M("def_constructor"),xt=c.CONSTR,mt=c.TYPED,bt=c.VIEW,wt=j(1,function(t,n){return Pt(N(t,t[gt]),n)}),St=o(function(){return 1===new Y(new Uint16Array([1]).buffer)[0]}),_t=!!Y&&!!Y.prototype.set&&o(function(){new Y(1).set({})}),Et=function(t,n){var r=v(t);if(r<0||r%n)throw V("Wrong offset!");return r},Ot=function(t){if(w(t)&&mt in t)return t;throw z(t+" is not a typed array!")},Pt=function(t,n){if(!(w(t)&&dt in t))throw z("It is not a typed array constructor!");return new t(n)},Ft=function(t,n){return Mt(N(t,t[gt]),n)},Mt=function(t,n){for(var r=0,e=n.length,i=Pt(t,e);e>r;)i[r]=n[r++];return i},At=function(t,n,r){G(t,n,{get:function(){return this._d[r]}})},jt=function(t){var n,r,e,i,o,u,c=S(t),f=arguments.length,s=f>1?arguments[1]:void 0,l=void 0!==s,h=F(c);if(null!=h&&!_(h)){for(u=h.call(c),e=[],n=0;!(o=u.next()).done;n++)e.push(o.value);c=e}for(l&&f>2&&(s=a(s,arguments[2],2)),n=0,r=y(c.length),i=Pt(this,r);r>n;n++)i[n]=l?s(c[n],n):c[n];return i},It=function(){for(var t=0,n=arguments.length,r=Pt(this,n);n>t;)r[t]=arguments[t++];return r},Nt=!!Y&&o(function(){pt.call(new Y(1))}),Tt=function(){return pt.apply(Nt?lt.call(Ot(this)):Ot(this),arguments)},Lt={copyWithin:function(t,n){return D.call(Ot(this),t,n,arguments.length>2?arguments[2]:void 0)},every:function(t){return Z(Ot(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return C.apply(Ot(this),arguments)},filter:function(t){return Ft(this,X(Ot(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return Q(Ot(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return tt(Ot(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){J(Ot(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return rt(Ot(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return nt(Ot(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return at.apply(Ot(this),arguments)},lastIndexOf:function(t){return ut.apply(Ot(this),arguments)},map:function(t){return wt(Ot(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return ct.apply(Ot(this),arguments)},reduceRight:function(t){return ft.apply(Ot(this),arguments)},reverse:function(){for(var t,n=Ot(this).length,r=Math.floor(n/2),e=0;e1?arguments[1]:void 0)},sort:function(t){return st.call(Ot(this),t)},subarray:function(t,n){var r=Ot(this),e=r.length,i=g(t,e);return new(N(r,r[gt]))(r.buffer,r.byteOffset+i*r.BYTES_PER_ELEMENT,y((void 0===n?e:g(n,e))-i))}},Rt=function(t,n){return Ft(this,lt.call(Ot(this),t,n))},kt=function(t){Ot(this);var n=Et(arguments[1],1),r=this.length,e=S(t),i=y(e.length),o=0;if(i+n>r)throw V("Wrong length!");for(;o255?255:255&e),i.v[p](r*n+i.o,e,St)}(this,r,t)},enumerable:!0})};m?(v=r(function(t,r,e,i){s(t,v,a,"_d");var o,u,c,f,l=0,p=0;if(w(r)){if(!(r instanceof $||"ArrayBuffer"==(f=b(r))||"SharedArrayBuffer"==f))return mt in r?Mt(v,r):jt.call(v,r);o=r,p=Et(e,n);var g=r.byteLength;if(void 0===i){if(g%n)throw V("Wrong length!");if((u=g-p)<0)throw V("Wrong length!")}else if((u=y(i)*n)+p>g)throw V("Wrong length!");c=u/n}else c=d(r),o=new $(u=c*n);for(h(t,"_d",{b:o,o:p,l:u,e:c,v:new K(o)});ldocument.F=Object<\/script>"),t.close(),f=t.F;e--;)delete f.prototype[o[e]];return f()};t.exports=Object.create||function(t,n){var r;return null!==t?(c.prototype=e(t),r=new c,c.prototype=null,r[u]=t):r=f(),void 0===n?r:i(r,n)}},function(t,n,r){var e=r(123),i=r(86).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return e(t,i)}},function(t,n,r){var e=r(20),i=r(15),o=r(85)("IE_PROTO"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),e(t,o)?t[o]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,n,r){var e=r(8)("unscopables"),i=Array.prototype;null==i[e]&&r(21)(i,e,{}),t.exports=function(t){i[e][t]=!0}},function(t,n,r){var e=r(6);t.exports=function(t,n){if(!e(t)||t._t!==n)throw TypeError("Incompatible receiver, "+n+" required!");return t}},,,,function(t,n,r){var e=r(13).f,i=r(20),o=r(8)("toStringTag");t.exports=function(t,n,r){t&&!i(t=r?t:t.prototype,o)&&e(t,o,{configurable:!0,value:n})}},function(t,n,r){var e=r(1),i=r(33),o=r(4),u=r(89),c="["+u+"]",f=RegExp("^"+c+c+"*"),a=RegExp(c+c+"*$"),s=function(t,n,r){var i={},c=o(function(){return!!u[t]()||"​…"!="​…"[t]()}),f=i[t]=c?n(l):u[t];r&&(i[r]=f),e(e.P+e.F*c,"String",i)},l=s.trim=function(t,n){return t=String(i(t)),1&n&&(t=t.replace(f,"")),2&n&&(t=t.replace(a,"")),t};t.exports=s},function(t,n){t.exports={}},function(t,n,r){"use strict";var e=r(3),i=r(13),o=r(12),u=r(8)("species");t.exports=function(t){var n=e[t];o&&n&&!n[u]&&i.f(n,u,{configurable:!0,get:function(){return this}})}},function(t,n){t.exports=function(t,n,r,e){if(!(t instanceof n)||void 0!==e&&e in t)throw TypeError(r+": incorrect invocation!");return t}},function(t,n,r){var e=r(17);t.exports=function(t,n,r){for(var i in n)e(t,i,n[i],r);return t}},,function(t,n,r){var e=r(32);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==e(t)?t.split(""):Object(t)}},function(t,n){n.f={}.propertyIsEnumerable},function(t,n,r){var e=r(32),i=r(8)("toStringTag"),o="Arguments"==e(function(){return arguments}());t.exports=function(t){var n,r,u;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=function(t,n){try{return t[n]}catch(t){}}(n=Object(t),i))?r:o?e(n):"Object"==(u=e(n))&&"function"==typeof n.callee?"Arguments":u}},function(t,n,r){var e=r(5),i=r(27),o=r(8)("species");t.exports=function(t,n){var r,u=e(t).constructor;return void 0===u||null==(r=e(u)[o])?n:i(r)}},,,,function(t,n,r){var e=r(11),i=r(3),o=i["__core-js_shared__"]||(i["__core-js_shared__"]={});(t.exports=function(t,n){return o[t]||(o[t]=void 0!==n?n:{})})("versions",[]).push({version:e.version,mode:r(42)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,n,r){var e=r(22),i=r(10),o=r(44);t.exports=function(t){return function(n,r,u){var c,f=e(n),a=i(f.length),s=o(u,a);if(t&&r!=r){for(;a>s;)if((c=f[s++])!=c)return!0}else for(;a>s;s++)if((t||s in f)&&f[s]===r)return t||s||0;return!t&&-1}}},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,r){var e=r(32);t.exports=Array.isArray||function(t){return"Array"==e(t)}},function(t,n,r){var e=r(8)("iterator"),i=!1;try{var o=[7][e]();o.return=function(){i=!0},Array.from(o,function(){throw 2})}catch(t){}t.exports=function(t,n){if(!n&&!i)return!1;var r=!1;try{var o=[7],u=o[e]();u.next=function(){return{done:r=!0}},o[e]=function(){return u},t(o)}catch(t){}return r}},function(t,n,r){"use strict";var e=r(5);t.exports=function(){var t=e(this),n="";return t.global&&(n+="g"),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),t.unicode&&(n+="u"),t.sticky&&(n+="y"),n}},function(t,n,r){"use strict";var e=r(62),i=RegExp.prototype.exec;t.exports=function(t,n){var r=t.exec;if("function"==typeof r){var o=r.call(t,n);if("object"!=typeof o)throw new TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==e(t))throw new TypeError("RegExp#exec called on incompatible receiver");return i.call(t,n)}},function(t,n,r){"use strict";r(141);var e=r(17),i=r(21),o=r(4),u=r(33),c=r(8),f=r(104),a=c("species"),s=!o(function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")}),l=function(){var t=/(?:)/,n=t.exec;t.exec=function(){return n.apply(this,arguments)};var r="ab".split(t);return 2===r.length&&"a"===r[0]&&"b"===r[1]}();t.exports=function(t,n,r){var h=c(t),p=!o(function(){var n={};return n[h]=function(){return 7},7!=""[t](n)}),v=p?!o(function(){var n=!1,r=/a/;return r.exec=function(){return n=!0,null},"split"===t&&(r.constructor={},r.constructor[a]=function(){return r}),r[h](""),!n}):void 0;if(!p||!v||"replace"===t&&!s||"split"===t&&!l){var y=/./[h],d=r(u,h,""[t],function(t,n,r,e,i){return n.exec===f?p&&!i?{done:!0,value:y.call(n,r,e)}:{done:!0,value:t.call(r,n,e)}:{done:!1}}),g=d[0],x=d[1];e(String.prototype,t,g),i(RegExp.prototype,h,2==n?function(t,n){return x.call(t,this,n)}:function(t){return x.call(t,this)})}}},function(t,n,r){var e=r(26),i=r(136),o=r(99),u=r(5),c=r(10),f=r(101),a={},s={};(n=t.exports=function(t,n,r,l,h){var p,v,y,d,g=h?function(){return t}:f(t),x=e(r,l,n?2:1),m=0;if("function"!=typeof g)throw TypeError(t+" is not iterable!");if(o(g)){for(p=c(t.length);p>m;m++)if((d=n?x(u(v=t[m])[0],v[1]):x(t[m]))===a||d===s)return d}else for(y=g.call(t);!(v=y.next()).done;)if((d=i(y,x,v.value,n))===a||d===s)return d}).BREAK=a,n.RETURN=s},function(t,n,r){var e=r(3).navigator;t.exports=e&&e.userAgent||""},function(t,n,r){"use strict";var e=r(3),i=r(1),o=r(17),u=r(58),c=r(37),f=r(75),a=r(57),s=r(6),l=r(4),h=r(71),p=r(53),v=r(90);t.exports=function(t,n,r,y,d,g){var x=e[t],m=x,b=d?"set":"add",w=m&&m.prototype,S={},_=function(t){var n=w[t];o(w,t,"delete"==t?function(t){return!(g&&!s(t))&&n.call(this,0===t?0:t)}:"has"==t?function(t){return!(g&&!s(t))&&n.call(this,0===t?0:t)}:"get"==t?function(t){return g&&!s(t)?void 0:n.call(this,0===t?0:t)}:"add"==t?function(t){return n.call(this,0===t?0:t),this}:function(t,r){return n.call(this,0===t?0:t,r),this})};if("function"==typeof m&&(g||w.forEach&&!l(function(){(new m).entries().next()}))){var E=new m,O=E[b](g?{}:-0,1)!=E,P=l(function(){E.has(1)}),F=h(function(t){new m(t)}),M=!g&&l(function(){for(var t=new m,n=5;n--;)t[b](n,n);return!t.has(-0)});F||((m=n(function(n,r){a(n,m,t);var e=v(new x,n,m);return null!=r&&f(r,d,e[b],e),e})).prototype=w,w.constructor=m),(P||M)&&(_("delete"),_("has"),d&&_("get")),(M||O)&&_(b),g&&w.clear&&delete w.clear}else m=y.getConstructor(n,t,d,b),u(m.prototype,r),c.NEED=!0;return p(m,t),S[t]=m,i(i.G+i.W+i.F*(m!=x),S),g||y.setStrong(m,t,d),m}},function(t,n,r){for(var e,i=r(3),o=r(21),u=r(41),c=u("typed_array"),f=u("view"),a=!(!i.ArrayBuffer||!i.DataView),s=a,l=0,h="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");l<9;)(e=i[h[l++]])?(o(e.prototype,c,!0),o(e.prototype,f,!0)):s=!1;t.exports={ABV:a,CONSTR:s,TYPED:c,VIEW:f}},,,,,function(t,n,r){var e=r(6),i=r(3).document,o=e(i)&&e(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n,r){n.f=r(8)},function(t,n,r){var e=r(67)("keys"),i=r(41);t.exports=function(t){return e[t]||(e[t]=i(t))}},function(t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,n,r){var e=r(3).document;t.exports=e&&e.documentElement},function(t,n,r){var e=r(6),i=r(5),o=function(t,n){if(i(t),!e(n)&&null!==n)throw TypeError(n+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,n,e){try{(e=r(26)(Function.call,r(29).f(Object.prototype,"__proto__").set,2))(t,[]),n=!(t instanceof Array)}catch(t){n=!0}return function(t,r){return o(t,r),n?t.__proto__=r:e(t,r),t}}({},!1):void 0),check:o}},function(t,n){t.exports="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff"},function(t,n,r){var e=r(6),i=r(88).set;t.exports=function(t,n,r){var o,u=n.constructor;return u!==r&&"function"==typeof u&&(o=u.prototype)!==r.prototype&&e(o)&&i&&i(t,o),t}},function(t,n,r){"use strict";var e=r(28),i=r(33);t.exports=function(t){var n=String(i(this)),r="",o=e(t);if(o<0||o==1/0)throw RangeError("Count can't be negative");for(;o>0;(o>>>=1)&&(n+=n))1&o&&(r+=n);return r}},function(t,n){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,n){var r=Math.expm1;t.exports=!r||r(10)>22025.465794806718||r(10)<22025.465794806718||-2e-17!=r(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:r},function(t,n,r){var e=r(28),i=r(33);t.exports=function(t){return function(n,r){var o,u,c=String(i(n)),f=e(r),a=c.length;return f<0||f>=a?t?"":void 0:(o=c.charCodeAt(f))<55296||o>56319||f+1===a||(u=c.charCodeAt(f+1))<56320||u>57343?t?c.charAt(f):o:t?c.slice(f,f+2):u-56320+(o-55296<<10)+65536}}},function(t,n,r){"use strict";var e=r(42),i=r(1),o=r(17),u=r(21),c=r(55),f=r(135),a=r(53),s=r(47),l=r(8)("iterator"),h=!([].keys&&"next"in[].keys()),p=function(){return this};t.exports=function(t,n,r,v,y,d,g){f(r,n,v);var x,m,b,w=function(t){if(!h&&t in O)return O[t];switch(t){case"keys":case"values":return function(){return new r(this,t)}}return function(){return new r(this,t)}},S=n+" Iterator",_="values"==y,E=!1,O=t.prototype,P=O[l]||O["@@iterator"]||y&&O[y],F=P||w(y),M=y?_?w("entries"):F:void 0,A="Array"==n&&O.entries||P;if(A&&(b=s(A.call(new t)))!==Object.prototype&&b.next&&(a(b,S,!0),e||"function"==typeof b[l]||u(b,l,p)),_&&P&&"values"!==P.name&&(E=!0,F=function(){return P.call(this)}),e&&!g||!h&&!E&&O[l]||u(O,l,F),c[n]=F,c[S]=p,y)if(x={values:_?F:w("values"),keys:d?F:w("keys"),entries:M},g)for(m in x)m in O||o(O,m,x[m]);else i(i.P+i.F*(h||E),n,x);return x}},function(t,n,r){var e=r(97),i=r(33);t.exports=function(t,n,r){if(e(n))throw TypeError("String#"+r+" doesn't accept regex!");return String(i(t))}},function(t,n,r){var e=r(6),i=r(32),o=r(8)("match");t.exports=function(t){var n;return e(t)&&(void 0!==(n=t[o])?!!n:"RegExp"==i(t))}},function(t,n,r){var e=r(8)("match");t.exports=function(t){var n=/./;try{"/./"[t](n)}catch(r){try{return n[e]=!1,!"/./"[t](n)}catch(t){}}return!0}},function(t,n,r){var e=r(55),i=r(8)("iterator"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(e.Array===t||o[i]===t)}},function(t,n,r){"use strict";var e=r(13),i=r(40);t.exports=function(t,n,r){n in t?e.f(t,n,i(0,r)):t[n]=r}},function(t,n,r){var e=r(62),i=r(8)("iterator"),o=r(55);t.exports=r(11).getIteratorMethod=function(t){if(null!=t)return t[i]||t["@@iterator"]||o[e(t)]}},function(t,n,r){"use strict";var e=r(15),i=r(44),o=r(10);t.exports=function(t){for(var n=e(this),r=o(n.length),u=arguments.length,c=i(u>1?arguments[1]:void 0,r),f=u>2?arguments[2]:void 0,a=void 0===f?r:i(f,r);a>c;)n[c++]=t;return n}},function(t,n,r){"use strict";var e=r(48),i=r(140),o=r(55),u=r(22);t.exports=r(95)(Array,"Array",function(t,n){this._t=u(t),this._i=0,this._k=n},function(){var t=this._t,n=this._k,r=this._i++;return!t||r>=t.length?(this._t=void 0,i(1)):i(0,"keys"==n?r:"values"==n?t[r]:[r,t[r]])},"values"),o.Arguments=o.Array,e("keys"),e("values"),e("entries")},function(t,n,r){"use strict";var e,i,o=r(72),u=RegExp.prototype.exec,c=String.prototype.replace,f=u,a=(e=/a/,i=/b*/g,u.call(e,"a"),u.call(i,"a"),0!==e.lastIndex||0!==i.lastIndex),s=void 0!==/()??/.exec("")[1];(a||s)&&(f=function(t){var n,r,e,i,f=this;return s&&(r=new RegExp("^"+f.source+"$(?!\\s)",o.call(f))),a&&(n=f.lastIndex),e=u.call(f,t),a&&e&&(f.lastIndex=f.global?e.index+e[0].length:n),s&&e&&e.length>1&&c.call(e[0],r,function(){for(i=1;ir;)n.push(arguments[r++]);return g[++d]=function(){c("function"==typeof t?t:Function(t),n)},e(d),d},p=function(t){delete g[t]},"process"==r(32)(l)?e=function(t){l.nextTick(u(x,t,1))}:y&&y.now?e=function(t){y.now(u(x,t,1))}:v?(o=(i=new v).port2,i.port1.onmessage=m,e=u(o.postMessage,o,1)):s.addEventListener&&"function"==typeof postMessage&&!s.importScripts?(e=function(t){s.postMessage(t+"","*")},s.addEventListener("message",m,!1)):e="onreadystatechange"in a("script")?function(t){f.appendChild(a("script")).onreadystatechange=function(){f.removeChild(this),x.call(t)}}:function(t){setTimeout(u(x,t,1),0)}),t.exports={set:h,clear:p}},function(t,n,r){"use strict";var e=r(3),i=r(12),o=r(42),u=r(78),c=r(21),f=r(58),a=r(4),s=r(57),l=r(28),h=r(10),p=r(148),v=r(46).f,y=r(13).f,d=r(102),g=r(53),x="prototype",m="Wrong index!",b=e.ArrayBuffer,w=e.DataView,S=e.Math,_=e.RangeError,E=e.Infinity,O=b,P=S.abs,F=S.pow,M=S.floor,A=S.log,j=S.LN2,I=i?"_b":"buffer",N=i?"_l":"byteLength",T=i?"_o":"byteOffset";function L(t,n,r){var e,i,o,u=new Array(r),c=8*r-n-1,f=(1<>1,s=23===n?F(2,-24)-F(2,-77):0,l=0,h=t<0||0===t&&1/t<0?1:0;for((t=P(t))!=t||t===E?(i=t!=t?1:0,e=f):(e=M(A(t)/j),t*(o=F(2,-e))<1&&(e--,o*=2),(t+=e+a>=1?s/o:s*F(2,1-a))*o>=2&&(e++,o/=2),e+a>=f?(i=0,e=f):e+a>=1?(i=(t*o-1)*F(2,n),e+=a):(i=t*F(2,a-1)*F(2,n),e=0));n>=8;u[l++]=255&i,i/=256,n-=8);for(e=e<0;u[l++]=255&e,e/=256,c-=8);return u[--l]|=128*h,u}function R(t,n,r){var e,i=8*r-n-1,o=(1<>1,c=i-7,f=r-1,a=t[f--],s=127&a;for(a>>=7;c>0;s=256*s+t[f],f--,c-=8);for(e=s&(1<<-c)-1,s>>=-c,c+=n;c>0;e=256*e+t[f],f--,c-=8);if(0===s)s=1-u;else{if(s===o)return e?NaN:a?-E:E;e+=F(2,n),s-=u}return(a?-1:1)*e*F(2,s-n)}function k(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}function C(t){return[255&t]}function D(t){return[255&t,t>>8&255]}function W(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}function B(t){return L(t,52,8)}function G(t){return L(t,23,4)}function U(t,n,r){y(t[x],n,{get:function(){return this[r]}})}function V(t,n,r,e){var i=p(+r);if(i+n>t[N])throw _(m);var o=t[I]._b,u=i+t[T],c=o.slice(u,u+n);return e?c:c.reverse()}function z(t,n,r,e,i,o){var u=p(+r);if(u+n>t[N])throw _(m);for(var c=t[I]._b,f=u+t[T],a=e(+i),s=0;sK;)(Y=$[K++])in b||c(b,Y,O[Y]);o||(q.constructor=b)}var J=new w(new b(2)),X=w[x].setInt8;J.setInt8(0,2147483648),J.setInt8(1,2147483649),!J.getInt8(0)&&J.getInt8(1)||f(w[x],{setInt8:function(t,n){X.call(this,t,n<<24>>24)},setUint8:function(t,n){X.call(this,t,n<<24>>24)}},!0)}else b=function(t){s(this,b,"ArrayBuffer");var n=p(t);this._b=d.call(new Array(n),0),this[N]=n},w=function(t,n,r){s(this,w,"DataView"),s(t,b,"DataView");var e=t[N],i=l(n);if(i<0||i>e)throw _("Wrong offset!");if(i+(r=void 0===r?e-i:h(r))>e)throw _("Wrong length!");this[I]=t,this[T]=i,this[N]=r},i&&(U(b,"byteLength","_l"),U(w,"buffer","_b"),U(w,"byteLength","_l"),U(w,"byteOffset","_o")),f(w[x],{getInt8:function(t){return V(this,1,t)[0]<<24>>24},getUint8:function(t){return V(this,1,t)[0]},getInt16:function(t){var n=V(this,2,t,arguments[1]);return(n[1]<<8|n[0])<<16>>16},getUint16:function(t){var n=V(this,2,t,arguments[1]);return n[1]<<8|n[0]},getInt32:function(t){return k(V(this,4,t,arguments[1]))},getUint32:function(t){return k(V(this,4,t,arguments[1]))>>>0},getFloat32:function(t){return R(V(this,4,t,arguments[1]),23,4)},getFloat64:function(t){return R(V(this,8,t,arguments[1]),52,8)},setInt8:function(t,n){z(this,1,t,C,n)},setUint8:function(t,n){z(this,1,t,C,n)},setInt16:function(t,n){z(this,2,t,D,n,arguments[2])},setUint16:function(t,n){z(this,2,t,D,n,arguments[2])},setInt32:function(t,n){z(this,4,t,W,n,arguments[2])},setUint32:function(t,n){z(this,4,t,W,n,arguments[2])},setFloat32:function(t,n){z(this,4,t,G,n,arguments[2])},setFloat64:function(t,n){z(this,8,t,B,n,arguments[2])}});g(b,"ArrayBuffer"),g(w,"DataView"),c(w[x],u.VIEW,!0),n.ArrayBuffer=b,n.DataView=w},function(t,n,r){var e=function(t){"use strict";var n,r=Object.prototype,e=r.hasOwnProperty,i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",u=i.asyncIterator||"@@asyncIterator",c=i.toStringTag||"@@toStringTag";function f(t,n,r,e){var i=n&&n.prototype instanceof y?n:y,o=Object.create(i.prototype),u=new F(e||[]);return o._invoke=function(t,n,r){var e=s;return function(i,o){if(e===h)throw new Error("Generator is already running");if(e===p){if("throw"===i)throw o;return A()}for(r.method=i,r.arg=o;;){var u=r.delegate;if(u){var c=E(u,r);if(c){if(c===v)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(e===s)throw e=p,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);e=h;var f=a(t,n,r);if("normal"===f.type){if(e=r.done?p:l,f.arg===v)continue;return{value:f.arg,done:r.done}}"throw"===f.type&&(e=p,r.method="throw",r.arg=f.arg)}}}(t,r,u),o}function a(t,n,r){try{return{type:"normal",arg:t.call(n,r)}}catch(t){return{type:"throw",arg:t}}}t.wrap=f;var s="suspendedStart",l="suspendedYield",h="executing",p="completed",v={};function y(){}function d(){}function g(){}var x={};x[o]=function(){return this};var m=Object.getPrototypeOf,b=m&&m(m(M([])));b&&b!==r&&e.call(b,o)&&(x=b);var w=g.prototype=y.prototype=Object.create(x);function S(t){["next","throw","return"].forEach(function(n){t[n]=function(t){return this._invoke(n,t)}})}function _(t){var n;this._invoke=function(r,i){function o(){return new Promise(function(n,o){!function n(r,i,o,u){var c=a(t[r],t,i);if("throw"!==c.type){var f=c.arg,s=f.value;return s&&"object"==typeof s&&e.call(s,"__await")?Promise.resolve(s.__await).then(function(t){n("next",t,o,u)},function(t){n("throw",t,o,u)}):Promise.resolve(s).then(function(t){f.value=t,o(f)},function(t){return n("throw",t,o,u)})}u(c.arg)}(r,i,n,o)})}return n=n?n.then(o,o):o()}}function E(t,r){var e=t.iterator[r.method];if(e===n){if(r.delegate=null,"throw"===r.method){if(t.iterator.return&&(r.method="return",r.arg=n,E(t,r),"throw"===r.method))return v;r.method="throw",r.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var i=a(e,t.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,v;var o=i.arg;return o?o.done?(r[t.resultName]=o.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=n),r.delegate=null,v):o:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,v)}function O(t){var n={tryLoc:t[0]};1 in t&&(n.catchLoc=t[1]),2 in t&&(n.finallyLoc=t[2],n.afterLoc=t[3]),this.tryEntries.push(n)}function P(t){var n=t.completion||{};n.type="normal",delete n.arg,t.completion=n}function F(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(O,this),this.reset(!0)}function M(t){if(t){var r=t[o];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var i=-1,u=function r(){for(;++i=0;--o){var u=this.tryEntries[o],c=u.completion;if("root"===u.tryLoc)return i("end");if(u.tryLoc<=this.prev){var f=e.call(u,"catchLoc"),a=e.call(u,"finallyLoc");if(f&&a){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&e.call(i,"finallyLoc")&&this.prev=0;--n){var r=this.tryEntries[n];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),P(r),v}},catch:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc===t){var e=r.completion;if("throw"===e.type){var i=e.arg;P(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,e){return this.delegate={iterator:M(t),resultName:r,nextLoc:e},"next"===this.method&&(this.arg=n),v}},t}(t.exports);try{regeneratorRuntime=e}catch(t){Function("r","regeneratorRuntime = r")(e)}},function(t,n){var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n,r){t.exports=!r(153)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},,,,,,,,,,function(t,n,r){t.exports=!r(12)&&!r(4)(function(){return 7!=Object.defineProperty(r(83)("div"),"a",{get:function(){return 7}}).a})},function(t,n,r){var e=r(3),i=r(11),o=r(42),u=r(84),c=r(13).f;t.exports=function(t){var n=i.Symbol||(i.Symbol=o?{}:e.Symbol||{});"_"==t.charAt(0)||t in n||c(n,t,{value:u.f(t)})}},function(t,n,r){var e=r(20),i=r(22),o=r(68)(!1),u=r(85)("IE_PROTO");t.exports=function(t,n){var r,c=i(t),f=0,a=[];for(r in c)r!=u&&e(c,r)&&a.push(r);for(;n.length>f;)e(c,r=n[f++])&&(~o(a,r)||a.push(r));return a}},function(t,n,r){var e=r(13),i=r(5),o=r(43);t.exports=r(12)?Object.defineProperties:function(t,n){i(t);for(var r,u=o(n),c=u.length,f=0;c>f;)e.f(t,r=u[f++],n[r]);return t}},function(t,n,r){var e=r(22),i=r(46).f,o={}.toString,u="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return u&&"[object Window]"==o.call(t)?function(t){try{return i(t)}catch(t){return u.slice()}}(t):i(e(t))}},function(t,n,r){"use strict";var e=r(12),i=r(43),o=r(69),u=r(61),c=r(15),f=r(60),a=Object.assign;t.exports=!a||r(4)(function(){var t={},n={},r=Symbol(),e="abcdefghijklmnopqrst";return t[r]=7,e.split("").forEach(function(t){n[t]=t}),7!=a({},t)[r]||Object.keys(a({},n)).join("")!=e})?function(t,n){for(var r=c(t),a=arguments.length,s=1,l=o.f,h=u.f;a>s;)for(var p,v=f(arguments[s++]),y=l?i(v).concat(l(v)):i(v),d=y.length,g=0;d>g;)p=y[g++],e&&!h.call(v,p)||(r[p]=v[p]);return r}:a},function(t,n){t.exports=Object.is||function(t,n){return t===n?0!==t||1/t==1/n:t!=t&&n!=n}},function(t,n,r){"use strict";var e=r(27),i=r(6),o=r(129),u=[].slice,c={},f=function(t,n,r){if(!(n in c)){for(var e=[],i=0;i>>0||(u.test(r)?16:10))}:e},function(t,n,r){var e=r(3).parseFloat,i=r(54).trim;t.exports=1/e(r(89)+"-0")!=-1/0?function(t){var n=i(String(t),3),r=e(n);return 0===r&&"-"==n.charAt(0)?-0:r}:e},function(t,n,r){var e=r(32);t.exports=function(t,n){if("number"!=typeof t&&"Number"!=e(t))throw TypeError(n);return+t}},function(t,n,r){var e=r(6),i=Math.floor;t.exports=function(t){return!e(t)&&isFinite(t)&&i(t)===t}},function(t,n){t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},function(t,n,r){"use strict";var e=r(45),i=r(40),o=r(53),u={};r(21)(u,r(8)("iterator"),function(){return this}),t.exports=function(t,n,r){t.prototype=e(u,{next:i(1,r)}),o(t,n+" Iterator")}},function(t,n,r){var e=r(5);t.exports=function(t,n,r,i){try{return i?n(e(r)[0],r[1]):n(r)}catch(n){var o=t.return;throw void 0!==o&&e(o.call(t)),n}}},function(t,n,r){var e=r(392);t.exports=function(t,n){return new(e(t))(n)}},function(t,n,r){var e=r(27),i=r(15),o=r(60),u=r(10);t.exports=function(t,n,r,c,f){e(n);var a=i(t),s=o(a),l=u(a.length),h=f?l-1:0,p=f?-1:1;if(r<2)for(;;){if(h in s){c=s[h],h+=p;break}if(h+=p,f?h<0:l<=h)throw TypeError("Reduce of empty array with no initial value")}for(;f?h>=0:l>h;h+=p)h in s&&(c=n(c,s[h],h,a));return c}},function(t,n,r){"use strict";var e=r(15),i=r(44),o=r(10);t.exports=[].copyWithin||function(t,n){var r=e(this),u=o(r.length),c=i(t,u),f=i(n,u),a=arguments.length>2?arguments[2]:void 0,s=Math.min((void 0===a?u:i(a,u))-f,u-c),l=1;for(f0;)f in r?r[c]=r[f]:delete r[c],c+=l,f+=l;return r}},function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},function(t,n,r){"use strict";var e=r(104);r(1)({target:"RegExp",proto:!0,forced:e!==/./.exec},{exec:e})},function(t,n,r){r(12)&&"g"!=/./g.flags&&r(13).f(RegExp.prototype,"flags",{configurable:!0,get:r(72)})},function(t,n,r){"use strict";var e,i,o,u,c=r(42),f=r(3),a=r(26),s=r(62),l=r(1),h=r(6),p=r(27),v=r(57),y=r(75),d=r(63),g=r(106).set,x=r(412)(),m=r(144),b=r(413),w=r(76),S=r(145),_=f.TypeError,E=f.process,O=E&&E.versions,P=O&&O.v8||"",F=f.Promise,M="process"==s(E),A=function(){},j=i=m.f,I=!!function(){try{var t=F.resolve(1),n=(t.constructor={})[r(8)("species")]=function(t){t(A,A)};return(M||"function"==typeof PromiseRejectionEvent)&&t.then(A)instanceof n&&0!==P.indexOf("6.6")&&-1===w.indexOf("Chrome/66")}catch(t){}}(),N=function(t){var n;return!(!h(t)||"function"!=typeof(n=t.then))&&n},T=function(t,n){if(!t._n){t._n=!0;var r=t._c;x(function(){for(var e=t._v,i=1==t._s,o=0,u=function(n){var r,o,u,c=i?n.ok:n.fail,f=n.resolve,a=n.reject,s=n.domain;try{c?(i||(2==t._h&&k(t),t._h=1),!0===c?r=e:(s&&s.enter(),r=c(e),s&&(s.exit(),u=!0)),r===n.promise?a(_("Promise-chain cycle")):(o=N(r))?o.call(r,f,a):f(r)):a(e)}catch(t){s&&!u&&s.exit(),a(t)}};r.length>o;)u(r[o++]);t._c=[],t._n=!1,n&&!t._h&&L(t)})}},L=function(t){g.call(f,function(){var n,r,e,i=t._v,o=R(t);if(o&&(n=b(function(){M?E.emit("unhandledRejection",i,t):(r=f.onunhandledrejection)?r({promise:t,reason:i}):(e=f.console)&&e.error&&e.error("Unhandled promise rejection",i)}),t._h=M||R(t)?2:1),t._a=void 0,o&&n.e)throw n.v})},R=function(t){return 1!==t._h&&0===(t._a||t._c).length},k=function(t){g.call(f,function(){var n;M?E.emit("rejectionHandled",t):(n=f.onrejectionhandled)&&n({promise:t,reason:t._v})})},C=function(t){var n=this;n._d||(n._d=!0,(n=n._w||n)._v=t,n._s=2,n._a||(n._a=n._c.slice()),T(n,!0))},D=function(t){var n,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===t)throw _("Promise can't be resolved itself");(n=N(t))?x(function(){var e={_w:r,_d:!1};try{n.call(t,a(D,e,1),a(C,e,1))}catch(t){C.call(e,t)}}):(r._v=t,r._s=1,T(r,!1))}catch(t){C.call({_w:r,_d:!1},t)}}};I||(F=function(t){v(this,F,"Promise","_h"),p(t),e.call(this);try{t(a(D,this,1),a(C,this,1))}catch(t){C.call(this,t)}},(e=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=r(58)(F.prototype,{then:function(t,n){var r=j(d(this,F));return r.ok="function"!=typeof t||t,r.fail="function"==typeof n&&n,r.domain=M?E.domain:void 0,this._c.push(r),this._a&&this._a.push(r),this._s&&T(this,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new e;this.promise=t,this.resolve=a(D,t,1),this.reject=a(C,t,1)},m.f=j=function(t){return t===F||t===u?new o(t):i(t)}),l(l.G+l.W+l.F*!I,{Promise:F}),r(53)(F,"Promise"),r(56)("Promise"),u=r(11).Promise,l(l.S+l.F*!I,"Promise",{reject:function(t){var n=j(this);return(0,n.reject)(t),n.promise}}),l(l.S+l.F*(c||!I),"Promise",{resolve:function(t){return S(c&&this===u?F:this,t)}}),l(l.S+l.F*!(I&&r(71)(function(t){F.all(t).catch(A)})),"Promise",{all:function(t){var n=this,r=j(n),e=r.resolve,i=r.reject,o=b(function(){var r=[],o=0,u=1;y(t,!1,function(t){var c=o++,f=!1;r.push(void 0),u++,n.resolve(t).then(function(t){f||(f=!0,r[c]=t,--u||e(r))},i)}),--u||e(r)});return o.e&&i(o.v),r.promise},race:function(t){var n=this,r=j(n),e=r.reject,i=b(function(){y(t,!1,function(t){n.resolve(t).then(r.resolve,e)})});return i.e&&e(i.v),r.promise}})},function(t,n,r){"use strict";var e=r(27);function i(t){var n,r;this.promise=new t(function(t,e){if(void 0!==n||void 0!==r)throw TypeError("Bad Promise constructor");n=t,r=e}),this.resolve=e(n),this.reject=e(r)}t.exports.f=function(t){return new i(t)}},function(t,n,r){var e=r(5),i=r(6),o=r(144);t.exports=function(t,n){if(e(t),i(n)&&n.constructor===t)return n;var r=o.f(t);return(0,r.resolve)(n),r.promise}},function(t,n,r){"use strict";var e=r(13).f,i=r(45),o=r(58),u=r(26),c=r(57),f=r(75),a=r(95),s=r(140),l=r(56),h=r(12),p=r(37).fastKey,v=r(49),y=h?"_s":"size",d=function(t,n){var r,e=p(n);if("F"!==e)return t._i[e];for(r=t._f;r;r=r.n)if(r.k==n)return r};t.exports={getConstructor:function(t,n,r,a){var s=t(function(t,e){c(t,s,n,"_i"),t._t=n,t._i=i(null),t._f=void 0,t._l=void 0,t[y]=0,null!=e&&f(e,r,t[a],t)});return o(s.prototype,{clear:function(){for(var t=v(this,n),r=t._i,e=t._f;e;e=e.n)e.r=!0,e.p&&(e.p=e.p.n=void 0),delete r[e.i];t._f=t._l=void 0,t[y]=0},delete:function(t){var r=v(this,n),e=d(r,t);if(e){var i=e.n,o=e.p;delete r._i[e.i],e.r=!0,o&&(o.n=i),i&&(i.p=o),r._f==e&&(r._f=i),r._l==e&&(r._l=o),r[y]--}return!!e},forEach:function(t){v(this,n);for(var r,e=u(t,arguments.length>1?arguments[1]:void 0,3);r=r?r.n:this._f;)for(e(r.v,r.k,this);r&&r.r;)r=r.p},has:function(t){return!!d(v(this,n),t)}}),h&&e(s.prototype,"size",{get:function(){return v(this,n)[y]}}),s},def:function(t,n,r){var e,i,o=d(t,n);return o?o.v=r:(t._l=o={i:i=p(n,!0),k:n,v:r,p:e=t._l,n:void 0,r:!1},t._f||(t._f=o),e&&(e.n=o),t[y]++,"F"!==i&&(t._i[i]=o)),t},getEntry:d,setStrong:function(t,n,r){a(t,n,function(t,r){this._t=v(t,n),this._k=r,this._l=void 0},function(){for(var t=this._k,n=this._l;n&&n.r;)n=n.p;return this._t&&(this._l=n=n?n.n:this._t._f)?s(0,"keys"==t?n.k:"values"==t?n.v:[n.k,n.v]):(this._t=void 0,s(1))},r?"entries":"values",!r,!0),l(n)}}},function(t,n,r){"use strict";var e=r(58),i=r(37).getWeak,o=r(5),u=r(6),c=r(57),f=r(75),a=r(31),s=r(20),l=r(49),h=a(5),p=a(6),v=0,y=function(t){return t._l||(t._l=new d)},d=function(){this.a=[]},g=function(t,n){return h(t.a,function(t){return t[0]===n})};d.prototype={get:function(t){var n=g(this,t);if(n)return n[1]},has:function(t){return!!g(this,t)},set:function(t,n){var r=g(this,t);r?r[1]=n:this.a.push([t,n])},delete:function(t){var n=p(this.a,function(n){return n[0]===t});return~n&&this.a.splice(n,1),!!~n}},t.exports={getConstructor:function(t,n,r,o){var a=t(function(t,e){c(t,a,n,"_i"),t._t=n,t._i=v++,t._l=void 0,null!=e&&f(e,r,t[o],t)});return e(a.prototype,{delete:function(t){if(!u(t))return!1;var r=i(t);return!0===r?y(l(this,n)).delete(t):r&&s(r,this._i)&&delete r[this._i]},has:function(t){if(!u(t))return!1;var r=i(t);return!0===r?y(l(this,n)).has(t):r&&s(r,this._i)}}),a},def:function(t,n,r){var e=i(o(n),!0);return!0===e?y(t).set(n,r):e[t._i]=r,t},ufstore:y}},function(t,n,r){var e=r(28),i=r(10);t.exports=function(t){if(void 0===t)return 0;var n=e(t),r=i(n);if(n!==r)throw RangeError("Wrong length!");return r}},function(t,n,r){var e=r(46),i=r(69),o=r(5),u=r(3).Reflect;t.exports=u&&u.ownKeys||function(t){var n=e.f(o(t)),r=i.f;return r?n.concat(r(t)):n}},function(t,n,r){var e=r(10),i=r(91),o=r(33);t.exports=function(t,n,r,u){var c=String(o(t)),f=c.length,a=void 0===r?" ":String(r),s=e(n);if(s<=f||""==a)return c;var l=s-f,h=i.call(a,Math.ceil(l/a.length));return h.length>l&&(h=h.slice(0,l)),u?h+c:c+h}},function(t,n,r){var e=r(12),i=r(43),o=r(22),u=r(61).f;t.exports=function(t){return function(n){for(var r,c=o(n),f=i(c),a=f.length,s=0,l=[];a>s;)r=f[s++],e&&!u.call(c,r)||l.push(t?[r,c[r]]:c[r]);return l}}},function(t,n){var r=t.exports={version:"2.6.9"};"number"==typeof __e&&(__e=r)},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(t,n,r){r(622),r(623),t.exports=r(629)},function(t,n,r){"use strict";(function(t){function e(){return t._babelPolyfill||"undefined"!=typeof window&&window._babelPolyfill?null:r(298)}Object.defineProperty(n,"__esModule",{value:!0}),n.idempotentBabelPolyfill=e,n.default=void 0;var i=e();n.default=i}).call(this,r(24))},function(t,n,r){"use strict";r(299);var e,i=(e=r(470))&&e.__esModule?e:{default:e};i.default._babelPolyfill&&"undefined"!=typeof console&&console.warn&&console.warn("@babel/polyfill is loaded more than once on this page. This is probably not desirable/intended and may have consequences if different versions of the polyfills are applied sequentially. If you do need to load the polyfill more than once, use @babel/polyfill/noConflict instead to bypass the warning."),i.default._babelPolyfill=!0},function(t,n,r){"use strict";r(300),r(443),r(445),r(448),r(450),r(452),r(454),r(456),r(458),r(460),r(462),r(464),r(466),r(108)},function(t,n,r){r(301),r(304),r(305),r(306),r(307),r(308),r(309),r(310),r(311),r(312),r(313),r(314),r(315),r(316),r(317),r(318),r(319),r(320),r(321),r(322),r(323),r(324),r(325),r(326),r(327),r(328),r(329),r(330),r(331),r(332),r(333),r(334),r(335),r(336),r(337),r(338),r(339),r(340),r(341),r(342),r(343),r(344),r(345),r(347),r(348),r(349),r(350),r(351),r(352),r(353),r(354),r(355),r(356),r(357),r(358),r(359),r(360),r(361),r(362),r(363),r(364),r(365),r(366),r(367),r(368),r(369),r(370),r(371),r(372),r(373),r(374),r(375),r(376),r(377),r(378),r(379),r(380),r(382),r(383),r(385),r(386),r(387),r(388),r(389),r(390),r(391),r(393),r(394),r(395),r(396),r(397),r(398),r(399),r(400),r(401),r(402),r(403),r(404),r(405),r(103),r(406),r(141),r(407),r(142),r(408),r(409),r(410),r(411),r(143),r(414),r(415),r(416),r(417),r(418),r(419),r(420),r(421),r(422),r(423),r(424),r(425),r(426),r(427),r(428),r(429),r(430),r(431),r(432),r(433),r(434),r(435),r(436),r(437),r(438),r(439),r(440),r(441),r(442),t.exports=r(11)},function(t,n,r){"use strict";var e=r(3),i=r(20),o=r(12),u=r(1),c=r(17),f=r(37).KEY,a=r(4),s=r(67),l=r(53),h=r(41),p=r(8),v=r(84),y=r(122),d=r(303),g=r(70),x=r(5),m=r(6),b=r(15),w=r(22),S=r(36),_=r(40),E=r(45),O=r(125),P=r(29),F=r(69),M=r(13),A=r(43),j=P.f,I=M.f,N=O.f,T=e.Symbol,L=e.JSON,R=L&&L.stringify,k=p("_hidden"),C=p("toPrimitive"),D={}.propertyIsEnumerable,W=s("symbol-registry"),B=s("symbols"),G=s("op-symbols"),U=Object.prototype,V="function"==typeof T&&!!F.f,z=e.QObject,Y=!z||!z.prototype||!z.prototype.findChild,q=o&&a(function(){return 7!=E(I({},"a",{get:function(){return I(this,"a",{value:7}).a}})).a})?function(t,n,r){var e=j(U,n);e&&delete U[n],I(t,n,r),e&&t!==U&&I(U,n,e)}:I,$=function(t){var n=B[t]=E(T.prototype);return n._k=t,n},K=V&&"symbol"==typeof T.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof T},J=function(t,n,r){return t===U&&J(G,n,r),x(t),n=S(n,!0),x(r),i(B,n)?(r.enumerable?(i(t,k)&&t[k][n]&&(t[k][n]=!1),r=E(r,{enumerable:_(0,!1)})):(i(t,k)||I(t,k,_(1,{})),t[k][n]=!0),q(t,n,r)):I(t,n,r)},X=function(t,n){x(t);for(var r,e=d(n=w(n)),i=0,o=e.length;o>i;)J(t,r=e[i++],n[r]);return t},H=function(t){var n=D.call(this,t=S(t,!0));return!(this===U&&i(B,t)&&!i(G,t))&&(!(n||!i(this,t)||!i(B,t)||i(this,k)&&this[k][t])||n)},Z=function(t,n){if(t=w(t),n=S(n,!0),t!==U||!i(B,n)||i(G,n)){var r=j(t,n);return!r||!i(B,n)||i(t,k)&&t[k][n]||(r.enumerable=!0),r}},Q=function(t){for(var n,r=N(w(t)),e=[],o=0;r.length>o;)i(B,n=r[o++])||n==k||n==f||e.push(n);return e},tt=function(t){for(var n,r=t===U,e=N(r?G:w(t)),o=[],u=0;e.length>u;)!i(B,n=e[u++])||r&&!i(U,n)||o.push(B[n]);return o};V||(c((T=function(){if(this instanceof T)throw TypeError("Symbol is not a constructor!");var t=h(arguments.length>0?arguments[0]:void 0),n=function(r){this===U&&n.call(G,r),i(this,k)&&i(this[k],t)&&(this[k][t]=!1),q(this,t,_(1,r))};return o&&Y&&q(U,t,{configurable:!0,set:n}),$(t)}).prototype,"toString",function(){return this._k}),P.f=Z,M.f=J,r(46).f=O.f=Q,r(61).f=H,F.f=tt,o&&!r(42)&&c(U,"propertyIsEnumerable",H,!0),v.f=function(t){return $(p(t))}),u(u.G+u.W+u.F*!V,{Symbol:T});for(var nt="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),rt=0;nt.length>rt;)p(nt[rt++]);for(var et=A(p.store),it=0;et.length>it;)y(et[it++]);u(u.S+u.F*!V,"Symbol",{for:function(t){return i(W,t+="")?W[t]:W[t]=T(t)},keyFor:function(t){if(!K(t))throw TypeError(t+" is not a symbol!");for(var n in W)if(W[n]===t)return n},useSetter:function(){Y=!0},useSimple:function(){Y=!1}}),u(u.S+u.F*!V,"Object",{create:function(t,n){return void 0===n?E(t):X(E(t),n)},defineProperty:J,defineProperties:X,getOwnPropertyDescriptor:Z,getOwnPropertyNames:Q,getOwnPropertySymbols:tt});var ot=a(function(){F.f(1)});u(u.S+u.F*ot,"Object",{getOwnPropertySymbols:function(t){return F.f(b(t))}}),L&&u(u.S+u.F*(!V||a(function(){var t=T();return"[null]"!=R([t])||"{}"!=R({a:t})||"{}"!=R(Object(t))})),"JSON",{stringify:function(t){for(var n,r,e=[t],i=1;arguments.length>i;)e.push(arguments[i++]);if(r=n=e[1],(m(n)||void 0!==t)&&!K(t))return g(n)||(n=function(t,n){if("function"==typeof r&&(n=r.call(this,t,n)),!K(n))return n}),e[1]=n,R.apply(L,e)}}),T.prototype[C]||r(21)(T.prototype,C,T.prototype.valueOf),l(T,"Symbol"),l(Math,"Math",!0),l(e.JSON,"JSON",!0)},function(t,n,r){t.exports=r(67)("native-function-to-string",Function.toString)},function(t,n,r){var e=r(43),i=r(69),o=r(61);t.exports=function(t){var n=e(t),r=i.f;if(r)for(var u,c=r(t),f=o.f,a=0;c.length>a;)f.call(t,u=c[a++])&&n.push(u);return n}},function(t,n,r){var e=r(1);e(e.S,"Object",{create:r(45)})},function(t,n,r){var e=r(1);e(e.S+e.F*!r(12),"Object",{defineProperty:r(13).f})},function(t,n,r){var e=r(1);e(e.S+e.F*!r(12),"Object",{defineProperties:r(124)})},function(t,n,r){var e=r(22),i=r(29).f;r(30)("getOwnPropertyDescriptor",function(){return function(t,n){return i(e(t),n)}})},function(t,n,r){var e=r(15),i=r(47);r(30)("getPrototypeOf",function(){return function(t){return i(e(t))}})},function(t,n,r){var e=r(15),i=r(43);r(30)("keys",function(){return function(t){return i(e(t))}})},function(t,n,r){r(30)("getOwnPropertyNames",function(){return r(125).f})},function(t,n,r){var e=r(6),i=r(37).onFreeze;r(30)("freeze",function(t){return function(n){return t&&e(n)?t(i(n)):n}})},function(t,n,r){var e=r(6),i=r(37).onFreeze;r(30)("seal",function(t){return function(n){return t&&e(n)?t(i(n)):n}})},function(t,n,r){var e=r(6),i=r(37).onFreeze;r(30)("preventExtensions",function(t){return function(n){return t&&e(n)?t(i(n)):n}})},function(t,n,r){var e=r(6);r(30)("isFrozen",function(t){return function(n){return!e(n)||!!t&&t(n)}})},function(t,n,r){var e=r(6);r(30)("isSealed",function(t){return function(n){return!e(n)||!!t&&t(n)}})},function(t,n,r){var e=r(6);r(30)("isExtensible",function(t){return function(n){return!!e(n)&&(!t||t(n))}})},function(t,n,r){var e=r(1);e(e.S+e.F,"Object",{assign:r(126)})},function(t,n,r){var e=r(1);e(e.S,"Object",{is:r(127)})},function(t,n,r){var e=r(1);e(e.S,"Object",{setPrototypeOf:r(88).set})},function(t,n,r){"use strict";var e=r(62),i={};i[r(8)("toStringTag")]="z",i+""!="[object z]"&&r(17)(Object.prototype,"toString",function(){return"[object "+e(this)+"]"},!0)},function(t,n,r){var e=r(1);e(e.P,"Function",{bind:r(128)})},function(t,n,r){var e=r(13).f,i=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in i||r(12)&&e(i,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(t){return""}}})},function(t,n,r){"use strict";var e=r(6),i=r(47),o=r(8)("hasInstance"),u=Function.prototype;o in u||r(13).f(u,o,{value:function(t){if("function"!=typeof this||!e(t))return!1;if(!e(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})},function(t,n,r){var e=r(1),i=r(130);e(e.G+e.F*(parseInt!=i),{parseInt:i})},function(t,n,r){var e=r(1),i=r(131);e(e.G+e.F*(parseFloat!=i),{parseFloat:i})},function(t,n,r){"use strict";var e=r(3),i=r(20),o=r(32),u=r(90),c=r(36),f=r(4),a=r(46).f,s=r(29).f,l=r(13).f,h=r(54).trim,p=e.Number,v=p,y=p.prototype,d="Number"==o(r(45)(y)),g="trim"in String.prototype,x=function(t){var n=c(t,!1);if("string"==typeof n&&n.length>2){var r,e,i,o=(n=g?n.trim():h(n,3)).charCodeAt(0);if(43===o||45===o){if(88===(r=n.charCodeAt(2))||120===r)return NaN}else if(48===o){switch(n.charCodeAt(1)){case 66:case 98:e=2,i=49;break;case 79:case 111:e=8,i=55;break;default:return+n}for(var u,f=n.slice(2),a=0,s=f.length;ai)return NaN;return parseInt(f,e)}}return+n};if(!p(" 0o1")||!p("0b1")||p("+0x1")){p=function(t){var n=arguments.length<1?0:t,r=this;return r instanceof p&&(d?f(function(){y.valueOf.call(r)}):"Number"!=o(r))?u(new v(x(n)),r,p):x(n)};for(var m,b=r(12)?a(v):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),w=0;b.length>w;w++)i(v,m=b[w])&&!i(p,m)&&l(p,m,s(v,m));p.prototype=y,y.constructor=p,r(17)(e,"Number",p)}},function(t,n,r){"use strict";var e=r(1),i=r(28),o=r(132),u=r(91),c=1..toFixed,f=Math.floor,a=[0,0,0,0,0,0],s="Number.toFixed: incorrect invocation!",l=function(t,n){for(var r=-1,e=n;++r<6;)e+=t*a[r],a[r]=e%1e7,e=f(e/1e7)},h=function(t){for(var n=6,r=0;--n>=0;)r+=a[n],a[n]=f(r/t),r=r%t*1e7},p=function(){for(var t=6,n="";--t>=0;)if(""!==n||0===t||0!==a[t]){var r=String(a[t]);n=""===n?r:n+u.call("0",7-r.length)+r}return n},v=function(t,n,r){return 0===n?r:n%2==1?v(t,n-1,r*t):v(t*t,n/2,r)};e(e.P+e.F*(!!c&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!r(4)(function(){c.call({})})),"Number",{toFixed:function(t){var n,r,e,c,f=o(this,s),a=i(t),y="",d="0";if(a<0||a>20)throw RangeError(s);if(f!=f)return"NaN";if(f<=-1e21||f>=1e21)return String(f);if(f<0&&(y="-",f=-f),f>1e-21)if(r=(n=function(t){for(var n=0,r=t;r>=4096;)n+=12,r/=4096;for(;r>=2;)n+=1,r/=2;return n}(f*v(2,69,1))-69)<0?f*v(2,-n,1):f/v(2,n,1),r*=4503599627370496,(n=52-n)>0){for(l(0,r),e=a;e>=7;)l(1e7,0),e-=7;for(l(v(10,e,1),0),e=n-1;e>=23;)h(1<<23),e-=23;h(1<0?y+((c=d.length)<=a?"0."+u.call("0",a-c)+d:d.slice(0,c-a)+"."+d.slice(c-a)):y+d}})},function(t,n,r){"use strict";var e=r(1),i=r(4),o=r(132),u=1..toPrecision;e(e.P+e.F*(i(function(){return"1"!==u.call(1,void 0)})||!i(function(){u.call({})})),"Number",{toPrecision:function(t){var n=o(this,"Number#toPrecision: incorrect invocation!");return void 0===t?u.call(n):u.call(n,t)}})},function(t,n,r){var e=r(1);e(e.S,"Number",{EPSILON:Math.pow(2,-52)})},function(t,n,r){var e=r(1),i=r(3).isFinite;e(e.S,"Number",{isFinite:function(t){return"number"==typeof t&&i(t)}})},function(t,n,r){var e=r(1);e(e.S,"Number",{isInteger:r(133)})},function(t,n,r){var e=r(1);e(e.S,"Number",{isNaN:function(t){return t!=t}})},function(t,n,r){var e=r(1),i=r(133),o=Math.abs;e(e.S,"Number",{isSafeInteger:function(t){return i(t)&&o(t)<=9007199254740991}})},function(t,n,r){var e=r(1);e(e.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(t,n,r){var e=r(1);e(e.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(t,n,r){var e=r(1),i=r(131);e(e.S+e.F*(Number.parseFloat!=i),"Number",{parseFloat:i})},function(t,n,r){var e=r(1),i=r(130);e(e.S+e.F*(Number.parseInt!=i),"Number",{parseInt:i})},function(t,n,r){var e=r(1),i=r(134),o=Math.sqrt,u=Math.acosh;e(e.S+e.F*!(u&&710==Math.floor(u(Number.MAX_VALUE))&&u(1/0)==1/0),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+o(t-1)*o(t+1))}})},function(t,n,r){var e=r(1),i=Math.asinh;e(e.S+e.F*!(i&&1/i(0)>0),"Math",{asinh:function t(n){return isFinite(n=+n)&&0!=n?n<0?-t(-n):Math.log(n+Math.sqrt(n*n+1)):n}})},function(t,n,r){var e=r(1),i=Math.atanh;e(e.S+e.F*!(i&&1/i(-0)<0),"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},function(t,n,r){var e=r(1),i=r(92);e(e.S,"Math",{cbrt:function(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},function(t,n,r){var e=r(1);e(e.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},function(t,n,r){var e=r(1),i=Math.exp;e(e.S,"Math",{cosh:function(t){return(i(t=+t)+i(-t))/2}})},function(t,n,r){var e=r(1),i=r(93);e(e.S+e.F*(i!=Math.expm1),"Math",{expm1:i})},function(t,n,r){var e=r(1);e(e.S,"Math",{fround:r(346)})},function(t,n,r){var e=r(92),i=Math.pow,o=i(2,-52),u=i(2,-23),c=i(2,127)*(2-u),f=i(2,-126);t.exports=Math.fround||function(t){var n,r,i=Math.abs(t),a=e(t);return ic||r!=r?a*(1/0):a*r}},function(t,n,r){var e=r(1),i=Math.abs;e(e.S,"Math",{hypot:function(t,n){for(var r,e,o=0,u=0,c=arguments.length,f=0;u0?(e=r/f)*e:r;return f===1/0?1/0:f*Math.sqrt(o)}})},function(t,n,r){var e=r(1),i=Math.imul;e(e.S+e.F*r(4)(function(){return-5!=i(4294967295,5)||2!=i.length}),"Math",{imul:function(t,n){var r=+t,e=+n,i=65535&r,o=65535&e;return 0|i*o+((65535&r>>>16)*o+i*(65535&e>>>16)<<16>>>0)}})},function(t,n,r){var e=r(1);e(e.S,"Math",{log10:function(t){return Math.log(t)*Math.LOG10E}})},function(t,n,r){var e=r(1);e(e.S,"Math",{log1p:r(134)})},function(t,n,r){var e=r(1);e(e.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},function(t,n,r){var e=r(1);e(e.S,"Math",{sign:r(92)})},function(t,n,r){var e=r(1),i=r(93),o=Math.exp;e(e.S+e.F*r(4)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(o(t-1)-o(-t-1))*(Math.E/2)}})},function(t,n,r){var e=r(1),i=r(93),o=Math.exp;e(e.S,"Math",{tanh:function(t){var n=i(t=+t),r=i(-t);return n==1/0?1:r==1/0?-1:(n-r)/(o(t)+o(-t))}})},function(t,n,r){var e=r(1);e(e.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},function(t,n,r){var e=r(1),i=r(44),o=String.fromCharCode,u=String.fromCodePoint;e(e.S+e.F*(!!u&&1!=u.length),"String",{fromCodePoint:function(t){for(var n,r=[],e=arguments.length,u=0;e>u;){if(n=+arguments[u++],i(n,1114111)!==n)throw RangeError(n+" is not a valid code point");r.push(n<65536?o(n):o(55296+((n-=65536)>>10),n%1024+56320))}return r.join("")}})},function(t,n,r){var e=r(1),i=r(22),o=r(10);e(e.S,"String",{raw:function(t){for(var n=i(t.raw),r=o(n.length),e=arguments.length,u=[],c=0;r>c;)u.push(String(n[c++])),c=n.length?{value:void 0,done:!0}:(t=e(n,r),this._i+=t.length,{value:t,done:!1})})},function(t,n,r){"use strict";var e=r(1),i=r(94)(!1);e(e.P,"String",{codePointAt:function(t){return i(this,t)}})},function(t,n,r){"use strict";var e=r(1),i=r(10),o=r(96),u="".endsWith;e(e.P+e.F*r(98)("endsWith"),"String",{endsWith:function(t){var n=o(this,t,"endsWith"),r=arguments.length>1?arguments[1]:void 0,e=i(n.length),c=void 0===r?e:Math.min(i(r),e),f=String(t);return u?u.call(n,f,c):n.slice(c-f.length,c)===f}})},function(t,n,r){"use strict";var e=r(1),i=r(96);e(e.P+e.F*r(98)("includes"),"String",{includes:function(t){return!!~i(this,t,"includes").indexOf(t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,r){var e=r(1);e(e.P,"String",{repeat:r(91)})},function(t,n,r){"use strict";var e=r(1),i=r(10),o=r(96),u="".startsWith;e(e.P+e.F*r(98)("startsWith"),"String",{startsWith:function(t){var n=o(this,t,"startsWith"),r=i(Math.min(arguments.length>1?arguments[1]:void 0,n.length)),e=String(t);return u?u.call(n,e,r):n.slice(r,r+e.length)===e}})},function(t,n,r){"use strict";r(18)("anchor",function(t){return function(n){return t(this,"a","name",n)}})},function(t,n,r){"use strict";r(18)("big",function(t){return function(){return t(this,"big","","")}})},function(t,n,r){"use strict";r(18)("blink",function(t){return function(){return t(this,"blink","","")}})},function(t,n,r){"use strict";r(18)("bold",function(t){return function(){return t(this,"b","","")}})},function(t,n,r){"use strict";r(18)("fixed",function(t){return function(){return t(this,"tt","","")}})},function(t,n,r){"use strict";r(18)("fontcolor",function(t){return function(n){return t(this,"font","color",n)}})},function(t,n,r){"use strict";r(18)("fontsize",function(t){return function(n){return t(this,"font","size",n)}})},function(t,n,r){"use strict";r(18)("italics",function(t){return function(){return t(this,"i","","")}})},function(t,n,r){"use strict";r(18)("link",function(t){return function(n){return t(this,"a","href",n)}})},function(t,n,r){"use strict";r(18)("small",function(t){return function(){return t(this,"small","","")}})},function(t,n,r){"use strict";r(18)("strike",function(t){return function(){return t(this,"strike","","")}})},function(t,n,r){"use strict";r(18)("sub",function(t){return function(){return t(this,"sub","","")}})},function(t,n,r){"use strict";r(18)("sup",function(t){return function(){return t(this,"sup","","")}})},function(t,n,r){var e=r(1);e(e.S,"Date",{now:function(){return(new Date).getTime()}})},function(t,n,r){"use strict";var e=r(1),i=r(15),o=r(36);e(e.P+e.F*r(4)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function(t){var n=i(this),r=o(n);return"number"!=typeof r||isFinite(r)?n.toISOString():null}})},function(t,n,r){var e=r(1),i=r(381);e(e.P+e.F*(Date.prototype.toISOString!==i),"Date",{toISOString:i})},function(t,n,r){"use strict";var e=r(4),i=Date.prototype.getTime,o=Date.prototype.toISOString,u=function(t){return t>9?t:"0"+t};t.exports=e(function(){return"0385-07-25T07:06:39.999Z"!=o.call(new Date(-5e13-1))})||!e(function(){o.call(new Date(NaN))})?function(){if(!isFinite(i.call(this)))throw RangeError("Invalid time value");var t=this,n=t.getUTCFullYear(),r=t.getUTCMilliseconds(),e=n<0?"-":n>9999?"+":"";return e+("00000"+Math.abs(n)).slice(e?-6:-4)+"-"+u(t.getUTCMonth()+1)+"-"+u(t.getUTCDate())+"T"+u(t.getUTCHours())+":"+u(t.getUTCMinutes())+":"+u(t.getUTCSeconds())+"."+(r>99?r:"0"+u(r))+"Z"}:o},function(t,n,r){var e=Date.prototype,i=e.toString,o=e.getTime;new Date(NaN)+""!="Invalid Date"&&r(17)(e,"toString",function(){var t=o.call(this);return t==t?i.call(this):"Invalid Date"})},function(t,n,r){var e=r(8)("toPrimitive"),i=Date.prototype;e in i||r(21)(i,e,r(384))},function(t,n,r){"use strict";var e=r(5),i=r(36);t.exports=function(t){if("string"!==t&&"number"!==t&&"default"!==t)throw TypeError("Incorrect hint");return i(e(this),"number"!=t)}},function(t,n,r){var e=r(1);e(e.S,"Array",{isArray:r(70)})},function(t,n,r){"use strict";var e=r(26),i=r(1),o=r(15),u=r(136),c=r(99),f=r(10),a=r(100),s=r(101);i(i.S+i.F*!r(71)(function(t){Array.from(t)}),"Array",{from:function(t){var n,r,i,l,h=o(t),p="function"==typeof this?this:Array,v=arguments.length,y=v>1?arguments[1]:void 0,d=void 0!==y,g=0,x=s(h);if(d&&(y=e(y,v>2?arguments[2]:void 0,2)),null==x||p==Array&&c(x))for(r=new p(n=f(h.length));n>g;g++)a(r,g,d?y(h[g],g):h[g]);else for(l=x.call(h),r=new p;!(i=l.next()).done;g++)a(r,g,d?u(l,y,[i.value,g],!0):i.value);return r.length=g,r}})},function(t,n,r){"use strict";var e=r(1),i=r(100);e(e.S+e.F*r(4)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,n=arguments.length,r=new("function"==typeof this?this:Array)(n);n>t;)i(r,t,arguments[t++]);return r.length=n,r}})},function(t,n,r){"use strict";var e=r(1),i=r(22),o=[].join;e(e.P+e.F*(r(60)!=Object||!r(25)(o)),"Array",{join:function(t){return o.call(i(this),void 0===t?",":t)}})},function(t,n,r){"use strict";var e=r(1),i=r(87),o=r(32),u=r(44),c=r(10),f=[].slice;e(e.P+e.F*r(4)(function(){i&&f.call(i)}),"Array",{slice:function(t,n){var r=c(this.length),e=o(this);if(n=void 0===n?r:n,"Array"==e)return f.call(this,t,n);for(var i=u(t,r),a=u(n,r),s=c(a-i),l=new Array(s),h=0;h1&&(e=Math.min(e,o(arguments[1]))),e<0&&(e=r+e);e>=0;e--)if(e in n&&n[e]===t)return e||0;return-1}})},function(t,n,r){var e=r(1);e(e.P,"Array",{copyWithin:r(139)}),r(48)("copyWithin")},function(t,n,r){var e=r(1);e(e.P,"Array",{fill:r(102)}),r(48)("fill")},function(t,n,r){"use strict";var e=r(1),i=r(31)(5),o=!0;"find"in[]&&Array(1).find(function(){o=!1}),e(e.P+e.F*o,"Array",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),r(48)("find")},function(t,n,r){"use strict";var e=r(1),i=r(31)(6),o="findIndex",u=!0;o in[]&&Array(1)[o](function(){u=!1}),e(e.P+e.F*u,"Array",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),r(48)(o)},function(t,n,r){r(56)("Array")},function(t,n,r){var e=r(3),i=r(90),o=r(13).f,u=r(46).f,c=r(97),f=r(72),a=e.RegExp,s=a,l=a.prototype,h=/a/g,p=/a/g,v=new a(h)!==h;if(r(12)&&(!v||r(4)(function(){return p[r(8)("match")]=!1,a(h)!=h||a(p)==p||"/a/i"!=a(h,"i")}))){a=function(t,n){var r=this instanceof a,e=c(t),o=void 0===n;return!r&&e&&t.constructor===a&&o?t:i(v?new s(e&&!o?t.source:t,n):s((e=t instanceof a)?t.source:t,e&&o?f.call(t):n),r?this:l,a)};for(var y=function(t){t in a||o(a,t,{configurable:!0,get:function(){return s[t]},set:function(n){s[t]=n}})},d=u(s),g=0;d.length>g;)y(d[g++]);l.constructor=a,a.prototype=l,r(17)(e,"RegExp",a)}r(56)("RegExp")},function(t,n,r){"use strict";r(142);var e=r(5),i=r(72),o=r(12),u=/./.toString,c=function(t){r(17)(RegExp.prototype,"toString",t,!0)};r(4)(function(){return"/a/b"!=u.call({source:"a",flags:"b"})})?c(function(){var t=e(this);return"/".concat(t.source,"/","flags"in t?t.flags:!o&&t instanceof RegExp?i.call(t):void 0)}):"toString"!=u.name&&c(function(){return u.call(this)})},function(t,n,r){"use strict";var e=r(5),i=r(10),o=r(105),u=r(73);r(74)("match",1,function(t,n,r,c){return[function(r){var e=t(this),i=null==r?void 0:r[n];return void 0!==i?i.call(r,e):new RegExp(r)[n](String(e))},function(t){var n=c(r,t,this);if(n.done)return n.value;var f=e(t),a=String(this);if(!f.global)return u(f,a);var s=f.unicode;f.lastIndex=0;for(var l,h=[],p=0;null!==(l=u(f,a));){var v=String(l[0]);h[p]=v,""===v&&(f.lastIndex=o(a,i(f.lastIndex),s)),p++}return 0===p?null:h}]})},function(t,n,r){"use strict";var e=r(5),i=r(15),o=r(10),u=r(28),c=r(105),f=r(73),a=Math.max,s=Math.min,l=Math.floor,h=/\$([$&`']|\d\d?|<[^>]*>)/g,p=/\$([$&`']|\d\d?)/g;r(74)("replace",2,function(t,n,r,v){return[function(e,i){var o=t(this),u=null==e?void 0:e[n];return void 0!==u?u.call(e,o,i):r.call(String(o),e,i)},function(t,n){var i=v(r,t,this,n);if(i.done)return i.value;var l=e(t),h=String(this),p="function"==typeof n;p||(n=String(n));var d=l.global;if(d){var g=l.unicode;l.lastIndex=0}for(var x=[];;){var m=f(l,h);if(null===m)break;if(x.push(m),!d)break;""===String(m[0])&&(l.lastIndex=c(h,o(l.lastIndex),g))}for(var b,w="",S=0,_=0;_=S&&(w+=h.slice(S,O)+j,S=O+E.length)}return w+h.slice(S)}];function y(t,n,e,o,u,c){var f=e+t.length,a=o.length,s=p;return void 0!==u&&(u=i(u),s=h),r.call(c,s,function(r,i){var c;switch(i.charAt(0)){case"$":return"$";case"&":return t;case"`":return n.slice(0,e);case"'":return n.slice(f);case"<":c=u[i.slice(1,-1)];break;default:var s=+i;if(0===s)return r;if(s>a){var h=l(s/10);return 0===h?r:h<=a?void 0===o[h-1]?i.charAt(1):o[h-1]+i.charAt(1):r}c=o[s-1]}return void 0===c?"":c})}})},function(t,n,r){"use strict";var e=r(5),i=r(127),o=r(73);r(74)("search",1,function(t,n,r,u){return[function(r){var e=t(this),i=null==r?void 0:r[n];return void 0!==i?i.call(r,e):new RegExp(r)[n](String(e))},function(t){var n=u(r,t,this);if(n.done)return n.value;var c=e(t),f=String(this),a=c.lastIndex;i(a,0)||(c.lastIndex=0);var s=o(c,f);return i(c.lastIndex,a)||(c.lastIndex=a),null===s?-1:s.index}]})},function(t,n,r){"use strict";var e=r(97),i=r(5),o=r(63),u=r(105),c=r(10),f=r(73),a=r(104),s=r(4),l=Math.min,h=[].push,p=!s(function(){RegExp(4294967295,"y")});r(74)("split",2,function(t,n,r,s){var v;return v="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var i=String(this);if(void 0===t&&0===n)return[];if(!e(t))return r.call(i,t,n);for(var o,u,c,f=[],s=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),l=0,p=void 0===n?4294967295:n>>>0,v=new RegExp(t.source,s+"g");(o=a.call(v,i))&&!((u=v.lastIndex)>l&&(f.push(i.slice(l,o.index)),o.length>1&&o.index=p));)v.lastIndex===o.index&&v.lastIndex++;return l===i.length?!c&&v.test("")||f.push(""):f.push(i.slice(l)),f.length>p?f.slice(0,p):f}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:r.call(this,t,n)}:r,[function(r,e){var i=t(this),o=null==r?void 0:r[n];return void 0!==o?o.call(r,i,e):v.call(String(i),r,e)},function(t,n){var e=s(v,t,this,n,v!==r);if(e.done)return e.value;var a=i(t),h=String(this),y=o(a,RegExp),d=a.unicode,g=(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.unicode?"u":"")+(p?"y":"g"),x=new y(p?a:"^(?:"+a.source+")",g),m=void 0===n?4294967295:n>>>0;if(0===m)return[];if(0===h.length)return null===f(x,h)?[h]:[];for(var b=0,w=0,S=[];w0?arguments[0]:void 0)}},{get:function(t){var n=e.getEntry(i(this,"Map"),t);return n&&n.v},set:function(t,n){return e.def(i(this,"Map"),0===t?0:t,n)}},e,!0)},function(t,n,r){"use strict";var e=r(146),i=r(49);t.exports=r(77)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return e.def(i(this,"Set"),t=0===t?0:t,t)}},e)},function(t,n,r){"use strict";var e,i=r(3),o=r(31)(0),u=r(17),c=r(37),f=r(126),a=r(147),s=r(6),l=r(49),h=r(49),p=!i.ActiveXObject&&"ActiveXObject"in i,v=c.getWeak,y=Object.isExtensible,d=a.ufstore,g=function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},x={get:function(t){if(s(t)){var n=v(t);return!0===n?d(l(this,"WeakMap")).get(t):n?n[this._i]:void 0}},set:function(t,n){return a.def(l(this,"WeakMap"),t,n)}},m=t.exports=r(77)("WeakMap",g,x,a,!0,!0);h&&p&&(f((e=a.getConstructor(g,"WeakMap")).prototype,x),c.NEED=!0,o(["delete","has","get","set"],function(t){var n=m.prototype,r=n[t];u(n,t,function(n,i){if(s(n)&&!y(n)){this._f||(this._f=new e);var o=this._f[t](n,i);return"set"==t?this:o}return r.call(this,n,i)})}))},function(t,n,r){"use strict";var e=r(147),i=r(49);r(77)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return e.def(i(this,"WeakSet"),t,!0)}},e,!1,!0)},function(t,n,r){"use strict";var e=r(1),i=r(78),o=r(107),u=r(5),c=r(44),f=r(10),a=r(6),s=r(3).ArrayBuffer,l=r(63),h=o.ArrayBuffer,p=o.DataView,v=i.ABV&&s.isView,y=h.prototype.slice,d=i.VIEW;e(e.G+e.W+e.F*(s!==h),{ArrayBuffer:h}),e(e.S+e.F*!i.CONSTR,"ArrayBuffer",{isView:function(t){return v&&v(t)||a(t)&&d in t}}),e(e.P+e.U+e.F*r(4)(function(){return!new h(2).slice(1,void 0).byteLength}),"ArrayBuffer",{slice:function(t,n){if(void 0!==y&&void 0===n)return y.call(u(this),t);for(var r=u(this).byteLength,e=c(t,r),i=c(void 0===n?r:n,r),o=new(l(this,h))(f(i-e)),a=new p(this),s=new p(o),v=0;e=n.length)return{value:void 0,done:!0}}while(!((t=n[this._i++])in this._t));return{value:t,done:!1}}),e(e.S,"Reflect",{enumerate:function(t){return new o(t)}})},function(t,n,r){var e=r(29),i=r(47),o=r(20),u=r(1),c=r(6),f=r(5);u(u.S,"Reflect",{get:function t(n,r){var u,a,s=arguments.length<3?n:arguments[2];return f(n)===s?n[r]:(u=e.f(n,r))?o(u,"value")?u.value:void 0!==u.get?u.get.call(s):void 0:c(a=i(n))?t(a,r,s):void 0}})},function(t,n,r){var e=r(29),i=r(1),o=r(5);i(i.S,"Reflect",{getOwnPropertyDescriptor:function(t,n){return e.f(o(t),n)}})},function(t,n,r){var e=r(1),i=r(47),o=r(5);e(e.S,"Reflect",{getPrototypeOf:function(t){return i(o(t))}})},function(t,n,r){var e=r(1);e(e.S,"Reflect",{has:function(t,n){return n in t}})},function(t,n,r){var e=r(1),i=r(5),o=Object.isExtensible;e(e.S,"Reflect",{isExtensible:function(t){return i(t),!o||o(t)}})},function(t,n,r){var e=r(1);e(e.S,"Reflect",{ownKeys:r(149)})},function(t,n,r){var e=r(1),i=r(5),o=Object.preventExtensions;e(e.S,"Reflect",{preventExtensions:function(t){i(t);try{return o&&o(t),!0}catch(t){return!1}}})},function(t,n,r){var e=r(13),i=r(29),o=r(47),u=r(20),c=r(1),f=r(40),a=r(5),s=r(6);c(c.S,"Reflect",{set:function t(n,r,c){var l,h,p=arguments.length<4?n:arguments[3],v=i.f(a(n),r);if(!v){if(s(h=o(n)))return t(h,r,c,p);v=f(0)}if(u(v,"value")){if(!1===v.writable||!s(p))return!1;if(l=i.f(p,r)){if(l.get||l.set||!1===l.writable)return!1;l.value=c,e.f(p,r,l)}else e.f(p,r,f(0,c));return!0}return void 0!==v.set&&(v.set.call(p,c),!0)}})},function(t,n,r){var e=r(1),i=r(88);i&&e(e.S,"Reflect",{setPrototypeOf:function(t,n){i.check(t,n);try{return i.set(t,n),!0}catch(t){return!1}}})},function(t,n,r){r(444),t.exports=r(11).Array.includes},function(t,n,r){"use strict";var e=r(1),i=r(68)(!0);e(e.P,"Array",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),r(48)("includes")},function(t,n,r){r(446),t.exports=r(11).Array.flatMap},function(t,n,r){"use strict";var e=r(1),i=r(447),o=r(15),u=r(10),c=r(27),f=r(137);e(e.P,"Array",{flatMap:function(t){var n,r,e=o(this);return c(t),n=u(e.length),r=f(e,0),i(r,e,e,n,0,1,t,arguments[1]),r}}),r(48)("flatMap")},function(t,n,r){"use strict";var e=r(70),i=r(6),o=r(10),u=r(26),c=r(8)("isConcatSpreadable");t.exports=function t(n,r,f,a,s,l,h,p){for(var v,y,d=s,g=0,x=!!h&&u(h,p,3);g0)d=t(n,r,v,o(v.length),d,l-1)-1;else{if(d>=9007199254740991)throw TypeError();n[d]=v}d++}g++}return d}},function(t,n,r){r(449),t.exports=r(11).String.padStart},function(t,n,r){"use strict";var e=r(1),i=r(150),o=r(76),u=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(o);e(e.P+e.F*u,"String",{padStart:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},function(t,n,r){r(451),t.exports=r(11).String.padEnd},function(t,n,r){"use strict";var e=r(1),i=r(150),o=r(76),u=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(o);e(e.P+e.F*u,"String",{padEnd:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},function(t,n,r){r(453),t.exports=r(11).String.trimLeft},function(t,n,r){"use strict";r(54)("trimLeft",function(t){return function(){return t(this,1)}},"trimStart")},function(t,n,r){r(455),t.exports=r(11).String.trimRight},function(t,n,r){"use strict";r(54)("trimRight",function(t){return function(){return t(this,2)}},"trimEnd")},function(t,n,r){r(457),t.exports=r(84).f("asyncIterator")},function(t,n,r){r(122)("asyncIterator")},function(t,n,r){r(459),t.exports=r(11).Object.getOwnPropertyDescriptors},function(t,n,r){var e=r(1),i=r(149),o=r(22),u=r(29),c=r(100);e(e.S,"Object",{getOwnPropertyDescriptors:function(t){for(var n,r,e=o(t),f=u.f,a=i(e),s={},l=0;a.length>l;)void 0!==(r=f(e,n=a[l++]))&&c(s,n,r);return s}})},function(t,n,r){r(461),t.exports=r(11).Object.values},function(t,n,r){var e=r(1),i=r(151)(!1);e(e.S,"Object",{values:function(t){return i(t)}})},function(t,n,r){r(463),t.exports=r(11).Object.entries},function(t,n,r){var e=r(1),i=r(151)(!0);e(e.S,"Object",{entries:function(t){return i(t)}})},function(t,n,r){"use strict";r(143),r(465),t.exports=r(11).Promise.finally},function(t,n,r){"use strict";var e=r(1),i=r(11),o=r(3),u=r(63),c=r(145);e(e.P+e.R,"Promise",{finally:function(t){var n=u(this,i.Promise||o.Promise),r="function"==typeof t;return this.then(r?function(r){return c(n,t()).then(function(){return r})}:t,r?function(r){return c(n,t()).then(function(){throw r})}:t)}})},function(t,n,r){r(467),r(468),r(469),t.exports=r(11)},function(t,n,r){var e=r(3),i=r(1),o=r(76),u=[].slice,c=/MSIE .\./.test(o),f=function(t){return function(n,r){var e=arguments.length>2,i=!!e&&u.call(arguments,2);return t(e?function(){("function"==typeof n?n:Function(n)).apply(this,i)}:n,r)}};i(i.G+i.B+i.F*c,{setTimeout:f(e.setTimeout),setInterval:f(e.setInterval)})},function(t,n,r){var e=r(1),i=r(106);e(e.G+e.B,{setImmediate:i.set,clearImmediate:i.clear})},function(t,n,r){for(var e=r(103),i=r(43),o=r(17),u=r(3),c=r(21),f=r(55),a=r(8),s=a("iterator"),l=a("toStringTag"),h=f.Array,p={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},v=i(p),y=0;y - - @track('mcloud-opt-in-crisp', 'pro') - @include('support.crisp') - @endtrack @endsection diff --git a/views/base/fields/help.blade.php b/views/base/fields/help.blade.php index 72363aea..0d24a22c 100755 --- a/views/base/fields/help.blade.php +++ b/views/base/fields/help.blade.php @@ -2,7 +2,7 @@ @foreach($data as $id => $helpLinks) @if(!empty($watch)) diff --git a/views/base/fields/password.blade.php b/views/base/fields/password.blade.php index 872710da..693ab10a 100755 --- a/views/base/fields/password.blade.php +++ b/views/base/fields/password.blade.php @@ -1,5 +1,8 @@
    - +
    + +
    + @if($description)

    {!! $description !!}

    @endif diff --git a/views/base/settings.blade.php b/views/base/settings.blade.php index 426fc21c..4252eab2 100755 --- a/views/base/settings.blade.php +++ b/views/base/settings.blade.php @@ -88,6 +88,11 @@ @if(!empty($section['title']))

    {{$section['title']}} + @if(!empty($section['doc_beacon'])) + + Help + + @endif @if (!empty($section['help']) && !empty($section['help']['data']) && (\ILAB\MediaCloud\Utilities\arrayPath($section['help'], 'target', 'footer') == 'header')) @@ -132,9 +130,8 @@ @endplan

    - @track('mcloud-opt-in-crisp', 'pro') - @include('support.crisp') - @endtrack + + @include('support.beacon') -

    Below is a complete list of available filters:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Filter NameDescriptionArgumentsReturns
    ilab_imgix_filter_parametersModifiy or append parameters to the Imgix URL. -
      -
    • $params - The current list of params.
    • -
    • $size - The current name of the image size that the URL is being generated for.
    • -
    • $id - The ID of the attachment.
    • -
    • $meta - The complete metadata for the attachment.
    • -
    -
    Returns the $params array that may or may not have been modified.
    ilab_imgix_enabledDetermines if imgix is enabled. -
      -
    • $isEnabled - Boolean that determines if imgix is enabled.
    • -
    -
    Returns true if enabled.
    ilab_s3_can_calculate_srcsetDetermines if the S3 tool can calculate the srcset of an image. This would allow you to override how S3 generates the image's srcset when WordPress requests it. -
      -
    • $canCalculate - Boolean that determines if S3 can calculate it or not.
    • -
    -
    Returns a boolean that determines if S3 can calculate it or not.
    ilab_s3_upload_optionsModify the options for the S3 upload. -
      -
    • $options - The current array of options for the upload.
    • -
    • $id - The ID of the attachment.
    • -
    • $data - The complete metadata for the attachment.
    • -
    -
    Returns the $options array that may or may not have been modified.
    - -

    Actions

    -

    This plugin exposes a single action hooks that you can use.

    - - - - - - - - - - - - - - - -
    Action NameDescriptionArguments
    ilab_imgix_setupCalled after the Imgix tool has been setup.None.
    - -

    Sample S3 Policy For WordPress

    -

    Below is the minimum AWS IAM policy you can have for the plugin to function:

    - -

    Replace `YOURBUCKET` with the name of the bucket you want to enable access to.

    - -

    Direct Uploads

    -

    To allow direct uploads to S3 via the "Cloud Upload" feature, you must also configure CORS on your bucket. This is the - recommended CORS configuration:

    - - - - - - - -@endsection \ No newline at end of file diff --git a/views/base/upgrade.blade.php b/views/base/upgrade.blade.php index 0dff3a5c..ad2e300f 100755 --- a/views/base/upgrade.blade.php +++ b/views/base/upgrade.blade.php @@ -12,6 +12,7 @@

    Upgrade to Media Cloud Premium

      +
    • Migrate your existing WordPress media library to {{\ILAB\MediaCloud\Storage\StorageManager::currentDriverName()}}
    • Easily manage your theme's image sizes
    • Built-in dynamic image generation
    • Image moderation with Google Vision
    • @@ -20,6 +21,7 @@
    • Built-in {{\ILAB\MediaCloud\Storage\StorageManager::currentDriverName()}} storage browser (Pro)
    • Import media from {{\ILAB\MediaCloud\Storage\StorageManager::currentDriverName()}} (Pro)
    • WPML, WooCommerce, Easy Digital Downloads, WP Job Manager integration (Pro)
    • +
    • plus more awesome features!
    Upgrade Now! diff --git a/views/base/wrong-license.blade.php b/views/base/wrong-license.blade.php new file mode 100755 index 00000000..b22785f7 --- /dev/null +++ b/views/base/wrong-license.blade.php @@ -0,0 +1,11 @@ +@extends('../templates/sub-page') + +@section('main') +
    +

    You are trying to use a Multisite license on a non-Multisite site

    +

    Oops! The license you have entered is only valid for Multisite WordPress. Please visit the pricing page to upgrade or downgrade to the correct non-multisite license.

    + +
    +@endsection diff --git a/views/debug/trouble-shooter.blade.php b/views/debug/trouble-shooter.blade.php index 4f855b63..1d26cc46 100755 --- a/views/debug/trouble-shooter.blade.php +++ b/views/debug/trouble-shooter.blade.php @@ -68,9 +68,8 @@
    - @track('mcloud-opt-in-crisp', 'pro') - @include('support.crisp') - @endtrack + + @include('support.beacon') @endsection @endsection + diff --git a/views/importer/importer.blade.php b/views/importer/importer.blade.php deleted file mode 100755 index 1259351d..00000000 --- a/views/importer/importer.blade.php +++ /dev/null @@ -1,143 +0,0 @@ -@extends('../templates/sub-page', ['title' => $title]) - -@section('main') -
    - -
    - {!! $instructions !!} - @if(!empty($warning)) -
    -

    Warning

    - {!! $warning !!} -
    - @endif - @if(!empty($commandLine)) -
    -

    Using WP-CLI

    -

    You can run this importer process from the command line using WP-CLI:

    - - {{$commandLine}} - - @if(!empty($commandLink)) -

    Command documentation

    - @endif -
    - @endif - @if(!empty($options)) -
    -

    Options

    -
      - @foreach($options as $optionName => $option) -
    • -
      - {!! $option['title'] !!} -
      -
      -
      - @if($option['type'] == 'checkbox') - @include('base/ui/checkbox', ['name' => $optionName, 'value' => $option['default'], 'description' => '', 'enabled' => true]) - @elseif($option['type'] == 'select') - - @elseif($option['type'] == 'browser') - - @endif -
      -
      {!! $option['description'] !!}
      -
      -
    • - @endforeach -
    -
    - @endif -
    - @if($enabled) - - @else - Please {{$disabledText}} before using this tool. - @endif -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    - @track('mcloud-opt-in-crisp', 'pro') - @include('support.crisp') - @endtrack -@endsection - - - \ No newline at end of file diff --git a/views/importer/instructions/clear-cache.blade.php b/views/importer/instructions/clear-cache.blade.php deleted file mode 100755 index ef9aed85..00000000 --- a/views/importer/instructions/clear-cache.blade.php +++ /dev/null @@ -1,10 +0,0 @@ - -

    This tool will clear the local file cache for any previously dynamically generated images.

    -@if (!$description) -@if ($background) -

    Depending on the number of items you have, this could take anywhere from a minute to several hours. This process runs in the background until it's finished. Once you've started the process, please check this page for progress.

    -@else -

    Depending on the number of items you have, this could take anywhere from a minute to several hours.

    -

    IMPORTANT: You are running the clear cache process in the web browser. Do not navigate away from this page or the import may not finish.

    -@endif -@endif diff --git a/views/importer/instructions/storage-exporter.blade.php b/views/importer/instructions/storage-exporter.blade.php deleted file mode 100755 index 43daef1d..00000000 --- a/views/importer/instructions/storage-exporter.blade.php +++ /dev/null @@ -1,16 +0,0 @@ - -

    This tool will migrate any media and documents you are currently hosting on your cloud storage and add it to your media library.

    -@if (!$description) -@if ($background) -

    Depending on the number of items you have, this could take anywhere from a minute to several hours. This process runs in the background until it's finished. Once you've started the process, please check this page for progress.

    -@else -

    Depending on the number of items you have, this could take anywhere from a minute to several hours.

    -

    IMPORTANT: You are running the import process in the web browser. Do not navigate away from this page or the import may not finish.

    -@endif -

    Note:

    -
      -
    1. Always backup your database before performing any batch migration.
    2. -
    3. This process will try it's best to prevent duplicates, but a few might slip through. Always double check the results.
    4. -
    5. Did you backup your database?
    6. -
    -@endif \ No newline at end of file diff --git a/views/support/beacon.blade.php b/views/support/beacon.blade.php new file mode 100755 index 00000000..d618aa29 --- /dev/null +++ b/views/support/beacon.blade.php @@ -0,0 +1,7 @@ + +@track('mcloud-opt-in-crisp', 'pro') + +@elsetrack + +@endtrack + diff --git a/views/support/crisp.blade.php b/views/support/crisp.blade.php deleted file mode 100755 index ac5c6640..00000000 --- a/views/support/crisp.blade.php +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/views/support/silent-beacon.blade.php b/views/support/silent-beacon.blade.php new file mode 100755 index 00000000..58c00dc6 --- /dev/null +++ b/views/support/silent-beacon.blade.php @@ -0,0 +1,3 @@ + + + diff --git a/views/tasks/batch-info.blade.php b/views/tasks/batch-info.blade.php new file mode 100755 index 00000000..34d2ff9f --- /dev/null +++ b/views/tasks/batch-info.blade.php @@ -0,0 +1,58 @@ + + + + + + + +@include($instructionsView) +@if(!empty($warning)) +
    +

    Warning

    + {!! $warning !!} +
    +@endif +@if(!empty($commandLine)) +
    +

    Using WP-CLI

    +

    You can run this importer process from the command line using WP-CLI:

    + + {{$commandLine}} + + @if(!empty($commandLink)) +

    Command documentation

    + @endif +
    +@endif +@if(!empty($taskClass::taskOptions())) +
    +

    Options

    +
      + @foreach($taskClass::taskOptions() as $optionName => $option) +
    • +
      + {!! $option['title'] !!} +
      +
      +
      + @if($option['type'] == 'checkbox') + @include('base/ui/checkbox', ['name' => $optionName, 'value' => $option['default'], 'description' => '', 'enabled' => true]) + @elseif($option['type'] == 'select') + + @elseif($option['type'] == 'browser') + + @elseif($option['type'] == 'media-select') +
      All Media Items
      + @endif +
      +
      {!! $option['description'] !!}
      +
      +
    • + @endforeach +
    +
    +@endif \ No newline at end of file diff --git a/views/tasks/batch.blade.php b/views/tasks/batch.blade.php new file mode 100755 index 00000000..b49ce244 --- /dev/null +++ b/views/tasks/batch.blade.php @@ -0,0 +1,88 @@ + + + + +@extends('../templates/sub-page') + +@section('main') +
    + + +
    + + + +@endsection + diff --git a/views/tasks/batch/clean-uploads.blade.php b/views/tasks/batch/clean-uploads.blade.php new file mode 100755 index 00000000..4a5cd366 --- /dev/null +++ b/views/tasks/batch/clean-uploads.blade.php @@ -0,0 +1,9 @@ + +@include('tasks.batch-info', [ + 'instructionsView' => $taskClass::instructionView(), + 'commandLine' => null, + 'commandTitle' => 'Clean Uploads', + 'commandLink'=> null, + 'warning' => $warning, + 'taskClass' => $taskClass +]) \ No newline at end of file diff --git a/views/tasks/batch/clear-glide-cache.blade.php b/views/tasks/batch/clear-glide-cache.blade.php new file mode 100755 index 00000000..6b03852e --- /dev/null +++ b/views/tasks/batch/clear-glide-cache.blade.php @@ -0,0 +1,9 @@ + +@include('tasks.batch-info', [ + 'instructionsView' => $taskClass::instructionView(), + 'commandLine' => 'wp dynamicImages clearCache', + 'commandTitle' => 'Clear Dynamic Images Cache', + 'commandLink'=> 'https://help.mediacloud.press/article/77-clear-dynamic-image-cache', + 'warning' => $warning, + 'taskClass' => $taskClass +]) \ No newline at end of file diff --git a/views/tasks/batch/import-task.blade.php b/views/tasks/batch/import-task.blade.php new file mode 100755 index 00000000..1b4b9f12 --- /dev/null +++ b/views/tasks/batch/import-task.blade.php @@ -0,0 +1,9 @@ + +@include('tasks.batch-info', [ + 'instructionsView' => $taskClass::instructionView(), + 'commandLine' => 'wp mediacloud importFromCloud [--import-path=] [--preserve-paths=preserve|replace|prepend] [--import-only] [--skip-thumbnails]', + 'commandTitle' => 'Import From Cloud Storage', + 'commandLink'=> 'https://help.mediacloud.press/article/74-import-from-cloud-storage', + 'warning' => $warning, + 'taskClass' => $taskClass +]) \ No newline at end of file diff --git a/views/tasks/batch/instructions/clean-uploads.blade.php b/views/tasks/batch/instructions/clean-uploads.blade.php new file mode 100755 index 00000000..68e93306 --- /dev/null +++ b/views/tasks/batch/instructions/clean-uploads.blade.php @@ -0,0 +1,9 @@ +

    This tool will delete any local files on your server that are associated with items in your WordPress media library.

    +@if(empty($description)) +

    Some important notes:

    +
      +
    1. It will only process items in your media library that have been uploaded to cloud storage.
    2. +
    3. It will not delete any items in your upload directory that are not associated with an attachment in your Media Library.
    4. +
    5. Use with caution!
    6. +
    +@endif diff --git a/views/tasks/batch/instructions/clear-glide-cache.blade.php b/views/tasks/batch/instructions/clear-glide-cache.blade.php new file mode 100755 index 00000000..ccd902e7 --- /dev/null +++ b/views/tasks/batch/instructions/clear-glide-cache.blade.php @@ -0,0 +1,4 @@ +

    This tool will unlink all of your media library from cloud storage.

    +@if(empty($description)) +

    Note that it will not download anything, it simply removes metadata from the database.

    +@endif \ No newline at end of file diff --git a/views/tasks/batch/instructions/import-task.blade.php b/views/tasks/batch/instructions/import-task.blade.php new file mode 100755 index 00000000..8b318ba2 --- /dev/null +++ b/views/tasks/batch/instructions/import-task.blade.php @@ -0,0 +1,11 @@ +

    This tool will migrate any media and documents you are currently hosting on your cloud storage and add it to your media library.

    +@if(empty($description)) +

    Depending on the number of items you have, this could take anywhere from a minute to several hours.

    +

    IMPORTANT: You are running the import process in the web browser. Do not navigate away from this page or the import may not finish.

    +

    Note:

    +
      +
    1. Always backup your database before performing any batch migration.
    2. +
    3. This process will try it's best to prevent duplicates, but a few might slip through. Always double check the results.
    4. +
    5. Did you backup your database?
    6. +
    +@endif \ No newline at end of file diff --git a/views/importer/instructions/storage-importer.blade.php b/views/tasks/batch/instructions/migrate-task.blade.php similarity index 68% rename from views/importer/instructions/storage-importer.blade.php rename to views/tasks/batch/instructions/migrate-task.blade.php index cc9a356d..ef046c16 100755 --- a/views/importer/instructions/storage-importer.blade.php +++ b/views/tasks/batch/instructions/migrate-task.blade.php @@ -1,12 +1,7 @@ -

    This tool will import any media and documents you are currently hosting on this server to your cloud storage service.

    -@if (!$description) -@if ($background) -

    Depending on the number of items you have, this could take anywhere from a minute to several hours. This process runs in the background until it's finished. Once you've started the process, please check this page for progress.

    -@else +@if(empty($description))

    Depending on the number of items you have, this could take anywhere from a minute to several hours.

    IMPORTANT: You are running the import process in the web browser. Do not navigate away from this page or the import may not finish.

    -@endif

    Note:

    1. Always backup your database before performing any batch migration.
    2. diff --git a/views/importer/instructions/vision.blade.php b/views/tasks/batch/instructions/process-vision.blade.php similarity index 88% rename from views/importer/instructions/vision.blade.php rename to views/tasks/batch/instructions/process-vision.blade.php index 66c4f546..6fb47ee0 100755 --- a/views/importer/instructions/vision.blade.php +++ b/views/tasks/batch/instructions/process-vision.blade.php @@ -1,6 +1,5 @@ -

      This tool will run any images that have already been uploaded to S3 through Amazon Rekognizer.

      -@if(!$description) +@if(empty($description))

      Depending on the number of items you have, this could take anywhere from a minute to several hours. This process runs in the background until it's finished. Once you've started the process, please check this page for progress.

      Note:

        diff --git a/views/importer/instructions/regeneration.blade.php b/views/tasks/batch/instructions/regenerate-thumbs-task.blade.php similarity index 88% rename from views/importer/instructions/regeneration.blade.php rename to views/tasks/batch/instructions/regenerate-thumbs-task.blade.php index 3532f771..80b64546 100755 --- a/views/importer/instructions/regeneration.blade.php +++ b/views/tasks/batch/instructions/regenerate-thumbs-task.blade.php @@ -1,6 +1,5 @@ -

        This tool will rebuild all of the thumbnails for all of your images.

        -@if(!$description) +@if(empty($description))

        Depending on the number of items you have, this could take anywhere from a minute to several hours. This process runs in the background until it's finished. Once you've started the process, please check this page for progress.

        If you don't have any of the source files on your WordPress server, this will download what it can from your storage service. Obviously this can be very slow going if you are processsing a lot of images. If you only want to regenerate thubmnails for a select group of images, use the bulk action in the media library's list view.

        @endif \ No newline at end of file diff --git a/views/tasks/batch/instructions/unlink-media-task.blade.php b/views/tasks/batch/instructions/unlink-media-task.blade.php new file mode 100755 index 00000000..ccd902e7 --- /dev/null +++ b/views/tasks/batch/instructions/unlink-media-task.blade.php @@ -0,0 +1,4 @@ +

        This tool will unlink all of your media library from cloud storage.

        +@if(empty($description)) +

        Note that it will not download anything, it simply removes metadata from the database.

        +@endif \ No newline at end of file diff --git a/views/tasks/batch/instructions/update-elementor.blade.php b/views/tasks/batch/instructions/update-elementor.blade.php new file mode 100755 index 00000000..e1e01de4 --- /dev/null +++ b/views/tasks/batch/instructions/update-elementor.blade.php @@ -0,0 +1,4 @@ +

        This tool will update the image URLs in your Elementor pages and posts, insuring they are correct.

        +@if(empty($description)) +

        You can configure this to run automatically whenever you migrate to storage or import from storage.

        +@endif \ No newline at end of file diff --git a/views/tasks/batch/migrate-task.blade.php b/views/tasks/batch/migrate-task.blade.php new file mode 100755 index 00000000..99c3e622 --- /dev/null +++ b/views/tasks/batch/migrate-task.blade.php @@ -0,0 +1,9 @@ + +@include('tasks.batch-info', [ + 'instructionsView' => $taskClass::instructionView(), + 'commandLine' => 'wp mediacloud migrate [--limit=] [--offset=] [--page=] [--path-handling=preserve|replace|prepend] [--skip-thumbnails] [--skip-imported] [--order-by=date|title|filename] [--order=asc|desc]', + 'commandTitle' => 'Migrate To Cloud Storage', + 'commandLink'=> 'https://help.mediacloud.press/article/73-migrate-to-cloud-storage', + 'warning' => $warning, + 'taskClass' => $taskClass +]) \ No newline at end of file diff --git a/views/tasks/batch/process-vision.blade.php b/views/tasks/batch/process-vision.blade.php new file mode 100755 index 00000000..9f5a2d16 --- /dev/null +++ b/views/tasks/batch/process-vision.blade.php @@ -0,0 +1,9 @@ + +@include('tasks.batch-info', [ + 'instructionsView' => $taskClass::instructionView(), + 'commandLine' => 'wp vision process', + 'commandTitle' => 'Process Images With Vision', + 'commandLink'=> 'https://help.mediacloud.press/article/103-process-image-with-vision', + 'warning' => $warning, + 'taskClass' => $taskClass +]) \ No newline at end of file diff --git a/views/tasks/batch/regenerate-thumbs-task.blade.php b/views/tasks/batch/regenerate-thumbs-task.blade.php new file mode 100755 index 00000000..22b59cc9 --- /dev/null +++ b/views/tasks/batch/regenerate-thumbs-task.blade.php @@ -0,0 +1,9 @@ + +@include('tasks.batch-info', [ + 'instructionsView' => $taskClass::instructionView(), + 'commandLine' => 'wp mediacloud regenerate', + 'commandTitle' => 'Regenerate Thumbnails', + 'commandLink'=> 'https://help.mediacloud.press/article/75-regenerate-thumbnails', + 'warning' => $warning, + 'taskClass' => $taskClass +]) \ No newline at end of file diff --git a/views/tasks/batch/unlink-media-task.blade.php b/views/tasks/batch/unlink-media-task.blade.php new file mode 100755 index 00000000..ea732cd5 --- /dev/null +++ b/views/tasks/batch/unlink-media-task.blade.php @@ -0,0 +1,9 @@ + +@include('tasks.batch-info', [ + 'instructionsView' => $taskClass::instructionView(), + 'commandLine' => 'wp mediacloud unlink [--limit=] [--offset=] [--page=]', + 'commandTitle' => 'Unlink From Cloud Storage', + 'commandLink'=> 'https://help.mediacloud.press/article/76-unlink-from-cloud-storage', + 'warning' => $warning, + 'taskClass' => $taskClass +]) \ No newline at end of file diff --git a/views/tasks/batch/update-elementor.blade.php b/views/tasks/batch/update-elementor.blade.php new file mode 100755 index 00000000..9319abcf --- /dev/null +++ b/views/tasks/batch/update-elementor.blade.php @@ -0,0 +1,9 @@ + +@include('tasks.batch-info', [ + 'instructionsView' => $taskClass::instructionView(), + 'commandLine' => 'wp mediacloud updateElementor', + 'commandTitle' => 'Update Elementor', + 'commandLink'=> 'https://help.mediacloud.press/article/104-update-elementor', + 'warning' => $warning, + 'taskClass' => $taskClass +]) \ No newline at end of file diff --git a/views/tasks/task-manager.blade.php b/views/tasks/task-manager.blade.php new file mode 100755 index 00000000..72e8f9d6 --- /dev/null +++ b/views/tasks/task-manager.blade.php @@ -0,0 +1,212 @@ + +@extends('../templates/sub-page') + +@section('main') +
        +

        The Task Manager allows you to view all of your currently running tasks, tasks that have completed and any scheduled tasks about to happen.

        +

        To test your system, try launching a Test Task to see how it performs.

        +
        +

        Available Tasks

        +
        + @foreach(\ILAB\MediaCloud\Tasks\TaskManager::registeredTasks() as $id => $taskClass) + @continue(!$taskClass::runFromTaskManager()) + + @endforeach +
        +
        + +
        +

        + Running Tasks +
        + +
        +

        + + + + + + + + + + + + + + + + + + + +
        + +
        +

        + Scheduled Tasks +

        + + + + + + + + + + + + + + + +
        + +
        +

        + Past Tasks +
        + +
        +

        + + + + + + + + + + + + + + + + + + +
        +
        + + + + + + + + + + + + @foreach(\ILAB\MediaCloud\Tasks\TaskManager::registeredTasks() as $identifier => $taskClass) + @continue(empty($taskClass::taskOptions())) + + @endforeach +@endsection + diff --git a/views/templates/modal.blade.php b/views/templates/modal.blade.php index e0cbe065..2c140c60 100755 --- a/views/templates/modal.blade.php +++ b/views/templates/modal.blade.php @@ -29,4 +29,10 @@ + +@include('support.silent-beacon') + @yield('script') + \ No newline at end of file diff --git a/views/templates/sub-page.blade.php b/views/templates/sub-page.blade.php index e39529e8..07d6f32b 100755 --- a/views/templates/sub-page.blade.php +++ b/views/templates/sub-page.blade.php @@ -15,5 +15,7 @@ @include('base/upgrade') @endplan + + @include('support.beacon')
    '),f=t.minicolors.defaults;if(!e.data("minicolors-initialized")){if(i=t.extend(!0,{},f,i),u.addClass("minicolors-theme-"+i.theme).toggleClass("minicolors-with-opacity",i.opacity),void 0!==i.position&&t.each(i.position.split(" "),function(){u.addClass("minicolors-position-"+this)}),n="rgb"===i.format?i.opacity?"25":"20":i.keywords?"11":"7",e.addClass("minicolors-input").data("minicolors-initialized",!1).data("minicolors-settings",i).prop("size",n).wrap(u).after('
    '),i.inline||(e.after(''),e.next(".minicolors-input-swatch").on("click",function(t){t.preventDefault(),e.focus()})),(c=e.parent().find(".minicolors-panel")).on("selectstart",function(){return!1}).end(),i.swatches&&0!==i.swatches.length)for(c.addClass("minicolors-with-swatches"),o=t('
      ').appendTo(c),p=0;p').appendTo(o).data("swatch-color",h).find(".minicolors-swatch-color").css({backgroundColor:v(s),opacity:s.a}),i.swatches[p]=s;i.inline&&e.parent().addClass("minicolors-inline"),r(e,!1),e.data("minicolors-initialized",!0)}}(t(this),o)}),t(this)}}}),t([document]).on("mousedown.minicolors touchstart.minicolors",function(e){t(e.target).parents().add(e.target).hasClass("minicolors")||a()}).on("mousedown.minicolors touchstart.minicolors",".minicolors-grid, .minicolors-slider, .minicolors-opacity-slider",function(e){var i=t(this);e.preventDefault(),t(e.delegateTarget).data("minicolors-target",i),n(i,e,!0)}).on("mousemove.minicolors touchmove.minicolors",function(e){var i=t(e.delegateTarget).data("minicolors-target");i&&n(i,e)}).on("mouseup.minicolors touchend.minicolors",function(){t(this).removeData("minicolors-target")}).on("click.minicolors",".minicolors-swatches li",function(e){e.preventDefault();var i=t(this),a=i.parents(".minicolors").find(".minicolors-input"),n=i.data("swatch-color");s(a,n,f(n)),r(a)}).on("mousedown.minicolors touchstart.minicolors",".minicolors-input-swatch",function(e){var a=t(this).parent().find(".minicolors-input");e.preventDefault(),i(a)}).on("focus.minicolors",".minicolors-input",function(){var e=t(this);e.data("minicolors-initialized")&&i(e)}).on("blur.minicolors",".minicolors-input",function(){var e,i,a,n,o,s=t(this),r=s.data("minicolors-settings");s.data("minicolors-initialized")&&(e=r.keywords?t.map(r.keywords.split(","),function(e){return t.trim(e.toLowerCase())}):[],""!==s.val()&&t.inArray(s.val().toLowerCase(),e)>-1?o=s.val():(m(s.val())?a=d(s.val(),!0):(i=l(s.val(),!0),a=i?w(i):null),o=null===a?r.defaultValue:"rgb"===r.format?r.opacity?d("rgba("+a.r+","+a.g+","+a.b+","+s.attr("data-opacity")+")"):d("rgb("+a.r+","+a.g+","+a.b+")"):v(a)),n=r.opacity?s.attr("data-opacity"):1,"transparent"===o.toLowerCase()&&(n=0),s.closest(".minicolors").find(".minicolors-input-swatch > span").css("opacity",n),s.val(o),""===s.val()&&s.val(p(r.defaultValue,!0)),s.val(c(s.val(),r.letterCase)))}).on("keydown.minicolors",".minicolors-input",function(e){var i=t(this);if(i.data("minicolors-initialized"))switch(e.which){case 9:a();break;case 13:case 27:a(),i.blur()}}).on("keyup.minicolors",".minicolors-input",function(){var e=t(this);e.data("minicolors-initialized")&&r(e,!0)}).on("paste.minicolors",".minicolors-input",function(){var e=t(this);e.data("minicolors-initialized")&&setTimeout(function(){r(e,!0)},1)})})?a.apply(e,n):a)||(t.exports=o)},603:function(t,e,i){"use strict";var a;i(51),a=jQuery,window.ImgixComponents.ImgixAlignment=function(t,e){this.delegate=t,this.container=e,this.alignmentParam=e.find(".imgix-param"),this.resetButton=e.find(".imgix-param-reset > a"),this.defaultValue=e.data("default-value"),this.param=e.data("param");var i=this;this.resetButton.on("click",function(t){return t.preventDefault(),i.reset(),!1}),e.find(".imgix-alignment-button").on("click",function(){var t=a(this);i.container.find(".imgix-alignment-button").each(function(){a(this).removeClass("selected-alignment")}),t.addClass("selected-alignment"),i.alignmentParam.val(t.data("param-value")),i.delegate.preview()})},ImgixComponents.ImgixAlignment.prototype.destroy=function(){this.resetButton.off("click"),this.container.find(".imgix-alignment-button").off("click")},ImgixComponents.ImgixAlignment.prototype.reset=function(t){var e;""==(e=t&&t.hasOwnProperty(this.param)?t[this.param]:this.defaultValue)&&(e=this.defaultValue),this.container.find(".imgix-alignment-button").each(function(){var t=a(this);t.data("param-value")==e?t.addClass("selected-alignment"):t.removeClass("selected-alignment")}),this.alignmentParam.val(e),this.delegate.preview()},ImgixComponents.ImgixAlignment.prototype.saveValue=function(t){return this.alignmentParam.val()!=this.defaultValue&&(t[this.param]=this.alignmentParam.val()),t}},604:function(t,e,i){"use strict";i(51),jQuery,window.ImgixComponents.ImgixMediaChooser=function(t,e){this.delegate=t,this.container=e,this.preview=e.find(".imgix-media-preview img"),this.mediaInput=e.find(".imgix-param"),this.selectButton=e.find(".imgix-media-button"),this.resetButton=e.find(".imgix-param-reset > a"),this.defaultValue=e.data("default-value"),this.param=e.data("param"),this.uploader=wp.media({title:"Select Watermark",button:{text:"Select Watermark"},multiple:!1});var i=this;this.resetButton.on("click",function(t){return t.preventDefault(),i.reset(),!1}),this.uploader.on("select",function(){var t=i.uploader.state().get("selection").first().toJSON();i.mediaInput.val(t.id),i.preview.attr("src",t.url),i.delegate.preview()}),this.selectButton.on("click",function(t){return t.preventDefault(),i.uploader.open(),!1})},ImgixComponents.ImgixMediaChooser.prototype.destroy=function(){this.selectButton.off("click"),this.uploader.off("select"),this.resetButton.off("click")},ImgixComponents.ImgixMediaChooser.prototype.reset=function(t){var e;t&&t.hasOwnProperty(this.param)?(e=t[this.param],this.mediaInput.val(e)):this.mediaInput.val(""),t&&t.hasOwnProperty(this.param+"_url")?this.preview.attr("src",t[this.param+"_url"]):(this.preview.removeAttr("src").replaceWith(this.preview.clone()),this.preview=this.container.find(".imgix-media-preview img")),this.delegate.preview()},ImgixComponents.ImgixMediaChooser.prototype.saveValue=function(t){var e=this.mediaInput.val();return e&&""!=e&&(t[this.param]=e),t}},605:function(t,e,i){"use strict";var a;i(51),a=jQuery,window.ImgixComponents.ImgixPillbox=function(t,e){this.delegate=t,this.container=e,this.param=e.data("param"),this.values=e.data("param-values").split(","),this.buttons=e.find(".ilabm-pill"),this.inputs={},this.radioMode=e.data("radio-mode"),this.mustSelect=e.data("must-select");var i=this;this.deselectOthers=function(t){this.buttons.each(function(){if(t!=this){var e=a(this),n=e.data("param");i.inputs[n].val(0),e.removeClass("pill-selected"),a(document).trigger(n+"-deselected")}})}.bind(this),this.buttons.each(function(){var t=a(this),e=t.data("param");i.inputs[e]=i.container.find("input[name='"+e+"']"),t.on("click",function(n){return n.preventDefault(),0==i.inputs[e].val()?(i.inputs[e].val(1),t.addClass("pill-selected"),a(document).trigger(e+"-selected"),i.radioMode&&i.deselectOthers(this)):i.mustSelect||(i.inputs[e].val(0),t.removeClass("pill-selected"),a(document).trigger(e+"-deselected")),i.delegate.preview(),!1}),a(document).on("change-"+e,function(a,n){i.inputs[e].val(n?1:0),n?t.addClass("pill-selected"):t.removeClass("pill-selected")})})},ImgixComponents.ImgixPillbox.prototype.destroy=function(){this.buttons.off("click")},ImgixComponents.ImgixPillbox.prototype.reset=function(t){this.buttons.each(function(){a(this).removeClass("pill-selected"),a(document).trigger(a(this).data("param")+"-deselected-ui")});var e=this;Object.keys(this.inputs).forEach(function(t,i){e.inputs[t].val(0)}),t&&t.hasOwnProperty(this.param)&&t[this.param].split(",").forEach(function(t,i){e.inputs[t].val(1);var n=e.container.find(".imgix-pill-"+t);n.addClass("pill-selected"),a(document).trigger(n.data("param")+"-selected-ui")}),this.delegate.preview()},ImgixComponents.ImgixPillbox.prototype.saveValue=function(t){var e=[],i=this;return Object.keys(this.inputs).forEach(function(t,a){1==i.inputs[t].val()&&e.push(t)}),e.length>0&&(t[this.param]=e.join(",")),t}},606:function(t,e){window.ILabImgixPresets=function(t,e,i){this.delegate=e,this.container=i.find(".ilabm-bottom-bar"),this.presetSelect=this.container.find(".imgix-presets"),this.presetContainer=this.container.find(".imgix-preset-container"),this.presetDefaultCheckbox=this.container.find(".imgix-preset-make-default");var a=this;a.presetSelect.on("change",function(){if(0==a.presetSelect.val)return a.delegate.resetAll(),void a.presetDefaultCheckbox.prop("checked",!1);var t=a.delegate.settings.presets[a.presetSelect.val()];t.default_for==a.delegate.settings.size&&a.presetDefaultCheckbox.prop("checked",!0),a.delegate.bindPreset(t)}),this.container.find(".imgix-new-preset-button").on("click",function(){a.newPreset()}),this.container.find(".imgix-save-preset-button").on("click",function(){a.savePreset()}),this.container.find(".imgix-delete-preset-button").on("click",function(){a.deletePreset()}),this.init=function(){a.presetSelect.find("option").remove(),0==Object.keys(a.delegate.settings.presets).length?a.presetContainer.addClass("is-hidden"):(Object.keys(a.delegate.settings.presets).forEach(function(e,i){a.presetSelect.append(t("").attr("value","0").text("None")),a.presetSelect.append(t("").attr("value",e).text(a.delegate.settings.presets[e].title))}),a.presetContainer.removeClass("is-hidden"),a.presetSelect.val(a.delegate.settings.currentPreset))},this.clearSelected=function(){a.presetSelect.val(0),a.presetDefaultCheckbox.prop("checked",!1)},this.setCurrentPreset=function(t,e){e?a.presetDefaultCheckbox.prop("checked",!0):a.presetDefaultCheckbox.prop("checked",!1),a.presetSelect.val(t)},this.newPreset=function(){var t=prompt("New preset name");if(null!=t){a.delegate.displayStatus("Saving preset ...");var e={};e.name=t,a.presetDefaultCheckbox.is(":checked")&&(e.make_default=1),a.delegate.postAjax("ilab_dynamic_images_new_preset",e,function(t){a.delegate.hideStatus(),"ok"==t.status&&(a.delegate.settings.currentPreset=t.currentPreset,a.delegate.settings.presets=t.presets,a.init())})}},this.savePreset=function(){if(null!=a.presetSelect.val()){a.delegate.displayStatus("Saving preset ...");var t={};t.key=a.presetSelect.val(),a.presetDefaultCheckbox.is(":checked")&&(t.make_default=1),a.delegate.postAjax("ilab_dynamic_images_save_preset",t,function(t){a.delegate.hideStatus()})}},this.deletePreset=function(){if(null!=a.presetSelect.val()&&confirm("Are you sure you want to delete this preset?")){a.delegate.displayStatus("Delete preset ...");var t={};t.key=a.presetSelect.val(),a.delegate.postAjax("ilab_dynamic_images_delete_preset",t,function(t){a.delegate.hideStatus(),"ok"==t.status&&(a.delegate.settings.currentPreset=t.currentPreset,a.delegate.settings.presets=t.presets,a.init(),a.delegate.bindUI(t))})}},this.init()}},607:function(t,e){window.ILabFaceEditor=function(t,e){var i=[],a=null,n=0;if(e.settings.meta.hasOwnProperty("faces")){for(var o=Number.MAX_VALUE,s=Number.MAX_VALUE,r=0,h=0,c=0;e.settings.meta.faces.hasOwnProperty(c);){var l=e.settings.meta.faces[c];o=Math.min(o,l.BoundingBox.Left),s=Math.min(s,l.BoundingBox.Top),r=Math.max(r,l.BoundingBox.Left+l.BoundingBox.Width),h=Math.max(h,l.BoundingBox.Top+l.BoundingBox.Height);var d={index:c+1,left:l.BoundingBox.Left,top:l.BoundingBox.Top,right:l.BoundingBox.Left+l.BoundingBox.Width,bottom:l.BoundingBox.Top+l.BoundingBox.Height,width:l.BoundingBox.Width,height:l.BoundingBox.Height,element:t("")};i.push(d);var p=this;!function(i){d.element.on("click",function(a){n=i,p.displayFaces(),t(document).trigger("change-faceindex",[i]),e.preview()})}(c+1),e.editorArea.append(d.element),c++}if(i.length>1)a={left:o,top:s,right:r,bottom:h,width:r-o,height:h-s,element:t("")},e.editorArea.append(a.element);else a=null}this.updateFacePositions=function(){var t=e.editorArea.get(0).getBoundingClientRect(),n=e.previewImage.get(0).getBoundingClientRect(),o=n.top-t.top,s=n.left-t.left,r=(n.right,t.left,n.bottom,t.top,n.width),h=n.height;if(null!=a){var c=s+r*a.left,l=o+h*a.top,d=r*a.width,p=h*a.height;a.element.css({left:c+"px",top:l+"px",width:d+"px",height:p+"px"})}i.forEach(function(t){var e=s+r*t.left,i=o+h*t.top,a=r*t.width,n=h*t.height;t.element.css({left:e+"px",top:i+"px",width:a+"px",height:n+"px"})})},this.displayFaces=function(){this.updateFacePositions(),0==n?1==i.length?(i[0].element.removeClass("hidden"),i[0].element.addClass("active")):(null!=a&&a.element.removeClass("hidden"),i.forEach(function(t){t.element.addClass("hidden")})):(null!=a&&a.element.addClass("hidden"),i.forEach(function(t,e){t.element.removeClass("hidden"),t.element.removeClass("active"),e==n-1&&t.element.addClass("active")}))},this.hideFaces=function(){null!=a&&a.element.addClass("hidden"),i.forEach(function(t){t.element.addClass("hidden")})},this.disable=function(){t(document).trigger("change-usefaces",[!1]),this.hideFaces()},this.save=function(t){return t},t(document).on("usefaces-selected",function(a){if(0==i.length)return alert("No faces have been detected in this image. To use this feature, you will need to have the Rekognition tool enabled if it isn't already."),void t(document).trigger("change-usefaces",[!1]);t(document).trigger("change-entropy",[!1]),t(document).trigger("change-edges",[!1]),e.focalPointEditor.disable(),this.displayFaces()}.bind(this)),t(document).on("usefaces-deselected",function(t){this.hideFaces()}.bind(this)),t(document).on("usefaces-selected-ui",function(t){0!=i.length&&this.displayFaces()}.bind(this)),t(document).on("usefaces-deselected-ui",function(t){this.hideFaces()}.bind(this)),t(document).on("faceindex-changed",function(t,e){n=e,this.displayFaces()}.bind(this)),t(window).on("resize",function(){this.updateFacePositions()}.bind(this)),e.settings.settings.hasOwnProperty("focalpoint")&&"usefaces"==e.settings.settings.focalpoint&&(e.settings.settings.hasOwnProperty("faceindex")&&(n=e.settings.settings.faceindex),setTimeout(function(){this.updateFacePositions(),this.displayFaces()}.bind(this),300))}},608:function(t,e){window.ILabFocalPointEditor=function(t,e){var i=t('
      '),a=.5,n=.5;e.settings.settings.hasOwnProperty("fp-x")&&(a=e.settings.settings["fp-x"]),e.settings.settings.hasOwnProperty("fp-y")&&(n=e.settings.settings["fp-y"]);var o=!1;this.updateFocalPointPosition=function(){var t=e.editorArea.get(0).getBoundingClientRect(),o=e.previewImage.get(0).getBoundingClientRect(),s=o.top-t.top,r=o.left-t.left,h=(o.right,t.left,o.bottom,t.top,o.width),c=o.height,l=r+h*a,d=s+c*n;l-=12,d-=12,i.css({left:l+"px",top:d+"px"})},this.buildFocalPoint=function(){i.remove(),e.editorArea.append(i),this.updateFocalPointPosition()},this.disable=function(){t(document).trigger("change-focalpoint",[!1]),o=!1,i.remove()},this.save=function(t){return t.hasOwnProperty("focalpoint")&&(t["fp-x"]=a,t["fp-y"]=n),t},t(document).on("focalpoint-selected",function(i){t(document).trigger("change-entropy",[!1]),t(document).trigger("change-edges",[!1]),e.faceEditor.disable(),o=!0,this.buildFocalPoint()}.bind(this)),t(document).on("focalpoint-deselected",function(t){o=!1,i.remove()}.bind(this)),t(document).on("focalpoint-selected-ui",function(t){o=!0,this.buildFocalPoint()}.bind(this)),t(document).on("focalpoint-deselected-ui",function(t){o=!1,i.remove()}.bind(this)),e.editorArea.on("mousedown",function(t){if(t.preventDefault(),!o)return!1;this.buildFocalPoint();var s=e.editorArea.get(0).getBoundingClientRect(),r=e.previewImage.get(0).getBoundingClientRect(),h={top:r.top-s.top,left:r.left-s.left,right:r.right-s.left,bottom:r.bottom-s.top,width:r.width,height:r.height};return e.editorArea.on("mousemove",function(t){t.preventDefault();var e=t.clientX-s.left;eh.right&&(e=h.right);var o=t.clientY-s.top;return oh.bottom&&(o=h.bottom),a=(e-h.left)/h.width,n=(o-h.top)/h.height,e-=12,o-=12,i.css({left:e+"px",top:o+"px"}),!1}.bind(this)),e.editorArea.on("mouseup",function(t){return t.preventDefault(),e.editorArea.off("mouseup"),e.editorArea.off("mousemove"),e.preview(),!1}.bind(this)),!1}.bind(this)),t(window).on("resize",function(){this.updateFocalPointPosition()}.bind(this)),e.settings.settings.hasOwnProperty("focalpoint")&&"focalpoint"==e.settings.settings.focalpoint&&(o=!0,setTimeout(function(){this.buildFocalPoint()}.bind(this),300))}}}); \ No newline at end of file +!function(t){var e={};function i(a){if(e[a])return e[a].exports;var n=e[a]={i:a,l:!1,exports:{}};return t[a].call(n.exports,n,n.exports,i),n.l=!0,n.exports}i.m=t,i.c=e,i.d=function(t,e,a){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(i.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)i.d(a,n,function(e){return t[e]}.bind(null,n));return a},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="/",i(i.s=286)}({13:function(t,e,i){"use strict";window.ImgixComponents={utilities:{byteToHex:function(t){var e=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];return e[t>>4&15]+e[15&t]}}}},286:function(t,e,i){t.exports=i(287)},287:function(t,e,i){"use strict";i(288),i(290),jQuery(document).ready(function(t){t("ul#adminmenu a[href$='https://talk.mediacloud.press']").attr("target","_blank"),t("ul#adminmenu a[href$='https://help.mediacloud.press']").attr("target","_blank"),t(".ilab_ajax_admin_item").each(function(){var e=t(this).find("input[name=nonce]").val(),i=t(this).find("input[name=action]").val();t(this).on("click",function(a){a.preventDefault();var n={action:i,nonce:e};return t.post(ajaxurl,n,function(t){t.hasOwnProperty("message")?alert(t.message):document.location.reload()}),!1})})})},288:function(t,e,i){"use strict";i(289),window.ILabCrop=function(t,e){this.settings=e,this.modalContainer=t("#ilabm-container-"+e.modal_id),this.cropper=this.modalContainer.find(".ilabc-cropper"),this.cropperData={},this.modal_id=e.modal_id,this.aspectCheckboxContainer=t("#ilab-crop-aspect-checkbox-container"),this.aspectCheckboxContainer.css({visibility:"hidden"});var i=this;t("#ilab-crop-aspect-checkbox").on("change",function(t){i.settings.isCrop||(this.checked?i.cropper.cropper("setAspectRatio",i.settings.aspect_ratio):i.cropper.cropper("setAspectRatio",Number.NaN))}),this.modalContainer.find(".ilabm-editor-tabs").ilabTabs({currentValue:this.settings.size,tabSelected:function(t){ILabModal.loadURL(t.data("url"),!0,function(t){this.bindUI(t)}.bind(this))}.bind(this)}),this.modalContainer.find(".ilabc-button-crop").on("click",function(t){return t.preventDefault(),this.crop(),!1}.bind(this)),this.modalContainer.find(".ilabc-button-reset-crop").on("click",function(t){return t.preventDefault(),this.resetCrop(),!1}.bind(this)),this.updatePreviewWidth=function(){var t=this.modalContainer.find(".ilab-crop-preview-title").width();this.modalContainer.find(".ilab-crop-preview").css({height:t/this.settings.aspect_ratio+"px",width:t+"px"})}.bind(this),this.bindUI=function(e){if(this.settings=e,e.isCrop?this.aspectCheckboxContainer.css({visibility:"hidden"}):this.aspectCheckboxContainer.css({visibility:"visible"}),this.cropper.cropper("destroy"),this.cropper.off("built.cropper"),e.hasOwnProperty("cropped_src")&&null!==e.cropped_src&&this.modalContainer.find(".ilab-current-crop-img").attr("src",e.cropped_src),e.hasOwnProperty("size_title")&&null!==e.size_title&&this.modalContainer.find(".ilabc-crop-size-title").text("Current "+e.size_title+" ("+e.min_width+" x "+e.min_height+")"),void 0!==e.aspect_ratio){if(this.updatePreviewWidth(),void 0!==e.prev_crop_x&&null!==e.prev_crop_x)this.cropperData={x:e.prev_crop_x,y:e.prev_crop_y,width:e.prev_crop_width,height:e.prev_crop_height};else if(2==e.crop_axis.length){var i=0,a=0;"center"==e.crop_axis[0]?i=e.image_width/2-e.real_crop_width/2:"right"==e.crop_axis[0]&&(i=e.image_width-e.real_crop_width),"center"==e.crop_axis[1]?a=e.image_height/2-e.real_crop_height/2:"right"==e.crop_axis[1]&&(a=e.image_height-e.real_crop_height),this.cropperData={x:i,y:a,width:e.real_crop_width,height:e.real_crop_height}}var n=e.aspect_ratio;e.isCrop||t("#ilab-crop-aspect-checkbox")[0].checked||(n=Number.NaN),this.cropper.on("built.cropper",function(){this.updatePreviewWidth()}.bind(this)).on("crop.cropper",function(t){}).cropper({viewMode:1,dragMode:"none",aspectRatio:n,minWidth:e.min_width,minHeight:e.min_height,modal:!0,movable:!1,cropBoxMovable:!0,zoomable:!1,zoomOnWheel:!1,zoomOnTouch:!1,autoCropArea:1,data:this.cropperData,checkImageOrigin:!1,checkCrossOrigin:!1,responsive:!0,restore:!0,preview:"#ilabm-container-"+this.modal_id+" .ilab-crop-preview"})}}.bind(this),this.crop=function(){this.displayStatus("Saving crop ...");var t=this.cropper.cropper("getData");t.action="ilab_perform_crop",t.post=this.settings.image_id,t.size=this.settings.size,jQuery.post(ajaxurl,t,function(t){var e=this.modalContainer.find(".ilab-current-crop-img");"ok"==t.status?e.attr("src")==t.src?this.hideStatus():(e.one("load",function(){this.hideStatus()}.bind(this)),e.attr("src",t.src),wp.media.model.Attachments.all._byId[this.settings.image_id].get("sizes")[this.settings.size].url=t.src):this.hideStatus()}.bind(this))}.bind(this),this.resetCrop=function(){this.displayStatus("Resetting crop ..."),this.cropper.cropper("reset");var t=this.cropper.cropper("getData");t.action="ilab_reset_crop",t.post=this.settings.image_id,t.size=this.settings.size,jQuery.post(ajaxurl,t,function(t){var e=this.modalContainer.find(".ilab-current-crop-img");"ok"==t.status?e.attr("src")==t.src?this.hideStatus():(e.one("load",function(){this.hideStatus()}.bind(this)),e.attr("src",t.src),wp.media.model.Attachments.all._byId[this.settings.image_id].get("sizes")[this.settings.size].url=t.src):this.hideStatus()}.bind(this))}.bind(this),this.displayStatus=function(t){this.modalContainer.find(".ilabm-status-label").text(t),this.modalContainer.find(".ilabm-status-container").removeClass("is-hidden")}.bind(this),this.hideStatus=function(){this.modalContainer.find(".ilabm-status-container").addClass("is-hidden")}.bind(this),this.bindUI(e)}},289:function(t,e,i){var a,n,o,s;function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function h(t){return(h="function"==typeof Symbol&&"symbol"===r(Symbol.iterator)?function(t){return r(t)}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":r(t)})(t)}s=function(t){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t;var e="undefined"!=typeof window,i=e?window:{},a="cropper-hidden",n=i.PointerEvent?"pointerdown":"touchstart mousedown",o=i.PointerEvent?"pointermove":"touchmove mousemove",s=i.PointerEvent?"pointerup pointercancel":"touchend touchcancel mouseup",r=/^(?:e|w|s|n|se|sw|ne|nw|all|crop|move|zoom)$/,c=/^data:/,l=/^data:image\/jpeg;base64,/,d=/^(?:img|canvas)$/i,p={viewMode:0,dragMode:"crop",aspectRatio:NaN,data:null,preview:"",responsive:!0,restore:!0,checkCrossOrigin:!0,checkOrientation:!0,modal:!0,guides:!0,center:!0,highlight:!0,background:!0,autoCrop:!0,autoCropArea:.8,movable:!0,rotatable:!0,scalable:!0,zoomable:!0,zoomOnTouch:!0,zoomOnWheel:!0,wheelZoomRatio:.1,cropBoxMovable:!0,cropBoxResizable:!0,toggleDragModeOnDblclick:!0,minCanvasWidth:0,minCanvasHeight:0,minCropBoxWidth:0,minCropBoxHeight:0,minContainerWidth:200,minContainerHeight:100,ready:null,cropstart:null,cropmove:null,cropend:null,crop:null,zoom:null},u="function"==typeof Symbol&&"symbol"===h(Symbol.iterator)?function(t){return h(t)}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":h(t)},m=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},f=function(){function t(t,e){for(var i=0;i1?e-1:0),a=1;a0&&i.forEach(function(e){x(e)&&Object.keys(e).forEach(function(i){t[i]=e[i]})}),t},I=/\.\d*(?:0|9){12}\d*$/i;function S(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e11;return I.test(t)?Math.round(t*e)/e:t}var B=/^(?:width|height|left|top|marginLeft|marginTop)$/;function P(t,e){var i=t.style;k(e,function(t,e){B.test(e)&&b(t)&&(t+="px"),i[e]=t})}function O(t,e){if(e)if(b(t.length))k(t,function(t){O(t,e)});else if(t.classList)t.classList.add(e);else{var i=t.className.trim();i?i.indexOf(e)<0&&(t.className=i+" "+e):t.className=e}}function _(t,e){e&&(b(t.length)?k(t,function(t){_(t,e)}):t.classList?t.classList.remove(e):t.className.indexOf(e)>=0&&(t.className=t.className.replace(e,"")))}function T(t,e,i){e&&(b(t.length)?k(t,function(t){T(t,e,i)}):i?O(t,e):_(t,e))}var E=/([a-z\d])([A-Z])/g;function z(t){return t.replace(E,"$1-$2").toLowerCase()}function L(t,e){return x(t[e])?t[e]:t.dataset?t.dataset[e]:t.getAttribute("data-"+z(e))}function W(t,e,i){x(i)?t[e]=i:t.dataset?t.dataset[e]=i:t.setAttribute("data-"+z(e),i)}function A(t,e){if(x(t[e]))try{delete t[e]}catch(i){t[e]=void 0}else if(t.dataset)try{delete t.dataset[e]}catch(i){t.dataset[e]=void 0}else t.removeAttribute("data-"+z(e))}var N=/\s\s*/,j=function(){var t=!1;if(e){var a=!1,n=function(){},o=Object.defineProperty({},"once",{get:function(){return t=!0,a},set:function(t){a=t}});i.addEventListener("test",n,o),i.removeEventListener("test",n,o)}return t}();function H(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=i;e.trim().split(N).forEach(function(e){if(!j){var o=t.listeners;o&&o[e]&&o[e][i]&&(n=o[e][i],delete o[e][i],0===Object.keys(o[e]).length&&delete o[e],0===Object.keys(o).length&&delete t.listeners)}t.removeEventListener(e,n,a)})}function R(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=i;e.trim().split(N).forEach(function(e){if(a.once&&!j){var o=t.listeners,s=void 0===o?{}:o;n=function(){for(var o=arguments.length,r=Array(o),h=0;h1&&void 0!==arguments[1]?arguments[1]:"contain",o=function(t){return K(t)&&t>0};if(o(a)&&o(i)){var s=i*e;"contain"===n&&s>a||"cover"===n&&s=8&&(o=h+l)}}}if(o){var d=e.getUint16(o,a),p=void 0,u=void 0;for(u=0;ut.width?3===i?r=t.height*s:h=t.width/s:3===i?h=t.width/s:r=t.height*s;var c={aspectRatio:s,naturalWidth:n,naturalHeight:o,width:r,height:h};c.left=(t.width-r)/2,c.top=(t.height-h)/2,c.oldLeft=c.left,c.oldTop=c.top,this.canvasData=c,this.limited=1===i||2===i,this.limitCanvas(!0,!0),this.initialImageData=D({},e),this.initialCanvasData=D({},c)},limitCanvas:function(t,e){var i=this.options,a=this.containerData,n=this.canvasData,o=this.cropBoxData,s=i.viewMode,r=n.aspectRatio,h=this.cropped&&o;if(t){var c=Number(i.minCanvasWidth)||0,l=Number(i.minCanvasHeight)||0;s>1?(c=Math.max(c,a.width),l=Math.max(l,a.height),3===s&&(l*r>c?c=l*r:l=c/r)):s>0&&(c?c=Math.max(c,h?o.width:0):l?l=Math.max(l,h?o.height:0):h&&(c=o.width,(l=o.height)*r>c?c=l*r:l=c/r));var d=Z({aspectRatio:r,width:c,height:l});c=d.width,l=d.height,n.minWidth=c,n.minHeight=l,n.maxWidth=1/0,n.maxHeight=1/0}if(e)if(s){var p=a.width-n.width,u=a.height-n.height;n.minLeft=Math.min(0,p),n.minTop=Math.min(0,u),n.maxLeft=Math.max(0,p),n.maxTop=Math.max(0,u),h&&this.limited&&(n.minLeft=Math.min(o.left,o.left+(o.width-n.width)),n.minTop=Math.min(o.top,o.top+(o.height-n.height)),n.maxLeft=o.left,n.maxTop=o.top,2===s&&(n.width>=a.width&&(n.minLeft=Math.min(0,p),n.maxLeft=Math.max(0,p)),n.height>=a.height&&(n.minTop=Math.min(0,u),n.maxTop=Math.max(0,u))))}else n.minLeft=-n.width,n.minTop=-n.height,n.maxLeft=a.width,n.maxTop=a.height},renderCanvas:function(t,e){var i=this.canvasData,a=this.imageData;if(e){var n=function(t){var e=t.width,i=t.height,a=t.degree;if(90==(a=Math.abs(a)%180))return{width:i,height:e};var n=a%90*Math.PI/180,o=Math.sin(n),s=Math.cos(n),r=e*s+i*o,h=e*o+i*s;return a>90?{width:h,height:r}:{width:r,height:h}}({width:a.naturalWidth*Math.abs(a.scaleX||1),height:a.naturalHeight*Math.abs(a.scaleY||1),degree:a.rotate||0}),o=n.width,s=n.height,r=i.width*(o/i.naturalWidth),h=i.height*(s/i.naturalHeight);i.left-=(r-i.width)/2,i.top-=(h-i.height)/2,i.width=r,i.height=h,i.aspectRatio=o/s,i.naturalWidth=o,i.naturalHeight=s,this.limitCanvas(!0,!1)}(i.width>i.maxWidth||i.widthi.maxHeight||i.heighte.width?n.height=n.width/i:n.width=n.height*i),this.cropBoxData=n,this.limitCropBox(!0,!0),n.width=Math.min(Math.max(n.width,n.minWidth),n.maxWidth),n.height=Math.min(Math.max(n.height,n.minHeight),n.maxHeight),n.width=Math.max(n.minWidth,n.width*a),n.height=Math.max(n.minHeight,n.height*a),n.left=e.left+(e.width-n.width)/2,n.top=e.top+(e.height-n.height)/2,n.oldLeft=n.left,n.oldTop=n.top,this.initialCropBoxData=D({},n)},limitCropBox:function(t,e){var i=this.options,a=this.containerData,n=this.canvasData,o=this.cropBoxData,s=this.limited,r=i.aspectRatio;if(t){var h=Number(i.minCropBoxWidth)||0,c=Number(i.minCropBoxHeight)||0,l=Math.min(a.width,s?n.width:a.width),d=Math.min(a.height,s?n.height:a.height);h=Math.min(h,a.width),c=Math.min(c,a.height),r&&(h&&c?c*r>h?c=h/r:h=c*r:h?c=h/r:c&&(h=c*r),d*r>l?d=l/r:l=d*r),o.minWidth=Math.min(h,l),o.minHeight=Math.min(c,d),o.maxWidth=l,o.maxHeight=d}e&&(s?(o.minLeft=Math.max(0,n.left),o.minTop=Math.max(0,n.top),o.maxLeft=Math.min(a.width,n.left+n.width)-o.width,o.maxTop=Math.min(a.height,n.top+n.height)-o.height):(o.minLeft=0,o.minTop=0,o.maxLeft=a.width-o.width,o.maxTop=a.height-o.height))},renderCropBox:function(){var t=this.options,e=this.containerData,i=this.cropBoxData;(i.width>i.maxWidth||i.widthi.maxHeight||i.height=e.width&&i.height>=e.height?"move":"all"),P(this.cropBox,D({width:i.width,height:i.height},Q({translateX:i.left,translateY:i.top}))),this.cropped&&this.limited&&this.limitCanvas(!0,!0),this.disabled||this.output()},output:function(){this.preview(),X(this.element,"crop",this.getData())}},at={initPreview:function(){var t=this.crossOrigin,e=this.options.preview,i=t?this.crossOriginUrl:this.url,a=document.createElement("img");if(t&&(a.crossOrigin=t),a.src=i,this.viewBox.appendChild(a),this.viewBoxImage=a,e){var n=e;"string"==typeof e?n=this.element.ownerDocument.querySelectorAll(e):e.querySelector&&(n=[e]),this.previews=n,k(n,function(e){var a=document.createElement("img");W(e,"preview",{width:e.offsetWidth,height:e.offsetHeight,html:e.innerHTML}),t&&(a.crossOrigin=t),a.src=i,a.style.cssText='display:block;width:100%;height:auto;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important;image-orientation:0deg!important;"',e.innerHTML="",e.appendChild(a)})}},resetPreview:function(){k(this.previews,function(t){var e=L(t,"preview");P(t,{width:e.width,height:e.height}),t.innerHTML=e.html,A(t,"preview")})},preview:function(){var t=this.imageData,e=this.canvasData,i=this.cropBoxData,a=i.width,n=i.height,o=t.width,s=t.height,r=i.left-e.left-t.left,h=i.top-e.top-t.top;this.cropped&&!this.disabled&&(P(this.viewBoxImage,D({width:o,height:s},Q(D({translateX:-r,translateY:-h},t)))),k(this.previews,function(e){var i=L(e,"preview"),c=i.width,l=i.height,d=c,p=l,u=1;a&&(p=n*(u=c/a)),n&&p>l&&(d=a*(u=l/n),p=l),P(e,{width:d,height:p}),P(e.getElementsByTagName("img")[0],D({width:o*u,height:s*u},Q(D({translateX:-r*u,translateY:-h*u},t))))}))}},nt={bind:function(){var t=this.element,e=this.options,i=this.cropper;M(e.cropstart)&&R(t,"cropstart",e.cropstart),M(e.cropmove)&&R(t,"cropmove",e.cropmove),M(e.cropend)&&R(t,"cropend",e.cropend),M(e.crop)&&R(t,"crop",e.crop),M(e.zoom)&&R(t,"zoom",e.zoom),R(i,n,this.onCropStart=this.cropStart.bind(this)),e.zoomable&&e.zoomOnWheel&&R(i,"wheel mousewheel DOMMouseScroll",this.onWheel=this.wheel.bind(this)),e.toggleDragModeOnDblclick&&R(i,"dblclick",this.onDblclick=this.dblclick.bind(this)),R(t.ownerDocument,o,this.onCropMove=this.cropMove.bind(this)),R(t.ownerDocument,s,this.onCropEnd=this.cropEnd.bind(this)),e.responsive&&R(window,"resize",this.onResize=this.resize.bind(this))},unbind:function(){var t=this.element,e=this.options,i=this.cropper;M(e.cropstart)&&H(t,"cropstart",e.cropstart),M(e.cropmove)&&H(t,"cropmove",e.cropmove),M(e.cropend)&&H(t,"cropend",e.cropend),M(e.crop)&&H(t,"crop",e.crop),M(e.zoom)&&H(t,"zoom",e.zoom),H(i,n,this.onCropStart),e.zoomable&&e.zoomOnWheel&&H(i,"wheel mousewheel DOMMouseScroll",this.onWheel),e.toggleDragModeOnDblclick&&H(i,"dblclick",this.onDblclick),H(t.ownerDocument,o,this.onCropMove),H(t.ownerDocument,s,this.onCropEnd),e.responsive&&H(window,"resize",this.onResize)}},ot={resize:function(){var t=this.options,e=this.container,i=this.containerData,a=Number(t.minContainerWidth)||200,n=Number(t.minContainerHeight)||100;if(!(this.disabled||i.width<=a||i.height<=n)){var o=e.offsetWidth/i.width;if(1!==o||e.offsetHeight!==i.height){var s=void 0,r=void 0;t.restore&&(s=this.getCanvasData(),r=this.getCropBoxData()),this.render(),t.restore&&(this.setCanvasData(k(s,function(t,e){s[e]=t*o})),this.setCropBoxData(k(r,function(t,e){r[e]=t*o})))}}},dblclick:function(){var t,e;this.disabled||"none"===this.options.dragMode||this.setDragMode((t=this.dragBox,e="cropper-crop",(t.classList?t.classList.contains(e):t.className.indexOf(e)>-1)?"move":"crop"))},wheel:function(t){var e=this,i=Number(this.options.wheelZoomRatio)||.1,a=1;this.disabled||(t.preventDefault(),this.wheeling||(this.wheeling=!0,setTimeout(function(){e.wheeling=!1},50),t.deltaY?a=t.deltaY>0?1:-1:t.wheelDelta?a=-t.wheelDelta/120:t.detail&&(a=t.detail>0?1:-1),this.zoom(-a*i,t)))},cropStart:function(t){if(!this.disabled){var e=this.options,i=this.pointers,a=void 0;t.changedTouches?k(t.changedTouches,function(t){i[t.identifier]=$(t)}):i[t.pointerId||0]=$(t),a=Object.keys(i).length>1&&e.zoomable&&e.zoomOnTouch?"zoom":L(t.target,"action"),r.test(a)&&!1!==X(this.element,"cropstart",{originalEvent:t,action:a})&&(t.preventDefault(),this.action=a,this.cropping=!1,"crop"===a&&(this.cropping=!0,O(this.dragBox,"cropper-modal")))}},cropMove:function(t){var e=this.action;if(!this.disabled&&e){var i=this.pointers;t.preventDefault(),!1!==X(this.element,"cropmove",{originalEvent:t,action:e})&&(t.changedTouches?k(t.changedTouches,function(t){D(i[t.identifier],$(t,!0))}):D(i[t.pointerId||0],$(t,!0)),this.change(t))}},cropEnd:function(t){if(!this.disabled){var e=this.action,i=this.pointers;t.changedTouches?k(t.changedTouches,function(t){delete i[t.identifier]}):delete i[t.pointerId||0],e&&(t.preventDefault(),Object.keys(i).length||(this.action=""),this.cropping&&(this.cropping=!1,T(this.dragBox,"cropper-modal",this.cropped&&this.options.modal)),X(this.element,"cropend",{originalEvent:t,action:e}))}}},st={change:function(t){var e=this.options,i=this.canvasData,n=this.containerData,o=this.cropBoxData,s=this.pointers,r=this.action,h=e.aspectRatio,c=o.left,l=o.top,d=o.width,p=o.height,u=c+d,m=l+p,f=0,g=0,v=n.width,b=n.height,w=!0,x=void 0;!h&&t.shiftKey&&(h=d&&p?d/p:1),this.limited&&(f=o.minLeft,g=o.minTop,v=f+Math.min(n.width,i.width,i.left+i.width),b=g+Math.min(n.height,i.height,i.top+i.height));var y=s[Object.keys(s)[0]],C={x:y.endX-y.startX,y:y.endY-y.startY},M=function(t){switch(t){case"e":u+C.x>v&&(C.x=v-u);break;case"w":c+C.xb&&(C.y=b-m)}};switch(r){case"all":c+=C.x,l+=C.y;break;case"e":if(C.x>=0&&(u>=v||h&&(l<=g||m>=b))){w=!1;break}M("e"),d+=C.x,h&&(p=d/h,l-=C.x/h/2),d<0&&(r="w",d=0);break;case"n":if(C.y<=0&&(l<=g||h&&(c<=f||u>=v))){w=!1;break}M("n"),p-=C.y,l+=C.y,h&&(d=p*h,c+=C.y*h/2),p<0&&(r="s",p=0);break;case"w":if(C.x<=0&&(c<=f||h&&(l<=g||m>=b))){w=!1;break}M("w"),d-=C.x,c+=C.x,h&&(p=d/h,l+=C.x/h/2),d<0&&(r="e",d=0);break;case"s":if(C.y>=0&&(m>=b||h&&(c<=f||u>=v))){w=!1;break}M("s"),p+=C.y,h&&(d=p*h,c-=C.y*h/2),p<0&&(r="n",p=0);break;case"ne":if(h){if(C.y<=0&&(l<=g||u>=v)){w=!1;break}M("n"),p-=C.y,l+=C.y,d=p*h}else M("n"),M("e"),C.x>=0?ug&&(p-=C.y,l+=C.y):(p-=C.y,l+=C.y);d<0&&p<0?(r="sw",p=0,d=0):d<0?(r="nw",d=0):p<0&&(r="se",p=0);break;case"nw":if(h){if(C.y<=0&&(l<=g||c<=f)){w=!1;break}M("n"),p-=C.y,l+=C.y,d=p*h,c+=C.y*h}else M("n"),M("w"),C.x<=0?c>f?(d-=C.x,c+=C.x):C.y<=0&&l<=g&&(w=!1):(d-=C.x,c+=C.x),C.y<=0?l>g&&(p-=C.y,l+=C.y):(p-=C.y,l+=C.y);d<0&&p<0?(r="se",p=0,d=0):d<0?(r="ne",d=0):p<0&&(r="sw",p=0);break;case"sw":if(h){if(C.x<=0&&(c<=f||m>=b)){w=!1;break}M("w"),d-=C.x,c+=C.x,p=d/h}else M("s"),M("w"),C.x<=0?c>f?(d-=C.x,c+=C.x):C.y>=0&&m>=b&&(w=!1):(d-=C.x,c+=C.x),C.y>=0?m=0&&(u>=v||m>=b)){w=!1;break}M("e"),p=(d+=C.x)/h}else M("s"),M("e"),C.x>=0?u=0&&m>=b&&(w=!1):d+=C.x,C.y>=0?m0?r=C.y>0?"se":"ne":C.x<0&&(c-=d,r=C.y>0?"sw":"nw"),C.y<0&&(l-=p),this.cropped||(_(this.cropBox,a),this.cropped=!0,this.limited&&this.limitCropBox(!0,!0))}w&&(o.width=d,o.height=p,o.left=c,o.top=l,this.action=r,this.renderCropBox()),k(s,function(t){t.startX=t.endX,t.startY=t.endY})}},rt={crop:function(){return!this.ready||this.cropped||this.disabled||(this.cropped=!0,this.limitCropBox(!0,!0),this.options.modal&&O(this.dragBox,"cropper-modal"),_(this.cropBox,a),this.setCropBoxData(this.initialCropBoxData)),this},reset:function(){return this.ready&&!this.disabled&&(this.imageData=D({},this.initialImageData),this.canvasData=D({},this.initialCanvasData),this.cropBoxData=D({},this.initialCropBoxData),this.renderCanvas(),this.cropped&&this.renderCropBox()),this},clear:function(){return this.cropped&&!this.disabled&&(D(this.cropBoxData,{left:0,top:0,width:0,height:0}),this.cropped=!1,this.renderCropBox(),this.limitCanvas(!0,!0),this.renderCanvas(),_(this.dragBox,"cropper-modal"),O(this.cropBox,a)),this},replace:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!this.disabled&&t&&(this.isImg&&(this.element.src=t),e?(this.url=t,this.image.src=t,this.ready&&(this.viewBoxImage.src=t,k(this.previews,function(e){e.getElementsByTagName("img")[0].src=t}))):(this.isImg&&(this.replaced=!0),this.options.data=null,this.uncreate(),this.load(t))),this},enable:function(){return this.ready&&this.disabled&&(this.disabled=!1,_(this.cropper,"cropper-disabled")),this},disable:function(){return this.ready&&!this.disabled&&(this.disabled=!0,O(this.cropper,"cropper-disabled")),this},destroy:function(){var t=this.element;return L(t,"cropper")?(this.isImg&&this.replaced&&(t.src=this.originalUrl),this.uncreate(),A(t,"cropper"),this):this},move:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.canvasData,a=i.left,n=i.top;return this.moveTo(w(t)?t:a+Number(t),w(e)?e:n+Number(e))},moveTo:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.canvasData,a=!1;return t=Number(t),e=Number(e),this.ready&&!this.disabled&&this.options.movable&&(b(t)&&(i.left=t,a=!0),b(e)&&(i.top=e,a=!0),a&&this.renderCanvas(!0)),this},zoom:function(t,e){var i=this.canvasData;return t=(t=Number(t))<0?1/(1-t):1+t,this.zoomTo(i.width*t/i.naturalWidth,null,e)},zoomTo:function(t,e,i){var a=this.options,n=this.canvasData,o=n.width,s=n.height,r=n.naturalWidth,h=n.naturalHeight;if((t=Number(t))>=0&&this.ready&&!this.disabled&&a.zoomable){var c=r*t,l=h*t;if(!1===X(this.element,"zoom",{originalEvent:i,oldRatio:o/r,ratio:c/r}))return this;if(i){var d=this.pointers,p=Y(this.cropper),u=d&&Object.keys(d).length?function(t){var e=0,i=0,a=0;return k(t,function(t){var n=t.startX,o=t.startY;e+=n,i+=o,a+=1}),{pageX:e/=a,pageY:i/=a}}(d):{pageX:i.pageX,pageY:i.pageY};n.left-=(c-o)*((u.pageX-p.left-n.left)/o),n.top-=(l-s)*((u.pageY-p.top-n.top)/s)}else C(e)&&b(e.x)&&b(e.y)?(n.left-=(c-o)*((e.x-n.left)/o),n.top-=(l-s)*((e.y-n.top)/s)):(n.left-=(c-o)/2,n.top-=(l-s)/2);n.width=c,n.height=l,this.renderCanvas(!0)}return this},rotate:function(t){return this.rotateTo((this.imageData.rotate||0)+Number(t))},rotateTo:function(t){return b(t=Number(t))&&this.ready&&!this.disabled&&this.options.rotatable&&(this.imageData.rotate=t%360,this.renderCanvas(!0,!0)),this},scaleX:function(t){var e=this.imageData.scaleY;return this.scale(t,b(e)?e:1)},scaleY:function(t){var e=this.imageData.scaleX;return this.scale(b(e)?e:1,t)},scale:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.imageData,a=!1;return t=Number(t),e=Number(e),this.ready&&!this.disabled&&this.options.scalable&&(b(t)&&(i.scaleX=t,a=!0),b(e)&&(i.scaleY=e,a=!0),a&&this.renderCanvas(!0,!0)),this},getData:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=this.options,i=this.imageData,a=this.canvasData,n=this.cropBoxData,o=void 0;if(this.ready&&this.cropped){o={x:n.left-a.left,y:n.top-a.top,width:n.width,height:n.height};var s=i.width/i.naturalWidth;k(o,function(e,i){e/=s,o[i]=t?Math.round(e):e})}else o={x:0,y:0,width:0,height:0};return e.rotatable&&(o.rotate=i.rotate||0),e.scalable&&(o.scaleX=i.scaleX||1,o.scaleY=i.scaleY||1),o},setData:function(t){var e=this.options,i=this.imageData,a=this.canvasData,n={};if(this.ready&&!this.disabled&&C(t)){var o=!1;e.rotatable&&b(t.rotate)&&t.rotate!==i.rotate&&(i.rotate=t.rotate,o=!0),e.scalable&&(b(t.scaleX)&&t.scaleX!==i.scaleX&&(i.scaleX=t.scaleX,o=!0),b(t.scaleY)&&t.scaleY!==i.scaleY&&(i.scaleY=t.scaleY,o=!0)),o&&this.renderCanvas(!0,!0);var s=i.width/i.naturalWidth;b(t.x)&&(n.left=t.x*s+a.left),b(t.y)&&(n.top=t.y*s+a.top),b(t.width)&&(n.width=t.width*s),b(t.height)&&(n.height=t.height*s),this.setCropBoxData(n)}return this},getContainerData:function(){return this.ready?D({},this.containerData):{}},getImageData:function(){return this.sized?D({},this.imageData):{}},getCanvasData:function(){var t=this.canvasData,e={};return this.ready&&k(["left","top","width","height","naturalWidth","naturalHeight"],function(i){e[i]=t[i]}),e},setCanvasData:function(t){var e=this.canvasData,i=e.aspectRatio;return this.ready&&!this.disabled&&C(t)&&(b(t.left)&&(e.left=t.left),b(t.top)&&(e.top=t.top),b(t.width)?(e.width=t.width,e.height=t.width/i):b(t.height)&&(e.height=t.height,e.width=t.height*i),this.renderCanvas(!0)),this},getCropBoxData:function(){var t=this.cropBoxData,e=void 0;return this.ready&&this.cropped&&(e={left:t.left,top:t.top,width:t.width,height:t.height}),e||{}},setCropBoxData:function(t){var e=this.cropBoxData,i=this.options.aspectRatio,a=void 0,n=void 0;return this.ready&&this.cropped&&!this.disabled&&C(t)&&(b(t.left)&&(e.left=t.left),b(t.top)&&(e.top=t.top),b(t.width)&&t.width!==e.width&&(a=!0,e.width=t.width),b(t.height)&&t.height!==e.height&&(n=!0,e.height=t.height),i&&(a?e.height=e.width/i:n&&(e.width=e.height*i)),this.renderCropBox()),this},getCroppedCanvas:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!this.ready||!window.HTMLCanvasElement)return null;var e=this.canvasData,i=J(this.image,this.imageData,e,t);if(!this.cropped)return i;var a=this.getData(),n=a.x,o=a.y,s=a.width,r=a.height,h=i.width/Math.floor(e.naturalWidth);1!==h&&(n*=h,o*=h,s*=h,r*=h);var c=s/r,l=Z({aspectRatio:c,width:t.maxWidth||1/0,height:t.maxHeight||1/0}),d=Z({aspectRatio:c,width:t.minWidth||0,height:t.minHeight||0},"cover"),p=Z({aspectRatio:c,width:t.width||(1!==h?i.width:s),height:t.height||(1!==h?i.height:r)}),u=p.width,m=p.height;u=Math.min(l.width,Math.max(d.width,u)),m=Math.min(l.height,Math.max(d.height,m));var f=document.createElement("canvas"),v=f.getContext("2d");f.width=S(u),f.height=S(m),v.fillStyle=t.fillColor||"transparent",v.fillRect(0,0,u,m);var b=t.imageSmoothingEnabled,w=void 0===b||b,x=t.imageSmoothingQuality;v.imageSmoothingEnabled=w,x&&(v.imageSmoothingQuality=x);var y=i.width,C=i.height,M=n,k=o,D=void 0,I=void 0,B=void 0,P=void 0,O=void 0,_=void 0;M<=-s||M>y?(M=0,D=0,B=0,O=0):M<=0?(B=-M,M=0,O=D=Math.min(y,s+M)):M<=y&&(B=0,O=D=Math.min(s,y-M)),D<=0||k<=-r||k>C?(k=0,I=0,P=0,_=0):k<=0?(P=-k,k=0,_=I=Math.min(C,r+k)):k<=C&&(P=0,_=I=Math.min(r,C-k));var T=[M,k,D,I];if(O>0&&_>0){var E=u/s;T.push(B*E,P*E,O*E,_*E)}return v.drawImage.apply(v,[i].concat(g(T.map(function(t){return Math.floor(S(t))})))),f},setAspectRatio:function(t){var e=this.options;return this.disabled||w(t)||(e.aspectRatio=Math.max(0,t)||NaN,this.ready&&(this.initCropBox(),this.cropped&&this.renderCropBox())),this},setDragMode:function(t){var e=this.options,i=this.dragBox,a=this.face;if(this.ready&&!this.disabled){var n="crop"===t,o=e.movable&&"move"===t;t=n||o?t:"none",e.dragMode=t,W(i,"action",t),T(i,"cropper-crop",n),T(i,"cropper-move",o),e.cropBoxMovable||(W(a,"action",t),T(a,"cropper-crop",n),T(a,"cropper-move",o))}return this}},ht=i.Cropper,ct=function(){function t(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(m(this,t),!e||!d.test(e.tagName))throw new Error("The first argument is required and must be an or element.");this.element=e,this.options=D({},p,C(i)&&i),this.cropped=!1,this.disabled=!1,this.pointers={},this.ready=!1,this.reloading=!1,this.replaced=!1,this.sized=!1,this.sizing=!1,this.init()}return f(t,[{key:"init",value:function(){var t=this.element,e=t.tagName.toLowerCase(),i=void 0;if(!L(t,"cropper")){if(W(t,"cropper",this),"img"===e){if(this.isImg=!0,i=t.getAttribute("src")||"",this.originalUrl=i,!i)return;i=t.src}else"canvas"===e&&window.HTMLCanvasElement&&(i=t.toDataURL());this.load(i)}}},{key:"load",value:function(t){var e=this;if(t){this.url=t,this.imageData={};var i=this.element,a=this.options;if(a.checkOrientation&&window.ArrayBuffer)if(c.test(t))l.test(t)?this.read((n=t.replace(tt,""),o=atob(n),s=new ArrayBuffer(o.length),k(r=new Uint8Array(s),function(t,e){r[e]=o.charCodeAt(e)}),s)):this.clone();else{var n,o,s,r,h=new XMLHttpRequest;this.reloading=!0,this.xhr=h;var d=function(){e.reloading=!1,e.xhr=null};h.ontimeout=d,h.onabort=d,h.onerror=function(){d(),e.clone()},h.onload=function(){d(),e.read(h.response)},a.checkCrossOrigin&&V(t)&&i.crossOrigin&&(t=q(t)),h.open("get",t),h.responseType="arraybuffer",h.withCredentials="use-credentials"===i.crossOrigin,h.send()}else this.clone()}}},{key:"read",value:function(t){var e=this.options,i=this.imageData,a=et(t),n=0,o=1,s=1;if(a>1){this.url=function(t,e){var i=new Uint8Array(t),a="";return k(i,function(t){a+=G(t)}),"data:"+e+";base64,"+btoa(a)}(t,"image/jpeg");var r=function(t){var e=0,i=1,a=1;switch(t){case 2:i=-1;break;case 3:e=-180;break;case 4:a=-1;break;case 5:e=90,a=-1;break;case 6:e=90;break;case 7:e=90,i=-1;break;case 8:e=-90}return{rotate:e,scaleX:i,scaleY:a}}(a);n=r.rotate,o=r.scaleX,s=r.scaleY}e.rotatable&&(i.rotate=n),e.scalable&&(i.scaleX=o,i.scaleY=s),this.clone()}},{key:"clone",value:function(){var t=this.element,e=this.url,i=void 0,a=void 0;this.options.checkCrossOrigin&&V(e)&&((i=t.crossOrigin)?a=e:(i="anonymous",a=q(e))),this.crossOrigin=i,this.crossOriginUrl=a;var n=document.createElement("img");i&&(n.crossOrigin=i),n.src=a||e;var o=this.start.bind(this),s=this.stop.bind(this);this.image=n,this.onStart=o,this.onStop=s,this.isImg?t.complete?this.timeout=setTimeout(o,0):R(t,"load",o,{once:!0}):(n.onload=o,n.onerror=s,O(n,"cropper-hide"),t.parentNode.insertBefore(n,t.nextSibling))}},{key:"start",value:function(t){var e=this,a=this.isImg?this.element:this.image;t&&(a.onload=null,a.onerror=null),this.sizing=!0;var n=i.navigator&&/(Macintosh|iPhone|iPod|iPad).*AppleWebKit/i.test(i.navigator.userAgent),o=function(t,i){D(e.imageData,{naturalWidth:t,naturalHeight:i,aspectRatio:t/i}),e.sizing=!1,e.sized=!0,e.build()};if(!a.naturalWidth||n){var s=document.createElement("img"),r=document.body||document.documentElement;this.sizingImage=s,s.onload=function(){o(s.width,s.height),n||r.removeChild(s)},s.src=a.src,n||(s.style.cssText="left:0;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;opacity:0;position:absolute;top:0;z-index:-1;",r.appendChild(s))}else o(a.naturalWidth,a.naturalHeight)}},{key:"stop",value:function(){var t=this.image;t.onload=null,t.onerror=null,t.parentNode.removeChild(t),this.image=null}},{key:"build",value:function(){if(this.sized&&!this.ready){var t=this.element,e=this.options,i=this.image,n=t.parentNode,o=document.createElement("div");o.innerHTML='
      ';var s=o.querySelector(".cropper-container"),r=s.querySelector(".cropper-canvas"),h=s.querySelector(".cropper-drag-box"),c=s.querySelector(".cropper-crop-box"),l=c.querySelector(".cropper-face");this.container=n,this.cropper=s,this.canvas=r,this.dragBox=h,this.cropBox=c,this.viewBox=s.querySelector(".cropper-view-box"),this.face=l,r.appendChild(i),O(t,a),n.insertBefore(s,t.nextSibling),this.isImg||_(i,"cropper-hide"),this.initPreview(),this.bind(),e.aspectRatio=Math.max(0,e.aspectRatio)||NaN,e.viewMode=Math.max(0,Math.min(3,Math.round(e.viewMode)))||0,O(c,a),e.guides||O(c.getElementsByClassName("cropper-dashed"),a),e.center||O(c.getElementsByClassName("cropper-center"),a),e.background&&O(s,"cropper-bg"),e.highlight||O(l,"cropper-invisible"),e.cropBoxMovable&&(O(l,"cropper-move"),W(l,"action","all")),e.cropBoxResizable||(O(c.getElementsByClassName("cropper-line"),a),O(c.getElementsByClassName("cropper-point"),a)),this.render(),this.ready=!0,this.setDragMode(e.dragMode),e.autoCrop&&this.crop(),this.setData(e.data),M(e.ready)&&R(t,"ready",e.ready,{once:!0}),X(t,"ready")}}},{key:"unbuild",value:function(){this.ready&&(this.ready=!1,this.unbind(),this.resetPreview(),this.cropper.parentNode.removeChild(this.cropper),_(this.element,a))}},{key:"uncreate",value:function(){var t=this.element;this.ready?(this.unbuild(),this.ready=!1,this.cropped=!1):this.sizing?(this.sizingImage.onload=null,this.sizing=!1,this.sized=!1):this.reloading?this.xhr.abort():this.isImg?t.complete?clearTimeout(this.timeout):H(t,"load",this.onStart):this.image&&this.stop()}}],[{key:"noConflict",value:function(){return window.Cropper=ht,t}},{key:"setDefaults",value:function(t){D(p,C(t)&&t)}}]),t}();if(D(ct.prototype,it,at,nt,ot,st,rt),t.fn){var lt=t.fn.cropper;t.fn.cropper=function(e){for(var i=arguments.length,a=Array(i>1?i-1:0),n=1;n
      \n '),this.browserPath=this.browserView.querySelector("input[type=text]"),this.browserTableContainer=this.browserView.querySelector(".ilab-browser-select-table-container"),this.browserView.querySelector(".button-cancel").addEventListener("click",this.cancelClick.bind(this)),this.browserView.querySelector(".button-primary").addEventListener("click",this.selectClick.bind(this)),this.popup.setContent(this.browserView)}browseClick(e){return e.preventDefault(),this.browserPath.value=this.input.value,this.browseButton.disabled=!0,this.browseToPath(this.browserPath.value,function(){this.browseButton.disabled=!1,this.popup.show()}.bind(this)),!1}browseToPath(e,t){if("/"==e&&(e=""),this.browserCache[e])return this.browserPath.value=""==e?"/":e,this.displayTable(this.browserCache[e]),void(t&&t());const a={action:"ilab_browser_browser_select_directory",nonce:this.nonce,key:e};jQuery.post(ajaxurl,a,function(a){if("ok"==a.status){this.browserPath.value=""==e?"/":e;let s=n.default.createElement(a.table);s.querySelectorAll('tr[data-file-type="dir"]').forEach(function(e){e.addEventListener("click",function(t){let a=e.dataset.key,s=e.querySelector("img.loader");s&&(s.style.display="block"),e.querySelectorAll("td > span").forEach(function(e){e.style.display="none"}.bind(this)),this.browseToPath(a)}.bind(this))}.bind(this)),this.browserCache[e]=s,this.displayTable(s),a.hasOwnProperty("nextNonce")&&(this.nonce=a.nextNonce),t&&t()}}.bind(this))}displayTable(e){e.querySelectorAll('tr[data-file-type="dir"]').forEach(function(e){let t=e.querySelector("img.loader");t&&(t.style.display="none"),e.querySelectorAll("td > span").forEach(function(e){e.style.display="block"}.bind(this))}.bind(this)),this.browserTableContainer.innerHTML="",this.browserTableContainer.append(e)}cancelClick(e){return e.preventDefault(),this.popup.hide(),!1}selectClick(e){return e.preventDefault(),this.input.value=this.browserPath.value,this.popup.hide(),!1}static bind(){document.querySelectorAll(".option-ui-browser").forEach(function(e){new r(e)})}}t.default=r},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=a(120);t.default=class{constructor(){this.popup=null,this.container=null,this.visible=!1,this.popup=s.default.createElement(""),this.container=this.popup.querySelector(".ilab-popup-contents"),this.popup.querySelector(".ilab-popup-close").addEventListener("click",this.closeClick.bind(this)),document.body.appendChild(this.popup)}setContent(e){this.container.innerHTML="",this.container.appendChild(e)}show(){this.visible||(this.visible=!0,this.popup.classList.remove("hidden"))}hide(){this.visible&&(this.visible=!1,this.popup.classList.add("hidden"))}closeClick(e){return e.preventDefault(),this.hide(),!1}}}]); \ No newline at end of file +!function(e){var t={};function a(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,a),n.l=!0,n.exports}a.m=e,a.c=t,a.d=function(e,t,s){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(a.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)a.d(s,n,function(t){return e[t]}.bind(null,n));return s},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="/",a(a.s=305)}([function(e,t,a){(function(e){e.exports=function(){"use strict";var t,s;function n(){return t.apply(null,arguments)}function r(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function i(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function d(e){return void 0===e}function _(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function o(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function u(e,t){var a,s=[];for(a=0;a>>0,s=0;s0)for(a=0;a=0;return(r?a?"+":"":"-")+Math.pow(10,Math.max(0,n)).toString().substr(1)+s}var I=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,N=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,C={},R={};function q(e,t,a,s){var n=s;"string"==typeof s&&(n=function(){return this[s]()}),e&&(R[e]=n),t&&(R[t[0]]=function(){return J(n.apply(this,arguments),t[1],t[2])}),a&&(R[a]=function(){return this.localeData().ordinal(n.apply(this,arguments),e)})}function U(e,t){return e.isValid()?(t=G(t,e.localeData()),C[t]=C[t]||function(e){var t,a,s,n=e.match(I);for(t=0,a=n.length;t=0&&N.test(e);)e=e.replace(N,s),N.lastIndex=0,a-=1;return e}var B=/\d/,V=/\d\d/,K=/\d{3}/,Z=/\d{4}/,$=/[+-]?\d{6}/,Q=/\d\d?/,X=/\d\d\d\d?/,ee=/\d\d\d\d\d\d?/,te=/\d{1,3}/,ae=/\d{1,4}/,se=/[+-]?\d{1,6}/,ne=/\d+/,re=/[+-]?\d+/,ie=/Z|[+-]\d\d:?\d\d/gi,de=/Z|[+-]\d\d(?::?\d\d)?/gi,_e=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,oe={};function ue(e,t,a){oe[e]=j(t)?t:function(e,s){return e&&a?a:t}}function le(e,t){return l(oe,e)?oe[e](t._strict,t._locale):new RegExp(me(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,a,s,n){return t||a||s||n})))}function me(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var he={};function ce(e,t){var a,s=t;for("string"==typeof e&&(e=[e]),_(t)&&(s=function(e,a){a[t]=T(e)}),a=0;a68?1900:2e3)};var Se,He=je("FullYear",!0);function je(e,t){return function(a){return null!=a?(Oe(this,e,a),n.updateOffset(this,t),this):xe(this,e)}}function xe(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function Oe(e,t,a){e.isValid()&&!isNaN(a)&&("FullYear"===t&&ve(e.year())&&1===e.month()&&29===e.date()?e._d["set"+(e._isUTC?"UTC":"")+t](a,e.month(),Pe(a,e.month())):e._d["set"+(e._isUTC?"UTC":"")+t](a))}function Pe(e,t){if(isNaN(e)||isNaN(t))return NaN;var a,s=(t%(a=12)+a)%a;return e+=(t-s)/12,1===s?ve(e)?29:28:31-s%7%2}Se=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t=0){var a=Array.prototype.slice.call(arguments);a[0]=e+400,t=new Date(Date.UTC.apply(null,a)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)}else t=new Date(Date.UTC.apply(null,arguments));return t}function Re(e,t,a){var s=7+t-a,n=(7+Ce(e,0,s).getUTCDay()-t)%7;return-n+s-1}function qe(e,t,a,s,n){var r,i,d=(7+a-s)%7,_=Re(e,s,n),o=1+7*(t-1)+d+_;return o<=0?i=be(r=e-1)+o:o>be(e)?(r=e+1,i=o-be(e)):(r=e,i=o),{year:r,dayOfYear:i}}function Ue(e,t,a){var s,n,r=Re(e.year(),t,a),i=Math.floor((e.dayOfYear()-r-1)/7)+1;return i<1?(n=e.year()-1,s=i+Ge(n,t,a)):i>Ge(e.year(),t,a)?(s=i-Ge(e.year(),t,a),n=e.year()+1):(n=e.year(),s=i),{week:s,year:n}}function Ge(e,t,a){var s=Re(e,t,a),n=Re(e+1,t,a);return(be(e)-s+n)/7}function Be(e,t){return e.slice(t,7).concat(e.slice(0,t))}q("w",["ww",2],"wo","week"),q("W",["WW",2],"Wo","isoWeek"),E("week","w"),E("isoWeek","W"),z("week",5),z("isoWeek",5),ue("w",Q),ue("ww",Q,V),ue("W",Q),ue("WW",Q,V),Me(["w","ww","W","WW"],function(e,t,a,s){t[s.substr(0,1)]=T(e)}),q("d",0,"do","day"),q("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),q("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),q("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),q("e",0,0,"weekday"),q("E",0,0,"isoWeekday"),E("day","d"),E("weekday","e"),E("isoWeekday","E"),z("day",11),z("weekday",11),z("isoWeekday",11),ue("d",Q),ue("e",Q),ue("E",Q),ue("dd",function(e,t){return t.weekdaysMinRegex(e)}),ue("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ue("dddd",function(e,t){return t.weekdaysRegex(e)}),Me(["dd","ddd","dddd"],function(e,t,a,s){var n=a._locale.weekdaysParse(e,s,a._strict);null!=n?t.d=n:c(a).invalidWeekday=e}),Me(["d","e","E"],function(e,t,a,s){t[s]=T(e)});var Ve="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Ke="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Ze="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),$e=_e,Qe=_e,Xe=_e;function et(){function e(e,t){return t.length-e.length}var t,a,s,n,r,i=[],d=[],_=[],o=[];for(t=0;t<7;t++)a=h([2e3,1]).day(t),s=this.weekdaysMin(a,""),n=this.weekdaysShort(a,""),r=this.weekdays(a,""),i.push(s),d.push(n),_.push(r),o.push(s),o.push(n),o.push(r);for(i.sort(e),d.sort(e),_.sort(e),o.sort(e),t=0;t<7;t++)d[t]=me(d[t]),_[t]=me(_[t]),o[t]=me(o[t]);this._weekdaysRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+_.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+d.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+i.join("|")+")","i")}function tt(){return this.hours()%12||12}function at(e,t){q(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function st(e,t){return t._meridiemParse}q("H",["HH",2],0,"hour"),q("h",["hh",2],0,tt),q("k",["kk",2],0,function(){return this.hours()||24}),q("hmm",0,0,function(){return""+tt.apply(this)+J(this.minutes(),2)}),q("hmmss",0,0,function(){return""+tt.apply(this)+J(this.minutes(),2)+J(this.seconds(),2)}),q("Hmm",0,0,function(){return""+this.hours()+J(this.minutes(),2)}),q("Hmmss",0,0,function(){return""+this.hours()+J(this.minutes(),2)+J(this.seconds(),2)}),at("a",!0),at("A",!1),E("hour","h"),z("hour",13),ue("a",st),ue("A",st),ue("H",Q),ue("h",Q),ue("k",Q),ue("HH",Q,V),ue("hh",Q,V),ue("kk",Q,V),ue("hmm",X),ue("hmmss",ee),ue("Hmm",X),ue("Hmmss",ee),ce(["H","HH"],pe),ce(["k","kk"],function(e,t,a){var s=T(e);t[pe]=24===s?0:s}),ce(["a","A"],function(e,t,a){a._isPm=a._locale.isPM(e),a._meridiem=e}),ce(["h","hh"],function(e,t,a){t[pe]=T(e),c(a).bigHour=!0}),ce("hmm",function(e,t,a){var s=e.length-2;t[pe]=T(e.substr(0,s)),t[ke]=T(e.substr(s)),c(a).bigHour=!0}),ce("hmmss",function(e,t,a){var s=e.length-4,n=e.length-2;t[pe]=T(e.substr(0,s)),t[ke]=T(e.substr(s,2)),t[De]=T(e.substr(n)),c(a).bigHour=!0}),ce("Hmm",function(e,t,a){var s=e.length-2;t[pe]=T(e.substr(0,s)),t[ke]=T(e.substr(s))}),ce("Hmmss",function(e,t,a){var s=e.length-4,n=e.length-2;t[pe]=T(e.substr(0,s)),t[ke]=T(e.substr(s,2)),t[De]=T(e.substr(n))});var nt,rt=je("Hours",!0),it={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:We,monthsShort:Ae,week:{dow:0,doy:6},weekdays:Ve,weekdaysMin:Ze,weekdaysShort:Ke,meridiemParse:/[ap]\.?m?\.?/i},dt={},_t={};function ot(e){return e?e.toLowerCase().replace("_","-"):e}function ut(t){var s=null;if(!dt[t]&&void 0!==e&&e&&e.exports)try{s=nt._abbr,a(312)("./"+t),lt(s)}catch(e){}return dt[t]}function lt(e,t){var a;return e&&((a=d(t)?ht(e):mt(e,t))?nt=a:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),nt._abbr}function mt(e,t){if(null!==t){var a,s=it;if(t.abbr=e,null!=dt[e])H("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=dt[e]._config;else if(null!=t.parentLocale)if(null!=dt[t.parentLocale])s=dt[t.parentLocale]._config;else{if(null==(a=ut(t.parentLocale)))return _t[t.parentLocale]||(_t[t.parentLocale]=[]),_t[t.parentLocale].push({name:e,config:t}),null;s=a._config}return dt[e]=new O(x(s,t)),_t[e]&&_t[e].forEach(function(e){mt(e.name,e.config)}),lt(e),dt[e]}return delete dt[e],null}function ht(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return nt;if(!r(e)){if(t=ut(e))return t;e=[e]}return function(e){for(var t,a,s,n,r=0;r0;){if(s=ut(n.slice(0,t).join("-")))return s;if(a&&a.length>=t&&g(n,a,!0)>=t-1)break;t--}r++}return nt}(e)}function ct(e){var t,a=e._a;return a&&-2===c(e).overflow&&(t=a[Ye]<0||a[Ye]>11?Ye:a[fe]<1||a[fe]>Pe(a[ye],a[Ye])?fe:a[pe]<0||a[pe]>24||24===a[pe]&&(0!==a[ke]||0!==a[De]||0!==a[Te])?pe:a[ke]<0||a[ke]>59?ke:a[De]<0||a[De]>59?De:a[Te]<0||a[Te]>999?Te:-1,c(e)._overflowDayOfYear&&(tfe)&&(t=fe),c(e)._overflowWeeks&&-1===t&&(t=ge),c(e)._overflowWeekday&&-1===t&&(t=we),c(e).overflow=t),e}function Mt(e,t,a){return null!=e?e:null!=t?t:a}function Lt(e){var t,a,s,r,i,d=[];if(!e._d){for(s=function(e){var t=new Date(n.now());return e._useUTC?[t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()]:[t.getFullYear(),t.getMonth(),t.getDate()]}(e),e._w&&null==e._a[fe]&&null==e._a[Ye]&&function(e){var t,a,s,n,r,i,d,_;if(null!=(t=e._w).GG||null!=t.W||null!=t.E)r=1,i=4,a=Mt(t.GG,e._a[ye],Ue(xt(),1,4).year),s=Mt(t.W,1),((n=Mt(t.E,1))<1||n>7)&&(_=!0);else{r=e._locale._week.dow,i=e._locale._week.doy;var o=Ue(xt(),r,i);a=Mt(t.gg,e._a[ye],o.year),s=Mt(t.w,o.week),null!=t.d?((n=t.d)<0||n>6)&&(_=!0):null!=t.e?(n=t.e+r,(t.e<0||t.e>6)&&(_=!0)):n=r}s<1||s>Ge(a,r,i)?c(e)._overflowWeeks=!0:null!=_?c(e)._overflowWeekday=!0:(d=qe(a,s,n,r,i),e._a[ye]=d.year,e._dayOfYear=d.dayOfYear)}(e),null!=e._dayOfYear&&(i=Mt(e._a[ye],s[ye]),(e._dayOfYear>be(i)||0===e._dayOfYear)&&(c(e)._overflowDayOfYear=!0),a=Ce(i,0,e._dayOfYear),e._a[Ye]=a.getUTCMonth(),e._a[fe]=a.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=d[t]=s[t];for(;t<7;t++)e._a[t]=d[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[pe]&&0===e._a[ke]&&0===e._a[De]&&0===e._a[Te]&&(e._nextDay=!0,e._a[pe]=0),e._d=(e._useUTC?Ce:function(e,t,a,s,n,r,i){var d;return e<100&&e>=0?(d=new Date(e+400,t,a,s,n,r,i),isFinite(d.getFullYear())&&d.setFullYear(e)):d=new Date(e,t,a,s,n,r,i),d}).apply(null,d),r=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[pe]=24),e._w&&void 0!==e._w.d&&e._w.d!==r&&(c(e).weekdayMismatch=!0)}}var yt=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Yt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ft=/Z|[+-]\d\d(?::?\d\d)?/,pt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],kt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Dt=/^\/?Date\((\-?\d+)/i;function Tt(e){var t,a,s,n,r,i,d=e._i,_=yt.exec(d)||Yt.exec(d);if(_){for(c(e).iso=!0,t=0,a=pt.length;t0&&c(e).unusedInput.push(i),d=d.slice(d.indexOf(a)+a.length),o+=a.length),R[r]?(a?c(e).empty=!1:c(e).unusedTokens.push(r),Le(r,a,e)):e._strict&&!a&&c(e).unusedTokens.push(r);c(e).charsLeftOver=_-o,d.length>0&&c(e).unusedInput.push(d),e._a[pe]<=12&&!0===c(e).bigHour&&e._a[pe]>0&&(c(e).bigHour=void 0),c(e).parsedDateParts=e._a.slice(0),c(e).meridiem=e._meridiem,e._a[pe]=function(e,t,a){var s;return null==a?t:null!=e.meridiemHour?e.meridiemHour(t,a):null!=e.isPM?((s=e.isPM(a))&&t<12&&(t+=12),s||12!==t||(t=0),t):t}(e._locale,e._a[pe],e._meridiem),Lt(e),ct(e)}else vt(e);else Tt(e)}function Ht(e){var t=e._i,a=e._f;return e._locale=e._locale||ht(e._l),null===t||void 0===a&&""===t?L({nullInput:!0}):("string"==typeof t&&(e._i=t=e._locale.preparse(t)),k(t)?new p(ct(t)):(o(t)?e._d=t:r(a)?function(e){var t,a,s,n,r;if(0===e._f.length)return c(e).invalidFormat=!0,void(e._d=new Date(NaN));for(n=0;nthis?this:e:L()});function Et(e,t){var a,s;if(1===t.length&&r(t[0])&&(t=t[0]),!t.length)return xt();for(a=t[0],s=1;s=0?new Date(e+400,t,a)-da:new Date(e,t,a).valueOf()}function ua(e,t,a){return e<100&&e>=0?Date.UTC(e+400,t,a)-da:Date.UTC(e,t,a)}function la(e,t){q(0,[e,e.length],0,t)}function ma(e,t,a,s,n){var r;return null==e?Ue(this,s,n).year:(r=Ge(e,s,n),t>r&&(t=r),function(e,t,a,s,n){var r=qe(e,t,a,s,n),i=Ce(r.year,0,r.dayOfYear);return this.year(i.getUTCFullYear()),this.month(i.getUTCMonth()),this.date(i.getUTCDate()),this}.call(this,e,t,a,s,n))}q(0,["gg",2],0,function(){return this.weekYear()%100}),q(0,["GG",2],0,function(){return this.isoWeekYear()%100}),la("gggg","weekYear"),la("ggggg","weekYear"),la("GGGG","isoWeekYear"),la("GGGGG","isoWeekYear"),E("weekYear","gg"),E("isoWeekYear","GG"),z("weekYear",1),z("isoWeekYear",1),ue("G",re),ue("g",re),ue("GG",Q,V),ue("gg",Q,V),ue("GGGG",ae,Z),ue("gggg",ae,Z),ue("GGGGG",se,$),ue("ggggg",se,$),Me(["gggg","ggggg","GGGG","GGGGG"],function(e,t,a,s){t[s.substr(0,2)]=T(e)}),Me(["gg","GG"],function(e,t,a,s){t[s]=n.parseTwoDigitYear(e)}),q("Q",0,"Qo","quarter"),E("quarter","Q"),z("quarter",7),ue("Q",B),ce("Q",function(e,t){t[Ye]=3*(T(e)-1)}),q("D",["DD",2],"Do","date"),E("date","D"),z("date",9),ue("D",Q),ue("DD",Q,V),ue("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),ce(["D","DD"],fe),ce("Do",function(e,t){t[fe]=T(e.match(Q)[0])});var ha=je("Date",!0);q("DDD",["DDDD",3],"DDDo","dayOfYear"),E("dayOfYear","DDD"),z("dayOfYear",4),ue("DDD",te),ue("DDDD",K),ce(["DDD","DDDD"],function(e,t,a){a._dayOfYear=T(e)}),q("m",["mm",2],0,"minute"),E("minute","m"),z("minute",14),ue("m",Q),ue("mm",Q,V),ce(["m","mm"],ke);var ca=je("Minutes",!1);q("s",["ss",2],0,"second"),E("second","s"),z("second",15),ue("s",Q),ue("ss",Q,V),ce(["s","ss"],De);var Ma,La=je("Seconds",!1);for(q("S",0,0,function(){return~~(this.millisecond()/100)}),q(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),q(0,["SSS",3],0,"millisecond"),q(0,["SSSS",4],0,function(){return 10*this.millisecond()}),q(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),q(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),q(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),q(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),q(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),E("millisecond","ms"),z("millisecond",16),ue("S",te,B),ue("SS",te,V),ue("SSS",te,K),Ma="SSSS";Ma.length<=9;Ma+="S")ue(Ma,ne);function ya(e,t){t[Te]=T(1e3*("0."+e))}for(Ma="S";Ma.length<=9;Ma+="S")ce(Ma,ya);var Ya=je("Milliseconds",!1);q("z",0,0,"zoneAbbr"),q("zz",0,0,"zoneName");var fa=p.prototype;function pa(e){return e}fa.add=Qt,fa.calendar=function(e,t){var a=e||xt(),s=Ct(a,this).startOf("day"),r=n.calendarFormat(this,s)||"sameElse",i=t&&(j(t[r])?t[r].call(this,a):t[r]);return this.format(i||this.localeData().calendar(r,this,xt(a)))},fa.clone=function(){return new p(this)},fa.diff=function(e,t,a){var s,n,r;if(!this.isValid())return NaN;if(!(s=Ct(e,this)).isValid())return NaN;switch(n=6e4*(s.utcOffset()-this.utcOffset()),t=W(t)){case"year":r=ea(this,s)/12;break;case"month":r=ea(this,s);break;case"quarter":r=ea(this,s)/3;break;case"second":r=(this-s)/1e3;break;case"minute":r=(this-s)/6e4;break;case"hour":r=(this-s)/36e5;break;case"day":r=(this-s-n)/864e5;break;case"week":r=(this-s-n)/6048e5;break;default:r=this-s}return a?r:D(r)},fa.endOf=function(e){var t;if(void 0===(e=W(e))||"millisecond"===e||!this.isValid())return this;var a=this._isUTC?ua:oa;switch(e){case"year":t=a(this.year()+1,0,1)-1;break;case"quarter":t=a(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=a(this.year(),this.month()+1,1)-1;break;case"week":t=a(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=a(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=a(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=ia-_a(t+(this._isUTC?0:this.utcOffset()*ra),ia)-1;break;case"minute":t=this._d.valueOf(),t+=ra-_a(t,ra)-1;break;case"second":t=this._d.valueOf(),t+=na-_a(t,na)-1}return this._d.setTime(t),n.updateOffset(this,!0),this},fa.format=function(e){e||(e=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var t=U(this,e);return this.localeData().postformat(t)},fa.from=function(e,t){return this.isValid()&&(k(e)&&e.isValid()||xt(e).isValid())?Bt({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},fa.fromNow=function(e){return this.from(xt(),e)},fa.to=function(e,t){return this.isValid()&&(k(e)&&e.isValid()||xt(e).isValid())?Bt({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},fa.toNow=function(e){return this.to(xt(),e)},fa.get=function(e){return j(this[e=W(e)])?this[e]():this},fa.invalidAt=function(){return c(this).overflow},fa.isAfter=function(e,t){var a=k(e)?e:xt(e);return!(!this.isValid()||!a.isValid())&&("millisecond"===(t=W(t)||"millisecond")?this.valueOf()>a.valueOf():a.valueOf()9999?U(a,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):j(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(a,"Z")):U(a,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},fa.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="";this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var a="["+e+'("]',s=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n=t+'[")]';return this.format(a+s+"-MM-DD[T]HH:mm:ss.SSS"+n)},fa.toJSON=function(){return this.isValid()?this.toISOString():null},fa.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},fa.unix=function(){return Math.floor(this.valueOf()/1e3)},fa.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},fa.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},fa.year=He,fa.isLeapYear=function(){return ve(this.year())},fa.weekYear=function(e){return ma.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},fa.isoWeekYear=function(e){return ma.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},fa.quarter=fa.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},fa.month=ze,fa.daysInMonth=function(){return Pe(this.year(),this.month())},fa.week=fa.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")},fa.isoWeek=fa.isoWeeks=function(e){var t=Ue(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")},fa.weeksInYear=function(){var e=this.localeData()._week;return Ge(this.year(),e.dow,e.doy)},fa.isoWeeksInYear=function(){return Ge(this.year(),1,4)},fa.date=ha,fa.day=fa.days=function(e){if(!this.isValid())return null!=e?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(e=function(e,t){return"string"!=typeof e?e:isNaN(e)?"number"==typeof(e=t.weekdaysParse(e))?e:null:parseInt(e,10)}(e,this.localeData()),this.add(e-t,"d")):t},fa.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")},fa.isoWeekday=function(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=function(e,t){return"string"==typeof e?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}(e,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7},fa.dayOfYear=function(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")},fa.hour=fa.hours=rt,fa.minute=fa.minutes=ca,fa.second=fa.seconds=La,fa.millisecond=fa.milliseconds=Ya,fa.utcOffset=function(e,t,a){var s,r=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null!=e){if("string"==typeof e){if(null===(e=Nt(de,e)))return this}else Math.abs(e)<16&&!a&&(e*=60);return!this._isUTC&&t&&(s=Rt(this)),this._offset=e,this._isUTC=!0,null!=s&&this.add(s,"m"),r!==e&&(!t||this._changeInProgress?$t(this,Bt(e-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,n.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Rt(this)},fa.utc=function(e){return this.utcOffset(0,e)},fa.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Rt(this),"m")),this},fa.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var e=Nt(ie,this._i);null!=e?this.utcOffset(e):this.utcOffset(0,!0)}return this},fa.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?xt(e).utcOffset():0,(this.utcOffset()-e)%60==0)},fa.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},fa.isLocal=function(){return!!this.isValid()&&!this._isUTC},fa.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},fa.isUtc=qt,fa.isUTC=qt,fa.zoneAbbr=function(){return this._isUTC?"UTC":""},fa.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},fa.dates=b("dates accessor is deprecated. Use date instead.",ha),fa.months=b("months accessor is deprecated. Use month instead",ze),fa.years=b("years accessor is deprecated. Use year instead",He),fa.zone=b("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),fa.isDSTShifted=b("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!d(this._isDSTShifted))return this._isDSTShifted;var e={};if(Y(e,this),(e=Ht(e))._a){var t=e._isUTC?h(e._a):xt(e._a);this._isDSTShifted=this.isValid()&&g(e._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var ka=O.prototype;function Da(e,t,a,s){var n=ht(),r=h().set(s,t);return n[a](r,e)}function Ta(e,t,a){if(_(e)&&(t=e,e=void 0),e=e||"",null!=t)return Da(e,t,a,"month");var s,n=[];for(s=0;s<12;s++)n[s]=Da(e,s,a,"month");return n}function ga(e,t,a,s){"boolean"==typeof e?(_(t)&&(a=t,t=void 0),t=t||""):(a=t=e,e=!1,_(t)&&(a=t,t=void 0),t=t||"");var n,r=ht(),i=e?r._week.dow:0;if(null!=a)return Da(t,(a+i)%7,s,"day");var d=[];for(n=0;n<7;n++)d[n]=Da(t,(n+i)%7,s,"day");return d}ka.calendar=function(e,t,a){var s=this._calendar[e]||this._calendar.sameElse;return j(s)?s.call(t,a):s},ka.longDateFormat=function(e){var t=this._longDateFormat[e],a=this._longDateFormat[e.toUpperCase()];return t||!a?t:(this._longDateFormat[e]=a.replace(/MMMM|MM|DD|dddd/g,function(e){return e.slice(1)}),this._longDateFormat[e])},ka.invalidDate=function(){return this._invalidDate},ka.ordinal=function(e){return this._ordinal.replace("%d",e)},ka.preparse=pa,ka.postformat=pa,ka.relativeTime=function(e,t,a,s){var n=this._relativeTime[a];return j(n)?n(e,t,a,s):n.replace(/%d/i,e)},ka.pastFuture=function(e,t){var a=this._relativeTime[e>0?"future":"past"];return j(a)?a(t):a.replace(/%s/i,t)},ka.set=function(e){var t,a;for(a in e)j(t=e[a])?this[a]=t:this["_"+a]=t;this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},ka.months=function(e,t){return e?r(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||Ee).test(t)?"format":"standalone"][e.month()]:r(this._months)?this._months:this._months.standalone},ka.monthsShort=function(e,t){return e?r(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[Ee.test(t)?"format":"standalone"][e.month()]:r(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},ka.monthsParse=function(e,t,a){var s,n,r;if(this._monthsParseExact)return function(e,t,a){var s,n,r,i=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)r=h([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(r,"").toLocaleLowerCase();return a?"MMM"===t?-1!==(n=Se.call(this._shortMonthsParse,i))?n:null:-1!==(n=Se.call(this._longMonthsParse,i))?n:null:"MMM"===t?-1!==(n=Se.call(this._shortMonthsParse,i))?n:-1!==(n=Se.call(this._longMonthsParse,i))?n:null:-1!==(n=Se.call(this._longMonthsParse,i))?n:-1!==(n=Se.call(this._shortMonthsParse,i))?n:null}.call(this,e,t,a);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(n=h([2e3,s]),a&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(n,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(n,"").replace(".","")+"$","i")),a||this._monthsParse[s]||(r="^"+this.months(n,"")+"|^"+this.monthsShort(n,""),this._monthsParse[s]=new RegExp(r.replace(".",""),"i")),a&&"MMMM"===t&&this._longMonthsParse[s].test(e))return s;if(a&&"MMM"===t&&this._shortMonthsParse[s].test(e))return s;if(!a&&this._monthsParse[s].test(e))return s}},ka.monthsRegex=function(e){return this._monthsParseExact?(l(this,"_monthsRegex")||Ne.call(this),e?this._monthsStrictRegex:this._monthsRegex):(l(this,"_monthsRegex")||(this._monthsRegex=Ie),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},ka.monthsShortRegex=function(e){return this._monthsParseExact?(l(this,"_monthsRegex")||Ne.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(l(this,"_monthsShortRegex")||(this._monthsShortRegex=Je),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},ka.week=function(e){return Ue(e,this._week.dow,this._week.doy).week},ka.firstDayOfYear=function(){return this._week.doy},ka.firstDayOfWeek=function(){return this._week.dow},ka.weekdays=function(e,t){var a=r(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(t)?"format":"standalone"];return!0===e?Be(a,this._week.dow):e?a[e.day()]:a},ka.weekdaysMin=function(e){return!0===e?Be(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin},ka.weekdaysShort=function(e){return!0===e?Be(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort},ka.weekdaysParse=function(e,t,a){var s,n,r;if(this._weekdaysParseExact)return function(e,t,a){var s,n,r,i=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=h([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return a?"dddd"===t?-1!==(n=Se.call(this._weekdaysParse,i))?n:null:"ddd"===t?-1!==(n=Se.call(this._shortWeekdaysParse,i))?n:null:-1!==(n=Se.call(this._minWeekdaysParse,i))?n:null:"dddd"===t?-1!==(n=Se.call(this._weekdaysParse,i))?n:-1!==(n=Se.call(this._shortWeekdaysParse,i))?n:-1!==(n=Se.call(this._minWeekdaysParse,i))?n:null:"ddd"===t?-1!==(n=Se.call(this._shortWeekdaysParse,i))?n:-1!==(n=Se.call(this._weekdaysParse,i))?n:-1!==(n=Se.call(this._minWeekdaysParse,i))?n:null:-1!==(n=Se.call(this._minWeekdaysParse,i))?n:-1!==(n=Se.call(this._weekdaysParse,i))?n:-1!==(n=Se.call(this._shortWeekdaysParse,i))?n:null}.call(this,e,t,a);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(n=h([2e3,1]).day(s),a&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(n,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(n,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(n,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[s]||(r="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[s]=new RegExp(r.replace(".",""),"i")),a&&"dddd"===t&&this._fullWeekdaysParse[s].test(e))return s;if(a&&"ddd"===t&&this._shortWeekdaysParse[s].test(e))return s;if(a&&"dd"===t&&this._minWeekdaysParse[s].test(e))return s;if(!a&&this._weekdaysParse[s].test(e))return s}},ka.weekdaysRegex=function(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||et.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(l(this,"_weekdaysRegex")||(this._weekdaysRegex=$e),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},ka.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||et.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(l(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Qe),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},ka.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||et.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(l(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Xe),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},ka.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},ka.meridiem=function(e,t,a){return e>11?a?"pm":"PM":a?"am":"AM"},lt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,a=1===T(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a}}),n.lang=b("moment.lang is deprecated. Use moment.locale instead.",lt),n.langData=b("moment.langData is deprecated. Use moment.localeData instead.",ht);var wa=Math.abs;function ba(e,t,a,s){var n=Bt(t,a);return e._milliseconds+=s*n._milliseconds,e._days+=s*n._days,e._months+=s*n._months,e._bubble()}function va(e){return e<0?Math.floor(e):Math.ceil(e)}function Sa(e){return 4800*e/146097}function Ha(e){return 146097*e/4800}function ja(e){return function(){return this.as(e)}}var xa=ja("ms"),Oa=ja("s"),Pa=ja("m"),Ea=ja("h"),Wa=ja("d"),Aa=ja("w"),Fa=ja("M"),za=ja("Q"),Ja=ja("y");function Ia(e){return function(){return this.isValid()?this._data[e]:NaN}}var Na=Ia("milliseconds"),Ca=Ia("seconds"),Ra=Ia("minutes"),qa=Ia("hours"),Ua=Ia("days"),Ga=Ia("months"),Ba=Ia("years"),Va=Math.round,Ka={ss:44,s:45,m:45,h:22,d:26,M:11},Za=Math.abs;function $a(e){return(e>0)-(e<0)||+e}function Qa(){if(!this.isValid())return this.localeData().invalidDate();var e,t,a=Za(this._milliseconds)/1e3,s=Za(this._days),n=Za(this._months);e=D(a/60),t=D(e/60),a%=60,e%=60;var r=D(n/12),i=n%=12,d=s,_=t,o=e,u=a?a.toFixed(3).replace(/\.?0+$/,""):"",l=this.asSeconds();if(!l)return"P0D";var m=l<0?"-":"",h=$a(this._months)!==$a(l)?"-":"",c=$a(this._days)!==$a(l)?"-":"",M=$a(this._milliseconds)!==$a(l)?"-":"";return m+"P"+(r?h+r+"Y":"")+(i?h+i+"M":"")+(d?c+d+"D":"")+(_||o||u?"T":"")+(_?M+_+"H":"")+(o?M+o+"M":"")+(u?M+u+"S":"")}var Xa=At.prototype;return Xa.isValid=function(){return this._isValid},Xa.abs=function(){var e=this._data;return this._milliseconds=wa(this._milliseconds),this._days=wa(this._days),this._months=wa(this._months),e.milliseconds=wa(e.milliseconds),e.seconds=wa(e.seconds),e.minutes=wa(e.minutes),e.hours=wa(e.hours),e.months=wa(e.months),e.years=wa(e.years),this},Xa.add=function(e,t){return ba(this,e,t,1)},Xa.subtract=function(e,t){return ba(this,e,t,-1)},Xa.as=function(e){if(!this.isValid())return NaN;var t,a,s=this._milliseconds;if("month"===(e=W(e))||"quarter"===e||"year"===e)switch(t=this._days+s/864e5,a=this._months+Sa(t),e){case"month":return a;case"quarter":return a/3;case"year":return a/12}else switch(t=this._days+Math.round(Ha(this._months)),e){case"week":return t/7+s/6048e5;case"day":return t+s/864e5;case"hour":return 24*t+s/36e5;case"minute":return 1440*t+s/6e4;case"second":return 86400*t+s/1e3;case"millisecond":return Math.floor(864e5*t)+s;default:throw new Error("Unknown unit "+e)}},Xa.asMilliseconds=xa,Xa.asSeconds=Oa,Xa.asMinutes=Pa,Xa.asHours=Ea,Xa.asDays=Wa,Xa.asWeeks=Aa,Xa.asMonths=Fa,Xa.asQuarters=za,Xa.asYears=Ja,Xa.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*T(this._months/12):NaN},Xa._bubble=function(){var e,t,a,s,n,r=this._milliseconds,i=this._days,d=this._months,_=this._data;return r>=0&&i>=0&&d>=0||r<=0&&i<=0&&d<=0||(r+=864e5*va(Ha(d)+i),i=0,d=0),_.milliseconds=r%1e3,e=D(r/1e3),_.seconds=e%60,t=D(e/60),_.minutes=t%60,a=D(t/60),_.hours=a%24,i+=D(a/24),n=D(Sa(i)),d+=n,i-=va(Ha(n)),s=D(d/12),d%=12,_.days=i,_.months=d,_.years=s,this},Xa.clone=function(){return Bt(this)},Xa.get=function(e){return e=W(e),this.isValid()?this[e+"s"]():NaN},Xa.milliseconds=Na,Xa.seconds=Ca,Xa.minutes=Ra,Xa.hours=qa,Xa.days=Ua,Xa.weeks=function(){return D(this.days()/7)},Xa.months=Ga,Xa.years=Ba,Xa.humanize=function(e){if(!this.isValid())return this.localeData().invalidDate();var t=this.localeData(),a=function(e,t,a){var s=Bt(e).abs(),n=Va(s.as("s")),r=Va(s.as("m")),i=Va(s.as("h")),d=Va(s.as("d")),_=Va(s.as("M")),o=Va(s.as("y")),u=n<=Ka.ss&&["s",n]||n0,u[4]=a,function(e,t,a,s,n){return n.relativeTime(t||1,!!a,e,s)}.apply(null,u)}(this,!e,t);return e&&(a=t.pastFuture(+this,a)),t.postformat(a)},Xa.toISOString=Qa,Xa.toString=Qa,Xa.toJSON=Qa,Xa.locale=ta,Xa.localeData=sa,Xa.toIsoString=b("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Qa),Xa.lang=aa,q("X",0,0,"unix"),q("x",0,0,"valueOf"),ue("x",re),ue("X",/[+-]?\d+(\.\d{1,3})?/),ce("X",function(e,t,a){a._d=new Date(1e3*parseFloat(e,10))}),ce("x",function(e,t,a){a._d=new Date(T(e))}),n.version="2.24.0",t=xt,n.fn=fa,n.min=function(){return Et("isBefore",[].slice.call(arguments,0))},n.max=function(){return Et("isAfter",[].slice.call(arguments,0))},n.now=function(){return Date.now?Date.now():+new Date},n.utc=h,n.unix=function(e){return xt(1e3*e)},n.months=function(e,t){return Ta(e,t,"months")},n.isDate=o,n.locale=lt,n.invalid=L,n.duration=Bt,n.isMoment=k,n.weekdays=function(e,t,a){return ga(e,t,a,"weekdays")},n.parseZone=function(){return xt.apply(null,arguments).parseZone()},n.localeData=ht,n.isDuration=Ft,n.monthsShort=function(e,t){return Ta(e,t,"monthsShort")},n.weekdaysMin=function(e,t,a){return ga(e,t,a,"weekdaysMin")},n.defineLocale=mt,n.updateLocale=function(e,t){if(null!=t){var a,s,n=it;null!=(s=ut(e))&&(n=s._config),t=x(n,t),(a=new O(t)).parentLocale=dt[e],dt[e]=a,lt(e)}else null!=dt[e]&&(null!=dt[e].parentLocale?dt[e]=dt[e].parentLocale:null!=dt[e]&&delete dt[e]);return dt[e]},n.locales=function(){return v(dt)},n.weekdaysShort=function(e,t,a){return ga(e,t,a,"weekdaysShort")},n.normalizeUnits=W,n.relativeTimeRounding=function(e){return void 0===e?Va:"function"==typeof e&&(Va=e,!0)},n.relativeTimeThreshold=function(e,t){return void 0!==Ka[e]&&(void 0===t?Ka[e]:(Ka[e]=t,"s"===e&&(Ka.ss=t-1),!0))},n.calendarFormat=function(e,t){var a=e.diff(t,"days",!0);return a<-6?"sameElse":a<-1?"lastWeek":a<0?"lastDay":a<1?"sameDay":a<2?"nextDay":a<7?"nextWeek":"sameElse"},n.prototype=fa,n.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},n}()}).call(this,a(311)(e))},,,,,,,,,,,,,,,,,,,,,,,function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});class s{static createElement(e){return(new DOMParser).parseFromString(e,"text/html").documentElement.querySelector("body").firstChild}static renderTemplate(e,t){var a=document.querySelector("#"+e);if(null==a)return null;const n=/\{\{\{\s*([aA-zZ0-9_-]+)\s*\}\}\}/gm;for(var r,i=a.innerHTML,d=i;null!=(r=n.exec(i));)d=t.hasOwnProperty(r[1])?d.replace(r[0],t[r[1]]):d.replace(r[0],"");return s.createElement(d)}}t.default=s},,,,,,,,,,,,,,,,,,,,,function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=a(308),n=a(23);class r{constructor(e){this.input=null,this.browseButton=null,this.popup=null,this.nonce=null,this.browserView=null,this.browserPath=null,this.browserTableContainer=null,this.browserCache={},this.input=e.querySelector("input[type=text]"),this.browseButton=e.querySelector("button"),this.nonce=this.browseButton.dataset.nonce,this.browseButton.addEventListener("click",this.browseClick.bind(this)),this.popup=new s.default;this.browserView=n.default.createElement('\n
      \n
      \n
      \n \n
      \n '),this.browserPath=this.browserView.querySelector("input[type=text]"),this.browserTableContainer=this.browserView.querySelector(".ilab-browser-select-table-container"),this.browserView.querySelector(".button-cancel").addEventListener("click",this.cancelClick.bind(this)),this.browserView.querySelector(".button-primary").addEventListener("click",this.selectClick.bind(this)),this.popup.setContent(this.browserView)}browseClick(e){return e.preventDefault(),this.browserPath.value=this.input.value,this.browseButton.disabled=!0,this.browseToPath(this.browserPath.value,function(){this.browseButton.disabled=!1,this.popup.show()}.bind(this)),!1}browseToPath(e,t){if("/"==e&&(e=""),this.browserCache[e])return this.browserPath.value=""==e?"/":e,this.displayTable(this.browserCache[e]),void(t&&t());const a={action:"ilab_browser_browser_select_directory",nonce:this.nonce,key:e};jQuery.post(ajaxurl,a,function(a){if("ok"==a.status){this.browserPath.value=""==e?"/":e;let s=n.default.createElement(a.table);s.querySelectorAll('tr[data-file-type="dir"]').forEach(function(e){e.addEventListener("click",function(t){let a=e.dataset.key,s=e.querySelector("img.loader");s&&(s.style.display="block"),e.querySelectorAll("td > span").forEach(function(e){e.style.display="none"}.bind(this)),this.browseToPath(a)}.bind(this))}.bind(this)),this.browserCache[e]=s,this.displayTable(s),a.hasOwnProperty("nextNonce")&&(this.nonce=a.nextNonce),t&&t()}}.bind(this))}displayTable(e){e.querySelectorAll('tr[data-file-type="dir"]').forEach(function(e){let t=e.querySelector("img.loader");t&&(t.style.display="none"),e.querySelectorAll("td > span").forEach(function(e){e.style.display="block"}.bind(this))}.bind(this)),this.browserTableContainer.innerHTML="",this.browserTableContainer.append(e)}cancelClick(e){return e.preventDefault(),this.popup.hide(),!1}selectClick(e){return e.preventDefault(),this.input.value=this.browserPath.value,this.popup.hide(),!1}static bind(){document.querySelectorAll(".option-ui-browser").forEach(function(e){new r(e)})}}t.default=r},function(e,t,a){!function(e){"use strict";e.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,t,a){return e<12?a?"vm":"VM":a?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},a={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},s=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},n={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},r=function(e){return function(t,a,r,i){var d=s(t),_=n[e][s(t)];return 2===d&&(_=_[a?0:1]),_.replace(/%d/i,t)}},i=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];e.defineLocale("ar",{months:i,monthsShort:i,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(e){return"م"===e},meridiem:function(e,t,a){return e<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:r("s"),ss:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(e){return e.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(e){return a[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"،")},week:{dow:6,doy:12}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ar-dz",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"أح_إث_ثلا_أر_خم_جم_سب".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ar-kw",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,doy:12}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},a=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},s={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},n=function(e){return function(t,n,r,i){var d=a(t),_=s[e][a(t)];return 2===d&&(_=_[n?0:1]),_.replace(/%d/i,t)}},r=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];e.defineLocale("ar-ly",{months:r,monthsShort:r,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(e){return"م"===e},meridiem:function(e,t,a){return e<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:n("s"),ss:n("s"),m:n("m"),mm:n("m"),h:n("h"),hh:n("h"),d:n("d"),dd:n("d"),M:n("M"),MM:n("M"),y:n("y"),yy:n("y")},preparse:function(e){return e.replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"،")},week:{dow:6,doy:12}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},a={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};e.defineLocale("ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(e){return"م"===e},meridiem:function(e,t,a){return e<12?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(e){return e.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(e){return a[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"،")},week:{dow:0,doy:6}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ar-tn",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};e.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gələn həftə] dddd [saat] LT",lastDay:"[dünən] LT",lastWeek:"[keçən həftə] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s əvvəl",s:"birneçə saniyə",ss:"%d saniyə",m:"bir dəqiqə",mm:"%d dəqiqə",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gecə|səhər|gündüz|axşam/,isPM:function(e){return/^(gündüz|axşam)$/.test(e)},meridiem:function(e,t,a){return e<4?"gecə":e<12?"səhər":e<17?"gündüz":"axşam"},dayOfMonthOrdinalParse:/\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,ordinal:function(e){if(0===e)return e+"-ıncı";var a=e%10,s=e%100-a,n=e>=100?100:null;return e+(t[a]||t[s]||t[n])},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a){var s,n,r={ss:t?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:t?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:t?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"месяц_месяцы_месяцаў",yy:"год_гады_гадоў"};return"m"===a?t?"хвіліна":"хвіліну":"h"===a?t?"гадзіна":"гадзіну":e+" "+(s=+e,n=r[a].split("_"),s%10==1&&s%100!=11?n[0]:s%10>=2&&s%10<=4&&(s%100<10||s%100>=20)?n[1]:n[2])}e.defineLocale("be",{months:{format:"студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня".split("_"),standalone:"студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань".split("_")},monthsShort:"студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж".split("_"),weekdays:{format:"нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу".split("_"),standalone:"нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота".split("_"),isFormat:/\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/},weekdaysShort:"нд_пн_ат_ср_чц_пт_сб".split("_"),weekdaysMin:"нд_пн_ат_ср_чц_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сёння ў] LT",nextDay:"[Заўтра ў] LT",lastDay:"[Учора ў] LT",nextWeek:function(){return"[У] dddd [ў] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [ў] LT";case 1:case 2:case 4:return"[У мінулы] dddd [ў] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі секунд",m:t,mm:t,h:t,hh:t,d:"дзень",dd:t,M:"месяц",MM:t,y:"год",yy:t},meridiemParse:/ночы|раніцы|дня|вечара/,isPM:function(e){return/^(дня|вечара)$/.test(e)},meridiem:function(e,t,a){return e<4?"ночы":e<12?"раніцы":e<17?"дня":"вечара"},dayOfMonthOrdinalParse:/\d{1,2}-(і|ы|га)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e%10!=2&&e%10!=3||e%100==12||e%100==13?e+"-ы":e+"-і";case"D":return e+"-га";default:return e}},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",ss:"%d секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(e){var t=e%10,a=e%100;return 0===e?e+"-ев":0===a?e+"-ен":a>10&&a<20?e+"-ти":1===t?e+"-ви":2===t?e+"-ри":7===t||8===t?e+"-ми":e+"-ти"},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des".split("_"),weekdays:"Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm"},calendar:{sameDay:"[Bi lɛrɛ] LT",nextDay:"[Sini lɛrɛ] LT",nextWeek:"dddd [don lɛrɛ] LT",lastDay:"[Kunu lɛrɛ] LT",lastWeek:"dddd [tɛmɛnen lɛrɛ] LT",sameElse:"L"},relativeTime:{future:"%s kɔnɔ",past:"a bɛ %s bɔ",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"lɛrɛ kelen",hh:"lɛrɛ %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},a={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};e.defineLocale("bn",{months:"জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি".split("_"),weekdaysMin:"রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",LTS:"A h:mm:ss সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm সময়",LLLL:"dddd, D MMMM YYYY, A h:mm সময়"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কয়েক সেকেন্ড",ss:"%d সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(e){return e.replace(/[১২৩৪৫৬৭৮৯০]/g,function(e){return a[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/রাত|সকাল|দুপুর|বিকাল|রাত/,meridiemHour:function(e,t){return 12===e&&(e=0),"রাত"===t&&e>=4||"দুপুর"===t&&e<5||"বিকাল"===t?e+12:e},meridiem:function(e,t,a){return e<4?"রাত":e<10?"সকাল":e<17?"দুপুর":e<20?"বিকাল":"রাত"},week:{dow:0,doy:6}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},a={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};e.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[ཁ་སང] LT",lastWeek:"[བདུན་ཕྲག་མཐའ་མ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",ss:"%d སྐར་ཆ།",m:"སྐར་མ་གཅིག",mm:"%d སྐར་མ",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(e){return e.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(e){return a[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,meridiemHour:function(e,t){return 12===e&&(e=0),"མཚན་མོ"===t&&e>=4||"ཉིན་གུང"===t&&e<5||"དགོང་དག"===t?e+12:e},meridiem:function(e,t,a){return e<4?"མཚན་མོ":e<10?"ཞོགས་ཀས":e<17?"ཉིན་གུང":e<20?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a){return e+" "+function(e,t){return 2===t?function(e){var t={m:"v",b:"v",d:"z"};return void 0===t[e.charAt(0)]?e:t[e.charAt(0)]+e.substring(1)}(e):e}({mm:"munutenn",MM:"miz",dd:"devezh"}[a],e)}e.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",ss:"%d eilenn",m:"ur vunutenn",mm:t,h:"un eur",hh:"%d eur",d:"un devezh",dd:t,M:"ur miz",MM:t,y:"ur bloaz",yy:function(e){switch(function e(t){return t>9?e(t%10):t}(e)){case 1:case 3:case 4:case 5:case 9:return e+" bloaz";default:return e+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(añ|vet)/,ordinal:function(e){var t=1===e?"añ":"vet";return e+t},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a){var s=e+" ";switch(a){case"ss":return s+=1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi";case"m":return t?"jedna minuta":"jedne minute";case"mm":return s+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta";case"h":return t?"jedan sat":"jednog sata";case"hh":return s+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return s+=1===e?"dan":"dana";case"MM":return s+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return s+=1===e?"godina":2===e||3===e||4===e?"godine":"godina"}}e.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:t,m:t,mm:t,h:t,hh:t,d:"dan",dd:t,M:"mjesec",MM:t,y:"godinu",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ca",{months:{standalone:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(e,t){var a=1===e?"r":2===e?"n":3===e?"r":4===e?"t":"è";return"w"!==t&&"W"!==t||(a="a"),e+a},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),a="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_"),s=[/^led/i,/^úno/i,/^bře/i,/^dub/i,/^kvě/i,/^(čvn|červen$|června)/i,/^(čvc|červenec|července)/i,/^srp/i,/^zář/i,/^říj/i,/^lis/i,/^pro/i],n=/^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;function r(e){return e>1&&e<5&&1!=~~(e/10)}function i(e,t,a,s){var n=e+" ";switch(a){case"s":return t||s?"pár sekund":"pár sekundami";case"ss":return t||s?n+(r(e)?"sekundy":"sekund"):n+"sekundami";case"m":return t?"minuta":s?"minutu":"minutou";case"mm":return t||s?n+(r(e)?"minuty":"minut"):n+"minutami";case"h":return t?"hodina":s?"hodinu":"hodinou";case"hh":return t||s?n+(r(e)?"hodiny":"hodin"):n+"hodinami";case"d":return t||s?"den":"dnem";case"dd":return t||s?n+(r(e)?"dny":"dní"):n+"dny";case"M":return t||s?"měsíc":"měsícem";case"MM":return t||s?n+(r(e)?"měsíce":"měsíců"):n+"měsíci";case"y":return t||s?"rok":"rokem";case"yy":return t||s?n+(r(e)?"roky":"let"):n+"lety"}}e.defineLocale("cs",{months:t,monthsShort:a,monthsRegex:n,monthsShortRegex:n,monthsStrictRegex:/^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,monthsParse:s,longMonthsParse:s,shortMonthsParse:s,weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("cv",{months:"кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав".split("_"),monthsShort:"кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш".split("_"),weekdays:"вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кӗҫ_эрн_шӑм".split("_"),weekdaysMin:"вр_тн_ыт_юн_кҫ_эр_шм".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]",LLL:"YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm",LLLL:"dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm"},calendar:{sameDay:"[Паян] LT [сехетре]",nextDay:"[Ыран] LT [сехетре]",lastDay:"[Ӗнер] LT [сехетре]",nextWeek:"[Ҫитес] dddd LT [сехетре]",lastWeek:"[Иртнӗ] dddd LT [сехетре]",sameElse:"L"},relativeTime:{future:function(e){var t=/сехет$/i.exec(e)?"рен":/ҫул$/i.exec(e)?"тан":"ран";return e+t},past:"%s каялла",s:"пӗр-ик ҫеккунт",ss:"%d ҫеккунт",m:"пӗр минут",mm:"%d минут",h:"пӗр сехет",hh:"%d сехет",d:"пӗр кун",dd:"%d кун",M:"пӗр уйӑх",MM:"%d уйӑх",y:"пӗр ҫул",yy:"%d ҫул"},dayOfMonthOrdinalParse:/\d{1,2}-мӗш/,ordinal:"%d-мӗш",week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(e){var t=e,a="";return t>20?a=40===t||50===t||60===t||80===t||100===t?"fed":"ain":t>0&&(a=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][t]),e+a},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"på dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a,s){var n={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?n[a][0]:n[a][1]}e.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a,s){var n={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?n[a][0]:n[a][1]}e.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a,s){var n={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?n[a][0]:n[a][1]}e.defineLocale("de-ch",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t=["ޖެނުއަރީ","ފެބްރުއަރީ","މާރިޗު","އޭޕްރީލު","މޭ","ޖޫން","ޖުލައި","އޯގަސްޓު","ސެޕްޓެމްބަރު","އޮކްޓޯބަރު","ނޮވެމްބަރު","ޑިސެމްބަރު"],a=["އާދިއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"];e.defineLocale("dv",{months:t,monthsShort:t,weekdays:a,weekdaysShort:a,weekdaysMin:"އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/މކ|މފ/,isPM:function(e){return"މފ"===e},meridiem:function(e,t,a){return e<12?"މކ":"މފ"},calendar:{sameDay:"[މިއަދު] LT",nextDay:"[މާދަމާ] LT",nextWeek:"dddd LT",lastDay:"[އިއްޔެ] LT",lastWeek:"[ފާއިތުވި] dddd LT",sameElse:"L"},relativeTime:{future:"ތެރޭގައި %s",past:"ކުރިން %s",s:"ސިކުންތުކޮޅެއް",ss:"d% ސިކުންތު",m:"މިނިޓެއް",mm:"މިނިޓު %d",h:"ގަޑިއިރެއް",hh:"ގަޑިއިރު %d",d:"ދުވަހެއް",dd:"ދުވަސް %d",M:"މަހެއް",MM:"މަސް %d",y:"އަހަރެއް",yy:"އަހަރު %d"},preparse:function(e){return e.replace(/،/g,",")},postformat:function(e){return e.replace(/,/g,"،")},week:{dow:7,doy:12}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(e,t){return e?"string"==typeof t&&/D/.test(t.substring(0,t.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]:this._monthsNominativeEl},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(e,t,a){return e>11?a?"μμ":"ΜΜ":a?"πμ":"ΠΜ"},isPM:function(e){return"μ"===(e+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,t){var a,s=this._calendarEl[e],n=t&&t.hours();return((a=s)instanceof Function||"[object Function]"===Object.prototype.toString.call(a))&&(s=s.apply(t)),s.replace("{}",n%12==1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"λίγα δευτερόλεπτα",ss:"%d δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},dayOfMonthOrdinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("en-SG",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,a=1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,a=1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,a=1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,a=1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,a=1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,a=1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,a=1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),weekdays:"dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_ĵaŭ_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_ĵa_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-a de] MMMM, YYYY",LLL:"D[-a de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-a de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(e){return"p"===e.charAt(0).toLowerCase()},meridiem:function(e,t,a){return e>11?a?"p.t.m.":"P.T.M.":a?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodiaŭ je] LT",nextDay:"[Morgaŭ je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hieraŭ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"antaŭ %s",s:"sekundoj",ss:"%d sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),a="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),s=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],n=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;e.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,s){return e?/-MMM-/.test(s)?a[e.month()]:t[e.month()]:t},monthsRegex:n,monthsShortRegex:n,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:s,longMonthsParse:s,shortMonthsParse:s,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),a="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),s=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],n=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;e.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,s){return e?/-MMM-/.test(s)?a[e.month()]:t[e.month()]:t},monthsRegex:n,monthsShortRegex:n,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:s,longMonthsParse:s,shortMonthsParse:s,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),a="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),s=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],n=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;e.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,s){return e?/-MMM-/.test(s)?a[e.month()]:t[e.month()]:t},monthsRegex:n,monthsShortRegex:n,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:s,longMonthsParse:s,shortMonthsParse:s,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:0,doy:6}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a,s){var n={s:["mõne sekundi","mõni sekund","paar sekundit"],ss:[e+"sekundi",e+"sekundit"],m:["ühe minuti","üks minut"],mm:[e+" minuti",e+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[e+" tunni",e+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[e+" kuu",e+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[e+" aasta",e+" aastat"]};return t?n[a][2]?n[a][2]:n[a][1]:s?n[a][0]:n[a][1]}e.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:"%d päeva",M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},a={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};e.defineLocale("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(e){return/بعد از ظهر/.test(e)},meridiem:function(e,t,a){return e<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چند ثانیه",ss:"ثانیه d%",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(e){return e.replace(/[۰-۹]/g,function(e){return a[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"،")},dayOfMonthOrdinalParse:/\d{1,2}م/,ordinal:"%dم",week:{dow:6,doy:12}})}(a(0))},function(e,t,a){!function(e){"use strict";var t="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),a=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",t[7],t[8],t[9]];function s(e,s,n,r){var i="";switch(n){case"s":return r?"muutaman sekunnin":"muutama sekunti";case"ss":return r?"sekunnin":"sekuntia";case"m":return r?"minuutin":"minuutti";case"mm":i=r?"minuutin":"minuuttia";break;case"h":return r?"tunnin":"tunti";case"hh":i=r?"tunnin":"tuntia";break;case"d":return r?"päivän":"päivä";case"dd":i=r?"päivän":"päivää";break;case"M":return r?"kuukauden":"kuukausi";case"MM":i=r?"kuukauden":"kuukautta";break;case"y":return r?"vuoden":"vuosi";case"yy":i=r?"vuoden":"vuotta"}return i=function(e,s){return e<10?s?a[e]:t[e]:e}(e,r)+" "+i}e.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:s,ss:s,m:s,mm:s,h:s,hh:s,d:s,dd:s,M:s,MM:s,y:s,yy:s},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[Í dag kl.] LT",nextDay:"[Í morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[Í gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaður",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(e,t){switch(t){case"D":return e+(1===e?"er":"");default:case"M":case"Q":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,t){switch(t){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,t){switch(t){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),a="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");e.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(e,s){return e?/-MMM-/.test(s)?a[e.month()]:t[e.month()]:t},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[ôfrûne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien minút",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ga",{months:["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Méitheamh","Iúil","Lúnasa","Meán Fómhair","Deaireadh Fómhair","Samhain","Nollaig"],monthsShort:["Eaná","Feab","Márt","Aibr","Beal","Méit","Iúil","Lúna","Meán","Deai","Samh","Noll"],monthsParseExact:!0,weekdays:["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Satharn"],weekdaysShort:["Dom","Lua","Mái","Céa","Déa","hAo","Sat"],weekdaysMin:["Do","Lu","Má","Ce","Dé","hA","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Amárach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inné aig] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s ó shin",s:"cúpla soicind",ss:"%d soicind",m:"nóiméad",mm:"%d nóiméad",h:"uair an chloig",hh:"%d uair an chloig",d:"lá",dd:"%d lá",M:"mí",MM:"%d mí",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){var t=1===e?"d":e%10==2?"na":"mh";return e+t},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd"],monthsShort:["Faoi","Gear","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùn","Sult","Dàmh","Samh","Dùbh"],monthsParseExact:!0,weekdays:["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["Dò","Lu","Mà","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-màireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-dè aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"mìos",MM:"%d mìosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){var t=1===e?"d":e%10==2?"na":"mh";return e+t},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){return 0===e.indexOf("un")?"n"+e:"en "+e},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a,s){var n={s:["thodde secondanim","thodde second"],ss:[e+" secondanim",e+" second"],m:["eka mintan","ek minute"],mm:[e+" mintanim",e+" mintam"],h:["eka voran","ek vor"],hh:[e+" voranim",e+" voram"],d:["eka disan","ek dis"],dd:[e+" disanim",e+" dis"],M:["eka mhoinean","ek mhoino"],MM:[e+" mhoineanim",e+" mhoine"],y:["eka vorsan","ek voros"],yy:[e+" vorsanim",e+" vorsam"]};return t?n[a][0]:n[a][1]}e.defineLocale("gom-latn",{months:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Ieta to] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fatlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(e,t){switch(t){case"D":return e+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:1,doy:4},meridiemParse:/rati|sokalli|donparam|sanje/,meridiemHour:function(e,t){return 12===e&&(e=0),"rati"===t?e<4?e:e+12:"sokalli"===t?e:"donparam"===t?e>12?e:e+12:"sanje"===t?e+12:void 0},meridiem:function(e,t,a){return e<4?"rati":e<12?"sokalli":e<16?"donparam":e<20?"sanje":"rati"}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"૧",2:"૨",3:"૩",4:"૪",5:"૫",6:"૬",7:"૭",8:"૮",9:"૯",0:"૦"},a={"૧":"1","૨":"2","૩":"3","૪":"4","૫":"5","૬":"6","૭":"7","૮":"8","૯":"9","૦":"0"};e.defineLocale("gu",{months:"જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર".split("_"),monthsShort:"જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.".split("_"),monthsParseExact:!0,weekdays:"રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર".split("_"),weekdaysShort:"રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ".split("_"),weekdaysMin:"ર_સો_મં_બુ_ગુ_શુ_શ".split("_"),longDateFormat:{LT:"A h:mm વાગ્યે",LTS:"A h:mm:ss વાગ્યે",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm વાગ્યે",LLLL:"dddd, D MMMM YYYY, A h:mm વાગ્યે"},calendar:{sameDay:"[આજ] LT",nextDay:"[કાલે] LT",nextWeek:"dddd, LT",lastDay:"[ગઇકાલે] LT",lastWeek:"[પાછલા] dddd, LT",sameElse:"L"},relativeTime:{future:"%s મા",past:"%s પેહલા",s:"અમુક પળો",ss:"%d સેકંડ",m:"એક મિનિટ",mm:"%d મિનિટ",h:"એક કલાક",hh:"%d કલાક",d:"એક દિવસ",dd:"%d દિવસ",M:"એક મહિનો",MM:"%d મહિનો",y:"એક વર્ષ",yy:"%d વર્ષ"},preparse:function(e){return e.replace(/[૧૨૩૪૫૬૭૮૯૦]/g,function(e){return a[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/રાત|બપોર|સવાર|સાંજ/,meridiemHour:function(e,t){return 12===e&&(e=0),"રાત"===t?e<4?e:e+12:"સવાર"===t?e:"બપોર"===t?e>=10?e:e+12:"સાંજ"===t?e+12:void 0},meridiem:function(e,t,a){return e<4?"રાત":e<10?"સવાર":e<17?"બપોર":e<20?"સાંજ":"રાત"},week:{dow:0,doy:6}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",ss:"%d שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(e){return 2===e?"שעתיים":e+" שעות"},d:"יום",dd:function(e){return 2===e?"יומיים":e+" ימים"},M:"חודש",MM:function(e){return 2===e?"חודשיים":e+" חודשים"},y:"שנה",yy:function(e){return 2===e?"שנתיים":e%10==0&&10!==e?e+" שנה":e+" שנים"}},meridiemParse:/אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,isPM:function(e){return/^(אחה"צ|אחרי הצהריים|בערב)$/.test(e)},meridiem:function(e,t,a){return e<5?"לפנות בוקר":e<10?"בבוקר":e<12?a?'לפנה"צ':"לפני הצהריים":e<18?a?'אחה"צ':"אחרי הצהריים":"בערב"}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},a={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};e.defineLocale("hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",ss:"%d सेकंड",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,function(e){return a[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/रात|सुबह|दोपहर|शाम/,meridiemHour:function(e,t){return 12===e&&(e=0),"रात"===t?e<4?e:e+12:"सुबह"===t?e:"दोपहर"===t?e>=10?e:e+12:"शाम"===t?e+12:void 0},meridiem:function(e,t,a){return e<4?"रात":e<10?"सुबह":e<17?"दोपहर":e<20?"शाम":"रात"},week:{dow:0,doy:6}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a){var s=e+" ";switch(a){case"ss":return s+=1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi";case"m":return t?"jedna minuta":"jedne minute";case"mm":return s+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta";case"h":return t?"jedan sat":"jednog sata";case"hh":return s+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return s+=1===e?"dan":"dana";case"MM":return s+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return s+=1===e?"godina":2===e||3===e||4===e?"godine":"godina"}}e.defineLocale("hr",{months:{format:"siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:t,m:t,mm:t,h:t,hh:t,d:"dan",dd:t,M:"mjesec",MM:t,y:"godinu",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";var t="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");function a(e,t,a,s){var n=e;switch(a){case"s":return s||t?"néhány másodperc":"néhány másodperce";case"ss":return n+(s||t)?" másodperc":" másodperce";case"m":return"egy"+(s||t?" perc":" perce");case"mm":return n+(s||t?" perc":" perce");case"h":return"egy"+(s||t?" óra":" órája");case"hh":return n+(s||t?" óra":" órája");case"d":return"egy"+(s||t?" nap":" napja");case"dd":return n+(s||t?" nap":" napja");case"M":return"egy"+(s||t?" hónap":" hónapja");case"MM":return n+(s||t?" hónap":" hónapja");case"y":return"egy"+(s||t?" év":" éve");case"yy":return n+(s||t?" év":" éve")}return""}function s(e){return(e?"":"[múlt] ")+"["+t[this.day()]+"] LT[-kor]"}e.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,t,a){return e<12?!0===a?"de":"DE":!0===a?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return s.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return s.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:a,ss:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("hy-am",{months:{format:"հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի".split("_"),standalone:"հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր".split("_")},monthsShort:"հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ".split("_"),weekdays:"կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ".split("_"),weekdaysShort:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),weekdaysMin:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY թ.",LLL:"D MMMM YYYY թ., HH:mm",LLLL:"dddd, D MMMM YYYY թ., HH:mm"},calendar:{sameDay:"[այսօր] LT",nextDay:"[վաղը] LT",lastDay:"[երեկ] LT",nextWeek:function(){return"dddd [օրը ժամը] LT"},lastWeek:function(){return"[անցած] dddd [օրը ժամը] LT"},sameElse:"L"},relativeTime:{future:"%s հետո",past:"%s առաջ",s:"մի քանի վայրկյան",ss:"%d վայրկյան",m:"րոպե",mm:"%d րոպե",h:"ժամ",hh:"%d ժամ",d:"օր",dd:"%d օր",M:"ամիս",MM:"%d ամիս",y:"տարի",yy:"%d տարի"},meridiemParse:/գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,isPM:function(e){return/^(ցերեկվա|երեկոյան)$/.test(e)},meridiem:function(e){return e<4?"գիշերվա":e<12?"առավոտվա":e<17?"ցերեկվա":"երեկոյան"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(ին|րդ)/,ordinal:function(e,t){switch(t){case"DDD":case"w":case"W":case"DDDo":return 1===e?e+"-ին":e+"-րդ";default:return e}},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,t){return 12===e&&(e=0),"pagi"===t?e:"siang"===t?e>=11?e:e+12:"sore"===t||"malam"===t?e+12:void 0},meridiem:function(e,t,a){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e){return e%100==11||e%10!=1}function a(e,a,s,n){var r=e+" ";switch(s){case"s":return a||n?"nokkrar sekúndur":"nokkrum sekúndum";case"ss":return t(e)?r+(a||n?"sekúndur":"sekúndum"):r+"sekúnda";case"m":return a?"mínúta":"mínútu";case"mm":return t(e)?r+(a||n?"mínútur":"mínútum"):a?r+"mínúta":r+"mínútu";case"hh":return t(e)?r+(a||n?"klukkustundir":"klukkustundum"):r+"klukkustund";case"d":return a?"dagur":n?"dag":"degi";case"dd":return t(e)?a?r+"dagar":r+(n?"daga":"dögum"):a?r+"dagur":r+(n?"dag":"degi");case"M":return a?"mánuður":n?"mánuð":"mánuði";case"MM":return t(e)?a?r+"mánuðir":r+(n?"mánuði":"mánuðum"):a?r+"mánuður":r+(n?"mánuð":"mánuði");case"y":return a||n?"ár":"ári";case"yy":return t(e)?r+(a||n?"ár":"árum"):r+(a||n?"ár":"ári")}}e.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:a,ss:a,m:a,mm:a,h:"klukkustund",hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ja",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日(ddd) HH:mm"},meridiemParse:/午前|午後/i,isPM:function(e){return"午後"===e},meridiem:function(e,t,a){return e<12?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:function(e){return e.week()=11?e:e+12:"sonten"===t||"ndalu"===t?e+12:void 0},meridiem:function(e,t,a){return e<11?"enjing":e<15?"siyang":e<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ka",{months:{standalone:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),format:"იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს".split("_")},monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekdays:{standalone:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),format:"კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს".split("_"),isFormat:/(წინა|შემდეგ)/},weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვალ] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინა] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(e){return/(წამი|წუთი|საათი|წელი)/.test(e)?e.replace(/ი$/,"ში"):e+"ში"},past:function(e){return/(წამი|წუთი|საათი|დღე|თვე)/.test(e)?e.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(e)?e.replace(/წელი$/,"წლის წინ"):void 0},s:"რამდენიმე წამი",ss:"%d წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},dayOfMonthOrdinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(e){return 0===e?e:1===e?e+"-ლი":e<20||e<=100&&e%20==0||e%100==0?"მე-"+e:e+"-ე"},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"};e.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан".split("_"),monthsShort:"қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі".split("_"),weekdaysShort:"жек_дүй_сей_сәр_бей_жұм_сен".split("_"),weekdaysMin:"жк_дй_сй_ср_бй_жм_сн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін сағат] LT",nextDay:"[Ертең сағат] LT",nextWeek:"dddd [сағат] LT",lastDay:"[Кеше сағат] LT",lastWeek:"[Өткен аптаның] dddd [сағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше секунд",ss:"%d секунд",m:"бір минут",mm:"%d минут",h:"бір сағат",hh:"%d сағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},dayOfMonthOrdinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(e){var a=e%10,s=e>=100?100:null;return e+(t[e]||t[a]||t[s])},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"១",2:"២",3:"៣",4:"៤",5:"៥",6:"៦",7:"៧",8:"៨",9:"៩",0:"០"},a={"១":"1","២":"2","៣":"3","៤":"4","៥":"5","៦":"6","៧":"7","៨":"8","៩":"9","០":"0"};e.defineLocale("km",{months:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysShort:"អា_ច_អ_ព_ព្រ_សុ_ស".split("_"),weekdaysMin:"អា_ច_អ_ព_ព្រ_សុ_ស".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/ព្រឹក|ល្ងាច/,isPM:function(e){return"ល្ងាច"===e},meridiem:function(e,t,a){return e<12?"ព្រឹក":"ល្ងាច"},calendar:{sameDay:"[ថ្ងៃនេះ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្តាហ៍មុន] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀត",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",ss:"%d វិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយថ្ងៃ",dd:"%d ថ្ងៃ",M:"មួយខែ",MM:"%d ខែ",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},dayOfMonthOrdinalParse:/ទី\d{1,2}/,ordinal:"ទី%d",preparse:function(e){return e.replace(/[១២៣៤៥៦៧៨៩០]/g,function(e){return a[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"೧",2:"೨",3:"೩",4:"೪",5:"೫",6:"೬",7:"೭",8:"೮",9:"೯",0:"೦"},a={"೧":"1","೨":"2","೩":"3","೪":"4","೫":"5","೬":"6","೭":"7","೮":"8","೯":"9","೦":"0"};e.defineLocale("kn",{months:"ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್".split("_"),monthsShort:"ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ".split("_"),monthsParseExact:!0,weekdays:"ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ".split("_"),weekdaysShort:"ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ".split("_"),weekdaysMin:"ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[ಇಂದು] LT",nextDay:"[ನಾಳೆ] LT",nextWeek:"dddd, LT",lastDay:"[ನಿನ್ನೆ] LT",lastWeek:"[ಕೊನೆಯ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ನಂತರ",past:"%s ಹಿಂದೆ",s:"ಕೆಲವು ಕ್ಷಣಗಳು",ss:"%d ಸೆಕೆಂಡುಗಳು",m:"ಒಂದು ನಿಮಿಷ",mm:"%d ನಿಮಿಷ",h:"ಒಂದು ಗಂಟೆ",hh:"%d ಗಂಟೆ",d:"ಒಂದು ದಿನ",dd:"%d ದಿನ",M:"ಒಂದು ತಿಂಗಳು",MM:"%d ತಿಂಗಳು",y:"ಒಂದು ವರ್ಷ",yy:"%d ವರ್ಷ"},preparse:function(e){return e.replace(/[೧೨೩೪೫೬೭೮೯೦]/g,function(e){return a[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,meridiemHour:function(e,t){return 12===e&&(e=0),"ರಾತ್ರಿ"===t?e<4?e:e+12:"ಬೆಳಿಗ್ಗೆ"===t?e:"ಮಧ್ಯಾಹ್ನ"===t?e>=10?e:e+12:"ಸಂಜೆ"===t?e+12:void 0},meridiem:function(e,t,a){return e<4?"ರಾತ್ರಿ":e<10?"ಬೆಳಿಗ್ಗೆ":e<17?"ಮಧ್ಯಾಹ್ನ":e<20?"ಸಂಜೆ":"ರಾತ್ರಿ"},dayOfMonthOrdinalParse:/\d{1,2}(ನೇ)/,ordinal:function(e){return e+"ನೇ"},week:{dow:0,doy:6}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h:mm",LLLL:"YYYY년 MMMM D일 dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY년 MMMM D일",lll:"YYYY년 MMMM D일 A h:mm",llll:"YYYY년 MMMM D일 dddd A h:mm"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",ss:"%d초",m:"1분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"},dayOfMonthOrdinalParse:/\d{1,2}(일|월|주)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"일";case"M":return e+"월";case"w":case"W":return e+"주";default:return e}},meridiemParse:/오전|오후/,isPM:function(e){return"오후"===e},meridiem:function(e,t,a){return e<12?"오전":"오후"}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},a={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},s=["کانونی دووەم","شوبات","ئازار","نیسان","ئایار","حوزەیران","تەمموز","ئاب","ئەیلوول","تشرینی یەكەم","تشرینی دووەم","كانونی یەکەم"];e.defineLocale("ku",{months:s,monthsShort:s,weekdays:"یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌".split("_"),weekdaysShort:"یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌".split("_"),weekdaysMin:"ی_د_س_چ_پ_ه_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/ئێواره‌|به‌یانی/,isPM:function(e){return/ئێواره‌/.test(e)},meridiem:function(e,t,a){return e<12?"به‌یانی":"ئێواره‌"},calendar:{sameDay:"[ئه‌مرۆ كاتژمێر] LT",nextDay:"[به‌یانی كاتژمێر] LT",nextWeek:"dddd [كاتژمێر] LT",lastDay:"[دوێنێ كاتژمێر] LT",lastWeek:"dddd [كاتژمێر] LT",sameElse:"L"},relativeTime:{future:"له‌ %s",past:"%s",s:"چه‌ند چركه‌یه‌ك",ss:"چركه‌ %d",m:"یه‌ك خوله‌ك",mm:"%d خوله‌ك",h:"یه‌ك كاتژمێر",hh:"%d كاتژمێر",d:"یه‌ك ڕۆژ",dd:"%d ڕۆژ",M:"یه‌ك مانگ",MM:"%d مانگ",y:"یه‌ك ساڵ",yy:"%d ساڵ"},preparse:function(e){return e.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(e){return a[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"،")},week:{dow:6,doy:12}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={0:"-чү",1:"-чи",2:"-чи",3:"-чү",4:"-чү",5:"-чи",6:"-чы",7:"-чи",8:"-чи",9:"-чу",10:"-чу",20:"-чы",30:"-чу",40:"-чы",50:"-чү",60:"-чы",70:"-чи",80:"-чи",90:"-чу",100:"-чү"};e.defineLocale("ky",{months:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),monthsShort:"янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),weekdays:"Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби".split("_"),weekdaysShort:"Жек_Дүй_Шей_Шар_Бей_Жум_Ише".split("_"),weekdaysMin:"Жк_Дй_Шй_Шр_Бй_Жм_Иш".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгүн саат] LT",nextDay:"[Эртең саат] LT",nextWeek:"dddd [саат] LT",lastDay:"[Кечээ саат] LT",lastWeek:"[Өткөн аптанын] dddd [күнү] [саат] LT",sameElse:"L"},relativeTime:{future:"%s ичинде",past:"%s мурун",s:"бирнече секунд",ss:"%d секунд",m:"бир мүнөт",mm:"%d мүнөт",h:"бир саат",hh:"%d саат",d:"бир күн",dd:"%d күн",M:"бир ай",MM:"%d ай",y:"бир жыл",yy:"%d жыл"},dayOfMonthOrdinalParse:/\d{1,2}-(чи|чы|чү|чу)/,ordinal:function(e){var a=e%10,s=e>=100?100:null;return e+(t[e]||t[a]||t[s])},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a,s){var n={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return t?n[a][0]:n[a][1]}function a(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e<10)return 4<=e&&e<=7;if(e<100){var t=e%10,s=e/10;return a(0===t?s:t)}if(e<1e4){for(;e>=10;)e/=10;return a(e)}return a(e/=1e3)}e.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(e){return a(e.substr(0,e.indexOf(" ")))?"a "+e:"an "+e},past:function(e){return a(e.substr(0,e.indexOf(" ")))?"viru "+e:"virun "+e},s:"e puer Sekonnen",ss:"%d Sekonnen",m:t,mm:"%d Minutten",h:t,hh:"%d Stonnen",d:t,dd:"%d Deeg",M:t,MM:"%d Méint",y:t,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("lo",{months:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),monthsShort:"ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ".split("_"),weekdays:"ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysShort:"ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ".split("_"),weekdaysMin:"ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"ວັນdddd D MMMM YYYY HH:mm"},meridiemParse:/ຕອນເຊົ້າ|ຕອນແລງ/,isPM:function(e){return"ຕອນແລງ"===e},meridiem:function(e,t,a){return e<12?"ຕອນເຊົ້າ":"ຕອນແລງ"},calendar:{sameDay:"[ມື້ນີ້ເວລາ] LT",nextDay:"[ມື້ອື່ນເວລາ] LT",nextWeek:"[ວັນ]dddd[ໜ້າເວລາ] LT",lastDay:"[ມື້ວານນີ້ເວລາ] LT",lastWeek:"[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT",sameElse:"L"},relativeTime:{future:"ອີກ %s",past:"%sຜ່ານມາ",s:"ບໍ່ເທົ່າໃດວິນາທີ",ss:"%d ວິນາທີ",m:"1 ນາທີ",mm:"%d ນາທີ",h:"1 ຊົ່ວໂມງ",hh:"%d ຊົ່ວໂມງ",d:"1 ມື້",dd:"%d ມື້",M:"1 ເດືອນ",MM:"%d ເດືອນ",y:"1 ປີ",yy:"%d ປີ"},dayOfMonthOrdinalParse:/(ທີ່)\d{1,2}/,ordinal:function(e){return"ທີ່"+e}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={ss:"sekundė_sekundžių_sekundes",m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"};function a(e,t,a,s){return t?n(a)[0]:s?n(a)[1]:n(a)[2]}function s(e){return e%10==0||e>10&&e<20}function n(e){return t[e].split("_")}function r(e,t,r,i){var d=e+" ";return 1===e?d+a(0,t,r[0],i):t?d+(s(e)?n(r)[1]:n(r)[0]):i?d+n(r)[1]:d+(s(e)?n(r)[1]:n(r)[2])}e.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:function(e,t,a,s){return t?"kelios sekundės":s?"kelių sekundžių":"kelias sekundes"},ss:r,m:a,mm:r,h:a,hh:r,d:a,dd:r,M:a,MM:r,y:a,yy:r},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={ss:"sekundes_sekundēm_sekunde_sekundes".split("_"),m:"minūtes_minūtēm_minūte_minūtes".split("_"),mm:"minūtes_minūtēm_minūte_minūtes".split("_"),h:"stundas_stundām_stunda_stundas".split("_"),hh:"stundas_stundām_stunda_stundas".split("_"),d:"dienas_dienām_diena_dienas".split("_"),dd:"dienas_dienām_diena_dienas".split("_"),M:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),MM:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function a(e,t,a){return a?t%10==1&&t%100!=11?e[2]:e[3]:t%10==1&&t%100!=11?e[0]:e[1]}function s(e,s,n){return e+" "+a(t[n],e,s)}function n(e,s,n){return a(t[n],e,s)}e.defineLocale("lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pēc %s",past:"pirms %s",s:function(e,t){return t?"dažas sekundes":"dažām sekundēm"},ss:s,m:n,mm:s,h:n,hh:s,d:n,dd:s,M:n,MM:s,y:n,yy:s},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,a,s){var n=t.words[s];return 1===s.length?a?n[0]:n[1]:e+" "+t.correctGrammaticalCase(e,n)}};e.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){return["[prošle] [nedjelje] [u] LT","[prošlog] [ponedjeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srijede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mjesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("mi",{months:"Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei".split("_"),weekdaysShort:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),weekdaysMin:"Ta_Ma_Tū_We_Tāi_Pa_Hā".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te hēkona ruarua",ss:"%d hēkona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Денес во] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"после %s",past:"пред %s",s:"неколку секунди",ss:"%d секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",M:"месец",MM:"%d месеци",y:"година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(e){var t=e%10,a=e%100;return 0===e?e+"-ев":0===a?e+"-ен":a>10&&a<20?e+"-ти":1===t?e+"-ви":2===t?e+"-ри":7===t||8===t?e+"-ми":e+"-ти"},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ml",{months:"ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.".split("_"),monthsParseExact:!0,weekdays:"ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച".split("_"),weekdaysShort:"ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി".split("_"),weekdaysMin:"ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ".split("_"),longDateFormat:{LT:"A h:mm -നു",LTS:"A h:mm:ss -നു",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -നു",LLLL:"dddd, D MMMM YYYY, A h:mm -നു"},calendar:{sameDay:"[ഇന്ന്] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇന്നലെ] LT",lastWeek:"[കഴിഞ്ഞ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s കഴിഞ്ഞ്",past:"%s മുൻപ്",s:"അൽപ നിമിഷങ്ങൾ",ss:"%d സെക്കൻഡ്",m:"ഒരു മിനിറ്റ്",mm:"%d മിനിറ്റ്",h:"ഒരു മണിക്കൂർ",hh:"%d മണിക്കൂർ",d:"ഒരു ദിവസം",dd:"%d ദിവസം",M:"ഒരു മാസം",MM:"%d മാസം",y:"ഒരു വർഷം",yy:"%d വർഷം"},meridiemParse:/രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,meridiemHour:function(e,t){return 12===e&&(e=0),"രാത്രി"===t&&e>=4||"ഉച്ച കഴിഞ്ഞ്"===t||"വൈകുന്നേരം"===t?e+12:e},meridiem:function(e,t,a){return e<4?"രാത്രി":e<12?"രാവിലെ":e<17?"ഉച്ച കഴിഞ്ഞ്":e<20?"വൈകുന്നേരം":"രാത്രി"}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a,s){switch(a){case"s":return t?"хэдхэн секунд":"хэдхэн секундын";case"ss":return e+(t?" секунд":" секундын");case"m":case"mm":return e+(t?" минут":" минутын");case"h":case"hh":return e+(t?" цаг":" цагийн");case"d":case"dd":return e+(t?" өдөр":" өдрийн");case"M":case"MM":return e+(t?" сар":" сарын");case"y":case"yy":return e+(t?" жил":" жилийн");default:return e}}e.defineLocale("mn",{months:"Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар".split("_"),monthsShort:"1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар".split("_"),monthsParseExact:!0,weekdays:"Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба".split("_"),weekdaysShort:"Ням_Дав_Мяг_Лха_Пүр_Баа_Бям".split("_"),weekdaysMin:"Ня_Да_Мя_Лх_Пү_Ба_Бя".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY оны MMMMын D",LLL:"YYYY оны MMMMын D HH:mm",LLLL:"dddd, YYYY оны MMMMын D HH:mm"},meridiemParse:/ҮӨ|ҮХ/i,isPM:function(e){return"ҮХ"===e},meridiem:function(e,t,a){return e<12?"ҮӨ":"ҮХ"},calendar:{sameDay:"[Өнөөдөр] LT",nextDay:"[Маргааш] LT",nextWeek:"[Ирэх] dddd LT",lastDay:"[Өчигдөр] LT",lastWeek:"[Өнгөрсөн] dddd LT",sameElse:"L"},relativeTime:{future:"%s дараа",past:"%s өмнө",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2} өдөр/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+" өдөр";default:return e}}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},a={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};function s(e,t,a,s){var n="";if(t)switch(a){case"s":n="काही सेकंद";break;case"ss":n="%d सेकंद";break;case"m":n="एक मिनिट";break;case"mm":n="%d मिनिटे";break;case"h":n="एक तास";break;case"hh":n="%d तास";break;case"d":n="एक दिवस";break;case"dd":n="%d दिवस";break;case"M":n="एक महिना";break;case"MM":n="%d महिने";break;case"y":n="एक वर्ष";break;case"yy":n="%d वर्षे"}else switch(a){case"s":n="काही सेकंदां";break;case"ss":n="%d सेकंदां";break;case"m":n="एका मिनिटा";break;case"mm":n="%d मिनिटां";break;case"h":n="एका तासा";break;case"hh":n="%d तासां";break;case"d":n="एका दिवसा";break;case"dd":n="%d दिवसां";break;case"M":n="एका महिन्या";break;case"MM":n="%d महिन्यां";break;case"y":n="एका वर्षा";break;case"yy":n="%d वर्षां"}return n.replace(/%d/i,e)}e.defineLocale("mr",{months:"जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),monthsShort:"जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",LTS:"A h:mm:ss वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm वाजता",LLLL:"dddd, D MMMM YYYY, A h:mm वाजता"},calendar:{sameDay:"[आज] LT",nextDay:"[उद्या] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%sमध्ये",past:"%sपूर्वी",s:s,ss:s,m:s,mm:s,h:s,hh:s,d:s,dd:s,M:s,MM:s,y:s,yy:s},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,function(e){return a[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/रात्री|सकाळी|दुपारी|सायंकाळी/,meridiemHour:function(e,t){return 12===e&&(e=0),"रात्री"===t?e<4?e:e+12:"सकाळी"===t?e:"दुपारी"===t?e>=10?e:e+12:"सायंकाळी"===t?e+12:void 0},meridiem:function(e,t,a){return e<4?"रात्री":e<10?"सकाळी":e<17?"दुपारी":e<20?"सायंकाळी":"रात्री"},week:{dow:0,doy:6}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,t){return 12===e&&(e=0),"pagi"===t?e:"tengahari"===t?e>=11?e:e+12:"petang"===t||"malam"===t?e+12:void 0},meridiem:function(e,t,a){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,t){return 12===e&&(e=0),"pagi"===t?e:"tengahari"===t?e>=11?e:e+12:"petang"===t||"malam"===t?e+12:void 0},meridiem:function(e,t,a){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ".split("_"),weekdays:"Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt".split("_"),weekdaysShort:"Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib".split("_"),weekdaysMin:"Ħa_Tn_Tl_Er_Ħa_Ġi_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[Għada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-bieraħ fil-]LT",lastWeek:"dddd [li għadda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f’ %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"siegħa",hh:"%d siegħat",d:"ġurnata",dd:"%d ġranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"၁",2:"၂",3:"၃",4:"၄",5:"၅",6:"၆",7:"၇",8:"၈",9:"၉",0:"၀"},a={"၁":"1","၂":"2","၃":"3","၄":"4","၅":"5","၆":"6","၇":"7","၈":"8","၉":"9","၀":"0"};e.defineLocale("my",{months:"ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးခဲ့သော] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်ခဲ့သော %s က",s:"စက္ကန်.အနည်းငယ်",ss:"%d စက္ကန့်",m:"တစ်မိနစ်",mm:"%d မိနစ်",h:"တစ်နာရီ",hh:"%d နာရီ",d:"တစ်ရက်",dd:"%d ရက်",M:"တစ်လ",MM:"%d လ",y:"တစ်နှစ်",yy:"%d နှစ်"},preparse:function(e){return e.replace(/[၁၂၃၄၅၆၇၈၉၀]/g,function(e){return a[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},a={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};e.defineLocale("ne",{months:"जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर".split("_"),monthsShort:"जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.".split("_"),monthsParseExact:!0,weekdays:"आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.".split("_"),weekdaysMin:"आ._सो._मं._बु._बि._शु._श.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"Aको h:mm बजे",LTS:"Aको h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, Aको h:mm बजे",LLLL:"dddd, D MMMM YYYY, Aको h:mm बजे"},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,function(e){return a[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/राति|बिहान|दिउँसो|साँझ/,meridiemHour:function(e,t){return 12===e&&(e=0),"राति"===t?e<4?e:e+12:"बिहान"===t?e:"दिउँसो"===t?e>=10?e:e+12:"साँझ"===t?e+12:void 0},meridiem:function(e,t,a){return e<3?"राति":e<12?"बिहान":e<16?"दिउँसो":e<20?"साँझ":"राति"},calendar:{sameDay:"[आज] LT",nextDay:"[भोलि] LT",nextWeek:"[आउँदो] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गएको] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडि",s:"केही क्षण",ss:"%d सेकेण्ड",m:"एक मिनेट",mm:"%d मिनेट",h:"एक घण्टा",hh:"%d घण्टा",d:"एक दिन",dd:"%d दिन",M:"एक महिना",MM:"%d महिना",y:"एक बर्ष",yy:"%d बर्ष"},week:{dow:0,doy:6}})}(a(0))},function(e,t,a){!function(e){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),a="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),s=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],n=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;e.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,s){return e?/-MMM-/.test(s)?a[e.month()]:t[e.month()]:t},monthsRegex:n,monthsShortRegex:n,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:s,longMonthsParse:s,shortMonthsParse:s,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),a="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),s=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],n=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;e.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,s){return e?/-MMM-/.test(s)?a[e.month()]:t[e.month()]:t},monthsRegex:n,monthsShortRegex:n,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:s,longMonthsParse:s,shortMonthsParse:s,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mån_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_må_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I går klokka] LT",lastWeek:"[Føregåande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein månad",MM:"%d månader",y:"eit år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"੧",2:"੨",3:"੩",4:"੪",5:"੫",6:"੬",7:"੭",8:"੮",9:"੯",0:"੦"},a={"੧":"1","੨":"2","੩":"3","੪":"4","੫":"5","੬":"6","੭":"7","੮":"8","੯":"9","੦":"0"};e.defineLocale("pa-in",{months:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),monthsShort:"ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ".split("_"),weekdays:"ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ".split("_"),weekdaysShort:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),weekdaysMin:"ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ".split("_"),longDateFormat:{LT:"A h:mm ਵਜੇ",LTS:"A h:mm:ss ਵਜੇ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm ਵਜੇ",LLLL:"dddd, D MMMM YYYY, A h:mm ਵਜੇ"},calendar:{sameDay:"[ਅਜ] LT",nextDay:"[ਕਲ] LT",nextWeek:"[ਅਗਲਾ] dddd, LT",lastDay:"[ਕਲ] LT",lastWeek:"[ਪਿਛਲੇ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ਵਿੱਚ",past:"%s ਪਿਛਲੇ",s:"ਕੁਝ ਸਕਿੰਟ",ss:"%d ਸਕਿੰਟ",m:"ਇਕ ਮਿੰਟ",mm:"%d ਮਿੰਟ",h:"ਇੱਕ ਘੰਟਾ",hh:"%d ਘੰਟੇ",d:"ਇੱਕ ਦਿਨ",dd:"%d ਦਿਨ",M:"ਇੱਕ ਮਹੀਨਾ",MM:"%d ਮਹੀਨੇ",y:"ਇੱਕ ਸਾਲ",yy:"%d ਸਾਲ"},preparse:function(e){return e.replace(/[੧੨੩੪੫੬੭੮੯੦]/g,function(e){return a[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,meridiemHour:function(e,t){return 12===e&&(e=0),"ਰਾਤ"===t?e<4?e:e+12:"ਸਵੇਰ"===t?e:"ਦੁਪਹਿਰ"===t?e>=10?e:e+12:"ਸ਼ਾਮ"===t?e+12:void 0},meridiem:function(e,t,a){return e<4?"ਰਾਤ":e<10?"ਸਵੇਰ":e<17?"ਦੁਪਹਿਰ":e<20?"ਸ਼ਾਮ":"ਰਾਤ"},week:{dow:0,doy:6}})}(a(0))},function(e,t,a){!function(e){"use strict";var t="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),a="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");function s(e){return e%10<5&&e%10>1&&~~(e/10)%10!=1}function n(e,t,a){var n=e+" ";switch(a){case"ss":return n+(s(e)?"sekundy":"sekund");case"m":return t?"minuta":"minutę";case"mm":return n+(s(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return n+(s(e)?"godziny":"godzin");case"MM":return n+(s(e)?"miesiące":"miesięcy");case"yy":return n+(s(e)?"lata":"lat")}}e.defineLocale("pl",{months:function(e,s){return e?""===s?"("+a[e.month()]+"|"+t[e.month()]+")":/D MMMM/.test(s)?a[e.month()]:t[e.month()]:t},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_śr_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedzielę o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W środę o] LT";case 6:return"[W sobotę o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:n,m:n,mm:n,h:n,hh:n,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:n,y:"rok",yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("pt",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Do_2ª_3ª_4ª_5ª_6ª_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Do_2ª_3ª_4ª_5ª_6ª_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº"})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a){var s=" ";return(e%100>=20||e>=100&&e%100==0)&&(s=" de "),e+s+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"}[a]}e.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",ss:t,m:"un minut",mm:t,h:"o oră",hh:t,d:"o zi",dd:t,M:"o lună",MM:t,y:"un an",yy:t},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a){var s,n,r={ss:t?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:t?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===a?t?"минута":"минуту":e+" "+(s=+e,n=r[a].split("_"),s%10==1&&s%100!=11?n[0]:s%10>=2&&s%10<=4&&(s%100<10||s%100>=20)?n[1]:n[2])}var a=[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йя]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i];e.defineLocale("ru",{months:{format:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),standalone:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_")},monthsShort:{format:"янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),standalone:"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_")},weekdays:{standalone:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),format:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/},weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:a,longMonthsParse:a,shortMonthsParse:a,monthsRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsShortRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsStrictRegex:/^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,monthsShortStrictRegex:/^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., H:mm",LLLL:"dddd, D MMMM YYYY г., H:mm"},calendar:{sameDay:"[Сегодня, в] LT",nextDay:"[Завтра, в] LT",lastDay:"[Вчера, в] LT",nextWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd, [в] LT":"[В] dddd, [в] LT";switch(this.day()){case 0:return"[В следующее] dddd, [в] LT";case 1:case 2:case 4:return"[В следующий] dddd, [в] LT";case 3:case 5:case 6:return"[В следующую] dddd, [в] LT"}},lastWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd, [в] LT":"[В] dddd, [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd, [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd, [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd, [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",ss:t,m:t,mm:t,h:"час",hh:t,d:"день",dd:t,M:"месяц",MM:t,y:"год",yy:t},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(e){return/^(дня|вечера)$/.test(e)},meridiem:function(e,t,a){return e<4?"ночи":e<12?"утра":e<17?"дня":"вечера"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":return e+"-й";case"D":return e+"-го";case"w":case"W":return e+"-я";default:return e}},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t=["جنوري","فيبروري","مارچ","اپريل","مئي","جون","جولاءِ","آگسٽ","سيپٽمبر","آڪٽوبر","نومبر","ڊسمبر"],a=["آچر","سومر","اڱارو","اربع","خميس","جمع","ڇنڇر"];e.defineLocale("sd",{months:t,monthsShort:t,weekdays:a,weekdaysShort:a,weekdaysMin:a,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(e){return"شام"===e},meridiem:function(e,t,a){return e<12?"صبح":"شام"},calendar:{sameDay:"[اڄ] LT",nextDay:"[سڀاڻي] LT",nextWeek:"dddd [اڳين هفتي تي] LT",lastDay:"[ڪالهه] LT",lastWeek:"[گزريل هفتي] dddd [تي] LT",sameElse:"L"},relativeTime:{future:"%s پوء",past:"%s اڳ",s:"چند سيڪنڊ",ss:"%d سيڪنڊ",m:"هڪ منٽ",mm:"%d منٽ",h:"هڪ ڪلاڪ",hh:"%d ڪلاڪ",d:"هڪ ڏينهن",dd:"%d ڏينهن",M:"هڪ مهينو",MM:"%d مهينا",y:"هڪ سال",yy:"%d سال"},preparse:function(e){return e.replace(/،/g,",")},postformat:function(e){return e.replace(/,/g,"،")},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("se",{months:"ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu".split("_"),monthsShort:"ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov".split("_"),weekdays:"sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat".split("_"),weekdaysShort:"sotn_vuos_maŋ_gask_duor_bear_láv".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s geažes",past:"maŋit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta mánnu",MM:"%d mánut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("si",{months:"ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්".split("_"),monthsShort:"ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ".split("_"),weekdays:"ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා".split("_"),weekdaysShort:"ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන".split("_"),weekdaysMin:"ඉ_ස_අ_බ_බ්‍ර_සි_සෙ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [වැනි] dddd, a h:mm:ss"},calendar:{sameDay:"[අද] LT[ට]",nextDay:"[හෙට] LT[ට]",nextWeek:"dddd LT[ට]",lastDay:"[ඊයේ] LT[ට]",lastWeek:"[පසුගිය] dddd LT[ට]",sameElse:"L"},relativeTime:{future:"%sකින්",past:"%sකට පෙර",s:"තත්පර කිහිපය",ss:"තත්පර %d",m:"මිනිත්තුව",mm:"මිනිත්තු %d",h:"පැය",hh:"පැය %d",d:"දිනය",dd:"දින %d",M:"මාසය",MM:"මාස %d",y:"වසර",yy:"වසර %d"},dayOfMonthOrdinalParse:/\d{1,2} වැනි/,ordinal:function(e){return e+" වැනි"},meridiemParse:/පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,isPM:function(e){return"ප.ව."===e||"පස් වරු"===e},meridiem:function(e,t,a){return e>11?a?"ප.ව.":"පස් වරු":a?"පෙ.ව.":"පෙර වරු"}})}(a(0))},function(e,t,a){!function(e){"use strict";var t="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),a="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");function s(e){return e>1&&e<5}function n(e,t,a,n){var r=e+" ";switch(a){case"s":return t||n?"pár sekúnd":"pár sekundami";case"ss":return t||n?r+(s(e)?"sekundy":"sekúnd"):r+"sekundami";case"m":return t?"minúta":n?"minútu":"minútou";case"mm":return t||n?r+(s(e)?"minúty":"minút"):r+"minútami";case"h":return t?"hodina":n?"hodinu":"hodinou";case"hh":return t||n?r+(s(e)?"hodiny":"hodín"):r+"hodinami";case"d":return t||n?"deň":"dňom";case"dd":return t||n?r+(s(e)?"dni":"dní"):r+"dňami";case"M":return t||n?"mesiac":"mesiacom";case"MM":return t||n?r+(s(e)?"mesiace":"mesiacov"):r+"mesiacmi";case"y":return t||n?"rok":"rokom";case"yy":return t||n?r+(s(e)?"roky":"rokov"):r+"rokmi"}}e.defineLocale("sk",{months:t,monthsShort:a,weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:n,ss:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a,s){var n=e+" ";switch(a){case"s":return t||s?"nekaj sekund":"nekaj sekundami";case"ss":return n+=1===e?t?"sekundo":"sekundi":2===e?t||s?"sekundi":"sekundah":e<5?t||s?"sekunde":"sekundah":"sekund";case"m":return t?"ena minuta":"eno minuto";case"mm":return n+=1===e?t?"minuta":"minuto":2===e?t||s?"minuti":"minutama":e<5?t||s?"minute":"minutami":t||s?"minut":"minutami";case"h":return t?"ena ura":"eno uro";case"hh":return n+=1===e?t?"ura":"uro":2===e?t||s?"uri":"urama":e<5?t||s?"ure":"urami":t||s?"ur":"urami";case"d":return t||s?"en dan":"enim dnem";case"dd":return n+=1===e?t||s?"dan":"dnem":2===e?t||s?"dni":"dnevoma":t||s?"dni":"dnevi";case"M":return t||s?"en mesec":"enim mesecem";case"MM":return n+=1===e?t||s?"mesec":"mesecem":2===e?t||s?"meseca":"mesecema":e<5?t||s?"mesece":"meseci":t||s?"mesecev":"meseci";case"y":return t||s?"eno leto":"enim letom";case"yy":return n+=1===e?t||s?"leto":"letom":2===e?t||s?"leti":"letoma":e<5?t||s?"leta":"leti":t||s?"let":"leti"}}e.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejšnjo] [nedeljo] [ob] LT";case 3:return"[prejšnjo] [sredo] [ob] LT";case 6:return"[prejšnjo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"pred %s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(e){return"M"===e.charAt(0)},meridiem:function(e,t,a){return e<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",ss:"%d sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,a,s){var n=t.words[s];return 1===s.length?a?n[0]:n[1]:e+" "+t.correctGrammaticalCase(e,n)}};e.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){return["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={words:{ss:["секунда","секунде","секунди"],m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,a,s){var n=t.words[s];return 1===s.length?a?n[0]:n[1]:e+" "+t.correctGrammaticalCase(e,n)}};e.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_среда_четвртак_петак_субота".split("_"),weekdaysShort:"нед._пон._уто._сре._чет._пет._суб.".split("_"),weekdaysMin:"не_по_ут_ср_че_пе_су".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){return["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"дан",dd:t.translate,M:"месец",MM:t.translate,y:"годину",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(e,t,a){return e<11?"ekuseni":e<15?"emini":e<19?"entsambama":"ebusuku"},meridiemHour:function(e,t){return 12===e&&(e=0),"ekuseni"===t?e:"emini"===t?e>=11?e:e+12:"entsambama"===t||"ebusuku"===t?0===e?0:e+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"[På] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}(e|a)/,ordinal:function(e){var t=e%10,a=1==~~(e%100/10)?"e":1===t?"a":2===t?"a":"e";return e+a},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"௧",2:"௨",3:"௩",4:"௪",5:"௫",6:"௬",7:"௭",8:"௮",9:"௯",0:"௦"},a={"௧":"1","௨":"2","௩":"3","௪":"4","௫":"5","௬":"6","௭":"7","௮":"8","௯":"9","௦":"0"};e.defineLocale("ta",{months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை".split("_"),weekdaysShort:"ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பு_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[இன்று] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேற்று] LT",lastWeek:"[கடந்த வாரம்] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இல்",past:"%s முன்",s:"ஒரு சில விநாடிகள்",ss:"%d விநாடிகள்",m:"ஒரு நிமிடம்",mm:"%d நிமிடங்கள்",h:"ஒரு மணி நேரம்",hh:"%d மணி நேரம்",d:"ஒரு நாள்",dd:"%d நாட்கள்",M:"ஒரு மாதம்",MM:"%d மாதங்கள்",y:"ஒரு வருடம்",yy:"%d ஆண்டுகள்"},dayOfMonthOrdinalParse:/\d{1,2}வது/,ordinal:function(e){return e+"வது"},preparse:function(e){return e.replace(/[௧௨௩௪௫௬௭௮௯௦]/g,function(e){return a[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,meridiem:function(e,t,a){return e<2?" யாமம்":e<6?" வைகறை":e<10?" காலை":e<14?" நண்பகல்":e<18?" எற்பாடு":e<22?" மாலை":" யாமம்"},meridiemHour:function(e,t){return 12===e&&(e=0),"யாமம்"===t?e<2?e:e+12:"வைகறை"===t||"காலை"===t?e:"நண்பகல்"===t&&e>=10?e:e+12},week:{dow:0,doy:6}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("te",{months:"జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్".split("_"),monthsShort:"జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.".split("_"),monthsParseExact:!0,weekdays:"ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం".split("_"),weekdaysShort:"ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని".split("_"),weekdaysMin:"ఆ_సో_మం_బు_గు_శు_శ".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[నేడు] LT",nextDay:"[రేపు] LT",nextWeek:"dddd, LT",lastDay:"[నిన్న] LT",lastWeek:"[గత] dddd, LT",sameElse:"L"},relativeTime:{future:"%s లో",past:"%s క్రితం",s:"కొన్ని క్షణాలు",ss:"%d సెకన్లు",m:"ఒక నిమిషం",mm:"%d నిమిషాలు",h:"ఒక గంట",hh:"%d గంటలు",d:"ఒక రోజు",dd:"%d రోజులు",M:"ఒక నెల",MM:"%d నెలలు",y:"ఒక సంవత్సరం",yy:"%d సంవత్సరాలు"},dayOfMonthOrdinalParse:/\d{1,2}వ/,ordinal:"%dవ",meridiemParse:/రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,meridiemHour:function(e,t){return 12===e&&(e=0),"రాత్రి"===t?e<4?e:e+12:"ఉదయం"===t?e:"మధ్యాహ్నం"===t?e>=10?e:e+12:"సాయంత్రం"===t?e+12:void 0},meridiem:function(e,t,a){return e<4?"రాత్రి":e<10?"ఉదయం":e<17?"మధ్యాహ్నం":e<20?"సాయంత్రం":"రాత్రి"},week:{dow:0,doy:6}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",ss:"minutu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10,a=1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={0:"-ум",1:"-ум",2:"-юм",3:"-юм",4:"-ум",5:"-ум",6:"-ум",7:"-ум",8:"-ум",9:"-ум",10:"-ум",12:"-ум",13:"-ум",20:"-ум",30:"-юм",40:"-ум",50:"-ум",60:"-ум",70:"-ум",80:"-ум",90:"-ум",100:"-ум"};e.defineLocale("tg",{months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе".split("_"),weekdaysShort:"яшб_дшб_сшб_чшб_пшб_ҷум_шнб".split("_"),weekdaysMin:"яш_дш_сш_чш_пш_ҷм_шб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Имрӯз соати] LT",nextDay:"[Пагоҳ соати] LT",lastDay:"[Дирӯз соати] LT",nextWeek:"dddd[и] [ҳафтаи оянда соати] LT",lastWeek:"dddd[и] [ҳафтаи гузашта соати] LT",sameElse:"L"},relativeTime:{future:"баъди %s",past:"%s пеш",s:"якчанд сония",m:"як дақиқа",mm:"%d дақиқа",h:"як соат",hh:"%d соат",d:"як рӯз",dd:"%d рӯз",M:"як моҳ",MM:"%d моҳ",y:"як сол",yy:"%d сол"},meridiemParse:/шаб|субҳ|рӯз|бегоҳ/,meridiemHour:function(e,t){return 12===e&&(e=0),"шаб"===t?e<4?e:e+12:"субҳ"===t?e:"рӯз"===t?e>=11?e:e+12:"бегоҳ"===t?e+12:void 0},meridiem:function(e,t,a){return e<4?"шаб":e<11?"субҳ":e<16?"рӯз":e<19?"бегоҳ":"шаб"},dayOfMonthOrdinalParse:/\d{1,2}-(ум|юм)/,ordinal:function(e){var a=e%10,s=e>=100?100:null;return e+(t[e]||t[a]||t[s])},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(e){return"หลังเที่ยง"===e},meridiem:function(e,t,a){return e<12?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",ss:"%d วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t="pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function a(e,a,s,n){var r=function(e){var a=Math.floor(e%1e3/100),s=Math.floor(e%100/10),n=e%10,r="";return a>0&&(r+=t[a]+"vatlh"),s>0&&(r+=(""!==r?" ":"")+t[s]+"maH"),n>0&&(r+=(""!==r?" ":"")+t[n]),""===r?"pagh":r}(e);switch(s){case"ss":return r+" lup";case"mm":return r+" tup";case"hh":return r+" rep";case"dd":return r+" jaj";case"MM":return r+" jar";case"yy":return r+" DIS"}}e.defineLocale("tlh",{months:"tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’".split("_"),monthsShort:"jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa’leS] LT",nextWeek:"LLL",lastDay:"[wa’Hu’] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(e){var t=e;return t=-1!==e.indexOf("jaj")?t.slice(0,-3)+"leS":-1!==e.indexOf("jar")?t.slice(0,-3)+"waQ":-1!==e.indexOf("DIS")?t.slice(0,-3)+"nem":t+" pIq"},past:function(e){var t=e;return t=-1!==e.indexOf("jaj")?t.slice(0,-3)+"Hu’":-1!==e.indexOf("jar")?t.slice(0,-3)+"wen":-1!==e.indexOf("DIS")?t.slice(0,-3)+"ben":t+" ret"},s:"puS lup",ss:a,m:"wa’ tup",mm:a,h:"wa’ rep",hh:a,d:"wa’ jaj",dd:a,M:"wa’ jar",MM:a,y:"wa’ DIS",yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";var t={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};e.defineLocale("tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(e,a){switch(a){case"d":case"D":case"Do":case"DD":return e;default:if(0===e)return e+"'ıncı";var s=e%10,n=e%100-s,r=e>=100?100:null;return e+(t[s]||t[n]||t[r])}},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a,s){var n={s:["viensas secunds","'iensas secunds"],ss:[e+" secunds",e+" secunds"],m:["'n míut","'iens míut"],mm:[e+" míuts",e+" míuts"],h:["'n þora","'iensa þora"],hh:[e+" þoras",e+" þoras"],d:["'n ziua","'iensa ziua"],dd:[e+" ziuas",e+" ziuas"],M:["'n mes","'iens mes"],MM:[e+" mesen",e+" mesen"],y:["'n ar","'iens ar"],yy:[e+" ars",e+" ars"]};return s?n[a][0]:t?n[a][0]:n[a][1]}e.defineLocale("tzl",{months:"Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi".split("_"),weekdaysShort:"Súl_Lún_Mai_Már_Xhú_Vié_Sát".split("_"),weekdaysMin:"Sú_Lú_Ma_Má_Xh_Vi_Sá".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(e){return"d'o"===e.toLowerCase()},meridiem:function(e,t,a){return e>11?a?"d'o":"D'O":a?"d'a":"D'A"},calendar:{sameDay:"[oxhi à] LT",nextDay:"[demà à] LT",nextWeek:"dddd [à] LT",lastDay:"[ieiri à] LT",lastWeek:"[sür el] dddd [lasteu à] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("tzm",{months:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),monthsShort:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[ⴰⵙⴷⵅ ⴴ] LT",nextDay:"[ⴰⵙⴽⴰ ⴴ] LT",nextWeek:"dddd [ⴴ] LT",lastDay:"[ⴰⵚⴰⵏⵜ ⴴ] LT",lastWeek:"dddd [ⴴ] LT",sameElse:"L"},relativeTime:{future:"ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",past:"ⵢⴰⵏ %s",s:"ⵉⵎⵉⴽ",ss:"%d ⵉⵎⵉⴽ",m:"ⵎⵉⵏⵓⴺ",mm:"%d ⵎⵉⵏⵓⴺ",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉⵏ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰⵏ",M:"ⴰⵢoⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔⵏ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙⵏ"},week:{dow:6,doy:12}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minuḍ",mm:"%d minuḍ",h:"saɛa",hh:"%d tassaɛin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("ug-cn",{months:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),monthsShort:"يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر".split("_"),weekdays:"يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە".split("_"),weekdaysShort:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),weekdaysMin:"يە_دۈ_سە_چا_پە_جۈ_شە".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-يىلىM-ئاينىڭD-كۈنى",LLL:"YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm",LLLL:"dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm"},meridiemParse:/يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,meridiemHour:function(e,t){return 12===e&&(e=0),"يېرىم كېچە"===t||"سەھەر"===t||"چۈشتىن بۇرۇن"===t?e:"چۈشتىن كېيىن"===t||"كەچ"===t?e+12:e>=11?e:e+12},meridiem:function(e,t,a){var s=100*e+t;return s<600?"يېرىم كېچە":s<900?"سەھەر":s<1130?"چۈشتىن بۇرۇن":s<1230?"چۈش":s<1800?"چۈشتىن كېيىن":"كەچ"},calendar:{sameDay:"[بۈگۈن سائەت] LT",nextDay:"[ئەتە سائەت] LT",nextWeek:"[كېلەركى] dddd [سائەت] LT",lastDay:"[تۆنۈگۈن] LT",lastWeek:"[ئالدىنقى] dddd [سائەت] LT",sameElse:"L"},relativeTime:{future:"%s كېيىن",past:"%s بۇرۇن",s:"نەچچە سېكونت",ss:"%d سېكونت",m:"بىر مىنۇت",mm:"%d مىنۇت",h:"بىر سائەت",hh:"%d سائەت",d:"بىر كۈن",dd:"%d كۈن",M:"بىر ئاي",MM:"%d ئاي",y:"بىر يىل",yy:"%d يىل"},dayOfMonthOrdinalParse:/\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"-كۈنى";case"w":case"W":return e+"-ھەپتە";default:return e}},preparse:function(e){return e.replace(/،/g,",")},postformat:function(e){return e.replace(/,/g,"،")},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";function t(e,t,a){var s,n,r={ss:t?"секунда_секунди_секунд":"секунду_секунди_секунд",mm:t?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:t?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===a?t?"хвилина":"хвилину":"h"===a?t?"година":"годину":e+" "+(s=+e,n=r[a].split("_"),s%10==1&&s%100!=11?n[0]:s%10>=2&&s%10<=4&&(s%100<10||s%100>=20)?n[1]:n[2])}function a(e){return function(){return e+"о"+(11===this.hours()?"б":"")+"] LT"}}e.defineLocale("uk",{months:{format:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_"),standalone:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_")},monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:function(e,t){var a={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")};if(!0===e)return a.nominative.slice(1,7).concat(a.nominative.slice(0,1));if(!e)return a.nominative;var s=/(\[[ВвУу]\]) ?dddd/.test(t)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(t)?"genitive":"nominative";return a[s][e.day()]},weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:a("[Сьогодні "),nextDay:a("[Завтра "),lastDay:a("[Вчора "),nextWeek:a("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return a("[Минулої] dddd [").call(this);case 1:case 2:case 4:return a("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",ss:t,m:t,mm:t,h:"годину",hh:t,d:"день",dd:t,M:"місяць",MM:t,y:"рік",yy:t},meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(e){return/^(дня|вечора)$/.test(e)},meridiem:function(e,t,a){return e<4?"ночі":e<12?"ранку":e<17?"дня":"вечора"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e+"-й";case"D":return e+"-го";default:return e}},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";var t=["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],a=["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","ہفتہ"];e.defineLocale("ur",{months:t,monthsShort:t,weekdays:a,weekdaysShort:a,weekdaysMin:a,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(e){return"شام"===e},meridiem:function(e,t,a){return e<12?"صبح":"شام"},calendar:{sameDay:"[آج بوقت] LT",nextDay:"[کل بوقت] LT",nextWeek:"dddd [بوقت] LT",lastDay:"[گذشتہ روز بوقت] LT",lastWeek:"[گذشتہ] dddd [بوقت] LT",sameElse:"L"},relativeTime:{future:"%s بعد",past:"%s قبل",s:"چند سیکنڈ",ss:"%d سیکنڈ",m:"ایک منٹ",mm:"%d منٹ",h:"ایک گھنٹہ",hh:"%d گھنٹے",d:"ایک دن",dd:"%d دن",M:"ایک ماہ",MM:"%d ماہ",y:"ایک سال",yy:"%d سال"},preparse:function(e){return e.replace(/،/g,",")},postformat:function(e){return e.replace(/,/g,"،")},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("uz",{months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Бугун соат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни соат] LT [да]",lastDay:"[Кеча соат] LT [да]",lastWeek:"[Утган] dddd [куни соат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурсат",ss:"%d фурсат",m:"бир дакика",mm:"%d дакика",h:"бир соат",hh:"%d соат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,t,a){return e<12?a?"sa":"SA":a?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",ss:"%d giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("x-pseudo",{months:"J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér".split("_"),monthsShort:"J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc".split("_"),monthsParseExact:!0,weekdays:"S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý".split("_"),weekdaysShort:"S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát".split("_"),weekdaysMin:"S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~ódá~ý át] LT",nextDay:"[T~ómó~rró~w át] LT",nextWeek:"dddd [át] LT",lastDay:"[Ý~ést~érdá~ý át] LT",lastWeek:"[L~ást] dddd [át] LT",sameElse:"L"},relativeTime:{future:"í~ñ %s",past:"%s á~gó",s:"á ~féw ~sécó~ñds",ss:"%d s~écóñ~ds",m:"á ~míñ~úté",mm:"%d m~íñú~tés",h:"á~ñ hó~úr",hh:"%d h~óúrs",d:"á ~dáý",dd:"%d d~áýs",M:"á ~móñ~th",MM:"%d m~óñt~hs",y:"á ~ýéár",yy:"%d ý~éárs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,a=1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+a},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("yo",{months:"Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀".split("_"),monthsShort:"Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀".split("_"),weekdays:"Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta".split("_"),weekdaysShort:"Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá".split("_"),weekdaysMin:"Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Ònì ni] LT",nextDay:"[Ọ̀la ni] LT",nextWeek:"dddd [Ọsẹ̀ tón'bọ] [ni] LT",lastDay:"[Àna ni] LT",lastWeek:"dddd [Ọsẹ̀ tólọ́] [ni] LT",sameElse:"L"},relativeTime:{future:"ní %s",past:"%s kọjá",s:"ìsẹjú aayá die",ss:"aayá %d",m:"ìsẹjú kan",mm:"ìsẹjú %d",h:"wákati kan",hh:"wákati %d",d:"ọjọ́ kan",dd:"ọjọ́ %d",M:"osù kan",MM:"osù %d",y:"ọdún kan",yy:"ọdún %d"},dayOfMonthOrdinalParse:/ọjọ́\s\d{1,2}/,ordinal:"ọjọ́ %d",week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return 12===e&&(e=0),"凌晨"===t||"早上"===t||"上午"===t?e:"下午"===t||"晚上"===t?e+12:e>=11?e:e+12},meridiem:function(e,t,a){var s=100*e+t;return s<600?"凌晨":s<900?"早上":s<1130?"上午":s<1230?"中午":s<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d 秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("zh-hk",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return 12===e&&(e=0),"凌晨"===t||"早上"===t||"上午"===t?e:"中午"===t?e>=11?e:e+12:"下午"===t||"晚上"===t?e+12:void 0},meridiem:function(e,t,a){var s=100*e+t;return s<600?"凌晨":s<900?"早上":s<1130?"上午":s<1230?"中午":s<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(a(0))},function(e,t,a){!function(e){"use strict";e.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return 12===e&&(e=0),"凌晨"===t||"早上"===t||"上午"===t?e:"中午"===t?e>=11?e:e+12:"下午"===t||"晚上"===t?e+12:void 0},meridiem:function(e,t,a){var s=100*e+t;return s<600?"凌晨":s<900?"早上":s<1130?"上午":s<1230?"中午":s<1800?"下午":"晚上"},calendar:{sameDay:"[今天] LT",nextDay:"[明天] LT",nextWeek:"[下]dddd LT",lastDay:"[昨天] LT",lastWeek:"[上]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})}(a(0))},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});class s{constructor(e){this.labelEle=e.querySelector(".media-select-label"),this.inputEle=e.querySelector("input[type=hidden]");let t=e.querySelector("button.button-select-media");t&&t.addEventListener("click",this.selectMedia.bind(this)),(t=e.querySelector("button.button-clear-media"))&&t.addEventListener("click",this.clearMedia.bind(this))}clearMedia(e){return e.preventDefault(),this.labelEle.innerText="All Media Items",this.inputEle.value=null,!1}selectMedia(e){e.preventDefault();var t=wp.media({title:"Select the files to process",button:{text:"Select Files"},multiple:"add"});return t.on("select",()=>{let e=t.state().get("selection"),a=[];e.forEach(e=>{a.push(e.get("id"))}),console.log(a),a.length>0?(this.labelEle.innerText=a.length+" items selected",this.inputEle.value=a.join(",")):(this.labelEle.innerText="All Media Items",this.inputEle.value=null)}),t.open(),!1}static bind(){document.querySelectorAll(".option-ui-media-select").forEach(e=>{new s(e)})}}t.default=s},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,a){e.exports=a(306)},function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),a(307);const s=a(44),n=a(309),r=a(315),i=a(172);function d(){jQuery.post(ajaxurl,{action:"mcloud_task_heartbeat"}),setTimeout(d,1e4)}document.addEventListener("DOMContentLoaded",function(){s.default.bind(),i.default.bind(),n.default.bind(),r.default.bind(),d()})},function(e,t){Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(e,t){if(null==this)throw new TypeError('"this" is null or not defined');var a=Object(this),s=a.length>>>0;if(0===s)return!1;var n,r,i=0|t,d=Math.max(i>=0?i:s-Math.abs(i),0);for(;d